From d8659e6b51e8822fd41747ec709dd578ecc570bd Mon Sep 17 00:00:00 2001 From: zheng Date: Wed, 22 May 2019 14:44:35 +0800 Subject: [PATCH 001/217] =?UTF-8?q?CHART-4027=20=E5=9B=BE=E8=A1=A8?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E8=AE=BE=E8=AE=A1=E5=99=A8=E7=95=8C=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../design/chartx/AbstractChartDataPane.java | 58 +++ .../fr/design/chartx/GanttChartDataPane.java | 39 ++ .../chartx/MultiCategoryChartDataPane.java | 43 ++ .../chartx/WordCloundChartDataPane.java | 20 + .../AbstractCustomFieldComboBoxPane.java | 368 ++++++++++++++++++ .../component/AbstractMultiComponentPane.java | 168 ++++++++ .../component/CustomFieldComboBoxPane.java | 58 +++ .../chartx/component/MultiComboBoxPane.java | 32 ++ .../component/MultiTinyFormulaPane.java | 31 ++ .../fields/AbstractCellDataFieldsPane.java | 93 +++++ .../fields/AbstractDataSetFieldsPane.java | 142 +++++++ ...tractDataSetFieldsWithCustomFieldPane.java | 60 +++ .../diff/MultiCategoryCellDataFieldsPane.java | 65 ++++ .../diff/MultiCategoryDataSetFieldsPane.java | 69 ++++ .../fr/design/chartx/single/CellDataPane.java | 56 +++ .../fr/design/chartx/single/DataSetPane.java | 121 ++++++ .../design/chartx/single/SingleDataPane.java | 90 +++++ .../ExtendedCustomFieldComboBoxPane.java | 322 +-------------- .../ColumnIndependentVanChartInterface.java | 8 + 19 files changed, 1542 insertions(+), 301 deletions(-) create mode 100644 designer-chart/src/main/java/com/fr/design/chartx/AbstractChartDataPane.java create mode 100644 designer-chart/src/main/java/com/fr/design/chartx/GanttChartDataPane.java create mode 100644 designer-chart/src/main/java/com/fr/design/chartx/MultiCategoryChartDataPane.java create mode 100644 designer-chart/src/main/java/com/fr/design/chartx/WordCloundChartDataPane.java create mode 100644 designer-chart/src/main/java/com/fr/design/chartx/component/AbstractCustomFieldComboBoxPane.java create mode 100644 designer-chart/src/main/java/com/fr/design/chartx/component/AbstractMultiComponentPane.java create mode 100644 designer-chart/src/main/java/com/fr/design/chartx/component/CustomFieldComboBoxPane.java create mode 100644 designer-chart/src/main/java/com/fr/design/chartx/component/MultiComboBoxPane.java create mode 100644 designer-chart/src/main/java/com/fr/design/chartx/component/MultiTinyFormulaPane.java create mode 100644 designer-chart/src/main/java/com/fr/design/chartx/fields/AbstractCellDataFieldsPane.java create mode 100644 designer-chart/src/main/java/com/fr/design/chartx/fields/AbstractDataSetFieldsPane.java create mode 100644 designer-chart/src/main/java/com/fr/design/chartx/fields/diff/AbstractDataSetFieldsWithCustomFieldPane.java create mode 100644 designer-chart/src/main/java/com/fr/design/chartx/fields/diff/MultiCategoryCellDataFieldsPane.java create mode 100644 designer-chart/src/main/java/com/fr/design/chartx/fields/diff/MultiCategoryDataSetFieldsPane.java create mode 100644 designer-chart/src/main/java/com/fr/design/chartx/single/CellDataPane.java create mode 100644 designer-chart/src/main/java/com/fr/design/chartx/single/DataSetPane.java create mode 100644 designer-chart/src/main/java/com/fr/design/chartx/single/SingleDataPane.java diff --git a/designer-chart/src/main/java/com/fr/design/chartx/AbstractChartDataPane.java b/designer-chart/src/main/java/com/fr/design/chartx/AbstractChartDataPane.java new file mode 100644 index 000000000..61359d91b --- /dev/null +++ b/designer-chart/src/main/java/com/fr/design/chartx/AbstractChartDataPane.java @@ -0,0 +1,58 @@ +package com.fr.design.chartx; + +import com.fr.chart.chartattr.ChartCollection; +import com.fr.chartx.data.ChartDataDefinitionProvider; +import com.fr.design.gui.frpane.AttributeChangeListener; +import com.fr.design.mainframe.chart.gui.ChartDataPane; +import com.fr.plugin.chart.vanchart.VanChart; + +import java.awt.BorderLayout; + +/** + * Created by shine on 2019/4/15. + */ +public abstract class AbstractChartDataPane extends ChartDataPane { + + public AbstractChartDataPane(AttributeChangeListener listener) { + super(listener); + } + + protected abstract void populate(T t); + + protected abstract T update(); + + @Override + public void populate(ChartCollection collection) { + if (collection == null) { + return; + } + VanChart chart = collection.getSelectedChart(VanChart.class); + if (chart == null) { + return; + } + + this.removeAll(); + this.add(createContentPane(), BorderLayout.CENTER); + + ChartDataDefinitionProvider dataSetCollection = chart.getChartDataDefinition(); + + populate((T) dataSetCollection); + + this.initAllListeners(); + this.validate(); + } + + + @Override + public void update(ChartCollection collection) { + if (collection == null) { + return; + } + VanChart chart = collection.getSelectedChart(VanChart.class); + if (chart == null) { + return; + } + + chart.setChartDataDefinition(update()); + } +} diff --git a/designer-chart/src/main/java/com/fr/design/chartx/GanttChartDataPane.java b/designer-chart/src/main/java/com/fr/design/chartx/GanttChartDataPane.java new file mode 100644 index 000000000..e418e0c30 --- /dev/null +++ b/designer-chart/src/main/java/com/fr/design/chartx/GanttChartDataPane.java @@ -0,0 +1,39 @@ +package com.fr.design.chartx; + +import com.fr.chartx.data.GanttChartDataDefinition; +import com.fr.design.gui.frpane.AttributeChangeListener; +import com.fr.van.chart.map.designer.VanChartGroupPane; + +import javax.swing.JPanel; + +/** + * Created by shine on 2019/5/22. + */ +public class GanttChartDataPane extends AbstractChartDataPane { + + private MultiCategoryChartDataPane dataPane; + private MultiCategoryChartDataPane linkPane; + + @Override + protected JPanel createContentPane() { + dataPane = new MultiCategoryChartDataPane(listener); + linkPane = new MultiCategoryChartDataPane(listener); + return new VanChartGroupPane(new String[]{"data", "link"}, new JPanel[]{dataPane, linkPane}) { + }; + } + + public GanttChartDataPane(AttributeChangeListener listener) { + super(listener); + } + + @Override + protected void populate(GanttChartDataDefinition ganttChartDataDefinition) { + dataPane.populate(ganttChartDataDefinition.getDataDefinition()); + linkPane.populate(ganttChartDataDefinition.getLinkDefinition()); + } + + @Override + protected GanttChartDataDefinition update() { + return null; + } +} diff --git a/designer-chart/src/main/java/com/fr/design/chartx/MultiCategoryChartDataPane.java b/designer-chart/src/main/java/com/fr/design/chartx/MultiCategoryChartDataPane.java new file mode 100644 index 000000000..721fc8480 --- /dev/null +++ b/designer-chart/src/main/java/com/fr/design/chartx/MultiCategoryChartDataPane.java @@ -0,0 +1,43 @@ +package com.fr.design.chartx; + +import com.fr.chartx.data.AbstractDataDefinition; +import com.fr.design.chartx.fields.diff.MultiCategoryCellDataFieldsPane; +import com.fr.design.chartx.fields.diff.MultiCategoryDataSetFieldsPane; +import com.fr.design.chartx.single.SingleDataPane; +import com.fr.design.gui.frpane.AttributeChangeListener; + +import javax.swing.JPanel; + +/** + * Created by shine on 2019/5/22. + */ +public class MultiCategoryChartDataPane extends AbstractChartDataPane { + + private SingleDataPane singleDataPane; + + public MultiCategoryChartDataPane(AttributeChangeListener listener) { + super(listener); + } + + @Override + protected void populate(AbstractDataDefinition dataDefinition) { + singleDataPane.populateBean(dataDefinition); + } + + @Override + protected AbstractDataDefinition update() { + return singleDataPane.updateBean(); + } + + @Override + protected JPanel createContentPane() { + singleDataPane = createSingleDataPane(); + return singleDataPane; + } + + protected SingleDataPane createSingleDataPane() { + return new SingleDataPane(new MultiCategoryDataSetFieldsPane(), new MultiCategoryCellDataFieldsPane()); + } + + +} diff --git a/designer-chart/src/main/java/com/fr/design/chartx/WordCloundChartDataPane.java b/designer-chart/src/main/java/com/fr/design/chartx/WordCloundChartDataPane.java new file mode 100644 index 000000000..2f3bd39a0 --- /dev/null +++ b/designer-chart/src/main/java/com/fr/design/chartx/WordCloundChartDataPane.java @@ -0,0 +1,20 @@ +package com.fr.design.chartx; + +import com.fr.design.chartx.fields.diff.MultiCategoryCellDataFieldsPane; +import com.fr.design.chartx.fields.diff.MultiCategoryDataSetFieldsPane; +import com.fr.design.chartx.single.SingleDataPane; +import com.fr.design.gui.frpane.AttributeChangeListener; + +/** + * Created by shine on 2019/5/22. + */ +public class WordCloundChartDataPane extends MultiCategoryChartDataPane { + public WordCloundChartDataPane(AttributeChangeListener listener) { + super(listener); + } + + @Override + protected SingleDataPane createSingleDataPane() { + return new SingleDataPane(new MultiCategoryDataSetFieldsPane(), new MultiCategoryCellDataFieldsPane()); + } +} diff --git a/designer-chart/src/main/java/com/fr/design/chartx/component/AbstractCustomFieldComboBoxPane.java b/designer-chart/src/main/java/com/fr/design/chartx/component/AbstractCustomFieldComboBoxPane.java new file mode 100644 index 000000000..8453452d2 --- /dev/null +++ b/designer-chart/src/main/java/com/fr/design/chartx/component/AbstractCustomFieldComboBoxPane.java @@ -0,0 +1,368 @@ +package com.fr.design.chartx.component; + +import com.fr.data.util.function.AbstractDataFunction; +import com.fr.design.beans.FurtherBasicBeanPane; +import com.fr.design.event.UIObserverListener; +import com.fr.design.gui.frpane.UIComboBoxPane; +import com.fr.design.gui.frpane.UICorrelationPane; +import com.fr.design.gui.icombobox.UIComboBox; +import com.fr.design.gui.ilable.UILabel; +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.layout.TableLayout; +import com.fr.design.layout.TableLayoutHelper; +import com.fr.design.mainframe.chart.gui.ChartDataPane; +import com.fr.design.mainframe.chart.gui.data.CalculateComboBox; +import com.fr.design.mainframe.chart.gui.data.table.DataPaneHelper; +import com.fr.extended.chart.UIComboBoxWithNone; +import com.fr.general.GeneralUtils; +import com.fr.stable.StringUtils; + +import javax.swing.JComponent; +import javax.swing.JPanel; +import javax.swing.JTable; +import javax.swing.SwingConstants; +import java.awt.BorderLayout; +import java.awt.Component; +import java.awt.Dimension; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.ItemEvent; +import java.awt.event.ItemListener; +import java.util.ArrayList; +import java.util.List; + +/** + * Created by shine on 2018/9/12. + * 系列名使用字段名or字段值的抽象的pane 支持多种属性结构的存取 + */ +public abstract class AbstractCustomFieldComboBoxPane extends UIComboBoxPane { + 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 AbstractUseFieldValuePane useFieldValuePane; + + private AbstractCustomFieldNamePane customFieldNamePane; + + private List fieldList = new ArrayList(); + + @Override + protected void initLayout() { + this.setLayout(new BorderLayout(0, 6)); + JPanel northPane = new JPanel(new BorderLayout()); + northPane.add(jcb, BorderLayout.CENTER); + UILabel label = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Series_Name_From")); + label.setPreferredSize(new Dimension(ChartDataPane.LABEL_WIDTH, 20)); + northPane.add(label, BorderLayout.WEST); + this.add(northPane, BorderLayout.NORTH); + this.add(cardPane, BorderLayout.CENTER); + } + + @Override + protected List> initPaneList() { + useFieldValuePane = createUseFieldValuePane(); + customFieldNamePane = createCustomFieldNamePane(); + List> list = new ArrayList>(); + list.add(useFieldValuePane); + list.add(customFieldNamePane); + return list; + } + + protected abstract AbstractUseFieldValuePane createUseFieldValuePane(); + + protected abstract AbstractCustomFieldNamePane createCustomFieldNamePane(); + + @Override + protected String title4PopupWindow() { + return StringUtils.EMPTY; + } + + protected boolean valueComboBoxHasNone() { + return false; + } + + public void checkBoxUse(boolean hasUse) { + jcb.setEnabled(hasUse); + useFieldValuePane.checkBoxUse(hasUse); + } + + public void clearAllBoxList() { + useFieldValuePane.clearAllBoxList(); + fieldList.clear(); + } + + public void refreshBoxListWithSelectTableData(List columnNameList) { + useFieldValuePane.refreshBoxListWithSelectTableData(columnNameList); + fieldList = columnNameList; + } + + protected void populateCustomFieldNamePane(T t) { + customFieldNamePane.populateBean(t); + } + + protected void updateCustomFieldNamePane(T t) { + customFieldNamePane.updateBean(t); + } + + protected void populateUseFieldValuePane(T t) { + useFieldValuePane.populateBean(t); + } + + protected void updateUseFieldValuePane(T t) { + useFieldValuePane.updateBean(t); + } + + protected abstract class AbstractUseFieldValuePane extends FurtherBasicBeanPane { + private UIComboBox series; + private UIComboBox value; + private CalculateComboBox function; + + public AbstractUseFieldValuePane() { + initComponents(); + } + + private void initComponents() { + + series = new UIComboBox(); + value = valueComboBoxHasNone() ? new UIComboBoxWithNone() : new UIComboBox(); + + function = new CalculateComboBox(); + + Component[][] components = new Component[][]{ + new Component[]{new UILabel(HEADS[1], SwingConstants.LEFT), series}, + new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Use_Value"), SwingConstants.LEFT), value}, + new Component[]{new UILabel(HEADS[2], SwingConstants.LEFT), function}, + }; + + double p = TableLayout.PREFERRED; + double[] columnSize = {78, 122}; + double[] rowSize = {p, p, p}; + + JPanel panel = TableLayoutHelper.createTableLayoutPane(components, rowSize, columnSize); + + this.setLayout(new BorderLayout(0, 6)); + this.add(panel, BorderLayout.CENTER); + } + + public void checkBoxUse(boolean hasUse) { + series.setEnabled(hasUse); + value.setEnabled(hasUse); + function.setEnabled(hasUse); + } + + public void clearAllBoxList() { + DataPaneHelper.clearBoxItems(series); + DataPaneHelper.clearBoxItems(value); + } + + public void refreshBoxListWithSelectTableData(List columnNameList) { + DataPaneHelper.refreshBoxItems(series, columnNameList); + DataPaneHelper.refreshBoxItems(value, columnNameList); + } + + protected void populateSeries(String item) { + series.setSelectedItem(item); + } + + protected void populateValue(String item) { + value.setSelectedItem(item); + } + + protected void populateFunction(AbstractDataFunction _function) { + function.populateBean(_function); + } + + protected String updateSeries() { + return GeneralUtils.objectToString(series.getSelectedItem()); + } + + protected String updateValue() { + return GeneralUtils.objectToString(value.getSelectedItem()); + } + + protected AbstractDataFunction updateFunction() { + return function.updateBean(); + } + + @Override + public boolean accept(Object ob) { + return true; + } + + @Override + public void reset() { + } + + @Override + public String title4PopupWindow() { + return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Enable_Field_Value"); + } + + @Override + public T updateBean() { + return null; + } + } + + protected abstract class AbstractCustomFieldNamePane extends FurtherBasicBeanPane { + + private UICorrelationPane correlationPane; + + public AbstractCustomFieldNamePane() { + initComponents(); + } + + private void initComponents() { + + correlationPane = new UICorrelationPane(HEADS) { + @Override + protected ActionListener getAddButtonListener() { + return new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + tablePane.addLine(new String[]{StringUtils.EMPTY, StringUtils.EMPTY, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Use_None")}); + fireTargetChanged(); + } + }; + } + + public UITableEditor createUITableEditor() { + return new Editor() { + @Override + protected UICorrelationPane getParent() { + return correlationPane; + } + }; + } + }; + + this.setLayout(new BorderLayout()); + this.add(correlationPane, BorderLayout.CENTER); + + } + + + protected void populate(List list) { + correlationPane.populateBean(list); + } + + protected List update() { + return correlationPane.updateBean(); + } + + + @Override + public boolean accept(Object ob) { + return true; + } + + @Override + public void reset() { + } + + @Override + public String title4PopupWindow() { + return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Enable_Field_Name"); + } + + @Override + public T updateBean() { + return null; + } + } + + private abstract class Editor extends UITableEditor { + private JComponent editorComponent; + + protected abstract UICorrelationPane getParent(); + + @Override + public Object getCellEditorValue() { + if (editorComponent instanceof UIComboBox) { + return ((UIComboBox) editorComponent).getSelectedItem(); + } else if (editorComponent instanceof UITextField) { + return ((UITextField) editorComponent).getText(); + } else if (editorComponent instanceof CalculateComboBox) { + return ((CalculateComboBox) editorComponent).getSelectedItem(); + } + return super.getCellEditorValue(); + } + + @Override + public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, final int row, int column) { + + switch (column) { + case 0: + editorComponent = createComboBoxEdit(row, value); + break; + case 1: + editorComponent = createTextEdit(value); + break; + default: + editorComponent = createCalculateComboBox(value); + break; + + } + return editorComponent; + } + + private void setDefaultName(int row) { + UITable table = getParent().getTable(); + Object object = table.getValueAt(row, 0); + if (object != null) { + table.setValueAt(object, row, 1); + } + } + + private UIComboBox createComboBoxEdit(final int row, Object value) { + UIComboBox uiComboBox = new UIComboBox(fieldList.toArray()); + + uiComboBox.addItemListener(new ItemListener() { + public void itemStateChanged(ItemEvent e) { + getParent().stopCellEditing(); + getParent().fireTargetChanged(); + setDefaultName(row); + } + }); + + if (value != null && StringUtils.isNotEmpty(value.toString())) { + uiComboBox.getModel().setSelectedItem(value); + } else { + uiComboBox.getModel().setSelectedItem(value); + } + + return uiComboBox; + } + + private UITextField createTextEdit(Object value) { + UITextField uiTextField = new UITextField(); + if (value != null) { + uiTextField.setText(value.toString()); + } + + uiTextField.registerChangeListener(new UIObserverListener() { + @Override + public void doChange() { + getParent().fireTargetChanged(); + } + }); + + return uiTextField; + } + + private CalculateComboBox createCalculateComboBox(Object value) { + CalculateComboBox calculateComboBox = new CalculateComboBox(); + if (value != null) { + calculateComboBox.setSelectedItem(value); + } + calculateComboBox.addItemListener(new ItemListener() { + public void itemStateChanged(ItemEvent e) { + getParent().stopCellEditing(); + getParent().fireTargetChanged(); + } + }); + return calculateComboBox; + } + } + +} diff --git a/designer-chart/src/main/java/com/fr/design/chartx/component/AbstractMultiComponentPane.java b/designer-chart/src/main/java/com/fr/design/chartx/component/AbstractMultiComponentPane.java new file mode 100644 index 000000000..008a7d91c --- /dev/null +++ b/designer-chart/src/main/java/com/fr/design/chartx/component/AbstractMultiComponentPane.java @@ -0,0 +1,168 @@ +package com.fr.design.chartx.component; + +import com.fr.chartx.data.field.ColumnField; +import com.fr.design.gui.ibutton.UIButton; +import com.fr.design.gui.ilable.BoldFontTextLabel; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.mainframe.chart.gui.ChartDataPane; +import com.fr.general.IOUtils; + +import javax.swing.BoxLayout; +import javax.swing.JComponent; +import javax.swing.JPanel; +import java.awt.BorderLayout; +import java.awt.Dimension; +import java.awt.FlowLayout; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.ArrayList; +import java.util.List; + + +/** + * Created by shine on 2019/4/10. + * 一列组件 可增可删 + */ +public abstract class AbstractMultiComponentPane extends JPanel { + private static final int COM_W = 96; + private static final int H = 20; + private static final int ICON_W = 20; + + private JPanel boxPane; + private UIButton addButton; + + private T firstFieldComponent; + + private List categoryComponentList = new ArrayList(); + + + protected abstract T createFirstFieldComponent(); + + protected abstract T createOtherFieldComponent(); + + protected abstract void populateField(T component, ColumnField field); + + protected abstract void updateField(T component, ColumnField field); + + public AbstractMultiComponentPane() { + + UILabel label = new BoldFontTextLabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Style_Category")); + label.setPreferredSize(new Dimension(ChartDataPane.LABEL_WIDTH, ChartDataPane.LABEL_HEIGHT)); + + firstFieldComponent = createFirstFieldComponent(); + firstFieldComponent.setPreferredSize(new Dimension(COM_W, H)); + + addButton = new UIButton(IOUtils.readIcon("/com/fr/design/images/buttonicon/add.png")); + addButton.setPreferredSize(new Dimension(ICON_W, H)); + addButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + if (canAdd()) { + addNewComboBox(); + } + } + }); + + final JPanel panel = new JPanel(); + panel.setLayout(new FlowLayout(FlowLayout.RIGHT, 0, 2)); + + panel.add(label); + panel.add(firstFieldComponent); + panel.add(addButton); + + boxPane = new JPanel(); + boxPane.setLayout(new BoxLayout(boxPane, BoxLayout.Y_AXIS)); + + this.setLayout(new BorderLayout(4, 0)); + this.add(panel, BorderLayout.NORTH); + this.add(boxPane, BorderLayout.CENTER); + } + + private JPanel addComboBoxAndButtonToBox(T uiComboBox, UIButton uiButton) { + final JPanel panel = new JPanel(); + panel.setLayout(new FlowLayout(FlowLayout.RIGHT, 0, 2)); + + panel.add(uiComboBox); + panel.add(uiButton); + + boxPane.add(panel); + categoryComponentList.add(uiComboBox); + + return panel; + } + + private void addNewComboBox() { + final T comboBox = createOtherFieldComponent(); + comboBox.setPreferredSize(new Dimension(COM_W, H)); + + UIButton delButton = new UIButton(IOUtils.readIcon("com/fr/design/images/toolbarbtn/close.png")); + delButton.setPreferredSize(new Dimension(ICON_W, H)); + + final JPanel panel = addComboBoxAndButtonToBox(comboBox, delButton); + + delButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + boxPane.remove(panel); + categoryComponentList.remove(comboBox); + checkAddButton(); + relayoutPane(); + } + }); + + relayoutPane(); + checkAddButton(); + } + + private void relayoutPane() { + this.revalidate(); + } + + private void checkAddButton() { + addButton.setEnabled(canAdd()); + } + + private boolean canAdd() { + return categoryComponentList.size() < 3; + } + + public List componentList() { + List list = new ArrayList<>(categoryComponentList); + list.add(firstFieldComponent); + return list; + } + + public void populate(List categoryList) { + int comboBoxSize = categoryComponentList.size(), + len = categoryList.size(); + + if (len > 0) { + populateField(firstFieldComponent, categoryList.get(0)); + } + + for (int i = 1; i < len; i++) { + if (i > comboBoxSize) { + addNewComboBox(); + } + T comboBox = categoryComponentList.get(i - 1); + populateField(comboBox, categoryList.get(i)); + } + + checkAddButton(); + relayoutPane(); + } + + public void update(List categoryList) { + categoryList.clear(); + + ColumnField temp1 = new ColumnField(); + categoryList.add(temp1); + updateField(firstFieldComponent, temp1); + + for (T comboBox : categoryComponentList) { + ColumnField temp = new ColumnField(); + categoryList.add(temp); + updateField(comboBox, temp); + } + } +} diff --git a/designer-chart/src/main/java/com/fr/design/chartx/component/CustomFieldComboBoxPane.java b/designer-chart/src/main/java/com/fr/design/chartx/component/CustomFieldComboBoxPane.java new file mode 100644 index 000000000..8e6b98577 --- /dev/null +++ b/designer-chart/src/main/java/com/fr/design/chartx/component/CustomFieldComboBoxPane.java @@ -0,0 +1,58 @@ +package com.fr.design.chartx.component; + +import com.fr.chartx.data.field.CustomFieldValueColumnFields; + +/** + * Created by shine on 2019/5/17. + */ +public class CustomFieldComboBoxPane extends AbstractCustomFieldComboBoxPane { + + @Override + protected AbstractUseFieldValuePane createUseFieldValuePane() { + return new UseFieldValuePane(); + } + + @Override + protected AbstractCustomFieldNamePane createCustomFieldNamePane() { + return new CustomFieldNamePane(); + } + + @Override + public void populateBean(CustomFieldValueColumnFields ob) { + if (ob.isCustomFieldValue()) { + populateCustomFieldNamePane(ob); + jcb.setSelectedIndex(1); + } else { + populateUseFieldValuePane(ob); + jcb.setSelectedIndex(0); + } + } + + @Override + public void updateBean(CustomFieldValueColumnFields ob) { + if (jcb.getSelectedIndex() == 0) { + ob.setCustomFieldValue(false); + updateUseFieldValuePane(ob); + } else { + ob.setCustomFieldValue(true); + updateCustomFieldNamePane(ob); + } + } + + private class UseFieldValuePane extends AbstractUseFieldValuePane { + + @Override + public void populateBean(CustomFieldValueColumnFields ob) { + + } + } + + private class CustomFieldNamePane extends AbstractCustomFieldNamePane { + + @Override + public void populateBean(CustomFieldValueColumnFields ob) { + + } + } + +} diff --git a/designer-chart/src/main/java/com/fr/design/chartx/component/MultiComboBoxPane.java b/designer-chart/src/main/java/com/fr/design/chartx/component/MultiComboBoxPane.java new file mode 100644 index 000000000..37a110b7d --- /dev/null +++ b/designer-chart/src/main/java/com/fr/design/chartx/component/MultiComboBoxPane.java @@ -0,0 +1,32 @@ +package com.fr.design.chartx.component; + +import com.fr.chartx.data.field.ColumnField; +import com.fr.design.chartx.fields.AbstractDataSetFieldsPane; +import com.fr.design.gui.icombobox.UIComboBox; +import com.fr.extended.chart.UIComboBoxWithNone; + +/** + * Created by shine on 2019/4/12. + */ +public class MultiComboBoxPane extends AbstractMultiComponentPane { + + @Override + protected UIComboBox createFirstFieldComponent() { + return new UIComboBoxWithNone(); + } + + @Override + protected UIComboBox createOtherFieldComponent() { + return new UIComboBox(); + } + + @Override + protected void populateField(UIComboBox component, ColumnField field) { + AbstractDataSetFieldsPane.populateField(component, field); + } + + @Override + protected void updateField(UIComboBox component, ColumnField field) { + AbstractDataSetFieldsPane.updateField(component, field); + } +} diff --git a/designer-chart/src/main/java/com/fr/design/chartx/component/MultiTinyFormulaPane.java b/designer-chart/src/main/java/com/fr/design/chartx/component/MultiTinyFormulaPane.java new file mode 100644 index 000000000..5e56b967c --- /dev/null +++ b/designer-chart/src/main/java/com/fr/design/chartx/component/MultiTinyFormulaPane.java @@ -0,0 +1,31 @@ +package com.fr.design.chartx.component; + +import com.fr.chartx.data.field.ColumnField; +import com.fr.design.chartx.fields.AbstractCellDataFieldsPane; +import com.fr.design.formula.TinyFormulaPane; + +/** + * Created by shine on 2019/4/12. + */ +public class MultiTinyFormulaPane extends AbstractMultiComponentPane { + @Override + protected TinyFormulaPane createFirstFieldComponent() { + return new TinyFormulaPane(); + } + + @Override + protected TinyFormulaPane createOtherFieldComponent() { + return new TinyFormulaPane(); + } + + @Override + protected void populateField(TinyFormulaPane component, ColumnField field) { + AbstractCellDataFieldsPane.populateField(component, field); + } + + @Override + protected void updateField(TinyFormulaPane component, ColumnField field) { + AbstractCellDataFieldsPane.updateField(component, field); + + } +} diff --git a/designer-chart/src/main/java/com/fr/design/chartx/fields/AbstractCellDataFieldsPane.java b/designer-chart/src/main/java/com/fr/design/chartx/fields/AbstractCellDataFieldsPane.java new file mode 100644 index 000000000..98400ed7a --- /dev/null +++ b/designer-chart/src/main/java/com/fr/design/chartx/fields/AbstractCellDataFieldsPane.java @@ -0,0 +1,93 @@ +package com.fr.design.chartx.fields; + +import com.fr.chartx.data.field.AbstractColumnFieldCollection; +import com.fr.chartx.data.field.ColumnField; +import com.fr.design.beans.BasicBeanPane; +import com.fr.design.formula.TinyFormulaPane; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.layout.TableLayout; +import com.fr.design.layout.TableLayoutHelper; +import com.fr.design.mainframe.chart.gui.ChartDataPane; +import com.fr.stable.StringUtils; + +import javax.swing.BorderFactory; +import javax.swing.JPanel; +import javax.swing.SwingConstants; +import java.awt.BorderLayout; +import java.awt.Component; +import java.util.Arrays; + +/** + * Created by shine on 2019/5/16. + * 单元格数据源 具体有哪些字段的一个抽象pane + */ +public abstract class AbstractCellDataFieldsPane extends BasicBeanPane { + + public AbstractCellDataFieldsPane() { + initComponents(); + } + + protected void initComponents() { + + this.setLayout(new BorderLayout(0, 6)); + + this.add(addNorthPane(), BorderLayout.NORTH); + this.add(addCenterPane(), BorderLayout.CENTER); + this.add(addSouthPane(), BorderLayout.SOUTH); + + this.setBorder(BorderFactory.createEmptyBorder(0, 15, 0, 8)); + } + + protected JPanel addCenterPane() { + String[] labels = fieldLabels(); + Component[] formulaPanes = fieldComponents(); + + int len = Math.min(labels.length, formulaPanes.length); + + Component[][] components = new Component[len][2]; + for (int i = 0; i < len; i++) { + components[i] = new Component[]{new UILabel(labels[i], SwingConstants.LEFT), formulaPanes[i]}; + } + + + double p = TableLayout.PREFERRED; + double[] columnSize = {ChartDataPane.LABEL_WIDTH, 124}; + double[] rowSize = new double[len]; + Arrays.fill(rowSize, p); + + return TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, 0, 6); + } + + + protected JPanel addNorthPane() { + return new JPanel(); + } + + protected JPanel addSouthPane() { + return new JPanel(); + } + + protected Component[] fieldComponents() { + return formulaPanes(); + } + + protected abstract String[] fieldLabels(); + + protected abstract TinyFormulaPane[] formulaPanes(); + + @Override + public abstract T updateBean(); + + public static void populateField(TinyFormulaPane formulaPane, ColumnField field) { + formulaPane.populateBean(field.getFieldName()); + } + + public static void updateField(TinyFormulaPane formulaPane, ColumnField field) { + field.setFieldName(formulaPane.updateBean()); + } + + @Override + protected String title4PopupWindow() { + return StringUtils.EMPTY; + } +} diff --git a/designer-chart/src/main/java/com/fr/design/chartx/fields/AbstractDataSetFieldsPane.java b/designer-chart/src/main/java/com/fr/design/chartx/fields/AbstractDataSetFieldsPane.java new file mode 100644 index 000000000..84c8401c1 --- /dev/null +++ b/designer-chart/src/main/java/com/fr/design/chartx/fields/AbstractDataSetFieldsPane.java @@ -0,0 +1,142 @@ +package com.fr.design.chartx.fields; + +import com.fr.chartx.data.field.AbstractColumnFieldCollection; +import com.fr.chartx.data.field.ColumnField; +import com.fr.data.util.function.AbstractDataFunction; +import com.fr.design.beans.BasicBeanPane; +import com.fr.design.gui.icombobox.UIComboBox; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.layout.TableLayout; +import com.fr.design.layout.TableLayoutHelper; +import com.fr.design.mainframe.chart.gui.ChartDataPane; +import com.fr.design.mainframe.chart.gui.data.CalculateComboBox; +import com.fr.design.mainframe.chart.gui.data.table.DataPaneHelper; +import com.fr.general.GeneralUtils; + +import javax.swing.BorderFactory; +import javax.swing.JPanel; +import javax.swing.SwingConstants; +import java.awt.BorderLayout; +import java.awt.Component; +import java.util.Arrays; +import java.util.List; + +import static com.fr.design.mainframe.chart.gui.data.table.DataPaneHelper.refreshBoxItems; + +/** + * Created by shine on 2019/5/16. + * 数据集数据源 具体有哪些字段的一个抽象pane + */ +public abstract class AbstractDataSetFieldsPane extends BasicBeanPane { + + public AbstractDataSetFieldsPane() { + initComponents(); + } + + protected void initComponents() { + + this.setLayout(new BorderLayout(0, 4)); + this.setBorder(BorderFactory.createEmptyBorder(2, 24, 0, 15)); + + JPanel north = createNorthPane(), + center = createCenterPane(), + south = createSouthPane(); + + if (north != null) { + this.add(north, BorderLayout.NORTH); + } + + if (center != null) { + this.add(center, BorderLayout.CENTER); + } + + if (south != null) { + this.add(south, BorderLayout.SOUTH); + } + } + + protected JPanel createNorthPane() { + return null; + } + + protected JPanel createCenterPane() { + String[] labels = fieldLabels(); + Component[] fieldComponents = fieldComponents(); + + int len = Math.min(labels.length, fieldComponents.length); + + if (len == 0) { + return null; + } + + Component[][] components = new Component[len][2]; + for (int i = 0; i < len; i++) { + components[i] = new Component[]{new UILabel(labels[i], SwingConstants.LEFT), fieldComponents[i]}; + } + + double p = TableLayout.PREFERRED; + double[] columnSize = {ChartDataPane.LABEL_WIDTH, 122}; + double[] rowSize = new double[len]; + Arrays.fill(rowSize, p); + + return TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, 0, 6); + } + + protected JPanel createSouthPane() { + return null; + } + + protected Component[] fieldComponents() { + return filedComboBoxes(); + } + + protected abstract String[] fieldLabels(); + + protected abstract UIComboBox[] filedComboBoxes(); + + public void checkBoxUse(boolean hasUse) { + for (Component component : fieldComponents()) { + component.setEnabled(hasUse); + } + } + + public void clearAllBoxList() { + for (UIComboBox comboBox : filedComboBoxes()) { + DataPaneHelper.clearBoxItems(comboBox); + } + } + + public void refreshBoxListWithSelectTableData(List columnNameList) { + for (UIComboBox comboBox : filedComboBoxes()) { + refreshBoxItems(comboBox, columnNameList); + } + } + + @Override + public abstract T updateBean(); + + public static void populateField(UIComboBox comboBox, ColumnField field) { + populateFunctionField(comboBox, null, field); + } + + public static void updateField(UIComboBox comboBox, ColumnField field) { + updateFunctionField(comboBox, null, field); + } + + protected static void populateFunctionField(UIComboBox comboBox, CalculateComboBox calculateComboBox, ColumnField field) { + comboBox.setSelectedItem(field.getFieldName()); + if (calculateComboBox != null) { + calculateComboBox.populateBean((AbstractDataFunction) field.getDataFunction()); + } + } + + protected static void updateFunctionField(UIComboBox comboBox, CalculateComboBox calculateComboBox, ColumnField field) { + field.setFieldName(GeneralUtils.objectToString(comboBox.getSelectedItem())); + if (calculateComboBox != null) { + field.setDataFunction(calculateComboBox.updateBean()); + } else { + field.setDataFunction(null); + } + } + +} diff --git a/designer-chart/src/main/java/com/fr/design/chartx/fields/diff/AbstractDataSetFieldsWithCustomFieldPane.java b/designer-chart/src/main/java/com/fr/design/chartx/fields/diff/AbstractDataSetFieldsWithCustomFieldPane.java new file mode 100644 index 000000000..9b0418c30 --- /dev/null +++ b/designer-chart/src/main/java/com/fr/design/chartx/fields/diff/AbstractDataSetFieldsWithCustomFieldPane.java @@ -0,0 +1,60 @@ +package com.fr.design.chartx.fields.diff; + +import com.fr.chartx.data.field.diff.AbstractColumnFieldCollectionWithCustomField; +import com.fr.design.chartx.component.CustomFieldComboBoxPane; +import com.fr.design.chartx.fields.AbstractDataSetFieldsPane; + +import javax.swing.JPanel; +import java.awt.BorderLayout; +import java.util.List; + +/** + * Created by shine on 2019/5/16. + * 带有 自定义系列名(fr表现为 系列名使用字段名) 的字段集合 的一个pane + */ +public abstract class AbstractDataSetFieldsWithCustomFieldPane + extends AbstractDataSetFieldsPane { + + private CustomFieldComboBoxPane customFieldComboBoxPane; + + @Override + protected JPanel createCenterPane() { + JPanel normalCenter = super.createCenterPane(); + customFieldComboBoxPane = new CustomFieldComboBoxPane(); + + if (normalCenter != null) { + JPanel panel = new JPanel(new BorderLayout()); + panel.add(normalCenter, BorderLayout.CENTER); + panel.add(customFieldComboBoxPane, BorderLayout.SOUTH); + return panel; + } else { + return customFieldComboBoxPane; + } + } + + @Override + public void checkBoxUse(boolean hasUse) { + super.checkBoxUse(hasUse); + customFieldComboBoxPane.checkBoxUse(hasUse); + } + + @Override + public void clearAllBoxList() { + super.clearAllBoxList(); + customFieldComboBoxPane.clearAllBoxList(); + } + + @Override + public void refreshBoxListWithSelectTableData(List columnNameList) { + super.refreshBoxListWithSelectTableData(columnNameList); + customFieldComboBoxPane.refreshBoxListWithSelectTableData(columnNameList); + } + + protected void populateCustomPane(AbstractColumnFieldCollectionWithCustomField t) { + customFieldComboBoxPane.populateBean(t.getCustomFieldValueColumnFields()); + } + + protected void updateCustomPane(AbstractColumnFieldCollectionWithCustomField t) { + customFieldComboBoxPane.updateBean(t.getCustomFieldValueColumnFields()); + } +} diff --git a/designer-chart/src/main/java/com/fr/design/chartx/fields/diff/MultiCategoryCellDataFieldsPane.java b/designer-chart/src/main/java/com/fr/design/chartx/fields/diff/MultiCategoryCellDataFieldsPane.java new file mode 100644 index 000000000..755f4a8c5 --- /dev/null +++ b/designer-chart/src/main/java/com/fr/design/chartx/fields/diff/MultiCategoryCellDataFieldsPane.java @@ -0,0 +1,65 @@ +package com.fr.design.chartx.fields.diff; + +import com.fr.chartx.data.field.ColumnField; +import com.fr.chartx.data.field.diff.MultiCategoryColumnFieldCollection; +import com.fr.design.chartx.component.MultiTinyFormulaPane; +import com.fr.design.chartx.fields.AbstractCellDataFieldsPane; +import com.fr.design.formula.TinyFormulaPane; + +import javax.swing.JPanel; +import java.util.List; + +/** + * Created by shine on 2019/4/12. + */ +public class MultiCategoryCellDataFieldsPane extends AbstractCellDataFieldsPane { + + private MultiTinyFormulaPane multiCategoryPane; + + private void createMultiFormulaPane() { + if (multiCategoryPane == null) { + multiCategoryPane = new MultiTinyFormulaPane(); + } + } + + @Override + protected JPanel addNorthPane() { + + createMultiFormulaPane(); + + return multiCategoryPane; + } + + @Override + protected String[] fieldLabels() { + return new String[0]; + } + + @Override + protected TinyFormulaPane[] formulaPanes() { + + createMultiFormulaPane(); + + List list = multiCategoryPane.componentList(); + return list.toArray(new TinyFormulaPane[list.size()]); + } + + @Override + public void populateBean(MultiCategoryColumnFieldCollection ob) { + + List categoryList = ob.getCategoryList(); + + multiCategoryPane.populate(categoryList); + } + + @Override + public MultiCategoryColumnFieldCollection updateBean() { + + MultiCategoryColumnFieldCollection fieldCollection = new MultiCategoryColumnFieldCollection(); + List categoryList = fieldCollection.getCategoryList(); + + multiCategoryPane.update(categoryList); + + return fieldCollection; + } +} diff --git a/designer-chart/src/main/java/com/fr/design/chartx/fields/diff/MultiCategoryDataSetFieldsPane.java b/designer-chart/src/main/java/com/fr/design/chartx/fields/diff/MultiCategoryDataSetFieldsPane.java new file mode 100644 index 000000000..f3828361b --- /dev/null +++ b/designer-chart/src/main/java/com/fr/design/chartx/fields/diff/MultiCategoryDataSetFieldsPane.java @@ -0,0 +1,69 @@ +package com.fr.design.chartx.fields.diff; + +import com.fr.chartx.data.field.ColumnField; +import com.fr.chartx.data.field.diff.MultiCategoryColumnFieldCollection; +import com.fr.design.chartx.component.MultiComboBoxPane; +import com.fr.design.gui.icombobox.UIComboBox; +import com.fr.stable.StringUtils; + +import javax.swing.JPanel; +import java.util.List; + + +/** + * Created by shine on 2019/4/10. + */ +public class MultiCategoryDataSetFieldsPane extends AbstractDataSetFieldsWithCustomFieldPane { + + private MultiComboBoxPane multiCategoryPane; + + @Override + protected String[] fieldLabels() { + return new String[0]; + } + + @Override + protected UIComboBox[] filedComboBoxes() { + List list = initMultiCategoryPane().componentList(); + return list.toArray(new UIComboBox[list.size()]); + } + + private MultiComboBoxPane initMultiCategoryPane() { + if (multiCategoryPane == null) { + multiCategoryPane = new MultiComboBoxPane(); + } + return multiCategoryPane; + } + + @Override + protected JPanel createNorthPane() { + return initMultiCategoryPane(); + } + + @Override + public void populateBean(MultiCategoryColumnFieldCollection ob) { + List categoryList = ob.getCategoryList(); + + multiCategoryPane.populate(categoryList); + + populateCustomPane(ob); + } + + @Override + public MultiCategoryColumnFieldCollection updateBean() { + + MultiCategoryColumnFieldCollection columnFieldCollection = new MultiCategoryColumnFieldCollection(); + List categoryList = columnFieldCollection.getCategoryList(); + + multiCategoryPane.update(categoryList); + + updateCustomPane(columnFieldCollection); + + return columnFieldCollection; + } + + @Override + protected String title4PopupWindow() { + return StringUtils.EMPTY; + } +} diff --git a/designer-chart/src/main/java/com/fr/design/chartx/single/CellDataPane.java b/designer-chart/src/main/java/com/fr/design/chartx/single/CellDataPane.java new file mode 100644 index 000000000..f0a4ef0af --- /dev/null +++ b/designer-chart/src/main/java/com/fr/design/chartx/single/CellDataPane.java @@ -0,0 +1,56 @@ +package com.fr.design.chartx.single; + +import com.fr.chartx.data.CellDataDefinition; +import com.fr.design.beans.FurtherBasicBeanPane; +import com.fr.design.chartx.fields.AbstractCellDataFieldsPane; +import com.fr.design.i18n.Toolkit; + +import java.awt.BorderLayout; + +/** + * Created by shine on 2019/5/21. + */ +public class CellDataPane extends FurtherBasicBeanPane { + + private AbstractCellDataFieldsPane cellDataFieldsPane; + + public CellDataPane(AbstractCellDataFieldsPane cellDataFieldsPane) { + initComps(cellDataFieldsPane); + } + + private void initComps(AbstractCellDataFieldsPane cellDataFieldsPane) { + this.cellDataFieldsPane = cellDataFieldsPane; + + this.setLayout(new BorderLayout()); + this.add(cellDataFieldsPane, BorderLayout.CENTER); + } + + @Override + public String title4PopupWindow() { + return Toolkit.i18nText("Fine-Design_Chart_Cell_Data"); + } + + + @Override + public boolean accept(Object ob) { + return ob instanceof CellDataDefinition; + } + + @Override + public void reset() { + this.removeAll(); + } + + @Override + public void populateBean(CellDataDefinition ob) { + cellDataFieldsPane.populateBean(ob.getColumnFieldCollection()); + } + + @Override + public CellDataDefinition updateBean() { + CellDataDefinition cellDataDefinition = new CellDataDefinition(); + cellDataDefinition.setColumnFieldCollection(cellDataFieldsPane.updateBean()); + + return cellDataDefinition; + } +} diff --git a/designer-chart/src/main/java/com/fr/design/chartx/single/DataSetPane.java b/designer-chart/src/main/java/com/fr/design/chartx/single/DataSetPane.java new file mode 100644 index 000000000..98394c31a --- /dev/null +++ b/designer-chart/src/main/java/com/fr/design/chartx/single/DataSetPane.java @@ -0,0 +1,121 @@ +package com.fr.design.chartx.single; + +import com.fr.chartx.data.DataSetDefinition; +import com.fr.data.impl.NameTableData; +import com.fr.design.beans.FurtherBasicBeanPane; +import com.fr.design.chartx.fields.AbstractDataSetFieldsPane; +import com.fr.design.data.tabledata.wrapper.TableDataWrapper; +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.DatabaseTableDataPane; +import com.fr.design.utils.gui.UIComponentUtils; + +import java.awt.BorderLayout; +import java.awt.Dimension; +import java.util.List; + +/** + * Created by shine on 2019/5/21. + */ +public class DataSetPane extends FurtherBasicBeanPane { + private static final int TABLE_DATA_LABEL_LINE_WRAP_WIDTH = 65; + private static final int TABLE_DATA_PANE_WIDTH = 246; + + private DatabaseTableDataPane tableDataPane; + + private AbstractDataSetFieldsPane dataSetFieldsPane; + + public DataSetPane(AbstractDataSetFieldsPane dataSetFieldsPane) { + initComps(dataSetFieldsPane); + } + + private void initComps(AbstractDataSetFieldsPane dataSetFieldsPane) { + UILabel label = new BoldFontTextLabel(Toolkit.i18nText("Fine-Design_Chart_Table_Data")); + UIComponentUtils.setLineWrap(label, TABLE_DATA_LABEL_LINE_WRAP_WIDTH); + UIComponentUtils.setPreferedWidth(label, ChartDataPane.LABEL_WIDTH); + + tableDataPane = new DatabaseTableDataPane(label) { + @Override + protected void userEvent() { + refreshBoxList(); + checkBoxUse(); + } + }; + tableDataPane.setPreferredSize(new Dimension(TABLE_DATA_PANE_WIDTH, tableDataPane.getPreferredSize().height)); + + this.dataSetFieldsPane = dataSetFieldsPane; + + this.setLayout(new BorderLayout()); + this.add(tableDataPane, BorderLayout.NORTH); + this.add(dataSetFieldsPane, BorderLayout.CENTER); + } + + /** + * 检查box是否可用. + */ + public void checkBoxUse() { + TableDataWrapper dataWrap = tableDataPane.getTableDataWrapper(); + + if (dataSetFieldsPane != null) { + dataSetFieldsPane.checkBoxUse(dataWrap != null); + } + } + + /** + * 刷新字段下拉列表 + */ + private void refreshBoxList() { + TableDataWrapper dataWrap = tableDataPane.getTableDataWrapper(); + + if (dataWrap == null) { + return; + } + + List columnNameList = dataWrap.calculateColumnNameList(); + + if (dataSetFieldsPane != null) { + dataSetFieldsPane.refreshBoxListWithSelectTableData(columnNameList); + } + } + + @Override + public boolean accept(Object ob) { + return ob instanceof DataSetDefinition; + } + + @Override + public String title4PopupWindow() { + return Toolkit.i18nText("Fine-Design_Chart_TableData"); + } + + @Override + public void reset() { + this.removeAll(); + } + + @Override + public void populateBean(DataSetDefinition ob) { + refreshBoxList(); + checkBoxUse(); + + tableDataPane.populateBean(ob.getNameTableData()); + + dataSetFieldsPane.populateBean(ob.getColumnFieldCollection()); + } + + @Override + public DataSetDefinition updateBean() { + DataSetDefinition dataSetDefinition = new DataSetDefinition(); + + TableDataWrapper tableDataWrapper = tableDataPane.getTableDataWrapper(); + if (tableDataWrapper != null) { + dataSetDefinition.setNameTableData(new NameTableData(tableDataWrapper.getTableDataName())); + } + + dataSetDefinition.setColumnFieldCollection(dataSetFieldsPane.updateBean()); + + return dataSetDefinition; + } +} diff --git a/designer-chart/src/main/java/com/fr/design/chartx/single/SingleDataPane.java b/designer-chart/src/main/java/com/fr/design/chartx/single/SingleDataPane.java new file mode 100644 index 000000000..a4e694998 --- /dev/null +++ b/designer-chart/src/main/java/com/fr/design/chartx/single/SingleDataPane.java @@ -0,0 +1,90 @@ +package com.fr.design.chartx.single; + +import com.fr.chartx.data.AbstractDataDefinition; +import com.fr.design.beans.BasicBeanPane; +import com.fr.design.beans.FurtherBasicBeanPane; +import com.fr.design.chartx.fields.AbstractCellDataFieldsPane; +import com.fr.design.chartx.fields.AbstractDataSetFieldsPane; +import com.fr.design.constants.LayoutConstants; +import com.fr.design.gui.frpane.UIComboBoxPane; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.mainframe.chart.gui.ChartDataPane; +import com.fr.design.utils.gui.GUICoreUtils; + +import javax.swing.BorderFactory; +import javax.swing.JPanel; +import java.awt.BorderLayout; +import java.awt.Component; +import java.awt.Dimension; +import java.util.ArrayList; +import java.util.List; + +/** + * Created by shine on 2019/5/21. + */ +public class SingleDataPane extends BasicBeanPane { + + private UIComboBoxPane comboBoxPane; + + private DataSetPane dataSetPane; + + private CellDataPane cellDataPane; + + public SingleDataPane(AbstractDataSetFieldsPane dataSetFieldsPane, AbstractCellDataFieldsPane cellDataFieldsPane) { + initComps(dataSetFieldsPane, cellDataFieldsPane); + } + + private void initComps(AbstractDataSetFieldsPane dataSetFieldsPane, AbstractCellDataFieldsPane cellDataFieldsPane) { + + cellDataPane = new CellDataPane(cellDataFieldsPane); + dataSetPane = new DataSetPane(dataSetFieldsPane); + + comboBoxPane = new UIComboBoxPane() { + @Override + protected List> initPaneList() { + List> list = new ArrayList>(); + list.add(dataSetPane); + list.add(cellDataPane); + return list; + } + + protected void initLayout() { + this.setLayout(new BorderLayout(LayoutConstants.HGAP_LARGE, 6)); + JPanel northPane = new JPanel(new BorderLayout(LayoutConstants.HGAP_LARGE, 0)); + northPane.add(jcb, BorderLayout.CENTER); + UILabel label1 = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Data_Source")); + label1.setPreferredSize(new Dimension(ChartDataPane.LABEL_WIDTH, ChartDataPane.LABEL_HEIGHT)); + northPane.add(GUICoreUtils.createBorderLayoutPane(new Component[]{jcb, null, null, label1, null})); + northPane.setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 8)); + this.add(northPane, BorderLayout.NORTH); + this.add(cardPane, BorderLayout.CENTER); + + } + + @Override + protected String title4PopupWindow() { + return null; + } + }; + + + this.setLayout(new BorderLayout()); + this.add(comboBoxPane, BorderLayout.CENTER); + + } + + @Override + public void populateBean(AbstractDataDefinition ob) { + comboBoxPane.populateBean(ob); + } + + @Override + public AbstractDataDefinition updateBean() { + return comboBoxPane.updateBean(); + } + + @Override + protected String title4PopupWindow() { + return null; + } +} diff --git a/designer-chart/src/main/java/com/fr/extended/chart/ExtendedCustomFieldComboBoxPane.java b/designer-chart/src/main/java/com/fr/extended/chart/ExtendedCustomFieldComboBoxPane.java index ceeea71c2..cc2849765 100644 --- a/designer-chart/src/main/java/com/fr/extended/chart/ExtendedCustomFieldComboBoxPane.java +++ b/designer-chart/src/main/java/com/fr/extended/chart/ExtendedCustomFieldComboBoxPane.java @@ -2,101 +2,34 @@ package com.fr.extended.chart; import com.fr.base.Utils; import com.fr.data.util.function.AbstractDataFunction; -import com.fr.design.beans.FurtherBasicBeanPane; -import com.fr.design.event.UIObserverListener; -import com.fr.design.gui.frpane.UIComboBoxPane; -import com.fr.design.gui.frpane.UICorrelationPane; -import com.fr.design.gui.icombobox.UIComboBox; -import com.fr.design.gui.ilable.UILabel; -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.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; -import com.fr.design.mainframe.chart.gui.ChartDataPane; -import com.fr.design.mainframe.chart.gui.data.CalculateComboBox; +import com.fr.design.chartx.component.AbstractCustomFieldComboBoxPane; import com.fr.design.mainframe.chart.gui.data.table.DataPaneHelper; -import com.fr.stable.StringUtils; -import javax.swing.JComponent; -import javax.swing.JPanel; -import javax.swing.JTable; -import javax.swing.SwingConstants; -import java.awt.BorderLayout; -import java.awt.Component; -import java.awt.Dimension; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.ItemEvent; -import java.awt.event.ItemListener; import java.util.ArrayList; import java.util.List; /** - * Created by shine on 2018/9/12. + * Created by shine on 2019/5/16. */ -public class ExtendedCustomFieldComboBoxPane extends UIComboBoxPane { - 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 UseFieldValuePane useFieldValuePane; - - private CustomFieldNamePane customFieldNamePane; - - private List fieldList = new ArrayList(); - +public class ExtendedCustomFieldComboBoxPane extends AbstractCustomFieldComboBoxPane { @Override - protected void initLayout() { - this.setLayout(new BorderLayout(0, 6)); - JPanel northPane = new JPanel(new BorderLayout()); - northPane.add(jcb, BorderLayout.CENTER); - UILabel label = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Series_Name_From")); - label.setPreferredSize(new Dimension(ChartDataPane.LABEL_WIDTH, 20)); - northPane.add(label, BorderLayout.WEST); - this.add(northPane, BorderLayout.NORTH); - this.add(cardPane, BorderLayout.CENTER); + protected AbstractUseFieldValuePane createUseFieldValuePane() { + return new ExtendedUseFieldValuePane(); } @Override - protected List> initPaneList() { - useFieldValuePane = new UseFieldValuePane(); - customFieldNamePane = new CustomFieldNamePane(); - List> list = new ArrayList>(); - list.add(useFieldValuePane); - list.add(customFieldNamePane); - return list; + protected AbstractCustomFieldNamePane createCustomFieldNamePane() { + return new ExtendedCustomFieldNamePane(); } - @Override - protected String title4PopupWindow() { - return StringUtils.EMPTY; - } - - protected boolean valueComboBoxHasNone() { - return false; - } - - public void checkBoxUse(boolean hasUse) { - jcb.setEnabled(hasUse); - useFieldValuePane.checkBoxUse(hasUse); - } - - public void clearAllBoxList() { - useFieldValuePane.clearAllBoxList(); - fieldList.clear(); - } - - protected void refreshBoxListWithSelectTableData(List columnNameList) { - useFieldValuePane.refreshBoxListWithSelectTableData(columnNameList); - fieldList = columnNameList; - } @Override public void populateBean(AbstractDataConfig ob) { if (ob.isCustomName()) { - customFieldNamePane.populateBean(ob); + populateCustomFieldNamePane(ob); jcb.setSelectedIndex(1); } else { - useFieldValuePane.populateBean(ob); + populateUseFieldValuePane(ob); jcb.setSelectedIndex(0); } } @@ -105,68 +38,22 @@ public class ExtendedCustomFieldComboBoxPane extends UIComboBoxPane { - private UIComboBox series; - private UIComboBox value; - private CalculateComboBox function; - - private UseFieldValuePane() { - initComponents(); - } - - private void initComponents() { - - series = new UIComboBox(); - value = valueComboBoxHasNone() ? new UIComboBoxWithNone() : new UIComboBox(); - - function = new CalculateComboBox(); - - Component[][] components = new Component[][]{ - new Component[]{new UILabel(HEADS[1], SwingConstants.LEFT), series}, - new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Use_Value"), SwingConstants.LEFT), value}, - new Component[]{new UILabel(HEADS[2], SwingConstants.LEFT), function}, - }; - - double p = TableLayout.PREFERRED; - double[] columnSize = {78, 122}; - double[] rowSize = {p, p, p}; - - JPanel panel = TableLayoutHelper.createTableLayoutPane(components, rowSize, columnSize); - - this.setLayout(new BorderLayout(0, 6)); - this.add(panel, BorderLayout.CENTER); - } - - public void checkBoxUse(boolean hasUse) { - series.setEnabled(hasUse); - value.setEnabled(hasUse); - function.setEnabled(hasUse); - } - - public void clearAllBoxList() { - DataPaneHelper.clearBoxItems(series); - DataPaneHelper.clearBoxItems(value); - } - - public void refreshBoxListWithSelectTableData(List columnNameList) { - DataPaneHelper.refreshBoxItems(series, columnNameList); - DataPaneHelper.refreshBoxItems(value, columnNameList); - } + private class ExtendedUseFieldValuePane extends AbstractUseFieldValuePane { @Override public void populateBean(AbstractDataConfig ob) { List list = ob.getCustomFields(); if (list.size() == 2) { - series.setSelectedItem(list.get(0).getFieldName()); - value.setSelectedItem(list.get(1).getFieldName()); - function.populateBean((AbstractDataFunction) list.get(1).getDataFunction()); + populateSeries(list.get(0).getFieldName()); + populateValue(list.get(1).getFieldName()); + populateFunction((AbstractDataFunction) list.get(1).getDataFunction()); } } @@ -174,70 +61,18 @@ public class ExtendedCustomFieldComboBoxPane extends UIComboBoxPane list = new ArrayList(); - list.add(new ExtendedField(Utils.objectToString(series.getSelectedItem()))); - ExtendedField field = new ExtendedField(Utils.objectToString(value.getSelectedItem())); - field.setDataFunction(function.updateBean()); + list.add(new ExtendedField(updateSeries())); + ExtendedField field = new ExtendedField(updateValue()); + field.setDataFunction(updateFunction()); list.add(field); ob.setCustomFields(list); } - @Override - public boolean accept(Object ob) { - return true; - } - - @Override - public void reset() { - } - - @Override - public String title4PopupWindow() { - return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Enable_Field_Value"); - } - @Override - public AbstractDataConfig updateBean() { - return null; - } } - private class CustomFieldNamePane extends FurtherBasicBeanPane { - - private UICorrelationPane correlationPane; - - public CustomFieldNamePane() { - initComponents(); - } - - private void initComponents() { - - correlationPane = new UICorrelationPane(HEADS) { - @Override - protected ActionListener getAddButtonListener() { - return new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - tablePane.addLine(new String[]{StringUtils.EMPTY, StringUtils.EMPTY, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Use_None")}); - fireTargetChanged(); - } - }; - } - - public UITableEditor createUITableEditor() { - return new Editor() { - @Override - protected UICorrelationPane getParent() { - return correlationPane; - } - }; - } - }; - - this.setLayout(new BorderLayout()); - this.add(correlationPane, BorderLayout.CENTER); - - } + private class ExtendedCustomFieldNamePane extends AbstractCustomFieldNamePane { @Override public void populateBean(AbstractDataConfig ob) { @@ -248,13 +83,12 @@ public class ExtendedCustomFieldComboBoxPane extends UIComboBoxPane list = correlationPane.updateBean(); + List list = update(); List customFields = new ArrayList(); for (Object[] line : list) { @@ -267,120 +101,6 @@ public class ExtendedCustomFieldComboBoxPane extends UIComboBoxPane Date: Fri, 24 May 2019 17:02:32 +0800 Subject: [PATCH 002/217] =?UTF-8?q?REPORT-15183=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8sdk=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- designer-form/build.form.gradle | 1 + .../com/fr/sdk/designer/FineDesignUtils.java | 79 +++++++++++++++++++ .../java/com/fr/sdk/FineDesignUtilsTest.java | 7 ++ pom.xml | 1 + 4 files changed, 88 insertions(+) create mode 100644 designer-sdk/src/main/java/com/fr/sdk/designer/FineDesignUtils.java create mode 100644 designer-sdk/src/test/java/com/fr/sdk/FineDesignUtilsTest.java diff --git a/designer-form/build.form.gradle b/designer-form/build.form.gradle index c489d5ca2..42b16b020 100644 --- a/designer-form/build.form.gradle +++ b/designer-form/build.form.gradle @@ -41,6 +41,7 @@ ant{ mkdir(dir:"src/main/java") move(todir:"src/main/java"){ fileset(dir:"../designer-realize/src",includes:"com/**") + fileset(dir:"../designer-sdk/src",includes:"com/**") fileset(dir:"src",includes:"com/**") } } diff --git a/designer-sdk/src/main/java/com/fr/sdk/designer/FineDesignUtils.java b/designer-sdk/src/main/java/com/fr/sdk/designer/FineDesignUtils.java new file mode 100644 index 000000000..f04cb33a0 --- /dev/null +++ b/designer-sdk/src/main/java/com/fr/sdk/designer/FineDesignUtils.java @@ -0,0 +1,79 @@ +package com.fr.sdk.designer; + +import com.fr.config.activator.ConfigurationActivator; +import com.fr.design.env.DesignerWorkspaceGenerator; +import com.fr.design.env.RemoteDesignerWorkspaceInfo; +import com.fr.module.Activator; +import com.fr.module.Module; +import com.fr.module.tool.ActivatorToolBox; +import com.fr.report.ReportActivator; +import com.fr.report.RestrictionActivator; +import com.fr.report.module.ReportBaseActivator; +import com.fr.scheduler.SchedulerActivator; +import com.fr.sdk.server.ModuleShell; +import com.fr.serialization.SerializationActivator; +import com.fr.stable.StringUtils; +import com.fr.startup.WorkspaceRegister; +import com.fr.store.StateServerActivator; +import com.fr.workspace.WorkContext; +import com.fr.workspace.connect.WorkspaceConnectionInfo; +import com.fr.workspace.engine.WorkspaceActivator; +import com.fr.workspace.server.ServerWorkspaceRegister; + +/** + * 设计器SDK模块工具类,用来放一些设计器相关插件开发过程中常用的工具函数 + */ +public class FineDesignUtils { + + /** + * 创建一个连接远程服务器的模块 + * @param remoteUrl 远程服务器地址 + * @param username 用户名 + * @param password 密码 + * @return 模块代理对象 使用ModuleShell的start和stop控制模块启停 + */ + public static ModuleShell createRemoteServerModule(String remoteUrl, String username, String password) { + return createRemoteServerModule(remoteUrl, username, password, StringUtils.EMPTY, StringUtils.EMPTY); + } + + /** + * 创建一个连接远程服务器的模块 + * @param remoteUrl 远程服务器地址 + * @param username 用户名 + * @param password 密码 + * @param certPath https证书路径 + * @param certSecretKey 证书秘钥 + * @return 模块代理对象 使用ModuleShell的start和stop控制模块启停 + */ + public static ModuleShell createRemoteServerModule(final String remoteUrl, final String username, final String password, final String certPath, final String certSecretKey) { + Module module = ActivatorToolBox.simpleLink( + new WorkspaceActivator(), + new SerializationActivator(), + new Activator() { + @Override + public void start() { + WorkspaceConnectionInfo connectionInfo = new WorkspaceConnectionInfo(remoteUrl, username, password, certPath, certSecretKey); + try { + WorkContext.switchTo(DesignerWorkspaceGenerator.generate(RemoteDesignerWorkspaceInfo.create(connectionInfo))); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public void stop() { + + } + }, + new ConfigurationActivator(), + new StateServerActivator(), + new SchedulerActivator(), + new ReportBaseActivator(), + new RestrictionActivator(), + new ReportActivator(), + new WorkspaceRegister(), + new ServerWorkspaceRegister() + ); + return new ModuleShell(module); + } +} \ No newline at end of file diff --git a/designer-sdk/src/test/java/com/fr/sdk/FineDesignUtilsTest.java b/designer-sdk/src/test/java/com/fr/sdk/FineDesignUtilsTest.java new file mode 100644 index 000000000..ec210321b --- /dev/null +++ b/designer-sdk/src/test/java/com/fr/sdk/FineDesignUtilsTest.java @@ -0,0 +1,7 @@ +package com.fr.sdk; + +import junit.framework.TestCase; + +public class FineDesignUtilsTest extends TestCase { + +} \ No newline at end of file diff --git a/pom.xml b/pom.xml index 408bc7be8..407f1fd17 100644 --- a/pom.xml +++ b/pom.xml @@ -16,6 +16,7 @@ designer-chart designer-form designer-realize + designer-sdk com.fr.report design From 0cd35bb8a281cd9acf6bf733d3737a83a288e888 Mon Sep 17 00:00:00 2001 From: zack Date: Fri, 24 May 2019 17:04:00 +0800 Subject: [PATCH 003/217] =?UTF-8?q?=E7=A7=BB=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- designer-sdk/.gitignore | 5 +++++ designer-sdk/pom.xml | 21 +++++++++++++++++++ .../com/fr/sdk/designer/FineDesignUtils.java | 2 +- 3 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 designer-sdk/.gitignore create mode 100644 designer-sdk/pom.xml diff --git a/designer-sdk/.gitignore b/designer-sdk/.gitignore new file mode 100644 index 000000000..85184fbc3 --- /dev/null +++ b/designer-sdk/.gitignore @@ -0,0 +1,5 @@ +*.iml +.idea/ +.DS_Store +.classpath +.project \ No newline at end of file diff --git a/designer-sdk/pom.xml b/designer-sdk/pom.xml new file mode 100644 index 000000000..2fb53e1dc --- /dev/null +++ b/designer-sdk/pom.xml @@ -0,0 +1,21 @@ + + + 4.0.0 + + com.fr.report + design + 10.0 + + com.fr.report + designer-sdk + 10.0 + + + com.fr.report + designer-realize + 10.0 + + + \ No newline at end of file diff --git a/designer-sdk/src/main/java/com/fr/sdk/designer/FineDesignUtils.java b/designer-sdk/src/main/java/com/fr/sdk/designer/FineDesignUtils.java index f04cb33a0..a99cf36c5 100644 --- a/designer-sdk/src/main/java/com/fr/sdk/designer/FineDesignUtils.java +++ b/designer-sdk/src/main/java/com/fr/sdk/designer/FineDesignUtils.java @@ -10,7 +10,7 @@ import com.fr.report.ReportActivator; import com.fr.report.RestrictionActivator; import com.fr.report.module.ReportBaseActivator; import com.fr.scheduler.SchedulerActivator; -import com.fr.sdk.server.ModuleShell; +import com.fr.sdk.server.shell.ModuleShell; import com.fr.serialization.SerializationActivator; import com.fr.stable.StringUtils; import com.fr.startup.WorkspaceRegister; From 3320161278e97f7dc7c3fd3f69aa5f7c73313ce7 Mon Sep 17 00:00:00 2001 From: zack Date: Fri, 24 May 2019 17:15:54 +0800 Subject: [PATCH 004/217] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E8=A7=84=E8=8C=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fr/sdk/designer/FineDesignUtils.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/designer-sdk/src/main/java/com/fr/sdk/designer/FineDesignUtils.java b/designer-sdk/src/main/java/com/fr/sdk/designer/FineDesignUtils.java index a99cf36c5..ea60edf74 100644 --- a/designer-sdk/src/main/java/com/fr/sdk/designer/FineDesignUtils.java +++ b/designer-sdk/src/main/java/com/fr/sdk/designer/FineDesignUtils.java @@ -3,6 +3,7 @@ package com.fr.sdk.designer; import com.fr.config.activator.ConfigurationActivator; import com.fr.design.env.DesignerWorkspaceGenerator; import com.fr.design.env.RemoteDesignerWorkspaceInfo; +import com.fr.log.FineLoggerFactory; import com.fr.module.Activator; import com.fr.module.Module; import com.fr.module.tool.ActivatorToolBox; @@ -56,7 +57,7 @@ public class FineDesignUtils { try { WorkContext.switchTo(DesignerWorkspaceGenerator.generate(RemoteDesignerWorkspaceInfo.create(connectionInfo))); } catch (Exception e) { - e.printStackTrace(); + FineLoggerFactory.getLogger().error(e.getMessage(),e); } } From 2a74a9103b20a4561c06757f666762a00b8dfa1d Mon Sep 17 00:00:00 2001 From: zack Date: Thu, 30 May 2019 15:18:57 +0800 Subject: [PATCH 005/217] =?UTF-8?q?=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- designer-sdk/pom.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/designer-sdk/pom.xml b/designer-sdk/pom.xml index 2fb53e1dc..9702536e2 100644 --- a/designer-sdk/pom.xml +++ b/designer-sdk/pom.xml @@ -17,5 +17,10 @@ designer-realize 10.0 + + com.fr.report + sdk-base + 10.0 + \ No newline at end of file From d7d95ef78abbd69ca4c13d6d5cdd1398264e91f4 Mon Sep 17 00:00:00 2001 From: zheng Date: Tue, 4 Jun 2019 14:20:13 +0800 Subject: [PATCH 006/217] =?UTF-8?q?CHART-4027=20=E7=B3=BB=E5=88=97+?= =?UTF-8?q?=E5=80=BC=20=E8=87=AA=E5=AE=9A=E4=B9=89=E7=9B=B8=E5=85=B3=20des?= =?UTF-8?q?ign?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../component/CustomFieldComboBoxPane.java | 58 ---------- .../SeriesValueFieldComboBoxPane.java | 108 ++++++++++++++++++ ...ractDataSetFieldsWithSeriesValuePane.java} | 28 ++--- .../diff/MultiCategoryDataSetFieldsPane.java | 2 +- 4 files changed, 123 insertions(+), 73 deletions(-) delete mode 100644 designer-chart/src/main/java/com/fr/design/chartx/component/CustomFieldComboBoxPane.java create mode 100644 designer-chart/src/main/java/com/fr/design/chartx/component/SeriesValueFieldComboBoxPane.java rename designer-chart/src/main/java/com/fr/design/chartx/fields/diff/{AbstractDataSetFieldsWithCustomFieldPane.java => AbstractDataSetFieldsWithSeriesValuePane.java} (60%) diff --git a/designer-chart/src/main/java/com/fr/design/chartx/component/CustomFieldComboBoxPane.java b/designer-chart/src/main/java/com/fr/design/chartx/component/CustomFieldComboBoxPane.java deleted file mode 100644 index 8e6b98577..000000000 --- a/designer-chart/src/main/java/com/fr/design/chartx/component/CustomFieldComboBoxPane.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.fr.design.chartx.component; - -import com.fr.chartx.data.field.CustomFieldValueColumnFields; - -/** - * Created by shine on 2019/5/17. - */ -public class CustomFieldComboBoxPane extends AbstractCustomFieldComboBoxPane { - - @Override - protected AbstractUseFieldValuePane createUseFieldValuePane() { - return new UseFieldValuePane(); - } - - @Override - protected AbstractCustomFieldNamePane createCustomFieldNamePane() { - return new CustomFieldNamePane(); - } - - @Override - public void populateBean(CustomFieldValueColumnFields ob) { - if (ob.isCustomFieldValue()) { - populateCustomFieldNamePane(ob); - jcb.setSelectedIndex(1); - } else { - populateUseFieldValuePane(ob); - jcb.setSelectedIndex(0); - } - } - - @Override - public void updateBean(CustomFieldValueColumnFields ob) { - if (jcb.getSelectedIndex() == 0) { - ob.setCustomFieldValue(false); - updateUseFieldValuePane(ob); - } else { - ob.setCustomFieldValue(true); - updateCustomFieldNamePane(ob); - } - } - - private class UseFieldValuePane extends AbstractUseFieldValuePane { - - @Override - public void populateBean(CustomFieldValueColumnFields ob) { - - } - } - - private class CustomFieldNamePane extends AbstractCustomFieldNamePane { - - @Override - public void populateBean(CustomFieldValueColumnFields ob) { - - } - } - -} diff --git a/designer-chart/src/main/java/com/fr/design/chartx/component/SeriesValueFieldComboBoxPane.java b/designer-chart/src/main/java/com/fr/design/chartx/component/SeriesValueFieldComboBoxPane.java new file mode 100644 index 000000000..b6c080d52 --- /dev/null +++ b/designer-chart/src/main/java/com/fr/design/chartx/component/SeriesValueFieldComboBoxPane.java @@ -0,0 +1,108 @@ +package com.fr.design.chartx.component; + +import com.fr.chartx.data.field.ColumnField; +import com.fr.chartx.data.field.SeriesValueColumnFields; +import com.fr.chartx.data.field.SeriesValueField; +import com.fr.data.util.function.AbstractDataFunction; +import com.fr.design.mainframe.chart.gui.data.table.DataPaneHelper; +import com.fr.general.GeneralUtils; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by shine on 2019/5/17. + */ +public class SeriesValueFieldComboBoxPane extends AbstractCustomFieldComboBoxPane { + + @Override + protected AbstractUseFieldValuePane createUseFieldValuePane() { + return new UseFieldValuePane(); + } + + @Override + protected AbstractCustomFieldNamePane createCustomFieldNamePane() { + return new CustomFieldNamePane(); + } + + @Override + public void populateBean(SeriesValueColumnFields ob) { + if (ob.isCustomFieldValue()) { + populateCustomFieldNamePane(ob); + jcb.setSelectedIndex(1); + } else { + populateUseFieldValuePane(ob); + jcb.setSelectedIndex(0); + } + } + + @Override + public void updateBean(SeriesValueColumnFields ob) { + if (jcb.getSelectedIndex() == 0) { + ob.setCustomFieldValue(false); + updateUseFieldValuePane(ob); + } else { + ob.setCustomFieldValue(true); + updateCustomFieldNamePane(ob); + } + } + + private class UseFieldValuePane extends AbstractUseFieldValuePane { + + @Override + public void populateBean(SeriesValueColumnFields ob) { + List list = ob.getSeriesValueFieldList(); + if (list != null && list.size() > 0) { + populateSeries(list.get(0).getSeries().getFieldName()); + populateValue(list.get(0).getValue().getFieldName()); + populateFunction((AbstractDataFunction) list.get(0).getValue().getDataFunction()); + } + } + + @Override + public void updateBean(SeriesValueColumnFields ob) { + List list = new ArrayList(); + SeriesValueField seriesValueField = new SeriesValueField(); + ColumnField series = new ColumnField(updateSeries()); + ColumnField value = new ColumnField(updateValue()); + value.setDataFunction(updateFunction()); + seriesValueField.setValue(value); + seriesValueField.setSeries(series); + list.add(seriesValueField); + ob.setSeriesValueFieldList(list); + } + } + + private class CustomFieldNamePane extends AbstractCustomFieldNamePane { + + @Override + public void populateBean(SeriesValueColumnFields ob) { + List list = new ArrayList(); + for (SeriesValueField seriesValueField : ob.getSeriesValueFieldList()) { + Object[] array = new Object[3]; + array[0] = seriesValueField.getSeries().getFieldName(); + array[1] = seriesValueField.getValue().getFieldName(); + array[2] = DataPaneHelper.getFunctionString(seriesValueField.getValue().getDataFunction()); + list.add(array); + } + populate(list); + } + + @Override + public void updateBean(SeriesValueColumnFields ob) { + List list = update(); + List seriesValueFields = new ArrayList(); + for (Object[] line : list) { + ColumnField series = new ColumnField(GeneralUtils.objectToString(line[0])); + ColumnField value = new ColumnField(GeneralUtils.objectToString(line[1])); + value.setDataFunction(DataPaneHelper.getFunctionByName(GeneralUtils.objectToString(line[2]))); + SeriesValueField seriesValueField = new SeriesValueField(); + seriesValueField.setValue(value); + seriesValueField.setSeries(series); + seriesValueFields.add(seriesValueField); + } + ob.setSeriesValueFieldList(seriesValueFields); + } + } + +} diff --git a/designer-chart/src/main/java/com/fr/design/chartx/fields/diff/AbstractDataSetFieldsWithCustomFieldPane.java b/designer-chart/src/main/java/com/fr/design/chartx/fields/diff/AbstractDataSetFieldsWithSeriesValuePane.java similarity index 60% rename from designer-chart/src/main/java/com/fr/design/chartx/fields/diff/AbstractDataSetFieldsWithCustomFieldPane.java rename to designer-chart/src/main/java/com/fr/design/chartx/fields/diff/AbstractDataSetFieldsWithSeriesValuePane.java index 9b0418c30..7c4f0f083 100644 --- a/designer-chart/src/main/java/com/fr/design/chartx/fields/diff/AbstractDataSetFieldsWithCustomFieldPane.java +++ b/designer-chart/src/main/java/com/fr/design/chartx/fields/diff/AbstractDataSetFieldsWithSeriesValuePane.java @@ -1,7 +1,7 @@ package com.fr.design.chartx.fields.diff; -import com.fr.chartx.data.field.diff.AbstractColumnFieldCollectionWithCustomField; -import com.fr.design.chartx.component.CustomFieldComboBoxPane; +import com.fr.chartx.data.field.diff.AbstractColumnFieldCollectionWithSeriesValue; +import com.fr.design.chartx.component.SeriesValueFieldComboBoxPane; import com.fr.design.chartx.fields.AbstractDataSetFieldsPane; import javax.swing.JPanel; @@ -12,49 +12,49 @@ import java.util.List; * Created by shine on 2019/5/16. * 带有 自定义系列名(fr表现为 系列名使用字段名) 的字段集合 的一个pane */ -public abstract class AbstractDataSetFieldsWithCustomFieldPane +public abstract class AbstractDataSetFieldsWithSeriesValuePane extends AbstractDataSetFieldsPane { - private CustomFieldComboBoxPane customFieldComboBoxPane; + private SeriesValueFieldComboBoxPane seriesValueFieldComboBoxPane; @Override protected JPanel createCenterPane() { JPanel normalCenter = super.createCenterPane(); - customFieldComboBoxPane = new CustomFieldComboBoxPane(); + seriesValueFieldComboBoxPane = new SeriesValueFieldComboBoxPane(); if (normalCenter != null) { JPanel panel = new JPanel(new BorderLayout()); panel.add(normalCenter, BorderLayout.CENTER); - panel.add(customFieldComboBoxPane, BorderLayout.SOUTH); + panel.add(seriesValueFieldComboBoxPane, BorderLayout.SOUTH); return panel; } else { - return customFieldComboBoxPane; + return seriesValueFieldComboBoxPane; } } @Override public void checkBoxUse(boolean hasUse) { super.checkBoxUse(hasUse); - customFieldComboBoxPane.checkBoxUse(hasUse); + seriesValueFieldComboBoxPane.checkBoxUse(hasUse); } @Override public void clearAllBoxList() { super.clearAllBoxList(); - customFieldComboBoxPane.clearAllBoxList(); + seriesValueFieldComboBoxPane.clearAllBoxList(); } @Override public void refreshBoxListWithSelectTableData(List columnNameList) { super.refreshBoxListWithSelectTableData(columnNameList); - customFieldComboBoxPane.refreshBoxListWithSelectTableData(columnNameList); + seriesValueFieldComboBoxPane.refreshBoxListWithSelectTableData(columnNameList); } - protected void populateCustomPane(AbstractColumnFieldCollectionWithCustomField t) { - customFieldComboBoxPane.populateBean(t.getCustomFieldValueColumnFields()); + protected void populateCustomPane(AbstractColumnFieldCollectionWithSeriesValue t) { + seriesValueFieldComboBoxPane.populateBean(t.getSeriesValueColumnFields()); } - protected void updateCustomPane(AbstractColumnFieldCollectionWithCustomField t) { - customFieldComboBoxPane.updateBean(t.getCustomFieldValueColumnFields()); + protected void updateCustomPane(AbstractColumnFieldCollectionWithSeriesValue t) { + seriesValueFieldComboBoxPane.updateBean(t.getSeriesValueColumnFields()); } } diff --git a/designer-chart/src/main/java/com/fr/design/chartx/fields/diff/MultiCategoryDataSetFieldsPane.java b/designer-chart/src/main/java/com/fr/design/chartx/fields/diff/MultiCategoryDataSetFieldsPane.java index f3828361b..6a6983fc1 100644 --- a/designer-chart/src/main/java/com/fr/design/chartx/fields/diff/MultiCategoryDataSetFieldsPane.java +++ b/designer-chart/src/main/java/com/fr/design/chartx/fields/diff/MultiCategoryDataSetFieldsPane.java @@ -13,7 +13,7 @@ import java.util.List; /** * Created by shine on 2019/4/10. */ -public class MultiCategoryDataSetFieldsPane extends AbstractDataSetFieldsWithCustomFieldPane { +public class MultiCategoryDataSetFieldsPane extends AbstractDataSetFieldsWithSeriesValuePane { private MultiComboBoxPane multiCategoryPane; From 5c113a8dbb63ee07f559d3d14ea440dd1da40285 Mon Sep 17 00:00:00 2001 From: zheng Date: Tue, 4 Jun 2019 16:11:47 +0800 Subject: [PATCH 007/217] =?UTF-8?q?CHART-4027=20=E7=B3=BB=E5=88=97+?= =?UTF-8?q?=E5=80=BC=20=E8=87=AA=E5=AE=9A=E4=B9=89=E7=9B=B8=E5=85=B3cellda?= =?UTF-8?q?ta=20design?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AbstractChartDataCorrelationPane.java | 106 ++++++++++++++++++ .../CellDataSeriesValueFieldsPane.java | 55 +++++++++ .../FieldEditorComponentWrapper.java | 19 ++++ .../TinyFormulaPaneEditorComponent.java | 61 ++++++++++ .../fields/AbstractCellDataFieldsPane.java | 16 ++- ...ractCellDataFieldsWithSeriesValuePane.java | 41 +++++++ ...tractDataSetFieldsWithSeriesValuePane.java | 4 +- .../diff/MultiCategoryCellDataFieldsPane.java | 9 +- .../diff/MultiCategoryDataSetFieldsPane.java | 4 +- 9 files changed, 302 insertions(+), 13 deletions(-) create mode 100644 designer-chart/src/main/java/com/fr/design/chartx/component/AbstractChartDataCorrelationPane.java create mode 100644 designer-chart/src/main/java/com/fr/design/chartx/component/CellDataSeriesValueFieldsPane.java create mode 100644 designer-chart/src/main/java/com/fr/design/chartx/component/FieldEditorComponentWrapper.java create mode 100644 designer-chart/src/main/java/com/fr/design/chartx/component/TinyFormulaPaneEditorComponent.java create mode 100644 designer-chart/src/main/java/com/fr/design/chartx/fields/diff/AbstractCellDataFieldsWithSeriesValuePane.java diff --git a/designer-chart/src/main/java/com/fr/design/chartx/component/AbstractChartDataCorrelationPane.java b/designer-chart/src/main/java/com/fr/design/chartx/component/AbstractChartDataCorrelationPane.java new file mode 100644 index 000000000..1e29a818e --- /dev/null +++ b/designer-chart/src/main/java/com/fr/design/chartx/component/AbstractChartDataCorrelationPane.java @@ -0,0 +1,106 @@ +package com.fr.design.chartx.component; + +import com.fr.design.beans.BasicBeanPane; +import com.fr.design.gui.frpane.UICorrelationPane; +import com.fr.design.gui.itable.UITable; +import com.fr.design.gui.itable.UITableEditor; +import com.fr.stable.StringUtils; + +import javax.swing.JTable; +import javax.swing.event.ChangeEvent; +import java.awt.BorderLayout; +import java.awt.Component; +import java.util.List; + +/** + * Created by shine on 2019/6/4. + */ +public abstract class AbstractChartDataCorrelationPane extends BasicBeanPane { + private FieldEditorComponentWrapper[] editorComponents; + + private UICorrelationPane correlationPane; + + public AbstractChartDataCorrelationPane() { + + this.editorComponents = fieldEditorComponentWrappers(); + + String[] headers = new String[editorComponents.length]; + + for (int i = 0, len = editorComponents.length; i < len; i++) { + headers[i] = editorComponents[i].headerName(); + } + + initComps(headers); + } + + protected abstract FieldEditorComponentWrapper[] fieldEditorComponentWrappers(); + + protected List update() { + return correlationPane.updateBean(); + } + + protected void populate(List list) { + correlationPane.populateBean(list); + } + + @Override + public T updateBean() { + return null; + } + + private void initComps(String[] headers) { + correlationPane = new UICorrelationPane(headers) { + public UITableEditor createUITableEditor() { + return new Editor(); + } + + protected UITable initUITable() { + return new UITable(columnCount) { + + public UITableEditor createTableEditor() { + return createUITableEditor(); + } + + public void tableCellEditingStopped(ChangeEvent e) { + stopPaneEditing(e); + } + }; + } + }; + + this.setLayout(new BorderLayout()); + this.add(correlationPane, BorderLayout.CENTER); + } + + private class Editor extends UITableEditor { + + private Component currentComponent; + private FieldEditorComponentWrapper currentEditorWrapper; + + public Object getCellEditorValue() { + return currentEditorWrapper.value(currentComponent); + } + + public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { + if (column == table.getModel().getColumnCount()) { + return null; + } + + correlationPane.stopCellEditing(); + + currentEditorWrapper = AbstractChartDataCorrelationPane.this.editorComponents[column]; + + currentComponent = currentEditorWrapper.createEditorComponent(correlationPane); + currentEditorWrapper.setValue(currentComponent, value); + + return currentComponent; + } + + } + + @Override + protected String title4PopupWindow() { + return StringUtils.EMPTY; + } + +} diff --git a/designer-chart/src/main/java/com/fr/design/chartx/component/CellDataSeriesValueFieldsPane.java b/designer-chart/src/main/java/com/fr/design/chartx/component/CellDataSeriesValueFieldsPane.java new file mode 100644 index 000000000..21d428012 --- /dev/null +++ b/designer-chart/src/main/java/com/fr/design/chartx/component/CellDataSeriesValueFieldsPane.java @@ -0,0 +1,55 @@ +package com.fr.design.chartx.component; + +import com.fr.chartx.data.field.ColumnField; +import com.fr.chartx.data.field.SeriesValueColumnFields; +import com.fr.chartx.data.field.SeriesValueField; +import com.fr.design.i18n.Toolkit; +import com.fr.general.GeneralUtils; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by shine on 2019/6/4. + */ +public class CellDataSeriesValueFieldsPane extends AbstractChartDataCorrelationPane { + + @Override + protected FieldEditorComponentWrapper[] fieldEditorComponentWrappers() { + return new FieldEditorComponentWrapper[]{ + new TinyFormulaPaneEditorComponent(Toolkit.i18nText("Fine-Design_Chart_Series_Name")), + new TinyFormulaPaneEditorComponent(Toolkit.i18nText("Fine-Design_Chart_Series_Value")) + }; + } + + @Override + public void populateBean(SeriesValueColumnFields ob) { + List list = new ArrayList(); + + List seriesValueFieldList = ob.getSeriesValueFieldList(); + for (SeriesValueField seriesValueField : seriesValueFieldList) { + Object[] array = new Object[]{seriesValueField.getSeries().getFieldName(), seriesValueField.getValue().getFieldName()}; + list.add(array); + } + + populate(list); + } + + @Override + public void updateBean(SeriesValueColumnFields ob) { + List list = update(); + + List seriesValueFieldList = new ArrayList(); + + for (Object[] objects : list) { + SeriesValueField seriesValueField = new SeriesValueField(); + ColumnField series = new ColumnField(GeneralUtils.objectToString(objects[0])); + ColumnField value = new ColumnField(GeneralUtils.objectToString(objects[1])); + seriesValueField.setSeries(series); + seriesValueField.setValue(value); + seriesValueFieldList.add(seriesValueField); + } + + ob.setSeriesValueFieldList(seriesValueFieldList); + } +} diff --git a/designer-chart/src/main/java/com/fr/design/chartx/component/FieldEditorComponentWrapper.java b/designer-chart/src/main/java/com/fr/design/chartx/component/FieldEditorComponentWrapper.java new file mode 100644 index 000000000..9d8f1a043 --- /dev/null +++ b/designer-chart/src/main/java/com/fr/design/chartx/component/FieldEditorComponentWrapper.java @@ -0,0 +1,19 @@ +package com.fr.design.chartx.component; + +import com.fr.design.gui.frpane.UICorrelationPane; + +import java.awt.Component; + +/** + * Created by shine on 2019/6/4. + */ +public interface FieldEditorComponentWrapper { + + String headerName(); + + T createEditorComponent(UICorrelationPane parent); + + Object value(T t); + + void setValue(T t, Object o); +} diff --git a/designer-chart/src/main/java/com/fr/design/chartx/component/TinyFormulaPaneEditorComponent.java b/designer-chart/src/main/java/com/fr/design/chartx/component/TinyFormulaPaneEditorComponent.java new file mode 100644 index 000000000..623445073 --- /dev/null +++ b/designer-chart/src/main/java/com/fr/design/chartx/component/TinyFormulaPaneEditorComponent.java @@ -0,0 +1,61 @@ +package com.fr.design.chartx.component; + +import com.fr.base.BaseFormula; +import com.fr.base.Utils; +import com.fr.design.constants.UIConstants; +import com.fr.design.event.UIObserverListener; +import com.fr.design.formula.TinyFormulaPane; +import com.fr.design.gui.frpane.UICorrelationPane; + +/** + * Created by shine on 2019/6/4. + */ +public class TinyFormulaPaneEditorComponent implements FieldEditorComponentWrapper { + + private String header; + + public TinyFormulaPaneEditorComponent(String header) { + this.header = header; + } + + @Override + public String headerName() { + return this.header; + } + + @Override + public TinyFormulaPane createEditorComponent(final UICorrelationPane parent) { + TinyFormulaPane editorComponent = new TinyFormulaPane() { + @Override + public void okEvent() { + parent.stopCellEditing(); + parent.fireTargetChanged(); + } + + @Override + protected void populateTextField(BaseFormula fm) { + formulaTextField.setText(fm.getContent()); + } + }; + editorComponent.setBackground(UIConstants.FLESH_BLUE); + + editorComponent.getUITextField().registerChangeListener(new UIObserverListener() { + @Override + public void doChange() { + parent.fireTargetChanged(); + } + }); + + return editorComponent; + } + + @Override + public Object value(TinyFormulaPane formulaPane) { + return formulaPane.getUITextField().getText(); + } + + @Override + public void setValue(TinyFormulaPane formulaPane, Object o) { + formulaPane.getUITextField().setText(Utils.objectToString(o)); + } +} diff --git a/designer-chart/src/main/java/com/fr/design/chartx/fields/AbstractCellDataFieldsPane.java b/designer-chart/src/main/java/com/fr/design/chartx/fields/AbstractCellDataFieldsPane.java index 98400ed7a..6b6408d93 100644 --- a/designer-chart/src/main/java/com/fr/design/chartx/fields/AbstractCellDataFieldsPane.java +++ b/designer-chart/src/main/java/com/fr/design/chartx/fields/AbstractCellDataFieldsPane.java @@ -31,19 +31,23 @@ public abstract class AbstractCellDataFieldsPane + extends AbstractCellDataFieldsPane { + + private CellDataSeriesValueFieldsPane seriesValueFieldsPane; + + @Override + protected JPanel createCenterPane() { + JPanel normalCenter = super.createCenterPane(); + seriesValueFieldsPane = new CellDataSeriesValueFieldsPane(); + + if (normalCenter != null) { + JPanel panel = new JPanel(new BorderLayout()); + panel.add(normalCenter, BorderLayout.CENTER); + panel.add(seriesValueFieldsPane, BorderLayout.SOUTH); + return panel; + } else { + return seriesValueFieldsPane; + } + } + + protected void populateSeriesValuePane(AbstractColumnFieldCollectionWithSeriesValue t) { + seriesValueFieldsPane.populateBean(t.getSeriesValueColumnFields()); + } + + protected void updateSeriesValuePane(AbstractColumnFieldCollectionWithSeriesValue t) { + seriesValueFieldsPane.updateBean(t.getSeriesValueColumnFields()); + } + +} diff --git a/designer-chart/src/main/java/com/fr/design/chartx/fields/diff/AbstractDataSetFieldsWithSeriesValuePane.java b/designer-chart/src/main/java/com/fr/design/chartx/fields/diff/AbstractDataSetFieldsWithSeriesValuePane.java index 7c4f0f083..c62a7deaa 100644 --- a/designer-chart/src/main/java/com/fr/design/chartx/fields/diff/AbstractDataSetFieldsWithSeriesValuePane.java +++ b/designer-chart/src/main/java/com/fr/design/chartx/fields/diff/AbstractDataSetFieldsWithSeriesValuePane.java @@ -50,11 +50,11 @@ public abstract class AbstractDataSetFieldsWithSeriesValuePane { +public class MultiCategoryCellDataFieldsPane extends AbstractCellDataFieldsWithSeriesValuePane { private MultiTinyFormulaPane multiCategoryPane; @@ -23,7 +22,7 @@ public class MultiCategoryCellDataFieldsPane extends AbstractCellDataFieldsPane< } @Override - protected JPanel addNorthPane() { + protected JPanel createNorthPane() { createMultiFormulaPane(); @@ -50,6 +49,8 @@ public class MultiCategoryCellDataFieldsPane extends AbstractCellDataFieldsPane< List categoryList = ob.getCategoryList(); multiCategoryPane.populate(categoryList); + + populateSeriesValuePane(ob); } @Override @@ -60,6 +61,8 @@ public class MultiCategoryCellDataFieldsPane extends AbstractCellDataFieldsPane< multiCategoryPane.update(categoryList); + updateSeriesValuePane(fieldCollection); + return fieldCollection; } } diff --git a/designer-chart/src/main/java/com/fr/design/chartx/fields/diff/MultiCategoryDataSetFieldsPane.java b/designer-chart/src/main/java/com/fr/design/chartx/fields/diff/MultiCategoryDataSetFieldsPane.java index 6a6983fc1..f638cad22 100644 --- a/designer-chart/src/main/java/com/fr/design/chartx/fields/diff/MultiCategoryDataSetFieldsPane.java +++ b/designer-chart/src/main/java/com/fr/design/chartx/fields/diff/MultiCategoryDataSetFieldsPane.java @@ -46,7 +46,7 @@ public class MultiCategoryDataSetFieldsPane extends AbstractDataSetFieldsWithSer multiCategoryPane.populate(categoryList); - populateCustomPane(ob); + populateSeriesValuePane(ob); } @Override @@ -57,7 +57,7 @@ public class MultiCategoryDataSetFieldsPane extends AbstractDataSetFieldsWithSer multiCategoryPane.update(categoryList); - updateCustomPane(columnFieldCollection); + updateSeriesValuePane(columnFieldCollection); return columnFieldCollection; } From 4b357edbc8212e3891b39738bae413f758f776cb Mon Sep 17 00:00:00 2001 From: zheng Date: Tue, 4 Jun 2019 16:34:12 +0800 Subject: [PATCH 008/217] update --- ...taCorrelationPane.java => AbstractCorrelationPane.java} | 7 ++++--- .../chartx/component/CellDataSeriesValueFieldsPane.java | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) rename designer-chart/src/main/java/com/fr/design/chartx/component/{AbstractChartDataCorrelationPane.java => AbstractCorrelationPane.java} (91%) diff --git a/designer-chart/src/main/java/com/fr/design/chartx/component/AbstractChartDataCorrelationPane.java b/designer-chart/src/main/java/com/fr/design/chartx/component/AbstractCorrelationPane.java similarity index 91% rename from designer-chart/src/main/java/com/fr/design/chartx/component/AbstractChartDataCorrelationPane.java rename to designer-chart/src/main/java/com/fr/design/chartx/component/AbstractCorrelationPane.java index 1e29a818e..e1f833b1f 100644 --- a/designer-chart/src/main/java/com/fr/design/chartx/component/AbstractChartDataCorrelationPane.java +++ b/designer-chart/src/main/java/com/fr/design/chartx/component/AbstractCorrelationPane.java @@ -14,13 +14,14 @@ import java.util.List; /** * Created by shine on 2019/6/4. + * 自定义editorComponent + 支持多种数据格式 */ -public abstract class AbstractChartDataCorrelationPane extends BasicBeanPane { +public abstract class AbstractCorrelationPane extends BasicBeanPane { private FieldEditorComponentWrapper[] editorComponents; private UICorrelationPane correlationPane; - public AbstractChartDataCorrelationPane() { + public AbstractCorrelationPane() { this.editorComponents = fieldEditorComponentWrappers(); @@ -88,7 +89,7 @@ public abstract class AbstractChartDataCorrelationPane extends BasicBeanPane< correlationPane.stopCellEditing(); - currentEditorWrapper = AbstractChartDataCorrelationPane.this.editorComponents[column]; + currentEditorWrapper = AbstractCorrelationPane.this.editorComponents[column]; currentComponent = currentEditorWrapper.createEditorComponent(correlationPane); currentEditorWrapper.setValue(currentComponent, value); diff --git a/designer-chart/src/main/java/com/fr/design/chartx/component/CellDataSeriesValueFieldsPane.java b/designer-chart/src/main/java/com/fr/design/chartx/component/CellDataSeriesValueFieldsPane.java index 21d428012..83a74f854 100644 --- a/designer-chart/src/main/java/com/fr/design/chartx/component/CellDataSeriesValueFieldsPane.java +++ b/designer-chart/src/main/java/com/fr/design/chartx/component/CellDataSeriesValueFieldsPane.java @@ -12,7 +12,7 @@ import java.util.List; /** * Created by shine on 2019/6/4. */ -public class CellDataSeriesValueFieldsPane extends AbstractChartDataCorrelationPane { +public class CellDataSeriesValueFieldsPane extends AbstractCorrelationPane { @Override protected FieldEditorComponentWrapper[] fieldEditorComponentWrappers() { From 269272c280ffed502a24880f6f8355b6d2c53a65 Mon Sep 17 00:00:00 2001 From: zheng Date: Mon, 10 Jun 2019 17:15:22 +0800 Subject: [PATCH 009/217] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E8=B4=A8=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CellDataSeriesValueCorrelationPane.java | 59 +++++++++++++++++++ .../CellDataSeriesValueFieldsPane.java | 55 ----------------- .../SeriesValueFieldComboBoxPane.java | 24 ++++---- .../AbstractCorrelationPane.java | 23 ++++---- .../correlation/AbstractEditorComponent.java | 19 ++++++ .../FieldEditorComponentWrapper.java | 4 +- .../TinyFormulaPaneEditorComponent.java | 15 ++--- ...ractCellDataFieldsWithSeriesValuePane.java | 14 ++--- ...tractDataSetFieldsWithSeriesValuePane.java | 8 +-- .../diff/MultiCategoryCellDataFieldsPane.java | 6 +- .../diff/MultiCategoryDataSetFieldsPane.java | 6 +- 11 files changed, 125 insertions(+), 108 deletions(-) create mode 100644 designer-chart/src/main/java/com/fr/design/chartx/component/CellDataSeriesValueCorrelationPane.java delete mode 100644 designer-chart/src/main/java/com/fr/design/chartx/component/CellDataSeriesValueFieldsPane.java rename designer-chart/src/main/java/com/fr/design/chartx/component/{ => correlation}/AbstractCorrelationPane.java (80%) create mode 100644 designer-chart/src/main/java/com/fr/design/chartx/component/correlation/AbstractEditorComponent.java rename designer-chart/src/main/java/com/fr/design/chartx/component/{ => correlation}/FieldEditorComponentWrapper.java (79%) rename designer-chart/src/main/java/com/fr/design/chartx/component/{ => correlation}/TinyFormulaPaneEditorComponent.java (80%) diff --git a/designer-chart/src/main/java/com/fr/design/chartx/component/CellDataSeriesValueCorrelationPane.java b/designer-chart/src/main/java/com/fr/design/chartx/component/CellDataSeriesValueCorrelationPane.java new file mode 100644 index 000000000..3d5cdc9d9 --- /dev/null +++ b/designer-chart/src/main/java/com/fr/design/chartx/component/CellDataSeriesValueCorrelationPane.java @@ -0,0 +1,59 @@ +package com.fr.design.chartx.component; + +import com.fr.chartx.data.field.ColumnField; +import com.fr.chartx.data.field.SeriesValueCorrelationDefinition; +import com.fr.chartx.data.field.SeriesValueField; +import com.fr.design.chartx.component.correlation.AbstractCorrelationPane; +import com.fr.design.chartx.component.correlation.FieldEditorComponentWrapper; +import com.fr.design.chartx.component.correlation.TinyFormulaPaneEditorComponent; +import com.fr.design.i18n.Toolkit; +import com.fr.general.GeneralUtils; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by shine on 2019/6/4. + */ +public class CellDataSeriesValueCorrelationPane extends AbstractCorrelationPane { + + @Override + protected FieldEditorComponentWrapper[] createFieldEditorComponentWrappers() { + return new FieldEditorComponentWrapper[]{ + new TinyFormulaPaneEditorComponent(Toolkit.i18nText("Fine-Design_Chart_Series_Name")), + new TinyFormulaPaneEditorComponent(Toolkit.i18nText("Fine-Design_Chart_Series_Value")) + }; + } + + @Override + protected List covertTBeanToTableModelList(SeriesValueCorrelationDefinition seriesValueCorrelationDefinition) { + List result = new ArrayList(); + + List seriesValueFieldList = seriesValueCorrelationDefinition.getSeriesValueFieldList(); + for (SeriesValueField seriesValueField : seriesValueFieldList) { + Object[] array = new Object[]{seriesValueField.getSeries().getFieldName(), seriesValueField.getValue().getFieldName()}; + result.add(array); + } + + return result; + } + + @Override + protected SeriesValueCorrelationDefinition covertTableModelListToTBean(List tableValues) { + List seriesValueFieldList = new ArrayList(); + + for (Object[] oneLine : tableValues) { + SeriesValueField seriesValueField = new SeriesValueField(); + ColumnField series = new ColumnField(GeneralUtils.objectToString(oneLine[0])); + ColumnField value = new ColumnField(GeneralUtils.objectToString(oneLine[1])); + seriesValueField.setSeries(series); + seriesValueField.setValue(value); + seriesValueFieldList.add(seriesValueField); + } + + SeriesValueCorrelationDefinition seriesValueCorrelationDefinition = new SeriesValueCorrelationDefinition(); + seriesValueCorrelationDefinition.setSeriesValueFieldList(seriesValueFieldList); + + return seriesValueCorrelationDefinition; + } +} diff --git a/designer-chart/src/main/java/com/fr/design/chartx/component/CellDataSeriesValueFieldsPane.java b/designer-chart/src/main/java/com/fr/design/chartx/component/CellDataSeriesValueFieldsPane.java deleted file mode 100644 index 83a74f854..000000000 --- a/designer-chart/src/main/java/com/fr/design/chartx/component/CellDataSeriesValueFieldsPane.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.fr.design.chartx.component; - -import com.fr.chartx.data.field.ColumnField; -import com.fr.chartx.data.field.SeriesValueColumnFields; -import com.fr.chartx.data.field.SeriesValueField; -import com.fr.design.i18n.Toolkit; -import com.fr.general.GeneralUtils; - -import java.util.ArrayList; -import java.util.List; - -/** - * Created by shine on 2019/6/4. - */ -public class CellDataSeriesValueFieldsPane extends AbstractCorrelationPane { - - @Override - protected FieldEditorComponentWrapper[] fieldEditorComponentWrappers() { - return new FieldEditorComponentWrapper[]{ - new TinyFormulaPaneEditorComponent(Toolkit.i18nText("Fine-Design_Chart_Series_Name")), - new TinyFormulaPaneEditorComponent(Toolkit.i18nText("Fine-Design_Chart_Series_Value")) - }; - } - - @Override - public void populateBean(SeriesValueColumnFields ob) { - List list = new ArrayList(); - - List seriesValueFieldList = ob.getSeriesValueFieldList(); - for (SeriesValueField seriesValueField : seriesValueFieldList) { - Object[] array = new Object[]{seriesValueField.getSeries().getFieldName(), seriesValueField.getValue().getFieldName()}; - list.add(array); - } - - populate(list); - } - - @Override - public void updateBean(SeriesValueColumnFields ob) { - List list = update(); - - List seriesValueFieldList = new ArrayList(); - - for (Object[] objects : list) { - SeriesValueField seriesValueField = new SeriesValueField(); - ColumnField series = new ColumnField(GeneralUtils.objectToString(objects[0])); - ColumnField value = new ColumnField(GeneralUtils.objectToString(objects[1])); - seriesValueField.setSeries(series); - seriesValueField.setValue(value); - seriesValueFieldList.add(seriesValueField); - } - - ob.setSeriesValueFieldList(seriesValueFieldList); - } -} diff --git a/designer-chart/src/main/java/com/fr/design/chartx/component/SeriesValueFieldComboBoxPane.java b/designer-chart/src/main/java/com/fr/design/chartx/component/SeriesValueFieldComboBoxPane.java index b6c080d52..82f0b7a88 100644 --- a/designer-chart/src/main/java/com/fr/design/chartx/component/SeriesValueFieldComboBoxPane.java +++ b/designer-chart/src/main/java/com/fr/design/chartx/component/SeriesValueFieldComboBoxPane.java @@ -1,7 +1,7 @@ package com.fr.design.chartx.component; import com.fr.chartx.data.field.ColumnField; -import com.fr.chartx.data.field.SeriesValueColumnFields; +import com.fr.chartx.data.field.SeriesValueCorrelationDefinition; import com.fr.chartx.data.field.SeriesValueField; import com.fr.data.util.function.AbstractDataFunction; import com.fr.design.mainframe.chart.gui.data.table.DataPaneHelper; @@ -13,7 +13,7 @@ import java.util.List; /** * Created by shine on 2019/5/17. */ -public class SeriesValueFieldComboBoxPane extends AbstractCustomFieldComboBoxPane { +public class SeriesValueFieldComboBoxPane extends AbstractCustomFieldComboBoxPane { @Override protected AbstractUseFieldValuePane createUseFieldValuePane() { @@ -26,7 +26,7 @@ public class SeriesValueFieldComboBoxPane extends AbstractCustomFieldComboBoxPan } @Override - public void populateBean(SeriesValueColumnFields ob) { + public void populateBean(SeriesValueCorrelationDefinition ob) { if (ob.isCustomFieldValue()) { populateCustomFieldNamePane(ob); jcb.setSelectedIndex(1); @@ -37,7 +37,7 @@ public class SeriesValueFieldComboBoxPane extends AbstractCustomFieldComboBoxPan } @Override - public void updateBean(SeriesValueColumnFields ob) { + public void updateBean(SeriesValueCorrelationDefinition ob) { if (jcb.getSelectedIndex() == 0) { ob.setCustomFieldValue(false); updateUseFieldValuePane(ob); @@ -47,10 +47,10 @@ public class SeriesValueFieldComboBoxPane extends AbstractCustomFieldComboBoxPan } } - private class UseFieldValuePane extends AbstractUseFieldValuePane { + private class UseFieldValuePane extends AbstractUseFieldValuePane { @Override - public void populateBean(SeriesValueColumnFields ob) { + public void populateBean(SeriesValueCorrelationDefinition ob) { List list = ob.getSeriesValueFieldList(); if (list != null && list.size() > 0) { populateSeries(list.get(0).getSeries().getFieldName()); @@ -60,7 +60,7 @@ public class SeriesValueFieldComboBoxPane extends AbstractCustomFieldComboBoxPan } @Override - public void updateBean(SeriesValueColumnFields ob) { + public void updateBean(SeriesValueCorrelationDefinition ob) { List list = new ArrayList(); SeriesValueField seriesValueField = new SeriesValueField(); ColumnField series = new ColumnField(updateSeries()); @@ -73,12 +73,12 @@ public class SeriesValueFieldComboBoxPane extends AbstractCustomFieldComboBoxPan } } - private class CustomFieldNamePane extends AbstractCustomFieldNamePane { + private class CustomFieldNamePane extends AbstractCustomFieldNamePane { @Override - public void populateBean(SeriesValueColumnFields ob) { + public void populateBean(SeriesValueCorrelationDefinition definition) { List list = new ArrayList(); - for (SeriesValueField seriesValueField : ob.getSeriesValueFieldList()) { + for (SeriesValueField seriesValueField : definition.getSeriesValueFieldList()) { Object[] array = new Object[3]; array[0] = seriesValueField.getSeries().getFieldName(); array[1] = seriesValueField.getValue().getFieldName(); @@ -89,7 +89,7 @@ public class SeriesValueFieldComboBoxPane extends AbstractCustomFieldComboBoxPan } @Override - public void updateBean(SeriesValueColumnFields ob) { + public void updateBean(SeriesValueCorrelationDefinition seriesValueCorrelationDefinition) { List list = update(); List seriesValueFields = new ArrayList(); for (Object[] line : list) { @@ -101,7 +101,7 @@ public class SeriesValueFieldComboBoxPane extends AbstractCustomFieldComboBoxPan seriesValueField.setSeries(series); seriesValueFields.add(seriesValueField); } - ob.setSeriesValueFieldList(seriesValueFields); + seriesValueCorrelationDefinition.setSeriesValueFieldList(seriesValueFields); } } diff --git a/designer-chart/src/main/java/com/fr/design/chartx/component/AbstractCorrelationPane.java b/designer-chart/src/main/java/com/fr/design/chartx/component/correlation/AbstractCorrelationPane.java similarity index 80% rename from designer-chart/src/main/java/com/fr/design/chartx/component/AbstractCorrelationPane.java rename to designer-chart/src/main/java/com/fr/design/chartx/component/correlation/AbstractCorrelationPane.java index e1f833b1f..c7b459e49 100644 --- a/designer-chart/src/main/java/com/fr/design/chartx/component/AbstractCorrelationPane.java +++ b/designer-chart/src/main/java/com/fr/design/chartx/component/correlation/AbstractCorrelationPane.java @@ -1,4 +1,4 @@ -package com.fr.design.chartx.component; +package com.fr.design.chartx.component.correlation; import com.fr.design.beans.BasicBeanPane; import com.fr.design.gui.frpane.UICorrelationPane; @@ -23,7 +23,7 @@ public abstract class AbstractCorrelationPane extends BasicBeanPane { public AbstractCorrelationPane() { - this.editorComponents = fieldEditorComponentWrappers(); + this.editorComponents = createFieldEditorComponentWrappers(); String[] headers = new String[editorComponents.length]; @@ -34,21 +34,22 @@ public abstract class AbstractCorrelationPane extends BasicBeanPane { initComps(headers); } - protected abstract FieldEditorComponentWrapper[] fieldEditorComponentWrappers(); + protected abstract FieldEditorComponentWrapper[] createFieldEditorComponentWrappers(); - protected List update() { - return correlationPane.updateBean(); - } - - protected void populate(List list) { - correlationPane.populateBean(list); + @Override + public void populateBean(T ob) { + correlationPane.populateBean(covertTBeanToTableModelList(ob)); } @Override public T updateBean() { - return null; + return covertTableModelListToTBean(correlationPane.updateBean()); } + protected abstract List covertTBeanToTableModelList(T t); + + protected abstract T covertTableModelListToTBean(List tableValues); + private void initComps(String[] headers) { correlationPane = new UICorrelationPane(headers) { public UITableEditor createUITableEditor() { @@ -79,7 +80,7 @@ public abstract class AbstractCorrelationPane extends BasicBeanPane { private FieldEditorComponentWrapper currentEditorWrapper; public Object getCellEditorValue() { - return currentEditorWrapper.value(currentComponent); + return currentEditorWrapper.getValue(currentComponent); } public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { diff --git a/designer-chart/src/main/java/com/fr/design/chartx/component/correlation/AbstractEditorComponent.java b/designer-chart/src/main/java/com/fr/design/chartx/component/correlation/AbstractEditorComponent.java new file mode 100644 index 000000000..d90605830 --- /dev/null +++ b/designer-chart/src/main/java/com/fr/design/chartx/component/correlation/AbstractEditorComponent.java @@ -0,0 +1,19 @@ +package com.fr.design.chartx.component.correlation; + +import java.awt.Component; + +/** + * Created by shine on 2019/6/10. + */ +public abstract class AbstractEditorComponent implements FieldEditorComponentWrapper { + private String header; + + public AbstractEditorComponent(String header) { + this.header = header; + } + + @Override + public String headerName() { + return this.header; + } +} diff --git a/designer-chart/src/main/java/com/fr/design/chartx/component/FieldEditorComponentWrapper.java b/designer-chart/src/main/java/com/fr/design/chartx/component/correlation/FieldEditorComponentWrapper.java similarity index 79% rename from designer-chart/src/main/java/com/fr/design/chartx/component/FieldEditorComponentWrapper.java rename to designer-chart/src/main/java/com/fr/design/chartx/component/correlation/FieldEditorComponentWrapper.java index 9d8f1a043..5181b466c 100644 --- a/designer-chart/src/main/java/com/fr/design/chartx/component/FieldEditorComponentWrapper.java +++ b/designer-chart/src/main/java/com/fr/design/chartx/component/correlation/FieldEditorComponentWrapper.java @@ -1,4 +1,4 @@ -package com.fr.design.chartx.component; +package com.fr.design.chartx.component.correlation; import com.fr.design.gui.frpane.UICorrelationPane; @@ -13,7 +13,7 @@ public interface FieldEditorComponentWrapper { T createEditorComponent(UICorrelationPane parent); - Object value(T t); + Object getValue(T t); void setValue(T t, Object o); } diff --git a/designer-chart/src/main/java/com/fr/design/chartx/component/TinyFormulaPaneEditorComponent.java b/designer-chart/src/main/java/com/fr/design/chartx/component/correlation/TinyFormulaPaneEditorComponent.java similarity index 80% rename from designer-chart/src/main/java/com/fr/design/chartx/component/TinyFormulaPaneEditorComponent.java rename to designer-chart/src/main/java/com/fr/design/chartx/component/correlation/TinyFormulaPaneEditorComponent.java index 623445073..71a0a59e5 100644 --- a/designer-chart/src/main/java/com/fr/design/chartx/component/TinyFormulaPaneEditorComponent.java +++ b/designer-chart/src/main/java/com/fr/design/chartx/component/correlation/TinyFormulaPaneEditorComponent.java @@ -1,4 +1,4 @@ -package com.fr.design.chartx.component; +package com.fr.design.chartx.component.correlation; import com.fr.base.BaseFormula; import com.fr.base.Utils; @@ -10,17 +10,10 @@ import com.fr.design.gui.frpane.UICorrelationPane; /** * Created by shine on 2019/6/4. */ -public class TinyFormulaPaneEditorComponent implements FieldEditorComponentWrapper { - - private String header; +public class TinyFormulaPaneEditorComponent extends AbstractEditorComponent { public TinyFormulaPaneEditorComponent(String header) { - this.header = header; - } - - @Override - public String headerName() { - return this.header; + super(header); } @Override @@ -50,7 +43,7 @@ public class TinyFormulaPaneEditorComponent implements FieldEditorComponentWrapp } @Override - public Object value(TinyFormulaPane formulaPane) { + public Object getValue(TinyFormulaPane formulaPane) { return formulaPane.getUITextField().getText(); } diff --git a/designer-chart/src/main/java/com/fr/design/chartx/fields/diff/AbstractCellDataFieldsWithSeriesValuePane.java b/designer-chart/src/main/java/com/fr/design/chartx/fields/diff/AbstractCellDataFieldsWithSeriesValuePane.java index a3693bf53..dc0ce33ec 100644 --- a/designer-chart/src/main/java/com/fr/design/chartx/fields/diff/AbstractCellDataFieldsWithSeriesValuePane.java +++ b/designer-chart/src/main/java/com/fr/design/chartx/fields/diff/AbstractCellDataFieldsWithSeriesValuePane.java @@ -1,7 +1,7 @@ package com.fr.design.chartx.fields.diff; import com.fr.chartx.data.field.diff.AbstractColumnFieldCollectionWithSeriesValue; -import com.fr.design.chartx.component.CellDataSeriesValueFieldsPane; +import com.fr.design.chartx.component.CellDataSeriesValueCorrelationPane; import com.fr.design.chartx.fields.AbstractCellDataFieldsPane; import javax.swing.JPanel; @@ -13,12 +13,12 @@ import java.awt.BorderLayout; public abstract class AbstractCellDataFieldsWithSeriesValuePane extends AbstractCellDataFieldsPane { - private CellDataSeriesValueFieldsPane seriesValueFieldsPane; + private CellDataSeriesValueCorrelationPane seriesValueFieldsPane; @Override protected JPanel createCenterPane() { JPanel normalCenter = super.createCenterPane(); - seriesValueFieldsPane = new CellDataSeriesValueFieldsPane(); + seriesValueFieldsPane = new CellDataSeriesValueCorrelationPane(); if (normalCenter != null) { JPanel panel = new JPanel(new BorderLayout()); @@ -30,12 +30,12 @@ public abstract class AbstractCellDataFieldsWithSeriesValuePane categoryList = ob.getCategoryList(); + List categoryList = multiCategoryColumnFieldCollection.getCategoryList(); multiCategoryPane.populate(categoryList); - populateSeriesValuePane(ob); + populateSeriesValuePane(multiCategoryColumnFieldCollection); } @Override diff --git a/designer-chart/src/main/java/com/fr/design/chartx/fields/diff/MultiCategoryDataSetFieldsPane.java b/designer-chart/src/main/java/com/fr/design/chartx/fields/diff/MultiCategoryDataSetFieldsPane.java index f638cad22..0e6121812 100644 --- a/designer-chart/src/main/java/com/fr/design/chartx/fields/diff/MultiCategoryDataSetFieldsPane.java +++ b/designer-chart/src/main/java/com/fr/design/chartx/fields/diff/MultiCategoryDataSetFieldsPane.java @@ -41,12 +41,12 @@ public class MultiCategoryDataSetFieldsPane extends AbstractDataSetFieldsWithSer } @Override - public void populateBean(MultiCategoryColumnFieldCollection ob) { - List categoryList = ob.getCategoryList(); + public void populateBean(MultiCategoryColumnFieldCollection multiCategoryColumnFieldCollection) { + List categoryList = multiCategoryColumnFieldCollection.getCategoryList(); multiCategoryPane.populate(categoryList); - populateSeriesValuePane(ob); + populateSeriesValuePane(multiCategoryColumnFieldCollection); } @Override From 852907a1cc06640363389355a32f580135c7ea01 Mon Sep 17 00:00:00 2001 From: zheng Date: Mon, 10 Jun 2019 19:35:41 +0800 Subject: [PATCH 010/217] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E8=B4=A8=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AbstractCustomFieldComboBoxPane.java | 214 ++++-------------- .../CellDataSeriesValueCorrelationPane.java | 5 +- .../SeriesValueFieldComboBoxPane.java | 21 +- .../correlation/AbstractCorrelationPane.java | 28 ++- .../CalculateComboBoxEditorComponent.java | 45 ++++ .../FieldEditorComponentWrapper.java | 3 +- .../TinyFormulaPaneEditorComponent.java | 4 +- .../UIComboBoxEditorComponent.java | 55 +++++ .../UITextFieldEditorComponent.java | 41 ++++ .../ExtendedCustomFieldComboBoxPane.java | 15 +- 10 files changed, 235 insertions(+), 196 deletions(-) create mode 100644 designer-chart/src/main/java/com/fr/design/chartx/component/correlation/CalculateComboBoxEditorComponent.java create mode 100644 designer-chart/src/main/java/com/fr/design/chartx/component/correlation/UIComboBoxEditorComponent.java create mode 100644 designer-chart/src/main/java/com/fr/design/chartx/component/correlation/UITextFieldEditorComponent.java diff --git a/designer-chart/src/main/java/com/fr/design/chartx/component/AbstractCustomFieldComboBoxPane.java b/designer-chart/src/main/java/com/fr/design/chartx/component/AbstractCustomFieldComboBoxPane.java index 8453452d2..6f6172bc3 100644 --- a/designer-chart/src/main/java/com/fr/design/chartx/component/AbstractCustomFieldComboBoxPane.java +++ b/designer-chart/src/main/java/com/fr/design/chartx/component/AbstractCustomFieldComboBoxPane.java @@ -2,14 +2,15 @@ package com.fr.design.chartx.component; import com.fr.data.util.function.AbstractDataFunction; import com.fr.design.beans.FurtherBasicBeanPane; -import com.fr.design.event.UIObserverListener; +import com.fr.design.chartx.component.correlation.AbstractCorrelationPane; +import com.fr.design.chartx.component.correlation.CalculateComboBoxEditorComponent; +import com.fr.design.chartx.component.correlation.FieldEditorComponentWrapper; +import com.fr.design.chartx.component.correlation.UIComboBoxEditorComponent; +import com.fr.design.chartx.component.correlation.UITextFieldEditorComponent; import com.fr.design.gui.frpane.UIComboBoxPane; -import com.fr.design.gui.frpane.UICorrelationPane; import com.fr.design.gui.icombobox.UIComboBox; import com.fr.design.gui.ilable.UILabel; -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.ChartDataPane; @@ -19,17 +20,11 @@ import com.fr.extended.chart.UIComboBoxWithNone; import com.fr.general.GeneralUtils; import com.fr.stable.StringUtils; -import javax.swing.JComponent; import javax.swing.JPanel; -import javax.swing.JTable; import javax.swing.SwingConstants; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Dimension; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.ItemEvent; -import java.awt.event.ItemListener; import java.util.ArrayList; import java.util.List; @@ -38,7 +33,6 @@ import java.util.List; * 系列名使用字段名or字段值的抽象的pane 支持多种属性结构的存取 */ public abstract class AbstractCustomFieldComboBoxPane extends UIComboBoxPane { - 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 AbstractUseFieldValuePane useFieldValuePane; @@ -64,7 +58,31 @@ public abstract class AbstractCustomFieldComboBoxPane extends UIComboBoxPane< customFieldNamePane = createCustomFieldNamePane(); List> list = new ArrayList>(); list.add(useFieldValuePane); - list.add(customFieldNamePane); + FurtherBasicBeanPane pane = new FurtherBasicBeanPane() { + @Override + public String title4PopupWindow() { + return Toolkit.i18nText("Fine-Design_Chart_Enable_Field_Name"); + } + + @Override + public boolean accept(Object ob) { + return false; + } + + @Override + public void reset() { + } + + @Override + public void populateBean(Object ob) { + } + + @Override + public Object updateBean() { + return null; + } + }; + list.add(pane); return list; } @@ -129,9 +147,9 @@ public abstract class AbstractCustomFieldComboBoxPane extends UIComboBoxPane< function = new CalculateComboBox(); Component[][] components = new Component[][]{ - new Component[]{new UILabel(HEADS[1], SwingConstants.LEFT), series}, - new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Use_Value"), SwingConstants.LEFT), value}, - new Component[]{new UILabel(HEADS[2], SwingConstants.LEFT), function}, + new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Series_Name"), SwingConstants.LEFT), series}, + new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Use_Value"), SwingConstants.LEFT), value}, + new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Summary_Method"), SwingConstants.LEFT), function}, }; double p = TableLayout.PREFERRED; @@ -204,165 +222,25 @@ public abstract class AbstractCustomFieldComboBoxPane extends UIComboBoxPane< } } - protected abstract class AbstractCustomFieldNamePane extends FurtherBasicBeanPane { - - private UICorrelationPane correlationPane; - - public AbstractCustomFieldNamePane() { - initComponents(); - } - - private void initComponents() { - - correlationPane = new UICorrelationPane(HEADS) { - @Override - protected ActionListener getAddButtonListener() { - return new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - tablePane.addLine(new String[]{StringUtils.EMPTY, StringUtils.EMPTY, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Use_None")}); - fireTargetChanged(); - } - }; - } + protected abstract class AbstractCustomFieldNamePane extends AbstractCorrelationPane { - public UITableEditor createUITableEditor() { - return new Editor() { + @Override + protected FieldEditorComponentWrapper[] createFieldEditorComponentWrappers() { + return new FieldEditorComponentWrapper[]{ + new UIComboBoxEditorComponent(Toolkit.i18nText("Fine-Design_Chart_Field_Name")) { @Override - protected UICorrelationPane getParent() { - return correlationPane; + protected List items() { + return fieldList; } - }; - } + }, + new UITextFieldEditorComponent(Toolkit.i18nText("Fine-Design_Chart_Series_Name")), + new CalculateComboBoxEditorComponent(Toolkit.i18nText("Fine-Design_Chart_Summary_Method")) }; - - this.setLayout(new BorderLayout()); - this.add(correlationPane, BorderLayout.CENTER); - - } - - - protected void populate(List list) { - correlationPane.populateBean(list); - } - - protected List update() { - return correlationPane.updateBean(); - } - - - @Override - public boolean accept(Object ob) { - return true; - } - - @Override - public void reset() { } @Override - public String title4PopupWindow() { - return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Enable_Field_Name"); - } - - @Override - public T updateBean() { - return null; + protected Object[] createLine() { + return new String[]{StringUtils.EMPTY, StringUtils.EMPTY, Toolkit.i18nText("Fine-Design_Chart_Use_None")}; } } - - private abstract class Editor extends UITableEditor { - private JComponent editorComponent; - - protected abstract UICorrelationPane getParent(); - - @Override - public Object getCellEditorValue() { - if (editorComponent instanceof UIComboBox) { - return ((UIComboBox) editorComponent).getSelectedItem(); - } else if (editorComponent instanceof UITextField) { - return ((UITextField) editorComponent).getText(); - } else if (editorComponent instanceof CalculateComboBox) { - return ((CalculateComboBox) editorComponent).getSelectedItem(); - } - return super.getCellEditorValue(); - } - - @Override - public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, final int row, int column) { - - switch (column) { - case 0: - editorComponent = createComboBoxEdit(row, value); - break; - case 1: - editorComponent = createTextEdit(value); - break; - default: - editorComponent = createCalculateComboBox(value); - break; - - } - return editorComponent; - } - - private void setDefaultName(int row) { - UITable table = getParent().getTable(); - Object object = table.getValueAt(row, 0); - if (object != null) { - table.setValueAt(object, row, 1); - } - } - - private UIComboBox createComboBoxEdit(final int row, Object value) { - UIComboBox uiComboBox = new UIComboBox(fieldList.toArray()); - - uiComboBox.addItemListener(new ItemListener() { - public void itemStateChanged(ItemEvent e) { - getParent().stopCellEditing(); - getParent().fireTargetChanged(); - setDefaultName(row); - } - }); - - if (value != null && StringUtils.isNotEmpty(value.toString())) { - uiComboBox.getModel().setSelectedItem(value); - } else { - uiComboBox.getModel().setSelectedItem(value); - } - - return uiComboBox; - } - - private UITextField createTextEdit(Object value) { - UITextField uiTextField = new UITextField(); - if (value != null) { - uiTextField.setText(value.toString()); - } - - uiTextField.registerChangeListener(new UIObserverListener() { - @Override - public void doChange() { - getParent().fireTargetChanged(); - } - }); - - return uiTextField; - } - - private CalculateComboBox createCalculateComboBox(Object value) { - CalculateComboBox calculateComboBox = new CalculateComboBox(); - if (value != null) { - calculateComboBox.setSelectedItem(value); - } - calculateComboBox.addItemListener(new ItemListener() { - public void itemStateChanged(ItemEvent e) { - getParent().stopCellEditing(); - getParent().fireTargetChanged(); - } - }); - return calculateComboBox; - } - } - } diff --git a/designer-chart/src/main/java/com/fr/design/chartx/component/CellDataSeriesValueCorrelationPane.java b/designer-chart/src/main/java/com/fr/design/chartx/component/CellDataSeriesValueCorrelationPane.java index 3d5cdc9d9..fe6d7db76 100644 --- a/designer-chart/src/main/java/com/fr/design/chartx/component/CellDataSeriesValueCorrelationPane.java +++ b/designer-chart/src/main/java/com/fr/design/chartx/component/CellDataSeriesValueCorrelationPane.java @@ -39,7 +39,7 @@ public class CellDataSeriesValueCorrelationPane extends AbstractCorrelationPane< } @Override - protected SeriesValueCorrelationDefinition covertTableModelListToTBean(List tableValues) { + protected void setTableModelListToTBean(List tableValues, SeriesValueCorrelationDefinition seriesValueCorrelationDefinition) { List seriesValueFieldList = new ArrayList(); for (Object[] oneLine : tableValues) { @@ -51,9 +51,6 @@ public class CellDataSeriesValueCorrelationPane extends AbstractCorrelationPane< seriesValueFieldList.add(seriesValueField); } - SeriesValueCorrelationDefinition seriesValueCorrelationDefinition = new SeriesValueCorrelationDefinition(); seriesValueCorrelationDefinition.setSeriesValueFieldList(seriesValueFieldList); - - return seriesValueCorrelationDefinition; } } diff --git a/designer-chart/src/main/java/com/fr/design/chartx/component/SeriesValueFieldComboBoxPane.java b/designer-chart/src/main/java/com/fr/design/chartx/component/SeriesValueFieldComboBoxPane.java index 82f0b7a88..4d5fbd3b4 100644 --- a/designer-chart/src/main/java/com/fr/design/chartx/component/SeriesValueFieldComboBoxPane.java +++ b/designer-chart/src/main/java/com/fr/design/chartx/component/SeriesValueFieldComboBoxPane.java @@ -74,25 +74,24 @@ public class SeriesValueFieldComboBoxPane extends AbstractCustomFieldComboBoxPan } private class CustomFieldNamePane extends AbstractCustomFieldNamePane { - @Override - public void populateBean(SeriesValueCorrelationDefinition definition) { + protected List covertTBeanToTableModelList(SeriesValueCorrelationDefinition seriesValueCorrelationDefinition) { List list = new ArrayList(); - for (SeriesValueField seriesValueField : definition.getSeriesValueFieldList()) { - Object[] array = new Object[3]; - array[0] = seriesValueField.getSeries().getFieldName(); - array[1] = seriesValueField.getValue().getFieldName(); - array[2] = DataPaneHelper.getFunctionString(seriesValueField.getValue().getDataFunction()); + for (SeriesValueField seriesValueField : seriesValueCorrelationDefinition.getSeriesValueFieldList()) { + Object[] array = new Object[]{ + seriesValueField.getSeries().getFieldName(), + seriesValueField.getValue().getFieldName(), + DataPaneHelper.getFunctionString(seriesValueField.getValue().getDataFunction()) + }; list.add(array); } - populate(list); + return list; } @Override - public void updateBean(SeriesValueCorrelationDefinition seriesValueCorrelationDefinition) { - List list = update(); + protected void setTableModelListToTBean(List tableValues, SeriesValueCorrelationDefinition seriesValueCorrelationDefinition) { List seriesValueFields = new ArrayList(); - for (Object[] line : list) { + for (Object[] line : tableValues) { ColumnField series = new ColumnField(GeneralUtils.objectToString(line[0])); ColumnField value = new ColumnField(GeneralUtils.objectToString(line[1])); value.setDataFunction(DataPaneHelper.getFunctionByName(GeneralUtils.objectToString(line[2]))); diff --git a/designer-chart/src/main/java/com/fr/design/chartx/component/correlation/AbstractCorrelationPane.java b/designer-chart/src/main/java/com/fr/design/chartx/component/correlation/AbstractCorrelationPane.java index c7b459e49..5c468c424 100644 --- a/designer-chart/src/main/java/com/fr/design/chartx/component/correlation/AbstractCorrelationPane.java +++ b/designer-chart/src/main/java/com/fr/design/chartx/component/correlation/AbstractCorrelationPane.java @@ -10,6 +10,8 @@ import javax.swing.JTable; import javax.swing.event.ChangeEvent; import java.awt.BorderLayout; import java.awt.Component; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; import java.util.List; /** @@ -41,14 +43,19 @@ public abstract class AbstractCorrelationPane extends BasicBeanPane { correlationPane.populateBean(covertTBeanToTableModelList(ob)); } + @Override + public void updateBean(T ob) { + setTableModelListToTBean(correlationPane.updateBean(), ob); + } + @Override public T updateBean() { - return covertTableModelListToTBean(correlationPane.updateBean()); + return null; } protected abstract List covertTBeanToTableModelList(T t); - protected abstract T covertTableModelListToTBean(List tableValues); + protected abstract void setTableModelListToTBean(List tableValues, T t); private void initComps(String[] headers) { correlationPane = new UICorrelationPane(headers) { @@ -68,12 +75,27 @@ public abstract class AbstractCorrelationPane extends BasicBeanPane { } }; } + + protected ActionListener getAddButtonListener() { + return new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + tablePane.addLine(createLine()); + fireTargetChanged(); + } + }; + } }; this.setLayout(new BorderLayout()); this.add(correlationPane, BorderLayout.CENTER); } + protected Object[] createLine() { + return new Object[this.editorComponents.length]; + } + + private class Editor extends UITableEditor { private Component currentComponent; @@ -92,7 +114,7 @@ public abstract class AbstractCorrelationPane extends BasicBeanPane { currentEditorWrapper = AbstractCorrelationPane.this.editorComponents[column]; - currentComponent = currentEditorWrapper.createEditorComponent(correlationPane); + currentComponent = currentEditorWrapper.getTableCellEditorComponent(correlationPane, table, isSelected, row, column); currentEditorWrapper.setValue(currentComponent, value); return currentComponent; diff --git a/designer-chart/src/main/java/com/fr/design/chartx/component/correlation/CalculateComboBoxEditorComponent.java b/designer-chart/src/main/java/com/fr/design/chartx/component/correlation/CalculateComboBoxEditorComponent.java new file mode 100644 index 000000000..9b14fdf4d --- /dev/null +++ b/designer-chart/src/main/java/com/fr/design/chartx/component/correlation/CalculateComboBoxEditorComponent.java @@ -0,0 +1,45 @@ +package com.fr.design.chartx.component.correlation; + +import com.fr.design.gui.frpane.UICorrelationPane; +import com.fr.design.mainframe.chart.gui.data.CalculateComboBox; + +import javax.swing.JTable; +import java.awt.event.ItemEvent; +import java.awt.event.ItemListener; + +/** + * Created by shine on 2019/6/10. + */ +public class CalculateComboBoxEditorComponent extends AbstractEditorComponent { + + public CalculateComboBoxEditorComponent(String header) { + super(header); + } + + @Override + public CalculateComboBox getTableCellEditorComponent(final UICorrelationPane parent, JTable table, boolean isSelected, int row, int column) { + + CalculateComboBox calculateComboBox = new CalculateComboBox(); + + calculateComboBox.addItemListener(new ItemListener() { + public void itemStateChanged(ItemEvent e) { + parent.stopCellEditing(); + parent.fireTargetChanged(); + } + }); + return calculateComboBox; + } + + @Override + public Object getValue(CalculateComboBox calculateComboBox) { + return calculateComboBox.getSelectedItem(); + } + + @Override + public void setValue(CalculateComboBox calculateComboBox, Object o) { + + if (o != null) { + calculateComboBox.setSelectedItem(o); + } + } +} diff --git a/designer-chart/src/main/java/com/fr/design/chartx/component/correlation/FieldEditorComponentWrapper.java b/designer-chart/src/main/java/com/fr/design/chartx/component/correlation/FieldEditorComponentWrapper.java index 5181b466c..af934c325 100644 --- a/designer-chart/src/main/java/com/fr/design/chartx/component/correlation/FieldEditorComponentWrapper.java +++ b/designer-chart/src/main/java/com/fr/design/chartx/component/correlation/FieldEditorComponentWrapper.java @@ -2,6 +2,7 @@ package com.fr.design.chartx.component.correlation; import com.fr.design.gui.frpane.UICorrelationPane; +import javax.swing.JTable; import java.awt.Component; /** @@ -11,7 +12,7 @@ public interface FieldEditorComponentWrapper { String headerName(); - T createEditorComponent(UICorrelationPane parent); + T getTableCellEditorComponent(UICorrelationPane parent, JTable table, boolean isSelected, final int row, int column); Object getValue(T t); diff --git a/designer-chart/src/main/java/com/fr/design/chartx/component/correlation/TinyFormulaPaneEditorComponent.java b/designer-chart/src/main/java/com/fr/design/chartx/component/correlation/TinyFormulaPaneEditorComponent.java index 71a0a59e5..7470ef62d 100644 --- a/designer-chart/src/main/java/com/fr/design/chartx/component/correlation/TinyFormulaPaneEditorComponent.java +++ b/designer-chart/src/main/java/com/fr/design/chartx/component/correlation/TinyFormulaPaneEditorComponent.java @@ -7,6 +7,8 @@ import com.fr.design.event.UIObserverListener; import com.fr.design.formula.TinyFormulaPane; import com.fr.design.gui.frpane.UICorrelationPane; +import javax.swing.JTable; + /** * Created by shine on 2019/6/4. */ @@ -17,7 +19,7 @@ public class TinyFormulaPaneEditorComponent extends AbstractEditorComponent { + + public UIComboBoxEditorComponent(String header) { + super(header); + } + + protected List items() { + return new ArrayList(); + } + + @Override + public UIComboBox getTableCellEditorComponent(final UICorrelationPane parent, JTable table, boolean isSelected, final int row, int column) { + UIComboBox uiComboBox = new UIComboBox(items().toArray()); + + uiComboBox.addItemListener(new ItemListener() { + public void itemStateChanged(ItemEvent e) { + parent.stopCellEditing(); + parent.fireTargetChanged(); + UITable table = parent.getTable(); + Object object = table.getValueAt(row, 0); + if (object != null) { + table.setValueAt(object, row, 1); + } + } + }); + + return uiComboBox; + } + + + @Override + public Object getValue(UIComboBox uiComboBox) { + return uiComboBox.getSelectedItem(); + } + + @Override + public void setValue(UIComboBox uiComboBox, Object o) { + uiComboBox.getModel().setSelectedItem(o); + } +} diff --git a/designer-chart/src/main/java/com/fr/design/chartx/component/correlation/UITextFieldEditorComponent.java b/designer-chart/src/main/java/com/fr/design/chartx/component/correlation/UITextFieldEditorComponent.java new file mode 100644 index 000000000..142cfb12b --- /dev/null +++ b/designer-chart/src/main/java/com/fr/design/chartx/component/correlation/UITextFieldEditorComponent.java @@ -0,0 +1,41 @@ +package com.fr.design.chartx.component.correlation; + +import com.fr.design.event.UIObserverListener; +import com.fr.design.gui.frpane.UICorrelationPane; +import com.fr.design.gui.itextfield.UITextField; +import com.fr.general.GeneralUtils; + +import javax.swing.JTable; + +/** + * Created by shine on 2019/6/10. + */ +public class UITextFieldEditorComponent extends AbstractEditorComponent { + public UITextFieldEditorComponent(String header) { + super(header); + } + + @Override + public UITextField getTableCellEditorComponent(final UICorrelationPane parent, JTable table, boolean isSelected, int row, int column) { + UITextField uiTextField = new UITextField(); + + uiTextField.registerChangeListener(new UIObserverListener() { + @Override + public void doChange() { + parent.fireTargetChanged(); + } + }); + + return uiTextField; + } + + @Override + public Object getValue(UITextField uiTextField) { + return uiTextField.getText(); + } + + @Override + public void setValue(UITextField uiTextField, Object o) { + uiTextField.setText(GeneralUtils.objectToString(o)); + } +} diff --git a/designer-chart/src/main/java/com/fr/extended/chart/ExtendedCustomFieldComboBoxPane.java b/designer-chart/src/main/java/com/fr/extended/chart/ExtendedCustomFieldComboBoxPane.java index cc2849765..f918011db 100644 --- a/designer-chart/src/main/java/com/fr/extended/chart/ExtendedCustomFieldComboBoxPane.java +++ b/designer-chart/src/main/java/com/fr/extended/chart/ExtendedCustomFieldComboBoxPane.java @@ -75,23 +75,21 @@ public class ExtendedCustomFieldComboBoxPane extends AbstractCustomFieldComboBox private class ExtendedCustomFieldNamePane extends AbstractCustomFieldNamePane { @Override - public void populateBean(AbstractDataConfig ob) { - List customFields = ob.getCustomFields(); + protected List covertTBeanToTableModelList(AbstractDataConfig dataConfig) { + List customFields = dataConfig.getCustomFields(); List list = new ArrayList(); for (ExtendedField field : customFields) { String[] array = {field.getFieldName(), field.getCustomName(), DataPaneHelper.getFunctionString(field.getDataFunction())}; list.add(array); } - populate(list); + return list; } @Override - public void updateBean(AbstractDataConfig ob) { - List list = update(); - + protected void setTableModelListToTBean(List tableValues, AbstractDataConfig dataConfig) { List customFields = new ArrayList(); - for (Object[] line : list) { + for (Object[] line : tableValues) { ExtendedField field = new ExtendedField(Utils.objectToString(line[0])); field.setCustomName(Utils.objectToString(line[1])); if (line.length > 2) { @@ -100,8 +98,9 @@ public class ExtendedCustomFieldComboBoxPane extends AbstractCustomFieldComboBox customFields.add(field); } - ob.setCustomFields(customFields); + dataConfig.setCustomFields(customFields); } + } } From 0dce6dd580fdc3deca9328f8290fc1f9663f8fac Mon Sep 17 00:00:00 2001 From: zheng Date: Mon, 10 Jun 2019 20:00:01 +0800 Subject: [PATCH 011/217] update --- .../chartx/component/AbstractCustomFieldComboBoxPane.java | 4 ++-- .../design/chartx/component/SeriesValueFieldComboBoxPane.java | 4 ++-- .../fr/extended/chart/ExtendedCustomFieldComboBoxPane.java | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/designer-chart/src/main/java/com/fr/design/chartx/component/AbstractCustomFieldComboBoxPane.java b/designer-chart/src/main/java/com/fr/design/chartx/component/AbstractCustomFieldComboBoxPane.java index 6f6172bc3..3376bd193 100644 --- a/designer-chart/src/main/java/com/fr/design/chartx/component/AbstractCustomFieldComboBoxPane.java +++ b/designer-chart/src/main/java/com/fr/design/chartx/component/AbstractCustomFieldComboBoxPane.java @@ -130,7 +130,7 @@ public abstract class AbstractCustomFieldComboBoxPane extends UIComboBoxPane< useFieldValuePane.updateBean(t); } - protected abstract class AbstractUseFieldValuePane extends FurtherBasicBeanPane { + protected abstract class AbstractUseFieldValuePane extends FurtherBasicBeanPane { private UIComboBox series; private UIComboBox value; private CalculateComboBox function; @@ -222,7 +222,7 @@ public abstract class AbstractCustomFieldComboBoxPane extends UIComboBoxPane< } } - protected abstract class AbstractCustomFieldNamePane extends AbstractCorrelationPane { + protected abstract class AbstractCustomFieldNamePane extends AbstractCorrelationPane { @Override protected FieldEditorComponentWrapper[] createFieldEditorComponentWrappers() { diff --git a/designer-chart/src/main/java/com/fr/design/chartx/component/SeriesValueFieldComboBoxPane.java b/designer-chart/src/main/java/com/fr/design/chartx/component/SeriesValueFieldComboBoxPane.java index 4d5fbd3b4..30ae364b7 100644 --- a/designer-chart/src/main/java/com/fr/design/chartx/component/SeriesValueFieldComboBoxPane.java +++ b/designer-chart/src/main/java/com/fr/design/chartx/component/SeriesValueFieldComboBoxPane.java @@ -47,7 +47,7 @@ public class SeriesValueFieldComboBoxPane extends AbstractCustomFieldComboBoxPan } } - private class UseFieldValuePane extends AbstractUseFieldValuePane { + private class UseFieldValuePane extends AbstractUseFieldValuePane { @Override public void populateBean(SeriesValueCorrelationDefinition ob) { @@ -73,7 +73,7 @@ public class SeriesValueFieldComboBoxPane extends AbstractCustomFieldComboBoxPan } } - private class CustomFieldNamePane extends AbstractCustomFieldNamePane { + private class CustomFieldNamePane extends AbstractCustomFieldNamePane { @Override protected List covertTBeanToTableModelList(SeriesValueCorrelationDefinition seriesValueCorrelationDefinition) { List list = new ArrayList(); diff --git a/designer-chart/src/main/java/com/fr/extended/chart/ExtendedCustomFieldComboBoxPane.java b/designer-chart/src/main/java/com/fr/extended/chart/ExtendedCustomFieldComboBoxPane.java index f918011db..108d4b605 100644 --- a/designer-chart/src/main/java/com/fr/extended/chart/ExtendedCustomFieldComboBoxPane.java +++ b/designer-chart/src/main/java/com/fr/extended/chart/ExtendedCustomFieldComboBoxPane.java @@ -45,7 +45,7 @@ public class ExtendedCustomFieldComboBoxPane extends AbstractCustomFieldComboBox } } - private class ExtendedUseFieldValuePane extends AbstractUseFieldValuePane { + private class ExtendedUseFieldValuePane extends AbstractUseFieldValuePane { @Override public void populateBean(AbstractDataConfig ob) { @@ -72,7 +72,7 @@ public class ExtendedCustomFieldComboBoxPane extends AbstractCustomFieldComboBox } - private class ExtendedCustomFieldNamePane extends AbstractCustomFieldNamePane { + private class ExtendedCustomFieldNamePane extends AbstractCustomFieldNamePane { @Override protected List covertTBeanToTableModelList(AbstractDataConfig dataConfig) { From 8114a3bc642c05d1dc86d83308b56c57c434fb6a Mon Sep 17 00:00:00 2001 From: ju Date: Thu, 13 Jun 2019 15:41:15 +0800 Subject: [PATCH 012/217] =?UTF-8?q?REPORT-17988=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=E5=90=AF=E5=8A=A8=E9=80=9F=E5=BA=A6&=E9=97=AA?= =?UTF-8?q?=E9=80=80=201=E3=80=81=E6=8F=90=E4=BE=9B=E5=B9=B6=E8=A1=8Cactiv?= =?UTF-8?q?ator=202=E3=80=81=E6=89=93=E5=8D=B0=E5=90=AF=E5=8A=A8=E6=97=B6?= =?UTF-8?q?=E9=95=BF=E4=BF=A1=E6=81=AF=E7=94=A8=E4=BA=8E=E5=90=8E=E9=9D=A2?= =?UTF-8?q?=E8=B0=83=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fr/start/Designer.java | 11 ++++++++--- .../java/com/fr/start/module/DesignerStartup.java | 7 +++++++ 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/start/Designer.java b/designer-realize/src/main/java/com/fr/start/Designer.java index 2c8e030e3..654f396c8 100644 --- a/designer-realize/src/main/java/com/fr/start/Designer.java +++ b/designer-realize/src/main/java/com/fr/start/Designer.java @@ -21,6 +21,7 @@ import com.fr.design.gui.ibutton.UIPreviewButton; import com.fr.design.gui.imenu.UIMenuItem; import com.fr.design.gui.imenu.UIPopupMenu; import com.fr.design.gui.itoolbar.UILargeToolbar; +import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.ActiveKeyGenerator; import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.InformationCollector; @@ -49,6 +50,7 @@ import com.fr.stable.lifecycle.LifecycleFatalError; import com.fr.stable.xml.XMLTools; import com.fr.start.module.StartupArgs; import com.fr.start.server.ServerTray; +import com.fr.third.org.apache.commons.lang3.time.StopWatch; import com.fr.workspace.WorkContext; import javax.swing.JComponent; @@ -92,7 +94,9 @@ public class Designer extends BaseDesigner { * @param args 参数 */ public static void main(String[] args) { - + + StopWatch watch = new StopWatch(); + watch.start(); //启动运行时 FineRuntime.start(); Module designerRoot = ModuleContext.parseRoot("designer-startup.xml"); @@ -102,7 +106,7 @@ public class Designer extends BaseDesigner { designerRoot.start(); } catch (LifecycleFatalError fatal) { SplashContext.getInstance().hide(); - JOptionPane.showMessageDialog(null, fatal.getMessage(), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Error"), JOptionPane.ERROR_MESSAGE); + JOptionPane.showMessageDialog(null, fatal.getMessage(), Toolkit.i18nText("Fine-Design_Basic_Error"), JOptionPane.ERROR_MESSAGE); FineLoggerFactory.getLogger().error(fatal.getMessage(), fatal); System.exit(0); } @@ -111,7 +115,8 @@ public class Designer extends BaseDesigner { //初始化一下serverTray ServerTray.init(); } - + FineLoggerFactory.getLogger().info("Designer started.Time used {} ms", watch.getTime()); + watch.stop(); } /** diff --git a/designer-realize/src/main/java/com/fr/start/module/DesignerStartup.java b/designer-realize/src/main/java/com/fr/start/module/DesignerStartup.java index 4a3db7b2c..a81676979 100644 --- a/designer-realize/src/main/java/com/fr/start/module/DesignerStartup.java +++ b/designer-realize/src/main/java/com/fr/start/module/DesignerStartup.java @@ -5,6 +5,7 @@ import com.fr.design.file.HistoryTemplateListCache; import com.fr.design.mainframe.DesignerContext; import com.fr.event.Event; import com.fr.event.Listener; +import com.fr.log.FineLoggerFactory; import com.fr.module.Activator; import com.fr.record.analyzer.EnableMetrics; import com.fr.record.analyzer.Metrics; @@ -14,6 +15,7 @@ import com.fr.start.ServerStarter; import com.fr.start.SplashContext; import com.fr.start.server.FineEmbedServer; import com.fr.startup.activators.BasicActivator; +import com.fr.third.org.apache.commons.lang3.time.StopWatch; import com.fr.workspace.Workspace; import com.fr.workspace.WorkspaceEvent; @@ -49,14 +51,19 @@ public class DesignerStartup extends Activator { FineEmbedServer.start(); } }); + final StopWatch watch = new StopWatch(); service.submit(new Runnable() { @Override public void run() { try { + + watch.start(); designer.show(args); } finally { DesignerContext.getDesignerFrame().getProgressDialog().dispose(); + FineLoggerFactory.getLogger().info("Designer showed.Time used {} ms", watch.getTime()); + watch.stop(); } } }); From 1c70ee19f38e12f574189aa0a3d7effabbd5ca47 Mon Sep 17 00:00:00 2001 From: ju Date: Fri, 14 Jun 2019 11:00:04 +0800 Subject: [PATCH 013/217] =?UTF-8?q?REPORT-17988=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=E5=90=AF=E5=8A=A8=E9=80=9F=E5=BA=A6--=E6=9C=AC?= =?UTF-8?q?=E6=9C=BA=E5=A4=A7=E6=A6=82=E4=BB=8E=2014.2s=20->=2010.2=201?= =?UTF-8?q?=E3=80=81basic=E5=B9=B6=E8=A1=8C=202=E3=80=81new=20Designer?= =?UTF-8?q?=E5=92=8Cenv=E3=80=81core=E5=B9=B6=E8=A1=8C=EF=BC=8C=E4=BD=86?= =?UTF-8?q?=E6=98=AF=E5=92=8CshowDesigner=E4=B8=B2=E8=A1=8C=203=E3=80=81?= =?UTF-8?q?=E5=8E=BB=E6=8E=89=E8=AF=BB=E6=A8=A1=E6=9D=BF=E6=97=B6=E5=80=99?= =?UTF-8?q?=E7=9A=84=E8=BF=9B=E5=BA=A6=E6=9D=A1=EF=BC=88=E5=BE=85=E8=AE=A8?= =?UTF-8?q?=E8=AE=BA=EF=BC=8C=E6=80=BB=E5=85=B1=E5=BF=AB=E4=BA=861s?= =?UTF-8?q?=E5=B7=A6=E5=8F=B3=E4=B8=8D=E8=BF=87=E5=90=AF=E5=8A=A8=E5=8A=A8?= =?UTF-8?q?=E7=94=BB=E7=9A=84=E6=97=B6=E9=97=B4=E9=95=BF=E4=BA=86=EF=BC=8C?= =?UTF-8?q?=E5=AE=A2=E6=88=B7=E6=84=9F=E5=8F=97=E4=B8=8D=E7=A1=AE=E5=AE=9A?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/EnvChangeEntrance.java | 11 +- .../main/java/com/fr/start/BaseDesigner.java | 47 +++----- .../java/com/fr/start/DesignerInitial.java | 24 ++++ .../start/module/DesignerInitActivator.java | 21 ++++ .../start/module/DesignerShowActivator.java | 21 ++++ .../com/fr/start/module/DesignerStartup.java | 111 ++---------------- .../module/DesignerWorkspaceActivator.java | 94 +++++++++++++++ 7 files changed, 196 insertions(+), 133 deletions(-) create mode 100644 designer-realize/src/main/java/com/fr/start/DesignerInitial.java create mode 100644 designer-realize/src/main/java/com/fr/start/module/DesignerInitActivator.java create mode 100644 designer-realize/src/main/java/com/fr/start/module/DesignerShowActivator.java create mode 100644 designer-realize/src/main/java/com/fr/start/module/DesignerWorkspaceActivator.java diff --git a/designer-base/src/main/java/com/fr/design/EnvChangeEntrance.java b/designer-base/src/main/java/com/fr/design/EnvChangeEntrance.java index 93f282454..c1c11553f 100644 --- a/designer-base/src/main/java/com/fr/design/EnvChangeEntrance.java +++ b/designer-base/src/main/java/com/fr/design/EnvChangeEntrance.java @@ -102,11 +102,7 @@ public class EnvChangeEntrance { return false; } - //REPORT-13810如果只是添加了工作目录,没有切换,这里ToolArea也是要显示新建的工作目录 - JTemplate template = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); - if (template != null) { - template.refreshToolArea(); - } + WorkContext.switchTo(workspace, new WorkContextCallback() { @Override public void done() { @@ -119,6 +115,11 @@ public class EnvChangeEntrance { } } }); + //REPORT-13810如果只是添加了工作目录,没有切换,这里ToolArea也是要显示新建的工作目录 + JTemplate template = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); + if (template != null) { + template.refreshToolArea(); + } } catch (WorkspaceAuthException | RegistEditionException e) { // String title = Toolkit.i18nText("Fine-Design_Basic_Remote_Connect_Auth_Failed"); diff --git a/designer-base/src/main/java/com/fr/start/BaseDesigner.java b/designer-base/src/main/java/com/fr/start/BaseDesigner.java index 3e466ed1f..f88582e66 100644 --- a/designer-base/src/main/java/com/fr/start/BaseDesigner.java +++ b/designer-base/src/main/java/com/fr/start/BaseDesigner.java @@ -31,19 +31,18 @@ import java.lang.reflect.Method; * The main class of Report Designer. */ public abstract class BaseDesigner extends ToolBarMenuDock { - private static final int PERCENT_TEN = 10; - private static final int PERCENT_SIXTY = 60; - private static final int PERCENT_NINTY= 90; - private static final int PERCENT_COMPLETE= 100; - + private static final int LOAD_TREE_MAXNUM = 10; + + private final String[] args; public BaseDesigner(String[] args) { - - init(args); + + this.args = args; + init(); } - - private void init(String[] args) { + + private void init() { //初始化 EventDispatcher.fire(ModuleEvent.MajorModuleStarting, Toolkit.i18nText("Fine-Design_Basic_Initializing")); // 初始化look and feel.这个在预加载之前执行是因为lookAndFeel里的东西,预加载时也要用到 @@ -52,18 +51,15 @@ public abstract class BaseDesigner extends ToolBarMenuDock { DesignerEnvManager.loadLogSetting(); createDesignerFrame(); } - - public void show(final String[] args) { + + public void show() { collectUserInformation(); - DesignerContext.getDesignerFrame().updateProgress(PERCENT_TEN); - showDesignerFrame(args, DesignerContext.getDesignerFrame(), false); - DesignerContext.getDesignerFrame().updateProgress(PERCENT_SIXTY); + showDesignerFrame(false); + DesignerContext.getDesignerFrame().setVisible(true); DesignerContext.getDesignerFrame().refreshEnv(); - DesignerContext.getDesignerFrame().updateProgress(PERCENT_NINTY); for (int i = 0; !TemplateTreePane.getInstance().getTemplateFileTree().isTemplateShowing() && i < LOAD_TREE_MAXNUM; i++) { TemplateTreePane.getInstance().getTemplateFileTree().refresh(); } - DesignerContext.getDesignerFrame().updateProgress(PERCENT_COMPLETE); } @@ -71,10 +67,9 @@ public abstract class BaseDesigner extends ToolBarMenuDock { new DesignerFrame(this); } - - - private void showDesignerFrame(String[] args, final DesignerFrame df, - boolean isException) { + + + private void showDesignerFrame(boolean isException) { try { FILE file = null; if (args != null && args.length > 0) { @@ -101,12 +96,13 @@ public abstract class BaseDesigner extends ToolBarMenuDock { file = FILEFactory.createFILE(FILEFactory.ENV_PREFIX + DesignerEnvManager.getEnvManager().getLastOpenFile()); } + DesignerFrame df = DesignerContext.getDesignerFrame(); isException = openFile(df, isException, file); df.fireDesignerOpened(); } catch (Exception e) { FineLoggerFactory.getLogger().error(e.getMessage(), e); if (!isException) { - showDesignerFrame(args, df, true); + showDesignerFrame(true); } else { System.exit(0); } @@ -137,19 +133,14 @@ public abstract class BaseDesigner extends ToolBarMenuDock { df.getSelectedJTemplate().requestGridFocus(); return isException; } - - - /** - * @param window - */ + private void enableFullScreenMode(Window window) { String className = "com.apple.eawt.FullScreenUtilities"; String methodName = "setWindowCanFullScreen"; try { Class clazz = Class.forName(className); - Method method = clazz.getMethod(methodName, new Class[]{ - Window.class, boolean.class}); + Method method = clazz.getMethod(methodName, Window.class, boolean.class); method.invoke(null, window, true); } catch (Throwable t) { FineLoggerFactory.getLogger().error("Full screen mode is not supported"); diff --git a/designer-realize/src/main/java/com/fr/start/DesignerInitial.java b/designer-realize/src/main/java/com/fr/start/DesignerInitial.java new file mode 100644 index 000000000..ea1faa321 --- /dev/null +++ b/designer-realize/src/main/java/com/fr/start/DesignerInitial.java @@ -0,0 +1,24 @@ +package com.fr.start; + +/** + * Created by juhaoyu on 2019-06-14. + * 设计器上下文 + */ +public class DesignerInitial { + + private static volatile Designer designer; + + public synchronized static void init(String... args) { + + designer = new Designer(args); + } + + public synchronized static void show() { + + if (designer != null) { + designer.show(); + } + //启动画面结束 + SplashContext.getInstance().hide(); + } +} diff --git a/designer-realize/src/main/java/com/fr/start/module/DesignerInitActivator.java b/designer-realize/src/main/java/com/fr/start/module/DesignerInitActivator.java new file mode 100644 index 000000000..e9bea2692 --- /dev/null +++ b/designer-realize/src/main/java/com/fr/start/module/DesignerInitActivator.java @@ -0,0 +1,21 @@ +package com.fr.start.module; + +import com.fr.module.Activator; +import com.fr.start.DesignerInitial; + +/** + * Created by juhaoyu on 2019-06-14. + */ +public class DesignerInitActivator extends Activator { + + @Override + public void start() { + + DesignerInitial.init(upFindSingleton(StartupArgs.class).get()); + } + + @Override + public void stop() { + + } +} diff --git a/designer-realize/src/main/java/com/fr/start/module/DesignerShowActivator.java b/designer-realize/src/main/java/com/fr/start/module/DesignerShowActivator.java new file mode 100644 index 000000000..d1e0ab567 --- /dev/null +++ b/designer-realize/src/main/java/com/fr/start/module/DesignerShowActivator.java @@ -0,0 +1,21 @@ +package com.fr.start.module; + +import com.fr.module.Activator; +import com.fr.start.DesignerInitial; + +/** + * Created by juhaoyu on 2019-06-14. + */ +public class DesignerShowActivator extends Activator { + + @Override + public void start() { + + DesignerInitial.show(); + } + + @Override + public void stop() { + + } +} diff --git a/designer-realize/src/main/java/com/fr/start/module/DesignerStartup.java b/designer-realize/src/main/java/com/fr/start/module/DesignerStartup.java index a81676979..97bdceda1 100644 --- a/designer-realize/src/main/java/com/fr/start/module/DesignerStartup.java +++ b/designer-realize/src/main/java/com/fr/start/module/DesignerStartup.java @@ -2,20 +2,15 @@ package com.fr.start.module; import com.fr.design.file.HistoryTemplateListCache; -import com.fr.design.mainframe.DesignerContext; import com.fr.event.Event; import com.fr.event.Listener; -import com.fr.log.FineLoggerFactory; import com.fr.module.Activator; import com.fr.record.analyzer.EnableMetrics; import com.fr.record.analyzer.Metrics; import com.fr.runtime.FineRuntime; -import com.fr.start.Designer; +import com.fr.start.DesignerInitial; import com.fr.start.ServerStarter; -import com.fr.start.SplashContext; import com.fr.start.server.FineEmbedServer; -import com.fr.startup.activators.BasicActivator; -import com.fr.third.org.apache.commons.lang3.time.StopWatch; import com.fr.workspace.Workspace; import com.fr.workspace.WorkspaceEvent; @@ -27,115 +22,31 @@ import java.util.concurrent.Executors; */ @EnableMetrics public class DesignerStartup extends Activator { - + @Override @Metrics public void start() { - + startSub(PreStartActivator.class); - //启动基础部分 - startSub(BasicActivator.class); - final String[] args = getModule().upFindSingleton(StartupArgs.class).get(); - final Designer designer = new Designer(args); - - startSub(DesignerWorkspaceProvider.class); - registerEnvListener(); - //启动env - startSub(EnvBasedModule.class); + getSub("parallel").start(); //designer模块启动好后,查看demo browserDemo(); - ExecutorService service = Executors.newFixedThreadPool(2); - service.submit(new Runnable() { - @Override - public void run() { - FineEmbedServer.start(); - } - }); - final StopWatch watch = new StopWatch(); - service.submit(new Runnable() { - - @Override - public void run() { - try { - - watch.start(); - designer.show(args); - } finally { - DesignerContext.getDesignerFrame().getProgressDialog().dispose(); - FineLoggerFactory.getLogger().info("Designer showed.Time used {} ms", watch.getTime()); - watch.stop(); - } - } - }); - service.shutdown(); - DesignerContext.getDesignerFrame().setVisible(true); - //启动画面结束 - SplashContext.getInstance().hide(); - - DesignerContext.getDesignerFrame().getProgressDialog().setVisible(true); + + startSub(DesignerShowActivator.class); startSub(StartFinishActivator.class); FineRuntime.startFinish(); } - + private void browserDemo() { - + if (getModule().leftFindSingleton(StartupArgs.class) != null && getModule().leftFindSingleton(StartupArgs.class).isDemo()) { ServerStarter.browserDemoURL(); } } - - /** - * 注册切换环境前后事件监听 - */ - private void registerEnvListener() { - - /*切换环境前,关闭所有相关模块,最后执行*/ - listenEvent(WorkspaceEvent.BeforeSwitch, new Listener(Integer.MIN_VALUE) { - - @Override - public void on(Event event, Workspace current) { - getSub(EnvBasedModule.class).stop(); - } - }); - /*切换环境后,重新启动所有相关模块,最先执行*/ - listenEvent(WorkspaceEvent.AfterSwitch, new Listener(Integer.MAX_VALUE) { - - @Override - public void on(Event event, Workspace current) { - getSub(EnvBasedModule.class).start(); - // 切换后的环境是本地环境才启动内置服务器 - if (current.isLocal()) { - ExecutorService service = Executors.newSingleThreadExecutor(); - service.submit(new Runnable() { - @Override - public void run() { - FineEmbedServer.start(); - } - }); - service.shutdown(); - } - } - }); - /*切换环境前,存储一下打开的所有文件对象,要先于 关闭相关模块部分 被触发*/ - listenEvent(WorkspaceEvent.BeforeSwitch, new Listener(Integer.MAX_VALUE) { - @Override - public void on(Event event, Workspace workspace) { - HistoryTemplateListCache.getInstance().stash(); - } - }); - - /*切换环境后,装载一下打开的所有文件对象,优先级低于默认优先级,要后于 启动相关模块部分 被触发*/ - listenEvent(WorkspaceEvent.AfterSwitch, new Listener(Integer.MIN_VALUE) { - @Override - public void on(Event event, Workspace workspace) { - HistoryTemplateListCache.getInstance().load(); - } - }); - } - - + + @Override public void stop() { - + } } diff --git a/designer-realize/src/main/java/com/fr/start/module/DesignerWorkspaceActivator.java b/designer-realize/src/main/java/com/fr/start/module/DesignerWorkspaceActivator.java new file mode 100644 index 000000000..09115eb50 --- /dev/null +++ b/designer-realize/src/main/java/com/fr/start/module/DesignerWorkspaceActivator.java @@ -0,0 +1,94 @@ +package com.fr.start.module; + +import com.fr.design.file.HistoryTemplateListCache; +import com.fr.event.Event; +import com.fr.event.Listener; +import com.fr.module.Activator; +import com.fr.start.server.FineEmbedServer; +import com.fr.workspace.WorkContext; +import com.fr.workspace.Workspace; +import com.fr.workspace.WorkspaceEvent; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +/** + * Created by juhaoyu on 2019-06-14. + */ +public class DesignerWorkspaceActivator extends Activator { + + @Override + public void start() { + + registerEnvListener(); + startServer(WorkContext.getCurrent()); + } + + + /** + * 注册切换环境前后事件监听 + */ + private void registerEnvListener() { + + /*切换环境前,关闭所有相关模块,最后执行*/ + listenEvent(WorkspaceEvent.BeforeSwitch, new Listener(Integer.MIN_VALUE) { + + @Override + public void on(Event event, Workspace current) { + + getSub(EnvBasedModule.class).stop(); + } + }); + /*切换环境后,重新启动所有相关模块,最先执行*/ + listenEvent(WorkspaceEvent.AfterSwitch, new Listener(Integer.MAX_VALUE) { + + @Override + public void on(Event event, Workspace current) { + + getSub(EnvBasedModule.class).start(); + startServer(current); + } + }); + /*切换环境前,存储一下打开的所有文件对象,要先于 关闭相关模块部分 被触发*/ + listenEvent(WorkspaceEvent.BeforeSwitch, new Listener(Integer.MAX_VALUE) { + + @Override + public void on(Event event, Workspace workspace) { + + HistoryTemplateListCache.getInstance().stash(); + } + }); + + /*切换环境后,装载一下打开的所有文件对象,优先级低于默认优先级,要后于 启动相关模块部分 被触发*/ + listenEvent(WorkspaceEvent.AfterSwitch, new Listener(Integer.MIN_VALUE) { + + @Override + public void on(Event event, Workspace workspace) { + + HistoryTemplateListCache.getInstance().load(); + } + }); + } + + private void startServer(Workspace current) { + + // 切换后的环境是本地环境才启动内置服务器 + if (current.isLocal()) { + ExecutorService service = Executors.newSingleThreadExecutor(); + service.submit(new Runnable() { + + @Override + public void run() { + + FineEmbedServer.start(); + } + }); + service.shutdown(); + } + } + + @Override + public void stop() { + + } +} From a08bec7b167de5769ef077ee3d296aa338fdabfd Mon Sep 17 00:00:00 2001 From: ju Date: Fri, 14 Jun 2019 11:42:45 +0800 Subject: [PATCH 014/217] =?UTF-8?q?REPORT-17988=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=E5=90=AF=E5=8A=A8=E9=80=9F=E5=BA=A6--=E6=9C=AC?= =?UTF-8?q?=E6=9C=BA=E5=A4=A7=E6=A6=82=E4=BB=8E=2014.2s=20->=2010.2=20bugf?= =?UTF-8?q?ix=20=E5=90=8E=E9=9D=A2=E5=88=B7=E6=96=B0env=E7=9A=84=E5=8E=9F?= =?UTF-8?q?=E5=9B=A0=E6=98=AF=E5=95=A5=EF=BC=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../design/event/DesignerOpenedListener.java | 2 +- .../fr/design/mainframe/DesignerFrame.java | 19 ++++++++----------- .../main/java/com/fr/start/BaseDesigner.java | 5 ++++- .../com/fr/start/module/DesignerStartup.java | 11 ----------- 4 files changed, 13 insertions(+), 24 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/event/DesignerOpenedListener.java b/designer-base/src/main/java/com/fr/design/event/DesignerOpenedListener.java index 77c6bcf8f..c14fe870f 100644 --- a/designer-base/src/main/java/com/fr/design/event/DesignerOpenedListener.java +++ b/designer-base/src/main/java/com/fr/design/event/DesignerOpenedListener.java @@ -9,5 +9,5 @@ public interface DesignerOpenedListener extends EventListener { /** * Invoked when the target of the listener has changed the rpt content. */ - public void designerOpened(); + void designerOpened(); } \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java index e10de8ab4..277ca93eb 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java @@ -308,16 +308,6 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta } } }); - this.addDesignerOpenedListener(new DesignerOpenedListener() { - - @Override - public void designerOpened() { - - HistoryTemplateListPane.getInstance().getCurrentEditingTemplate().setComposite(); - reCalculateFrameSize(); - HistoryTemplateListPane.getInstance().getCurrentEditingTemplate().doResize(); - } - }); this.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); this.setVisible(false); this.setExtendedState(JFrame.MAXIMIZED_BOTH); @@ -326,7 +316,14 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta initMenuPane(); this.progressDialog = new ProgressDialog(this); } - + + public void resizeFrame() { + + HistoryTemplateListPane.getInstance().getCurrentEditingTemplate().setComposite(); + reCalculateFrameSize(); + HistoryTemplateListPane.getInstance().getCurrentEditingTemplate().doResize(); + } + public void closeAuthorityEditing() { DesignModeContext.switchTo(com.fr.design.base.mode.DesignerMode.NORMAL); WestRegionContainerPane.getInstance().replaceDownPane( diff --git a/designer-base/src/main/java/com/fr/start/BaseDesigner.java b/designer-base/src/main/java/com/fr/start/BaseDesigner.java index f88582e66..91e4f725e 100644 --- a/designer-base/src/main/java/com/fr/start/BaseDesigner.java +++ b/designer-base/src/main/java/com/fr/start/BaseDesigner.java @@ -55,11 +55,14 @@ public abstract class BaseDesigner extends ToolBarMenuDock { public void show() { collectUserInformation(); showDesignerFrame(false); - DesignerContext.getDesignerFrame().setVisible(true); + + //TODO: 2019-06-14 这里有啥作用? DesignerContext.getDesignerFrame().refreshEnv(); for (int i = 0; !TemplateTreePane.getInstance().getTemplateFileTree().isTemplateShowing() && i < LOAD_TREE_MAXNUM; i++) { TemplateTreePane.getInstance().getTemplateFileTree().refresh(); } + DesignerContext.getDesignerFrame().setVisible(true); + DesignerContext.getDesignerFrame().resizeFrame(); } diff --git a/designer-realize/src/main/java/com/fr/start/module/DesignerStartup.java b/designer-realize/src/main/java/com/fr/start/module/DesignerStartup.java index 97bdceda1..539e8359a 100644 --- a/designer-realize/src/main/java/com/fr/start/module/DesignerStartup.java +++ b/designer-realize/src/main/java/com/fr/start/module/DesignerStartup.java @@ -1,21 +1,11 @@ package com.fr.start.module; -import com.fr.design.file.HistoryTemplateListCache; -import com.fr.event.Event; -import com.fr.event.Listener; import com.fr.module.Activator; import com.fr.record.analyzer.EnableMetrics; import com.fr.record.analyzer.Metrics; import com.fr.runtime.FineRuntime; -import com.fr.start.DesignerInitial; import com.fr.start.ServerStarter; -import com.fr.start.server.FineEmbedServer; -import com.fr.workspace.Workspace; -import com.fr.workspace.WorkspaceEvent; - -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; /** * Created by juhaoyu on 2018/1/8. @@ -31,7 +21,6 @@ public class DesignerStartup extends Activator { getSub("parallel").start(); //designer模块启动好后,查看demo browserDemo(); - startSub(DesignerShowActivator.class); startSub(StartFinishActivator.class); FineRuntime.startFinish(); From d397b419a8fca8127a07f0b4ab2085ba325f90b4 Mon Sep 17 00:00:00 2001 From: ju Date: Fri, 14 Jun 2019 11:48:56 +0800 Subject: [PATCH 015/217] =?UTF-8?q?REPORT-17988=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=E5=90=AF=E5=8A=A8=E9=80=9F=E5=BA=A6=20bugfix?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/fr/start/BaseDesigner.java | 2 - .../fr/start/module/PreStartActivator.java | 62 +++++++++++-------- 2 files changed, 37 insertions(+), 27 deletions(-) diff --git a/designer-base/src/main/java/com/fr/start/BaseDesigner.java b/designer-base/src/main/java/com/fr/start/BaseDesigner.java index 91e4f725e..05d41a1e7 100644 --- a/designer-base/src/main/java/com/fr/start/BaseDesigner.java +++ b/designer-base/src/main/java/com/fr/start/BaseDesigner.java @@ -43,8 +43,6 @@ public abstract class BaseDesigner extends ToolBarMenuDock { } private void init() { - //初始化 - EventDispatcher.fire(ModuleEvent.MajorModuleStarting, Toolkit.i18nText("Fine-Design_Basic_Initializing")); // 初始化look and feel.这个在预加载之前执行是因为lookAndFeel里的东西,预加载时也要用到 DesignUtils.initLookAndFeel(); // 初始化Log Handler diff --git a/designer-realize/src/main/java/com/fr/start/module/PreStartActivator.java b/designer-realize/src/main/java/com/fr/start/module/PreStartActivator.java index 72d3217be..035be0aaa 100644 --- a/designer-realize/src/main/java/com/fr/start/module/PreStartActivator.java +++ b/designer-realize/src/main/java/com/fr/start/module/PreStartActivator.java @@ -3,14 +3,17 @@ package com.fr.start.module; import com.fr.design.DesignerEnvManager; import com.fr.design.RestartHelper; import com.fr.design.fun.OemProcessor; +import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.template.info.TemplateInfoCollector; import com.fr.design.utils.DesignUtils; import com.fr.design.utils.DesignerPort; +import com.fr.event.EventDispatcher; import com.fr.general.CloudCenter; import com.fr.general.ComparatorUtils; import com.fr.general.GeneralContext; import com.fr.log.FineLoggerFactory; import com.fr.module.Activator; +import com.fr.module.ModuleEvent; import com.fr.stable.BuildContext; import com.fr.stable.OperatingSystem; import com.fr.stable.ProductConstants; @@ -30,10 +33,10 @@ import java.util.concurrent.Executors; * Created by juhaoyu on 2018/1/8. */ public class PreStartActivator extends Activator { - + @Override public void start() { - + BuildContext.setBuildFilePath("/com/fr/stable/build.properties"); // 如果端口被占用了 说明程序已经运行了一次,也就是说,已经建立一个监听服务器,现在只要给服务器发送命令就好了 final String[] args = getModule().upFindSingleton(StartupArgs.class).get(); @@ -45,87 +48,96 @@ public class PreStartActivator extends Activator { System.exit(0); return; } - + RestartHelper.deleteRecordFilesWhenStart(); - + preloadResource(); - + SplashContext.getInstance().registerSplash(createSplash()); - + SplashContext.getInstance().show(); - // 完成初始化 //noinspection ResultOfMethodCallIgnored CloudCenter.getInstance(); - + // 创建监听服务 DesignUtils.createListeningServer(DesignUtils.getPort(), startFileSuffix()); - + initLanguage(); } - + @Override public void stop() { - + } - + private void checkDebugStart() { + if (isDebug()) { setDebugEnv(); } } - - + + /** * 在VM options里加入-Ddebug=true激活 * * @return isDebug */ private boolean isDebug() { + return ComparatorUtils.equals("true", System.getProperty("debug")); } - - + + //端口改一下,环境配置文件改一下。便于启动两个设计器,进行对比调试 private void setDebugEnv() { + DesignUtils.setPort(DesignerPort.DEBUG_MESSAGE_PORT); String debugXMlFilePath = StableUtils.pathJoin( - ProductConstants.getEnvHome(), - ProductConstants.APP_NAME + "Env_debug.xml" + ProductConstants.getEnvHome(), + ProductConstants.APP_NAME + "Env_debug.xml" ); DesignerEnvManager.setEnvFile( - new File(debugXMlFilePath)); + new File(debugXMlFilePath)); } - + private void initLanguage() { //这两句的位置不能随便调换,因为会影响语言切换的问题 GeneralContext.setLocale(DesignerEnvManager.getEnvManager(false).getLanguage()); } - + private String[] startFileSuffix() { + return new String[]{".cpt", ".xls", ".xlsx", ".frm", ".form", ".cht", ".chart"}; } - + private static void preloadResource() { + ExecutorService service = Executors.newCachedThreadPool(); - + service.submit(new Runnable() { + @Override public void run() { + new ImagePreLoader(); } }); - + service.submit(new Runnable() { + @Override public void run() { + TemplateInfoCollector.getInstance(); } }); service.shutdown(); } - + private SplashStrategy createSplash() { + OemProcessor oemProcessor = OemHandler.findOem(); if (oemProcessor != null) { SplashStrategy splashStrategy = null; From 40d515d864c8e4ce406469e130fd92c9c247003d Mon Sep 17 00:00:00 2001 From: ju Date: Fri, 14 Jun 2019 11:49:56 +0800 Subject: [PATCH 016/217] =?UTF-8?q?REPORT-17988=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=E5=90=AF=E5=8A=A8=E9=80=9F=E5=BA=A6=20bugfix?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fr/start/module/PreStartActivator.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/designer-realize/src/main/java/com/fr/start/module/PreStartActivator.java b/designer-realize/src/main/java/com/fr/start/module/PreStartActivator.java index 035be0aaa..c4b1dc0a9 100644 --- a/designer-realize/src/main/java/com/fr/start/module/PreStartActivator.java +++ b/designer-realize/src/main/java/com/fr/start/module/PreStartActivator.java @@ -56,6 +56,8 @@ public class PreStartActivator extends Activator { SplashContext.getInstance().registerSplash(createSplash()); SplashContext.getInstance().show(); + //初始化 + EventDispatcher.fire(ModuleEvent.MajorModuleStarting, Toolkit.i18nText("Fine-Design_Basic_Initializing")); // 完成初始化 //noinspection ResultOfMethodCallIgnored CloudCenter.getInstance(); From 56928fed2cf7a2bc4e73def006e89b832a451dde Mon Sep 17 00:00:00 2001 From: ju Date: Fri, 14 Jun 2019 15:15:53 +0800 Subject: [PATCH 017/217] =?UTF-8?q?REPORT-17988=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=E5=90=AF=E5=8A=A8=E9=80=9F=E5=BA=A6=20=E6=A8=A1?= =?UTF-8?q?=E5=9D=97=E8=AF=A6=E6=83=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/start/module/DesignerShowActivator.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/designer-realize/src/main/java/com/fr/start/module/DesignerShowActivator.java b/designer-realize/src/main/java/com/fr/start/module/DesignerShowActivator.java index d1e0ab567..33ef015c1 100644 --- a/designer-realize/src/main/java/com/fr/start/module/DesignerShowActivator.java +++ b/designer-realize/src/main/java/com/fr/start/module/DesignerShowActivator.java @@ -1,6 +1,9 @@ package com.fr.start.module; +import com.fr.design.i18n.Toolkit; +import com.fr.event.EventDispatcher; import com.fr.module.Activator; +import com.fr.module.ModuleEvent; import com.fr.start.DesignerInitial; /** @@ -10,7 +13,8 @@ public class DesignerShowActivator extends Activator { @Override public void start() { - + + EventDispatcher.fire(ModuleEvent.MajorModuleStarting, Toolkit.i18nText("Fine-Design_Module_Name_Designer")); DesignerInitial.show(); } From fff1a460b28bee2274cc8fd6c8c46186894fe036 Mon Sep 17 00:00:00 2001 From: zheng Date: Tue, 18 Jun 2019 15:08:17 +0800 Subject: [PATCH 018/217] =?UTF-8?q?=E6=9F=B1=E5=BD=A2=E5=9B=BE=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E9=85=8D=E7=BD=AE=E7=95=8C=E9=9D=A2=E5=B0=91=E4=BA=86?= =?UTF-8?q?=E4=B8=80=E7=82=B9=20=E4=B8=8A=E6=AC=A1=E5=A4=84=E7=90=86?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E8=B4=A8=E9=87=8F=E5=87=BA=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../component/AbstractCustomFieldComboBoxPane.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/designer-chart/src/main/java/com/fr/design/chartx/component/AbstractCustomFieldComboBoxPane.java b/designer-chart/src/main/java/com/fr/design/chartx/component/AbstractCustomFieldComboBoxPane.java index 3376bd193..443fea07a 100644 --- a/designer-chart/src/main/java/com/fr/design/chartx/component/AbstractCustomFieldComboBoxPane.java +++ b/designer-chart/src/main/java/com/fr/design/chartx/component/AbstractCustomFieldComboBoxPane.java @@ -58,6 +58,11 @@ public abstract class AbstractCustomFieldComboBoxPane extends UIComboBoxPane< customFieldNamePane = createCustomFieldNamePane(); List> list = new ArrayList>(); list.add(useFieldValuePane); + list.add(paneWrapper()); + return list; + } + + private FurtherBasicBeanPane paneWrapper() { FurtherBasicBeanPane pane = new FurtherBasicBeanPane() { @Override public String title4PopupWindow() { @@ -82,8 +87,9 @@ public abstract class AbstractCustomFieldComboBoxPane extends UIComboBoxPane< return null; } }; - list.add(pane); - return list; + pane.setLayout(new BorderLayout(0, 6)); + pane.add(customFieldNamePane, BorderLayout.CENTER); + return pane; } protected abstract AbstractUseFieldValuePane createUseFieldValuePane(); From b9fcc636b6cdf8ebdecedf959caee8fb714f7d0e Mon Sep 17 00:00:00 2001 From: zheng Date: Tue, 18 Jun 2019 15:38:35 +0800 Subject: [PATCH 019/217] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=AF=8D=E4=BA=91?= =?UTF-8?q?=E7=9A=84=E6=95=B0=E6=8D=AE=E9=85=8D=E7=BD=AE=20=E6=9C=89?= =?UTF-8?q?=E5=8A=A9=E4=BA=8E=E7=90=86=E8=A7=A3=E8=AE=A1=E7=AE=97=E7=9A=84?= =?UTF-8?q?=E5=BC=80=E5=8F=91=E5=B7=A5=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../design/chartx/WordCloudChartDataPane.java | 20 +++++ .../chartx/WordCloundChartDataPane.java | 20 ----- .../fields/AbstractDataSetFieldsPane.java | 7 ++ .../diff/MultiCategoryDataSetFieldsPane.java | 6 -- .../diff/WordCloudCellDataFieldsPane.java | 70 ++++++++++++++++++ .../diff/WordCloudDataSetFieldsPane.java | 74 +++++++++++++++++++ ...WordCloudIndependentVanChartInterface.java | 21 ++---- 7 files changed, 177 insertions(+), 41 deletions(-) create mode 100644 designer-chart/src/main/java/com/fr/design/chartx/WordCloudChartDataPane.java delete mode 100644 designer-chart/src/main/java/com/fr/design/chartx/WordCloundChartDataPane.java create mode 100644 designer-chart/src/main/java/com/fr/design/chartx/fields/diff/WordCloudCellDataFieldsPane.java create mode 100644 designer-chart/src/main/java/com/fr/design/chartx/fields/diff/WordCloudDataSetFieldsPane.java diff --git a/designer-chart/src/main/java/com/fr/design/chartx/WordCloudChartDataPane.java b/designer-chart/src/main/java/com/fr/design/chartx/WordCloudChartDataPane.java new file mode 100644 index 000000000..677308152 --- /dev/null +++ b/designer-chart/src/main/java/com/fr/design/chartx/WordCloudChartDataPane.java @@ -0,0 +1,20 @@ +package com.fr.design.chartx; + +import com.fr.design.chartx.fields.diff.WordCloudCellDataFieldsPane; +import com.fr.design.chartx.fields.diff.WordCloudDataSetFieldsPane; +import com.fr.design.chartx.single.SingleDataPane; +import com.fr.design.gui.frpane.AttributeChangeListener; + +/** + * Created by shine on 2019/5/22. + */ +public class WordCloudChartDataPane extends MultiCategoryChartDataPane { + public WordCloudChartDataPane(AttributeChangeListener listener) { + super(listener); + } + + @Override + protected SingleDataPane createSingleDataPane() { + return new SingleDataPane(new WordCloudDataSetFieldsPane(), new WordCloudCellDataFieldsPane()); + } +} diff --git a/designer-chart/src/main/java/com/fr/design/chartx/WordCloundChartDataPane.java b/designer-chart/src/main/java/com/fr/design/chartx/WordCloundChartDataPane.java deleted file mode 100644 index 2f3bd39a0..000000000 --- a/designer-chart/src/main/java/com/fr/design/chartx/WordCloundChartDataPane.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.fr.design.chartx; - -import com.fr.design.chartx.fields.diff.MultiCategoryCellDataFieldsPane; -import com.fr.design.chartx.fields.diff.MultiCategoryDataSetFieldsPane; -import com.fr.design.chartx.single.SingleDataPane; -import com.fr.design.gui.frpane.AttributeChangeListener; - -/** - * Created by shine on 2019/5/22. - */ -public class WordCloundChartDataPane extends MultiCategoryChartDataPane { - public WordCloundChartDataPane(AttributeChangeListener listener) { - super(listener); - } - - @Override - protected SingleDataPane createSingleDataPane() { - return new SingleDataPane(new MultiCategoryDataSetFieldsPane(), new MultiCategoryCellDataFieldsPane()); - } -} diff --git a/designer-chart/src/main/java/com/fr/design/chartx/fields/AbstractDataSetFieldsPane.java b/designer-chart/src/main/java/com/fr/design/chartx/fields/AbstractDataSetFieldsPane.java index 84c8401c1..1b0efcd5c 100644 --- a/designer-chart/src/main/java/com/fr/design/chartx/fields/AbstractDataSetFieldsPane.java +++ b/designer-chart/src/main/java/com/fr/design/chartx/fields/AbstractDataSetFieldsPane.java @@ -12,6 +12,7 @@ import com.fr.design.mainframe.chart.gui.ChartDataPane; import com.fr.design.mainframe.chart.gui.data.CalculateComboBox; import com.fr.design.mainframe.chart.gui.data.table.DataPaneHelper; import com.fr.general.GeneralUtils; +import com.fr.stable.StringUtils; import javax.swing.BorderFactory; import javax.swing.JPanel; @@ -139,4 +140,10 @@ public abstract class AbstractDataSetFieldsPane { + + private UITextField name; + private TinyFormulaPane wordName; + private TinyFormulaPane wordValue; + + @Override + protected void initComponents() { + name = new UITextField(); + wordName = new TinyFormulaPane(); + wordValue = new TinyFormulaPane(); + + super.initComponents(); + } + + @Override + protected String[] fieldLabels() { + return new String[]{ + Toolkit.i18nText("Fine-Design_Chart_MultiPie_Series_Name"), + Toolkit.i18nText("Fine-Design_Chart_Word_Name"), + Toolkit.i18nText("Fine-Design_Chart_Word_Value") + }; + } + + @Override + protected TinyFormulaPane[] formulaPanes() { + return new TinyFormulaPane[]{ + wordName, + wordValue + }; + } + + @Override + protected Component[] fieldComponents() { + return new Component[]{ + name, + wordName, + wordValue + }; + } + + @Override + public void populateBean(WordCloudColumnFieldCollection ob) { + name.setText(ob.getTargetName()); + populateField(wordName, ob.getWordName()); + populateField(wordValue, ob.getWordValue()); + } + + @Override + public WordCloudColumnFieldCollection updateBean() { + WordCloudColumnFieldCollection result = new WordCloudColumnFieldCollection(); + result.setTargetName(name.getText()); + updateField(wordName, result.getWordName()); + populateField(wordValue, result.getWordValue()); + return result; + } +} diff --git a/designer-chart/src/main/java/com/fr/design/chartx/fields/diff/WordCloudDataSetFieldsPane.java b/designer-chart/src/main/java/com/fr/design/chartx/fields/diff/WordCloudDataSetFieldsPane.java new file mode 100644 index 000000000..77c529ea5 --- /dev/null +++ b/designer-chart/src/main/java/com/fr/design/chartx/fields/diff/WordCloudDataSetFieldsPane.java @@ -0,0 +1,74 @@ +package com.fr.design.chartx.fields.diff; + +import com.fr.chartx.data.field.diff.WordCloudColumnFieldCollection; +import com.fr.design.chartx.fields.AbstractDataSetFieldsPane; +import com.fr.design.gui.icombobox.UIComboBox; +import com.fr.design.gui.itextfield.UITextField; +import com.fr.design.i18n.Toolkit; +import com.fr.design.mainframe.chart.gui.data.CalculateComboBox; + +import java.awt.Component; + +/** + * Created by shine on 2019/6/18. + */ +public class WordCloudDataSetFieldsPane extends AbstractDataSetFieldsPane { + private UITextField name; + private UIComboBox wordName; + private UIComboBox wordValue; + private CalculateComboBox calculateCombox; + + @Override + protected void initComponents() { + name = new UITextField(); + wordName = new UIComboBox(); + wordValue = new UIComboBox(); + calculateCombox = new CalculateComboBox(); + + super.initComponents(); + } + + @Override + protected String[] fieldLabels() { + return new String[]{ + Toolkit.i18nText("Fine-Design_Chart_MultiPie_Series_Name"), + Toolkit.i18nText("Fine-Design_Chart_Word_Name"), + Toolkit.i18nText("Fine-Design_Chart_Word_Value"), + Toolkit.i18nText("Fine-Design_Chart_Summary_Method") + }; + } + + @Override + protected UIComboBox[] filedComboBoxes() { + return new UIComboBox[]{ + wordName, + wordValue + }; + } + + @Override + protected Component[] fieldComponents() { + return new Component[]{ + name, + wordName, + wordValue, + calculateCombox + }; + } + + @Override + public void populateBean(WordCloudColumnFieldCollection ob) { + name.setText(ob.getTargetName()); + populateField(wordName, ob.getWordName()); + populateFunctionField(wordValue, calculateCombox, ob.getWordValue()); + } + + @Override + public WordCloudColumnFieldCollection updateBean() { + WordCloudColumnFieldCollection result = new WordCloudColumnFieldCollection(); + result.setTargetName(name.getText()); + updateField(wordName, result.getWordName()); + updateFunctionField(wordValue, calculateCombox, result.getWordValue()); + return result; + } +} diff --git a/designer-chart/src/main/java/com/fr/van/chart/wordcloud/designer/WordCloudIndependentVanChartInterface.java b/designer-chart/src/main/java/com/fr/van/chart/wordcloud/designer/WordCloudIndependentVanChartInterface.java index e6e89c0d9..1b270b90b 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/wordcloud/designer/WordCloudIndependentVanChartInterface.java +++ b/designer-chart/src/main/java/com/fr/van/chart/wordcloud/designer/WordCloudIndependentVanChartInterface.java @@ -3,23 +3,19 @@ package com.fr.van.chart.wordcloud.designer; import com.fr.chart.chartattr.Chart; import com.fr.chart.chartattr.Plot; import com.fr.design.beans.BasicBeanPane; +import com.fr.design.chartx.WordCloudChartDataPane; import com.fr.design.condition.ConditionAttributesPane; import com.fr.design.dialog.BasicPane; import com.fr.design.gui.frpane.AttributeChangeListener; 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.plugin.chart.base.VanChartConstants; import com.fr.van.chart.designer.other.VanChartInteractivePaneWithOutSort; import com.fr.van.chart.designer.other.VanChartOtherPane; import com.fr.van.chart.designer.style.VanChartStylePane; import com.fr.van.chart.vanchart.AbstractIndependentVanChartUI; -import com.fr.van.chart.wordcloud.designer.data.WordCloudPlotReportDataContentPane; -import com.fr.van.chart.wordcloud.designer.data.WordCloudPlotTableDataContentPane; import com.fr.van.chart.wordcloud.designer.other.VanChartWordCloudConditionPane; import com.fr.van.chart.wordcloud.designer.style.VanChartWordCloudSeriesPane; import com.fr.van.chart.wordcloud.designer.type.VanChartWordCloudTypePane; @@ -50,16 +46,6 @@ public class WordCloudIndependentVanChartInterface extends AbstractIndependentVa return "com/fr/design/images/form/toolbar/wordcloud.png"; } - @Override - public AbstractReportDataContentPane getReportDataSourcePane(Plot plot, ChartDataPane parent) { - return new WordCloudPlotReportDataContentPane(); - } - - @Override - public AbstractTableDataContentPane getTableDataSourcePane(Plot plot, ChartDataPane parent) { - return new WordCloudPlotTableDataContentPane(); - } - @Override public BasicBeanPane getPlotSeriesPane(ChartStylePane parent, Plot plot) { return new VanChartWordCloudSeriesPane(parent, plot); @@ -104,4 +90,9 @@ public class WordCloudIndependentVanChartInterface extends AbstractIndependentVa public String getPlotTypeTitle4PopupWindow(){ return VanChartWordCloudTypePane.TITLE; } + + @Override + public ChartDataPane getChartDataPane(AttributeChangeListener listener) { + return new WordCloudChartDataPane(listener); + } } From a4bff1b769c788264855fb619a1562fb2c71a39f Mon Sep 17 00:00:00 2001 From: zheng Date: Wed, 19 Jun 2019 13:29:11 +0800 Subject: [PATCH 020/217] =?UTF-8?q?=E5=A4=9A=E5=B1=82=E9=A5=BC=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../design/chartx/MultiPieChartDataPane.java | 21 +++ .../component/AbstractMultiComponentPane.java | 2 +- ...stractMultiComponentPaneWithUISpinner.java | 150 ++++++++++++++++++ .../chartx/component/MultiComboBoxPane.java | 10 +- .../MultiComboBoxPaneWithUISpinner.java | 40 +++++ .../MultiTinyFormulaPaneWithUISpinner.java | 25 +++ .../diff/MultiCategoryDataSetFieldsPane.java | 6 + .../diff/MultiPieCellDataFieldsPane.java | 67 ++++++++ .../diff/MultiPieDataSetFieldsPane.java | 94 +++++++++++ .../MultiPieIndependentVanChartInterface.java | 15 +- 10 files changed, 417 insertions(+), 13 deletions(-) create mode 100644 designer-chart/src/main/java/com/fr/design/chartx/MultiPieChartDataPane.java create mode 100644 designer-chart/src/main/java/com/fr/design/chartx/component/AbstractMultiComponentPaneWithUISpinner.java create mode 100644 designer-chart/src/main/java/com/fr/design/chartx/component/MultiComboBoxPaneWithUISpinner.java create mode 100644 designer-chart/src/main/java/com/fr/design/chartx/component/MultiTinyFormulaPaneWithUISpinner.java create mode 100644 designer-chart/src/main/java/com/fr/design/chartx/fields/diff/MultiPieCellDataFieldsPane.java create mode 100644 designer-chart/src/main/java/com/fr/design/chartx/fields/diff/MultiPieDataSetFieldsPane.java diff --git a/designer-chart/src/main/java/com/fr/design/chartx/MultiPieChartDataPane.java b/designer-chart/src/main/java/com/fr/design/chartx/MultiPieChartDataPane.java new file mode 100644 index 000000000..952bca3cd --- /dev/null +++ b/designer-chart/src/main/java/com/fr/design/chartx/MultiPieChartDataPane.java @@ -0,0 +1,21 @@ +package com.fr.design.chartx; + +import com.fr.design.chartx.fields.diff.MultiPieCellDataFieldsPane; +import com.fr.design.chartx.fields.diff.MultiPieDataSetFieldsPane; +import com.fr.design.chartx.single.SingleDataPane; +import com.fr.design.gui.frpane.AttributeChangeListener; + +/** + * Created by shine on 2019/6/18. + */ +public class MultiPieChartDataPane extends MultiCategoryChartDataPane { + + public MultiPieChartDataPane(AttributeChangeListener listener) { + super(listener); + } + + @Override + protected SingleDataPane createSingleDataPane() { + return new SingleDataPane(new MultiPieDataSetFieldsPane(), new MultiPieCellDataFieldsPane()); + } +} diff --git a/designer-chart/src/main/java/com/fr/design/chartx/component/AbstractMultiComponentPane.java b/designer-chart/src/main/java/com/fr/design/chartx/component/AbstractMultiComponentPane.java index 008a7d91c..2a8154d7b 100644 --- a/designer-chart/src/main/java/com/fr/design/chartx/component/AbstractMultiComponentPane.java +++ b/designer-chart/src/main/java/com/fr/design/chartx/component/AbstractMultiComponentPane.java @@ -21,7 +21,7 @@ import java.util.List; /** * Created by shine on 2019/4/10. - * 一列组件 可增可删 + * 一列组件 可增可删,通过JComponent后面的加减button增删。 */ public abstract class AbstractMultiComponentPane extends JPanel { private static final int COM_W = 96; diff --git a/designer-chart/src/main/java/com/fr/design/chartx/component/AbstractMultiComponentPaneWithUISpinner.java b/designer-chart/src/main/java/com/fr/design/chartx/component/AbstractMultiComponentPaneWithUISpinner.java new file mode 100644 index 000000000..b24743c76 --- /dev/null +++ b/designer-chart/src/main/java/com/fr/design/chartx/component/AbstractMultiComponentPaneWithUISpinner.java @@ -0,0 +1,150 @@ +package com.fr.design.chartx.component; + +import com.fr.chartx.data.field.ColumnField; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.gui.ispinner.UISpinner; +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 javax.swing.JComponent; +import javax.swing.JPanel; +import java.awt.BorderLayout; +import java.awt.Component; +import java.util.ArrayList; +import java.util.List; + +/** + * Created by shine on 2019/6/18. + * 一列组件 可增可删,通过UISpinner增删。 + */ +public abstract class AbstractMultiComponentPaneWithUISpinner extends JPanel { + + private UISpinner levelNumSpinner; + + private List levelComponentList = new ArrayList(); + + private JPanel levelPane; + + private int currentNum = 3; + + public AbstractMultiComponentPaneWithUISpinner() { + initComps(); + } + + public List getComponentList() { + return levelComponentList; + } + + protected abstract T createJComponent(); + + protected abstract void populateField(T component, ColumnField field); + + protected abstract void updateField(T component, ColumnField field); + + protected void initComps() { + + this.setLayout(new BorderLayout(0, 6)); + + levelNumSpinner = new UISpinner(1, 15, 1, currentNum) { + @Override + protected void fireStateChanged() { + //先处理自身的空间布局 + refreshLevelPane(); + //然后更新数据 + super.fireStateChanged(); + } + + @Override + public void setTextFieldValue(double value) { + //如果为0,则没有改变值 + if (value == 0) { + return; + } + super.setTextFieldValue(value); + } + }; + + Component[][] components = new Component[][]{ + new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Level_Number")), levelNumSpinner}, + }; + + JPanel northPane = TableLayoutHelper.createGapTableLayoutPane(components, new double[]{TableLayout.PREFERRED}, new double[]{ChartDataPane.LABEL_WIDTH, 122}, 0, 6); + + this.add(northPane, BorderLayout.NORTH); + + initLevelPane(); + } + + private void initLevelPane() { + double[] rows = new double[currentNum]; + + Component[][] components = new Component[currentNum][2]; + + List newList = new ArrayList(); + + int maxSize = levelComponentList.size(); + for (int i = 0; i < currentNum; i++) { + rows[i] = TableLayout.PREFERRED; + T component = i < maxSize ? levelComponentList.get(i) : createJComponent(); + newList.add(component); + + components[i] = new Component[]{ + new UILabel(Toolkit.i18nText("Fine-Design_Chart_Level") + String.valueOf(i + 1)), + component + }; + } + + levelComponentList = newList; + + levelPane = TableLayoutHelper.createGapTableLayoutPane(components, rows, new double[]{ChartDataPane.LABEL_WIDTH, 122}, 0, 6); + + this.add(levelPane, BorderLayout.CENTER); + } + + private void refreshLevelPane() { + if (levelNumSpinner == null) { + return; + } + + int newNum = (int) levelNumSpinner.getValue(); + + if (newNum != currentNum) { + currentNum = newNum; + this.remove(levelPane); + this.initLevelPane(); + } + + refreshPane(); + } + + private void refreshPane() { + this.validate(); + this.repaint(); + this.revalidate(); + } + + public void populate(List categoryList) { + int len = categoryList.size(); + levelNumSpinner.setValue(len); + + refreshLevelPane(); + + for (int i = 0; i < len; i++) { + ColumnField columnField = categoryList.get(i); + T component = levelComponentList.get(i); + populateField(component, columnField); + } + } + + public void update(List categoryList) { + categoryList.clear(); + + for (T comboBox : levelComponentList) { + ColumnField temp = new ColumnField(); + categoryList.add(temp); + updateField(comboBox, temp); + } + } +} diff --git a/designer-chart/src/main/java/com/fr/design/chartx/component/MultiComboBoxPane.java b/designer-chart/src/main/java/com/fr/design/chartx/component/MultiComboBoxPane.java index 37a110b7d..f1716a0ae 100644 --- a/designer-chart/src/main/java/com/fr/design/chartx/component/MultiComboBoxPane.java +++ b/designer-chart/src/main/java/com/fr/design/chartx/component/MultiComboBoxPane.java @@ -5,10 +5,18 @@ import com.fr.design.chartx.fields.AbstractDataSetFieldsPane; import com.fr.design.gui.icombobox.UIComboBox; import com.fr.extended.chart.UIComboBoxWithNone; +import java.util.ArrayList; +import java.util.List; + /** * Created by shine on 2019/4/12. */ public class MultiComboBoxPane extends AbstractMultiComponentPane { + private List currentBoxItems = new ArrayList(); + + public void setCurrentBoxItems(List currentBoxItems) { + this.currentBoxItems = currentBoxItems; + } @Override protected UIComboBox createFirstFieldComponent() { @@ -17,7 +25,7 @@ public class MultiComboBoxPane extends AbstractMultiComponentPane { @Override protected UIComboBox createOtherFieldComponent() { - return new UIComboBox(); + return new UIComboBox(currentBoxItems.toArray(new Object[currentBoxItems.size()])); } @Override diff --git a/designer-chart/src/main/java/com/fr/design/chartx/component/MultiComboBoxPaneWithUISpinner.java b/designer-chart/src/main/java/com/fr/design/chartx/component/MultiComboBoxPaneWithUISpinner.java new file mode 100644 index 000000000..8b20768e2 --- /dev/null +++ b/designer-chart/src/main/java/com/fr/design/chartx/component/MultiComboBoxPaneWithUISpinner.java @@ -0,0 +1,40 @@ +package com.fr.design.chartx.component; + +import com.fr.chartx.data.field.ColumnField; +import com.fr.design.chartx.fields.AbstractDataSetFieldsPane; +import com.fr.design.gui.icombobox.UIComboBox; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by shine on 2019/6/18. + */ +public class MultiComboBoxPaneWithUISpinner extends AbstractMultiComponentPaneWithUISpinner { + private List currentBoxList = new ArrayList(); + + @Override + protected void initComps() { + currentBoxList = new ArrayList(); + super.initComps(); + } + + public void setCurrentBoxList(List currentBoxList) { + this.currentBoxList = currentBoxList; + } + + @Override + protected UIComboBox createJComponent() { + return new UIComboBox(currentBoxList.toArray(new Object[currentBoxList.size()])); + } + + @Override + protected void populateField(UIComboBox component, ColumnField field) { + AbstractDataSetFieldsPane.populateField(component, field); + } + + @Override + protected void updateField(UIComboBox component, ColumnField field) { + AbstractDataSetFieldsPane.updateField(component, field); + } +} diff --git a/designer-chart/src/main/java/com/fr/design/chartx/component/MultiTinyFormulaPaneWithUISpinner.java b/designer-chart/src/main/java/com/fr/design/chartx/component/MultiTinyFormulaPaneWithUISpinner.java new file mode 100644 index 000000000..e3bbf4b84 --- /dev/null +++ b/designer-chart/src/main/java/com/fr/design/chartx/component/MultiTinyFormulaPaneWithUISpinner.java @@ -0,0 +1,25 @@ +package com.fr.design.chartx.component; + +import com.fr.chartx.data.field.ColumnField; +import com.fr.design.chartx.fields.AbstractCellDataFieldsPane; +import com.fr.design.formula.TinyFormulaPane; + +/** + * Created by shine on 2019/6/19. + */ +public class MultiTinyFormulaPaneWithUISpinner extends AbstractMultiComponentPaneWithUISpinner { + @Override + protected TinyFormulaPane createJComponent() { + return new TinyFormulaPane(); + } + + @Override + protected void populateField(TinyFormulaPane component, ColumnField field) { + AbstractCellDataFieldsPane.populateField(component, field); + } + + @Override + protected void updateField(TinyFormulaPane component, ColumnField field) { + AbstractCellDataFieldsPane.updateField(component, field); + } +} diff --git a/designer-chart/src/main/java/com/fr/design/chartx/fields/diff/MultiCategoryDataSetFieldsPane.java b/designer-chart/src/main/java/com/fr/design/chartx/fields/diff/MultiCategoryDataSetFieldsPane.java index 17fcfb2ba..1abe2b184 100644 --- a/designer-chart/src/main/java/com/fr/design/chartx/fields/diff/MultiCategoryDataSetFieldsPane.java +++ b/designer-chart/src/main/java/com/fr/design/chartx/fields/diff/MultiCategoryDataSetFieldsPane.java @@ -39,6 +39,12 @@ public class MultiCategoryDataSetFieldsPane extends AbstractDataSetFieldsWithSer return initMultiCategoryPane(); } + @Override + public void refreshBoxListWithSelectTableData(List columnNameList) { + super.refreshBoxListWithSelectTableData(columnNameList); + multiCategoryPane.setCurrentBoxItems(columnNameList); + } + @Override public void populateBean(MultiCategoryColumnFieldCollection multiCategoryColumnFieldCollection) { List categoryList = multiCategoryColumnFieldCollection.getCategoryList(); diff --git a/designer-chart/src/main/java/com/fr/design/chartx/fields/diff/MultiPieCellDataFieldsPane.java b/designer-chart/src/main/java/com/fr/design/chartx/fields/diff/MultiPieCellDataFieldsPane.java new file mode 100644 index 000000000..950f49401 --- /dev/null +++ b/designer-chart/src/main/java/com/fr/design/chartx/fields/diff/MultiPieCellDataFieldsPane.java @@ -0,0 +1,67 @@ +package com.fr.design.chartx.fields.diff; + +import com.fr.chartx.data.field.diff.MultiPieColumnFieldCollection; +import com.fr.design.chartx.component.MultiTinyFormulaPaneWithUISpinner; +import com.fr.design.chartx.fields.AbstractCellDataFieldsPane; +import com.fr.design.formula.TinyFormulaPane; +import com.fr.design.gui.itextfield.UITextField; +import com.fr.design.i18n.Toolkit; + +import javax.swing.JPanel; + +/** + * Created by shine on 2019/6/18. + */ +public class MultiPieCellDataFieldsPane extends AbstractCellDataFieldsPane { + + private UITextField nameField;//指标名称 + + private MultiTinyFormulaPaneWithUISpinner levelPane; + + private TinyFormulaPane value; + + @Override + protected void initComponents() { + nameField = new UITextField(); + levelPane = new MultiTinyFormulaPaneWithUISpinner(); + value = new TinyFormulaPane(); + super.initComponents(); + } + + @Override + protected JPanel createNorthPane() { + return levelPane; + } + + @Override + protected String[] fieldLabels() { + return new String[]{ + Toolkit.i18nText("Fine-Design_Chart_Use_Value"), + }; + } + + @Override + protected TinyFormulaPane[] formulaPanes() { + return new TinyFormulaPane[]{ + value + }; + } + + @Override + public void populateBean(MultiPieColumnFieldCollection ob) { + nameField.setText(ob.getTargetName()); + levelPane.populate(ob.getLevels()); + populateField(value, ob.getValue()); + } + + @Override + public MultiPieColumnFieldCollection updateBean() { + MultiPieColumnFieldCollection result = new MultiPieColumnFieldCollection(); + + result.setTargetName(nameField.getText()); + levelPane.update(result.getLevels()); + updateField(value, result.getValue()); + + return result; + } +} diff --git a/designer-chart/src/main/java/com/fr/design/chartx/fields/diff/MultiPieDataSetFieldsPane.java b/designer-chart/src/main/java/com/fr/design/chartx/fields/diff/MultiPieDataSetFieldsPane.java new file mode 100644 index 000000000..2a299ba6e --- /dev/null +++ b/designer-chart/src/main/java/com/fr/design/chartx/fields/diff/MultiPieDataSetFieldsPane.java @@ -0,0 +1,94 @@ +package com.fr.design.chartx.fields.diff; + +import com.fr.chartx.data.field.diff.MultiPieColumnFieldCollection; +import com.fr.design.chartx.component.MultiComboBoxPaneWithUISpinner; +import com.fr.design.chartx.fields.AbstractDataSetFieldsPane; +import com.fr.design.gui.icombobox.UIComboBox; +import com.fr.design.gui.itextfield.UITextField; +import com.fr.design.i18n.Toolkit; +import com.fr.design.mainframe.chart.gui.data.CalculateComboBox; + +import javax.swing.JPanel; +import java.awt.Component; +import java.util.List; + +/** + * Created by shine on 2019/6/18. + */ +public class MultiPieDataSetFieldsPane extends AbstractDataSetFieldsPane { + private UITextField nameField; + + private MultiComboBoxPaneWithUISpinner levelComboBoxPane; + + private UIComboBox value; + + private CalculateComboBox function; + + @Override + protected void initComponents() { + nameField = new UITextField(); + levelComboBoxPane = new MultiComboBoxPaneWithUISpinner(); + value = new UIComboBox(); + function = new CalculateComboBox(); + super.initComponents(); + } + + @Override + protected JPanel createNorthPane() { + return levelComboBoxPane; + } + + + @Override + protected String[] fieldLabels() { + return new String[]{ + Toolkit.i18nText("Fine-Design_Chart_Use_Value"), + Toolkit.i18nText("Fine-Design_Chart_Summary_Method") + }; + } + + @Override + protected Component[] fieldComponents() { + return new UIComboBox[]{ + value, + function + }; + } + + @Override + protected UIComboBox[] filedComboBoxes() { + List list = levelComboBoxPane.getComponentList(); + + int len = list.size(); + UIComboBox[] result = new UIComboBox[len + 1]; + for (int i = 0; i < len; i++) { + result[i] = list.get(i); + } + result[len] = value; + + return result; + } + + @Override + public void refreshBoxListWithSelectTableData(List columnNameList) { + super.refreshBoxListWithSelectTableData(columnNameList); + levelComboBoxPane.setCurrentBoxList(columnNameList); + } + + @Override + public void populateBean(MultiPieColumnFieldCollection ob) { + levelComboBoxPane.populate(ob.getLevels()); + populateFunctionField(value, function, ob.getValue()); + } + + @Override + public MultiPieColumnFieldCollection updateBean() { + MultiPieColumnFieldCollection result = new MultiPieColumnFieldCollection(); + + levelComboBoxPane.update(result.getLevels()); + + updateFunctionField(value, function, result.getValue()); + + return result; + } +} diff --git a/designer-chart/src/main/java/com/fr/van/chart/multilayer/MultiPieIndependentVanChartInterface.java b/designer-chart/src/main/java/com/fr/van/chart/multilayer/MultiPieIndependentVanChartInterface.java index e25e55b06..06f0b0f75 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/multilayer/MultiPieIndependentVanChartInterface.java +++ b/designer-chart/src/main/java/com/fr/van/chart/multilayer/MultiPieIndependentVanChartInterface.java @@ -2,14 +2,12 @@ package com.fr.van.chart.multilayer; import com.fr.chart.chartattr.Plot; import com.fr.design.beans.BasicBeanPane; +import com.fr.design.chartx.MultiPieChartDataPane; import com.fr.design.condition.ConditionAttributesPane; +import com.fr.design.gui.frpane.AttributeChangeListener; 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.multilayer.data.MultiPiePlotReportDataContentPane; -import com.fr.van.chart.multilayer.data.MultiPiePlotTableDataContentPane; import com.fr.van.chart.multilayer.other.VanChartMultiPieConditionPane; import com.fr.van.chart.multilayer.style.VanChartMultiPieSeriesPane; import com.fr.van.chart.vanchart.AbstractIndependentVanChartUI; @@ -29,13 +27,8 @@ public class MultiPieIndependentVanChartInterface extends AbstractIndependentVan } @Override - public AbstractTableDataContentPane getTableDataSourcePane(Plot plot, ChartDataPane parent){ - return new MultiPiePlotTableDataContentPane(parent); - } - - @Override - public AbstractReportDataContentPane getReportDataSourcePane(Plot plot, ChartDataPane parent){ - return new MultiPiePlotReportDataContentPane(parent); + public ChartDataPane getChartDataPane(AttributeChangeListener listener) { + return new MultiPieChartDataPane(listener); } public BasicBeanPane getPlotSeriesPane(ChartStylePane parent, Plot plot){ From 9194307c9243e8b469a7366194278c94efd3196a Mon Sep 17 00:00:00 2001 From: vito Date: Fri, 21 Jun 2019 11:45:23 +0800 Subject: [PATCH 021/217] =?UTF-8?q?REPORT-18494=20=E7=BA=BF=E7=A8=8B?= =?UTF-8?q?=E6=B1=A0=E5=91=BD=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/utils/DesignUtils.java | 10 +-- .../main/java/com/fr/start/ServerStarter.java | 22 +++--- .../start/server/FineEmbedServerMonitor.java | 3 +- .../mainframe/InformationCollector.java | 3 +- .../main/java/com/fr/start/SplashContext.java | 3 +- .../main/java/com/fr/start/fx/SplashFx.java | 3 +- .../fr/start/module/DesignerActivator.java | 3 +- .../module/DesignerWorkspaceActivator.java | 41 ++++++----- .../fr/start/module/PreStartActivator.java | 71 ++++++++++--------- .../com/fr/start/preload/ImagePreLoader.java | 3 +- 10 files changed, 85 insertions(+), 77 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/utils/DesignUtils.java b/designer-base/src/main/java/com/fr/design/utils/DesignUtils.java index dab6e4f85..befe47c55 100644 --- a/designer-base/src/main/java/com/fr/design/utils/DesignUtils.java +++ b/designer-base/src/main/java/com/fr/design/utils/DesignUtils.java @@ -2,6 +2,7 @@ package com.fr.design.utils; import com.fr.base.FeedBackInfo; import com.fr.base.ServerConfig; +import com.fr.concurrent.NamedThreadFactory; import com.fr.design.DesignerEnvManager; import com.fr.design.ExtraDesignClassManager; import com.fr.design.fun.DesignerEnvProcessor; @@ -116,7 +117,7 @@ public class DesignUtils { * @param suffixs 文件后缀 */ public static void createListeningServer(final int startPort, final String[] suffixs) { - ExecutorService service = Executors.newSingleThreadExecutor(); + ExecutorService service = Executors.newSingleThreadExecutor(new NamedThreadFactory("DesignClientListener")); service.execute(new Runnable() { @Override public void run() { @@ -129,7 +130,8 @@ public class DesignUtils { while (true) { try { if (serverSocket != null) { - Socket socket = serverSocket.accept(); // 接收客户连接 + // 接收客户连接 + Socket socket = serverSocket.accept(); BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream(), StandardCharsets.UTF_8)); String line; while ((line = reader.readLine()) != null) { @@ -141,8 +143,8 @@ public class DesignUtils { String path = f.getAbsolutePath(); boolean isMatch = false; - for (int i = 0; i < suffixs.length; i++) { - isMatch = isMatch || path.endsWith(suffixs[i]); + for (String suffix : suffixs) { + isMatch = isMatch || path.endsWith(suffix); } if (isMatch) { DesignerContext.getDesignerFrame().openTemplate(new FileFILE(f)); diff --git a/designer-base/src/main/java/com/fr/start/ServerStarter.java b/designer-base/src/main/java/com/fr/start/ServerStarter.java index 6d20cf12a..d4e1143c6 100644 --- a/designer-base/src/main/java/com/fr/start/ServerStarter.java +++ b/designer-base/src/main/java/com/fr/start/ServerStarter.java @@ -1,6 +1,7 @@ package com.fr.start; import com.fr.base.ServerConfig; +import com.fr.concurrent.NamedThreadFactory; import com.fr.design.DesignerEnvManager; import com.fr.design.utils.BrowseUtils; import com.fr.general.ComparatorUtils; @@ -14,29 +15,28 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class ServerStarter { - + /** * 预览Demo * 找默认工作目录,不应该按照名字去找,而应该按照安装路径,因为默认工作目录的名字可能会改变。 */ public static void browserDemoURL() { - + if (!WorkContext.getCurrent().isLocal()) { //有问题,这里拿不到远程的http端口 BrowseUtils.browser(WorkContext.getCurrent().getPath()); - } - else if (ComparatorUtils.equals(StableUtils.getInstallHome(), ".")) {//august:供代码使用 + } else if (ComparatorUtils.equals(StableUtils.getInstallHome(), ".")) {//august:供代码使用 String web = GeneralContext.getCurrentAppNameOfEnv(); browserURLWithLocalEnv("http://localhost:" + DesignerEnvManager.getEnvManager().getEmbedServerPort() + "/" + web + "/" + ServerConfig.getInstance().getServletName()); - }else{ + } else { initDemoServerAndBrowser(); } } - + private static void initDemoServerAndBrowser() { - + try { FineEmbedServer.start(); } finally { @@ -44,7 +44,7 @@ public class ServerStarter { BrowseUtils.browser("http://localhost:" + DesignerEnvManager.getEnvManager().getEmbedServerPort() + "/" + GeneralContext.getCurrentAppNameOfEnv() + "/" + ServerConfig.getInstance().getServletName()); } } - + /** * 本地环境浏览url * @@ -52,9 +52,9 @@ public class ServerStarter { */ public static void browserURLWithLocalEnv(final String url) { - if(!FineEmbedServerMonitor.getInstance().isComplete()){ + if (!FineEmbedServerMonitor.getInstance().isComplete()) { FineEmbedServerMonitor.getInstance().monitor(); - ExecutorService service = Executors.newSingleThreadExecutor(); + ExecutorService service = Executors.newSingleThreadExecutor(new NamedThreadFactory("ServerStarter")); service.submit(new Runnable() { @Override @@ -68,7 +68,7 @@ public class ServerStarter { } }); service.shutdown(); - }else{ + } else { FineEmbedServer.start(); BrowseUtils.browser(url); } diff --git a/designer-base/src/main/java/com/fr/start/server/FineEmbedServerMonitor.java b/designer-base/src/main/java/com/fr/start/server/FineEmbedServerMonitor.java index ee54a80de..5807773bf 100644 --- a/designer-base/src/main/java/com/fr/start/server/FineEmbedServerMonitor.java +++ b/designer-base/src/main/java/com/fr/start/server/FineEmbedServerMonitor.java @@ -1,5 +1,6 @@ package com.fr.start.server; +import com.fr.concurrent.NamedThreadFactory; import com.fr.design.mainframe.DesignerContext; import com.fr.event.Event; import com.fr.event.EventDispatcher; @@ -66,7 +67,7 @@ public class FineEmbedServerMonitor { } public void monitor() { - ExecutorService service = Executors.newSingleThreadExecutor(); + ExecutorService service = Executors.newSingleThreadExecutor(new NamedThreadFactory("FineEmbedServerMonitor")); service.submit(new Runnable() { @Override diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/InformationCollector.java b/designer-realize/src/main/java/com/fr/design/mainframe/InformationCollector.java index 83cb7dd33..148929495 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/InformationCollector.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/InformationCollector.java @@ -4,6 +4,7 @@ package com.fr.design.mainframe; import com.fr.base.FRContext; +import com.fr.concurrent.NamedThreadFactory; import com.fr.config.MarketConfig; import com.fr.design.DesignerEnvManager; import com.fr.design.mainframe.errorinfo.ErrorInfoUploader; @@ -196,7 +197,7 @@ public class InformationCollector implements XMLReadable, XMLWriter { return; } - ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor(); + ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor(new NamedThreadFactory("InformationCollector")); service.schedule(new Runnable() { @Override public void run() { diff --git a/designer-realize/src/main/java/com/fr/start/SplashContext.java b/designer-realize/src/main/java/com/fr/start/SplashContext.java index 17eff62ba..8ae77ee09 100644 --- a/designer-realize/src/main/java/com/fr/start/SplashContext.java +++ b/designer-realize/src/main/java/com/fr/start/SplashContext.java @@ -1,5 +1,6 @@ package com.fr.start; +import com.fr.concurrent.NamedThreadFactory; import com.fr.design.DesignerEnvManager; import com.fr.design.mainframe.bbs.BBSConstants; import com.fr.event.Event; @@ -38,7 +39,7 @@ public class SplashContext { private int fetchOnlineTimes = 0; private String guest = StringUtils.EMPTY; - private ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); + private ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1, new NamedThreadFactory("SplashContext")); private Listener listener; diff --git a/designer-realize/src/main/java/com/fr/start/fx/SplashFx.java b/designer-realize/src/main/java/com/fr/start/fx/SplashFx.java index fc657f659..f5c64bf79 100644 --- a/designer-realize/src/main/java/com/fr/start/fx/SplashFx.java +++ b/designer-realize/src/main/java/com/fr/start/fx/SplashFx.java @@ -1,5 +1,6 @@ package com.fr.start.fx; +import com.fr.concurrent.NamedThreadFactory; import com.fr.design.mainframe.DesignerContext; import com.fr.start.SplashFxActionListener; import com.fr.start.SplashStrategy; @@ -21,7 +22,7 @@ import java.util.concurrent.Executors; public class SplashFx implements SplashStrategy { private SplashFxWindow fxWindow; - private static final ExecutorService SERVICE = Executors.newSingleThreadExecutor(); + private static final ExecutorService SERVICE = Executors.newSingleThreadExecutor(new NamedThreadFactory("SplashFx")); @Override public void show() { diff --git a/designer-realize/src/main/java/com/fr/start/module/DesignerActivator.java b/designer-realize/src/main/java/com/fr/start/module/DesignerActivator.java index f360f24b9..9ab53f1b0 100644 --- a/designer-realize/src/main/java/com/fr/start/module/DesignerActivator.java +++ b/designer-realize/src/main/java/com/fr/start/module/DesignerActivator.java @@ -5,6 +5,7 @@ import com.fr.base.Formula; import com.fr.base.MultiFieldParameter; import com.fr.base.process.ProcessOperator; import com.fr.chart.chartattr.ChartCollection; +import com.fr.concurrent.NamedThreadFactory; import com.fr.design.ExtraDesignClassManager; import com.fr.design.actions.NewFormAction; import com.fr.design.actions.core.ActionFactory; @@ -169,7 +170,7 @@ public class DesignerActivator extends Activator { } private static void preLoadPane() { - ExecutorService service = Executors.newCachedThreadPool(); + ExecutorService service = Executors.newCachedThreadPool(new NamedThreadFactory("PreLoadPane")); service.submit(new Runnable() { @Override public void run() { diff --git a/designer-realize/src/main/java/com/fr/start/module/DesignerWorkspaceActivator.java b/designer-realize/src/main/java/com/fr/start/module/DesignerWorkspaceActivator.java index 09115eb50..e652cda6f 100644 --- a/designer-realize/src/main/java/com/fr/start/module/DesignerWorkspaceActivator.java +++ b/designer-realize/src/main/java/com/fr/start/module/DesignerWorkspaceActivator.java @@ -1,5 +1,6 @@ package com.fr.start.module; +import com.fr.concurrent.NamedThreadFactory; import com.fr.design.file.HistoryTemplateListCache; import com.fr.event.Event; import com.fr.event.Listener; @@ -16,79 +17,77 @@ import java.util.concurrent.Executors; * Created by juhaoyu on 2019-06-14. */ public class DesignerWorkspaceActivator extends Activator { - + @Override public void start() { - + registerEnvListener(); startServer(WorkContext.getCurrent()); } - - + /** * 注册切换环境前后事件监听 */ private void registerEnvListener() { - + /*切换环境前,关闭所有相关模块,最后执行*/ listenEvent(WorkspaceEvent.BeforeSwitch, new Listener(Integer.MIN_VALUE) { - + @Override public void on(Event event, Workspace current) { - + getSub(EnvBasedModule.class).stop(); } }); /*切换环境后,重新启动所有相关模块,最先执行*/ listenEvent(WorkspaceEvent.AfterSwitch, new Listener(Integer.MAX_VALUE) { - + @Override public void on(Event event, Workspace current) { - + getSub(EnvBasedModule.class).start(); startServer(current); } }); /*切换环境前,存储一下打开的所有文件对象,要先于 关闭相关模块部分 被触发*/ listenEvent(WorkspaceEvent.BeforeSwitch, new Listener(Integer.MAX_VALUE) { - + @Override public void on(Event event, Workspace workspace) { - + HistoryTemplateListCache.getInstance().stash(); } }); - + /*切换环境后,装载一下打开的所有文件对象,优先级低于默认优先级,要后于 启动相关模块部分 被触发*/ listenEvent(WorkspaceEvent.AfterSwitch, new Listener(Integer.MIN_VALUE) { - + @Override public void on(Event event, Workspace workspace) { - + HistoryTemplateListCache.getInstance().load(); } }); } - + private void startServer(Workspace current) { - + // 切换后的环境是本地环境才启动内置服务器 if (current.isLocal()) { - ExecutorService service = Executors.newSingleThreadExecutor(); + ExecutorService service = Executors.newSingleThreadExecutor(new NamedThreadFactory("DesignerWorkspaceActivator")); service.submit(new Runnable() { - + @Override public void run() { - FineEmbedServer.start(); } }); service.shutdown(); } } - + @Override public void stop() { - + } } diff --git a/designer-realize/src/main/java/com/fr/start/module/PreStartActivator.java b/designer-realize/src/main/java/com/fr/start/module/PreStartActivator.java index c4b1dc0a9..3a9f59140 100644 --- a/designer-realize/src/main/java/com/fr/start/module/PreStartActivator.java +++ b/designer-realize/src/main/java/com/fr/start/module/PreStartActivator.java @@ -1,5 +1,6 @@ package com.fr.start.module; +import com.fr.concurrent.NamedThreadFactory; import com.fr.design.DesignerEnvManager; import com.fr.design.RestartHelper; import com.fr.design.fun.OemProcessor; @@ -33,10 +34,10 @@ import java.util.concurrent.Executors; * Created by juhaoyu on 2018/1/8. */ public class PreStartActivator extends Activator { - + @Override public void start() { - + BuildContext.setBuildFilePath("/com/fr/stable/build.properties"); // 如果端口被占用了 说明程序已经运行了一次,也就是说,已经建立一个监听服务器,现在只要给服务器发送命令就好了 final String[] args = getModule().upFindSingleton(StartupArgs.class).get(); @@ -48,98 +49,98 @@ public class PreStartActivator extends Activator { System.exit(0); return; } - + RestartHelper.deleteRecordFilesWhenStart(); - + preloadResource(); - + SplashContext.getInstance().registerSplash(createSplash()); - + SplashContext.getInstance().show(); //初始化 EventDispatcher.fire(ModuleEvent.MajorModuleStarting, Toolkit.i18nText("Fine-Design_Basic_Initializing")); // 完成初始化 //noinspection ResultOfMethodCallIgnored CloudCenter.getInstance(); - + // 创建监听服务 DesignUtils.createListeningServer(DesignUtils.getPort(), startFileSuffix()); - + initLanguage(); } - + @Override public void stop() { - + } - + private void checkDebugStart() { - + if (isDebug()) { setDebugEnv(); } } - - + + /** * 在VM options里加入-Ddebug=true激活 * * @return isDebug */ private boolean isDebug() { - + return ComparatorUtils.equals("true", System.getProperty("debug")); } - - + + //端口改一下,环境配置文件改一下。便于启动两个设计器,进行对比调试 private void setDebugEnv() { - + DesignUtils.setPort(DesignerPort.DEBUG_MESSAGE_PORT); String debugXMlFilePath = StableUtils.pathJoin( - ProductConstants.getEnvHome(), - ProductConstants.APP_NAME + "Env_debug.xml" + ProductConstants.getEnvHome(), + ProductConstants.APP_NAME + "Env_debug.xml" ); DesignerEnvManager.setEnvFile( - new File(debugXMlFilePath)); + new File(debugXMlFilePath)); } - + private void initLanguage() { //这两句的位置不能随便调换,因为会影响语言切换的问题 GeneralContext.setLocale(DesignerEnvManager.getEnvManager(false).getLanguage()); } - + private String[] startFileSuffix() { - + return new String[]{".cpt", ".xls", ".xlsx", ".frm", ".form", ".cht", ".chart"}; } - + private static void preloadResource() { - - ExecutorService service = Executors.newCachedThreadPool(); - + + ExecutorService service = Executors.newCachedThreadPool(new NamedThreadFactory("PreLoadResource")); + service.submit(new Runnable() { - + @Override public void run() { - + new ImagePreLoader(); } }); - + service.submit(new Runnable() { - + @Override public void run() { - + TemplateInfoCollector.getInstance(); } }); service.shutdown(); } - + private SplashStrategy createSplash() { - + OemProcessor oemProcessor = OemHandler.findOem(); if (oemProcessor != null) { SplashStrategy splashStrategy = null; diff --git a/designer-realize/src/main/java/com/fr/start/preload/ImagePreLoader.java b/designer-realize/src/main/java/com/fr/start/preload/ImagePreLoader.java index c53bbb6db..1204f9a88 100644 --- a/designer-realize/src/main/java/com/fr/start/preload/ImagePreLoader.java +++ b/designer-realize/src/main/java/com/fr/start/preload/ImagePreLoader.java @@ -1,5 +1,6 @@ package com.fr.start.preload; +import com.fr.concurrent.NamedThreadFactory; import com.fr.general.IOUtils; import java.util.concurrent.ExecutorService; @@ -13,7 +14,7 @@ public class ImagePreLoader { public static final int THRESHOLD = 50; public ImagePreLoader() { - ExecutorService service = Executors.newCachedThreadPool(); + ExecutorService service = Executors.newCachedThreadPool(new NamedThreadFactory("ImagePreLoader")); int len = preLoadImages.length; int start = 0; From bbe4791fae69aeba83d72c93cd382bde27a8b48b Mon Sep 17 00:00:00 2001 From: zheng Date: Tue, 25 Jun 2019 15:29:48 +0800 Subject: [PATCH 022/217] =?UTF-8?q?CHART-9141=20se.cellCC=20&&=20floatCC?= =?UTF-8?q?=20=E8=B0=83=E7=94=A8=E5=9B=BE=E8=A1=A8=E7=BB=9F=E4=B8=80?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=20=E5=88=A0=E9=99=A4BaseChart=20=E5=90=84res?= =?UTF-8?q?ultProcessor=20=E5=88=9D=E6=AD=A5=E7=9A=84=E6=B5=81=E7=A8=8B?= =?UTF-8?q?=E8=B5=B0=E9=80=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gui/chart/MiddleChartComponent.java | 15 +- .../fr/design/ChartTypeInterfaceManager.java | 3 +- .../com/fr/design/chart/ChartTypePane.java | 12 +- .../fr/design/chart/gui/ChartComponent.java | 4 +- .../design/chart/gui/ChartWidgetOption.java | 6 +- .../active/action/ChartComponentAction.java | 7 +- .../impl/ChartHyperPoplinkPane.java | 5 +- .../chart/gui/ChartTypeButtonPane.java | 6 +- .../mainframe/chart/gui/ChartTypePane.java | 41 +----- .../chart/gui/type/AbstractChartTypePane.java | 3 +- .../fr/design/module/ChartPreStylePane.java | 13 +- .../fr/extended/chart/ExtendedTypePane.java | 3 +- .../java/com/fr/poly/PolyComponentsBar.java | 9 +- .../src/main/java/com/fr/poly/PolyUtils.java | 24 +--- .../com/fr/poly/creator/ChartBlockEditor.java | 133 ------------------ .../poly/hanlder/PolyDesignerDropTarget.java | 6 +- 16 files changed, 50 insertions(+), 240 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/gui/chart/MiddleChartComponent.java b/designer-base/src/main/java/com/fr/design/gui/chart/MiddleChartComponent.java index 9d16d6787..025c669bc 100644 --- a/designer-base/src/main/java/com/fr/design/gui/chart/MiddleChartComponent.java +++ b/designer-base/src/main/java/com/fr/design/gui/chart/MiddleChartComponent.java @@ -1,12 +1,11 @@ package com.fr.design.gui.chart; -import javax.swing.JComponent; - -import com.fr.base.chart.BaseChart; import com.fr.base.chart.BaseChartCollection; -import com.fr.stable.core.PropertyChangeAdapter; +import com.fr.chartx.attr.XChart; import com.fr.stable.core.PropertyChangeListener; +import javax.swing.JComponent; + /** * @author kunsnat E-mail:kunsnat@gmail.com * @version 创建时间:2013-7-10 上午09:19:36 @@ -18,8 +17,8 @@ public abstract class MiddleChartComponent extends JComponent { public abstract BaseChartCollection update(); public abstract void reset(); - - public abstract BaseChart getEditingChart(); - - public abstract void addStopEditingListener(PropertyChangeListener list); + + public abstract XChart getEditingChart(); + + public abstract void addStopEditingListener(PropertyChangeListener list); } \ No newline at end of file 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 1255d87d5..a188737c0 100644 --- a/designer-chart/src/main/java/com/fr/design/ChartTypeInterfaceManager.java +++ b/designer-chart/src/main/java/com/fr/design/ChartTypeInterfaceManager.java @@ -5,6 +5,7 @@ import com.fr.chart.base.ChartInternationalNameContentBean; import com.fr.chart.chartattr.Chart; import com.fr.chart.chartattr.Plot; import com.fr.chart.charttypes.ChartTypeManager; +import com.fr.chartx.attr.XChart; import com.fr.design.beans.BasicBeanPane; import com.fr.design.beans.FurtherBasicBeanPane; import com.fr.design.chart.fun.IndependentChartUIProvider; @@ -161,7 +162,7 @@ public class ChartTypeInterfaceManager implements ExtraChartDesignClassManagerPr int index = 0; for (ChartInternationalNameContentBean bean : typeName) { String plotID = bean.getPlotID(); - Chart[] rowChart = ChartTypeManager.getInstance().getChartTypes(plotID); + XChart[] rowChart = ChartTypeManager.getInstance().getChartTypes(plotID); if (ArrayUtils.isEmpty(rowChart) && !ChartTypeManager.innerChart(plotID)) { continue; } diff --git a/designer-chart/src/main/java/com/fr/design/chart/ChartTypePane.java b/designer-chart/src/main/java/com/fr/design/chart/ChartTypePane.java index d914a81e8..ed1e2656e 100644 --- a/designer-chart/src/main/java/com/fr/design/chart/ChartTypePane.java +++ b/designer-chart/src/main/java/com/fr/design/chart/ChartTypePane.java @@ -11,6 +11,7 @@ import com.fr.chart.chartattr.ChartIcon; import com.fr.chart.chartattr.MapPlot; import com.fr.chart.chartattr.Plot; import com.fr.chart.charttypes.ChartTypeManager; +import com.fr.chartx.attr.XChart; import com.fr.design.gui.ilable.UILabel; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.utils.gui.GUICoreUtils; @@ -36,12 +37,13 @@ public class ChartTypePane extends ChartCommonWizardPane { private static final long serialVersionUID = -1175602484968520546L; private ChartInternationalNameContentBean[] typeName = ChartTypeManager.getInstanceWithCheck().getAllChartBaseNames(); + //todo@shinerefactor 这个页面所有强转Chart的地方都要处理一下 private Chart[][] charts4Icon = null; { charts4Icon = new Chart[this.typeName.length][]; for (int i = 0; i < this.typeName.length; i++) { - Chart[] rowCharts = ChartTypeManager.getInstanceWithCheck().getChartTypes(this.typeName[i].getPlotID()); + XChart[] rowCharts = ChartTypeManager.getInstanceWithCheck().getChartTypes(this.typeName[i].getPlotID()); int rowChartsCount = rowCharts.length; charts4Icon[i] = new Chart[rowChartsCount]; for (int j = 0; j < rowChartsCount; j++) { @@ -145,9 +147,9 @@ public class ChartTypePane extends ChartCommonWizardPane { int subIndex = 0; for (int i = 0; i < typeName.length; i++) { - Chart[] charts = ChartTypeManager.getInstanceWithCheck().getChartTypes(typeName[i].getPlotID()); + XChart[] charts = ChartTypeManager.getInstanceWithCheck().getChartTypes(typeName[i].getPlotID()); for (int j = 0; j < charts.length; j++) { - if (charts[j].getPlot().match4GUI(plot)) { + if (((Chart) charts[j]).getPlot().match4GUI(plot)) { mainIndex = i; subIndex = j; // 一旦匹配 立马中断 @@ -162,7 +164,7 @@ public class ChartTypePane extends ChartCommonWizardPane { public void update(Chart oldChart) { String plotID = typeName[mainTypeList.getSelectedIndex()].getPlotID(); - Chart chart = ChartTypeManager.getInstanceWithCheck().getChartTypes(plotID)[iconViewList.getSelectedIndex()]; + Chart chart = (Chart) ChartTypeManager.getInstanceWithCheck().getChartTypes(plotID)[iconViewList.getSelectedIndex()]; if(chart.getPlot() != null){ if(chart.getPlot() instanceof MapPlot && !supportMap()){ JOptionPane.showMessageDialog(null, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Map_Not_Supported")); @@ -191,7 +193,7 @@ public class ChartTypePane extends ChartCommonWizardPane { Chart chart4Update = cc.getSelectedChart(); if (chart4Update == null) { String plotID = typeName[mainTypeList.getSelectedIndex()].getPlotID(); - Chart chart = ChartTypeManager.getInstance().getChartTypes(plotID)[iconViewList.getSelectedIndex()]; + Chart chart = (Chart) ChartTypeManager.getInstance().getChartTypes(plotID)[iconViewList.getSelectedIndex()]; try{ chart4Update = (Chart)chart.clone(); cc.addChart(chart4Update); diff --git a/designer-chart/src/main/java/com/fr/design/chart/gui/ChartComponent.java b/designer-chart/src/main/java/com/fr/design/chart/gui/ChartComponent.java index 769218c7f..85fcaaeff 100644 --- a/designer-chart/src/main/java/com/fr/design/chart/gui/ChartComponent.java +++ b/designer-chart/src/main/java/com/fr/design/chart/gui/ChartComponent.java @@ -1,7 +1,6 @@ package com.fr.design.chart.gui; import com.fr.base.ScreenResolution; -import com.fr.base.chart.BaseChart; import com.fr.base.chart.BaseChartCollection; import com.fr.base.chart.BaseChartGlyph; import com.fr.base.chart.chartdata.CallbackEvent; @@ -10,6 +9,7 @@ import com.fr.chart.chartattr.Axis; import com.fr.chart.chartattr.Chart; import com.fr.chart.chartattr.ChartCollection; import com.fr.chart.chartglyph.AxisGlyph; +import com.fr.chartx.attr.XChart; import com.fr.design.chart.gui.active.ActiveGlyph; import com.fr.design.chart.gui.active.ChartActiveGlyph; import com.fr.design.file.HistoryTemplateListPane; @@ -162,7 +162,7 @@ public class ChartComponent extends MiddleChartComponent implements MouseListene return (this.chartCollection4Design == null) ? 0 : this.chartCollection4Design.getChartCount(); } - public BaseChart getEditingChart() { + public XChart getEditingChart() { return editingChart; } diff --git a/designer-chart/src/main/java/com/fr/design/chart/gui/ChartWidgetOption.java b/designer-chart/src/main/java/com/fr/design/chart/gui/ChartWidgetOption.java index f621c545f..d52dcbfde 100644 --- a/designer-chart/src/main/java/com/fr/design/chart/gui/ChartWidgetOption.java +++ b/designer-chart/src/main/java/com/fr/design/chart/gui/ChartWidgetOption.java @@ -1,7 +1,7 @@ package com.fr.design.chart.gui; -import com.fr.chart.chartattr.Chart; import com.fr.chart.charttypes.ChartTypeManager; +import com.fr.chartx.attr.XChart; import com.fr.design.gui.core.WidgetOption; import com.fr.form.ui.ChartEditor; import com.fr.form.ui.Widget; @@ -38,8 +38,8 @@ public class ChartWidgetOption extends WidgetOption { Class clz = widgetClass(); try { ChartEditor widget = clz.newInstance(); - Chart chart = ChartTypeManager.getInstanceWithCheck().getChartTypes(this.chartID)[0]; - widget.addChart((Chart) chart.clone()); + XChart chart = ChartTypeManager.getInstanceWithCheck().getChartTypes(this.chartID)[0]; + widget.addChart((XChart) chart.clone()); return widget; } catch (InstantiationException e) { FineLoggerFactory.getLogger().error(e.getMessage(), e); diff --git a/designer-chart/src/main/java/com/fr/design/chart/gui/active/action/ChartComponentAction.java b/designer-chart/src/main/java/com/fr/design/chart/gui/active/action/ChartComponentAction.java index a27d2387a..9bedc637d 100644 --- a/designer-chart/src/main/java/com/fr/design/chart/gui/active/action/ChartComponentAction.java +++ b/designer-chart/src/main/java/com/fr/design/chart/gui/active/action/ChartComponentAction.java @@ -1,11 +1,10 @@ package com.fr.design.chart.gui.active.action; -import com.fr.base.chart.BaseChart; import com.fr.chart.chartattr.Axis; import com.fr.chart.chartattr.ChartCollection; import com.fr.chart.chartglyph.AxisGlyph; -import com.fr.design.chart.gui.ChartComponent; import com.fr.design.actions.UpdateAction; +import com.fr.design.chart.gui.ChartComponent; /** * Created by IntelliJ IDEA. @@ -29,10 +28,6 @@ public abstract class ChartComponentAction extends UpdateAction { chartComponent.repaint(); } - public BaseChart getEditingChart() { - return chartComponent.getEditingChart(); - } - public ChartCollection getChartCollection() { return chartComponent.getChartCollection(); } diff --git a/designer-chart/src/main/java/com/fr/design/chart/series/SeriesCondition/impl/ChartHyperPoplinkPane.java b/designer-chart/src/main/java/com/fr/design/chart/series/SeriesCondition/impl/ChartHyperPoplinkPane.java index c3db9b7ef..01c5a156e 100644 --- a/designer-chart/src/main/java/com/fr/design/chart/series/SeriesCondition/impl/ChartHyperPoplinkPane.java +++ b/designer-chart/src/main/java/com/fr/design/chart/series/SeriesCondition/impl/ChartHyperPoplinkPane.java @@ -6,6 +6,7 @@ import com.fr.chart.chartattr.Chart; import com.fr.chart.chartattr.ChartCollection; import com.fr.chart.charttypes.ChartTypeManager; import com.fr.chart.web.ChartHyperPoplink; +import com.fr.chartx.attr.XChart; import com.fr.design.chart.gui.ChartComponent; import com.fr.design.gui.itextfield.UITextField; import com.fr.design.hyperlink.AbstractHyperLinkPane; @@ -66,10 +67,10 @@ public class ChartHyperPoplinkPane extends AbstractHyperLinkPane implemen if (editingCollection != null) { //点击添加按钮,则会触发切换状态 - Chart chart = editingCollection.getChangeStateNewChart(); + XChart chart = editingCollection.getChangeStateNewChart(); try { - Chart newChart = (Chart) chart.clone(); + XChart newChart = (XChart) chart.clone(); editingCollection.addNamedChart(name, newChart); } catch (CloneNotSupportedException e1) { FineLoggerFactory.getLogger().error("Error in Clone"); 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 33c9a41dc..56547842c 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 @@ -41,30 +41,6 @@ public class ChartTypePane extends AbstractChartAttrPane{ private ChartTypeButtonPane buttonPane; private ChartEditPane editPane; private ChartCollection editingCollection; - private PaneState paneState = new PaneState(); - - private class PaneState{ - //记录面板所处状态 - private SwitchState paneState = SwitchState.DEFAULT; - //记录当前面板是谁在使用切换状态 - private String chartID = StringUtils.EMPTY; - - public SwitchState getPaneState() { - return paneState; - } - - public void setPaneState(SwitchState paneState) { - this.paneState = paneState; - } - - public String getChartID() { - return chartID; - } - - public void setChartID(String chartID) { - this.chartID = chartID; - } - } @Override protected JPanel createContentPane() { @@ -337,22 +313,7 @@ public class ChartTypePane extends AbstractChartAttrPane{ public void relayoutChartTypePane(ChartCollection collection){ - if (needRelayout(collection)) { - chartTypeComBox.relayout(collection); - //设置面板切换状态 - updatePaneState(collection); - } - } - - private void updatePaneState(ChartCollection collection) { - paneState.setChartID(collection.getRepresentChartID()); - paneState.setPaneState(collection.getState()); - } - - // TODO: 2016/11/17 因为现在populate面板时会重新构造面板,所以每次都需要重构 - private boolean needRelayout(ChartCollection collection) { - /*return paneState.getChartID() != collection.getRepresentChartID() || paneState.getPaneState() != collection.getState();*/ - return true; + chartTypeComBox.relayout(collection); } /** diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/AbstractChartTypePane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/AbstractChartTypePane.java index 27f426682..46447495d 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/AbstractChartTypePane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/AbstractChartTypePane.java @@ -17,6 +17,7 @@ import com.fr.chart.chartattr.Plot; import com.fr.chart.chartattr.Title; import com.fr.chart.chartglyph.ConditionAttr; import com.fr.chart.charttypes.BarIndependentChart; +import com.fr.chartx.attr.XChart; import com.fr.design.beans.FurtherBasicBeanPane; import com.fr.design.chart.series.PlotStyle.ChartSelectDemoPane; import com.fr.design.gui.ilable.BoldFontTextLabel; @@ -616,7 +617,7 @@ public abstract class AbstractChartTypePane extends FurtherBasicBeanPane{ return typePane; } - public Chart getDefaultChart() { + public XChart getDefaultChart() { return BarIndependentChart.barChartTypes[0]; } } \ No newline at end of file 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 2b8f6ea32..5bd4c3897 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 @@ -5,7 +5,6 @@ import com.fr.chart.base.ChartUtils; import com.fr.chart.chartattr.Bar2DPlot; import com.fr.chart.chartattr.Chart; import com.fr.chart.chartattr.ChartCollection; -import com.fr.chart.chartattr.Plot; import com.fr.design.beans.BasicBeanPane; import com.fr.design.chart.gui.ChartComponent; import com.fr.design.event.UIObserver; @@ -13,7 +12,6 @@ import com.fr.design.event.UIObserverListener; import com.fr.design.gui.ilable.BoldFontTextLabel; import com.fr.design.layout.FRGUIPaneFactory; - import javax.swing.JPanel; import java.awt.BorderLayout; import java.awt.Component; @@ -30,7 +28,8 @@ public class ChartPreStylePane extends BasicBeanPane { private ChartPreFillStylePane fillStylePane; private ChartComponent chartComponent; - + private Bar2DPlot demoPlot; + public ChartPreStylePane() { this.setLayout(FRGUIPaneFactory.createBorderLayout()); @@ -50,8 +49,9 @@ public class ChartPreStylePane extends BasicBeanPane { this.add(boxPane, BorderLayout.CENTER); ChartCollection cc = new ChartCollection(); - cc.addChart(new Chart(new Bar2DPlot())); - + demoPlot = new Bar2DPlot(); + cc.addChart(new Chart(demoPlot)); + chartComponent = new ChartComponent(); chartComponent.populate(cc); chartComponent.setPreferredSize(new Dimension(400, 300)); @@ -82,8 +82,7 @@ public class ChartPreStylePane extends BasicBeanPane { private void refreshWhenStyleChange(ChartColorMatching preStyle) { if(chartComponent != null) { - Plot plot = (Plot) chartComponent.getEditingChart().getBasePlot(); - plot.setPlotFillStyle(ChartUtils.chartColorMatching2AttrFillStyle(preStyle)); + demoPlot.setPlotFillStyle(ChartUtils.chartColorMatching2AttrFillStyle(preStyle)); chartComponent.reset(); } } diff --git a/designer-chart/src/main/java/com/fr/extended/chart/ExtendedTypePane.java b/designer-chart/src/main/java/com/fr/extended/chart/ExtendedTypePane.java index 9e5ddd7b4..331e51164 100644 --- a/designer-chart/src/main/java/com/fr/extended/chart/ExtendedTypePane.java +++ b/designer-chart/src/main/java/com/fr/extended/chart/ExtendedTypePane.java @@ -2,6 +2,7 @@ package com.fr.extended.chart; import com.fr.chart.chartattr.Chart; import com.fr.chart.charttypes.ChartTypeManager; +import com.fr.chartx.attr.XChart; import com.fr.design.mainframe.chart.gui.type.AbstractChartTypePane; import com.fr.design.mainframe.chart.gui.type.ChartImagePane; @@ -65,7 +66,7 @@ public class ExtendedTypePane extends AbstractChartType } @Override - public Chart getDefaultChart() { + public XChart getDefaultChart() { return ChartTypeManager.getInstance().getChartTypes(getPlotID())[0]; } diff --git a/designer-realize/src/main/java/com/fr/poly/PolyComponentsBar.java b/designer-realize/src/main/java/com/fr/poly/PolyComponentsBar.java index 564a3ae6a..097528c68 100644 --- a/designer-realize/src/main/java/com/fr/poly/PolyComponentsBar.java +++ b/designer-realize/src/main/java/com/fr/poly/PolyComponentsBar.java @@ -1,7 +1,7 @@ package com.fr.poly; import com.fr.base.BaseUtils; -import com.fr.base.chart.BaseChart; +import com.fr.base.chart.BaseChartCollection; import com.fr.base.chart.BaseChartGetter; import com.fr.base.chart.BaseChartNameID; import com.fr.base.vcs.DesignerMode; @@ -64,9 +64,10 @@ public class PolyComponentsBar extends JToolBar { ); this.add(serIcons[0]); for (int i = 0; i < typeLen; i++) { - BaseChart[] rowChart = BaseChartGetter.getStaticChartTypes(typeName[i].getPlotID()); - String iconPath = ChartTypeInterfaceManager.getInstance().getIconPath(typeName[i].getPlotID()); - serIcons[i + 1] = new SerIcon(rowChart[0], InterProviderFactory.getProvider().getLocText(typeName[i].getName()), iconPath); + String chartID = typeName[i].getPlotID(); + String iconPath = ChartTypeInterfaceManager.getInstance().getIconPath(chartID); + BaseChartCollection chartCollection = BaseChartGetter.getStaticChartCollection(chartID); + serIcons[i + 1] = new SerIcon(chartCollection, InterProviderFactory.getProvider().getLocText(typeName[i].getName()), iconPath); this.add(serIcons[i + 1]); } diff --git a/designer-realize/src/main/java/com/fr/poly/PolyUtils.java b/designer-realize/src/main/java/com/fr/poly/PolyUtils.java index 330949fb3..e297a69ad 100644 --- a/designer-realize/src/main/java/com/fr/poly/PolyUtils.java +++ b/designer-realize/src/main/java/com/fr/poly/PolyUtils.java @@ -4,9 +4,7 @@ package com.fr.poly; import com.fr.base.ScreenResolution; -import com.fr.base.chart.BaseChart; import com.fr.base.chart.BaseChartCollection; -import com.fr.base.chart.BasePlot; import com.fr.log.FineLoggerFactory; import com.fr.poly.creator.BlockCreator; import com.fr.poly.creator.ChartBlockCreator; @@ -15,7 +13,6 @@ import com.fr.poly.model.AddedData; import com.fr.report.poly.PolyChartBlock; import com.fr.report.poly.PolyECBlock; import com.fr.report.poly.TemplateBlock; -import com.fr.stable.bridge.StableFactory; import java.awt.Point; import java.lang.reflect.Constructor; @@ -53,10 +50,8 @@ public class PolyUtils { public static BlockCreator createCreator(Class clazz) { return createCreator(blockGenerate(clazz)); } - - public static BlockCreator createCreator(BaseChart chart) { - BaseChartCollection cc = (BaseChartCollection)StableFactory.createXmlObject(BaseChartCollection.XML_TAG); - cc.addChart(chart); + + public static BlockCreator createCreator(BaseChartCollection cc) { TemplateBlock block = new PolyChartBlock(cc); return createCreator(block); } @@ -66,20 +61,7 @@ public class PolyUtils { try { block = (TemplateBlock) clazz.newInstance(); } catch (Exception e) { - try { - BasePlot plot = (BasePlot)clazz.newInstance(); - BaseChartCollection cc = (BaseChartCollection)StableFactory.createXmlObject(BaseChartCollection.XML_TAG); - - BaseChart chart = (BaseChart)StableFactory.createXmlObject(BaseChart.XML_TAG); - chart.initChart(plot); - cc.addChart(chart); - - block = new PolyChartBlock(cc); - } catch (InstantiationException e1) { - FineLoggerFactory.getLogger().error(e1.getMessage(), e1); - } catch (IllegalAccessException e1) { - FineLoggerFactory.getLogger().error(e1.getMessage(), e1); - } + FineLoggerFactory.getLogger().error(e.getMessage(), e); } return block; } diff --git a/designer-realize/src/main/java/com/fr/poly/creator/ChartBlockEditor.java b/designer-realize/src/main/java/com/fr/poly/creator/ChartBlockEditor.java index 006c7e48d..bf72884bc 100644 --- a/designer-realize/src/main/java/com/fr/poly/creator/ChartBlockEditor.java +++ b/designer-realize/src/main/java/com/fr/poly/creator/ChartBlockEditor.java @@ -3,25 +3,15 @@ */ package com.fr.poly.creator; -import com.fr.base.BaseUtils; -import com.fr.base.ScreenResolution; -import com.fr.base.chart.BaseChart; import com.fr.base.chart.BaseChartCollection; -import com.fr.base.chart.BaseChartGetter; -import com.fr.base.chart.BaseChartNameID; import com.fr.base.vcs.DesignerMode; -import com.fr.design.border.UIRoundedBorder; import com.fr.design.file.HistoryTemplateListPane; import com.fr.design.gui.chart.MiddleChartComponent; import com.fr.design.mainframe.EastRegionContainerPane; -import com.fr.design.mainframe.JSliderPane; import com.fr.design.mainframe.JTemplate; import com.fr.design.mainframe.NoSupportAuthorityEdit; import com.fr.design.mainframe.cell.QuickEditorRegion; import com.fr.design.module.DesignModuleFactory; -import com.fr.design.utils.gui.LayoutUtils; -import com.fr.general.ComparatorUtils; -import com.fr.log.FineLoggerFactory; import com.fr.poly.PolyConstants; import com.fr.poly.PolyDesigner; import com.fr.poly.PolyDesigner.SelectionType; @@ -31,13 +21,8 @@ import com.fr.report.poly.PolyChartBlock; import com.fr.stable.core.PropertyChangeAdapter; import javax.swing.BorderFactory; -import javax.swing.Icon; -import javax.swing.JPanel; -import javax.swing.JToggleButton; -import javax.swing.border.Border; import java.awt.Color; import java.awt.Dimension; -import java.awt.FlowLayout; import java.awt.Rectangle; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; @@ -48,31 +33,10 @@ import java.awt.event.MouseEvent; */ // 图片的命名必须符合下面的代码规范(chart类别+序号的方式) 不然读取不到指定图片 public class ChartBlockEditor extends BlockEditor { - private static final int BOUND_OFF = 21; - private static Border buttonBorder; - private static String[][] chartsNames; - private static BaseChartNameID[] typeName = BaseChartGetter.getStaticAllChartBaseNames(); - private int resolution = (int) (ScreenResolution.getScreenResolution()* JSliderPane.getInstance().resolutionTimes); - - static { - buttonBorder = new UIRoundedBorder(new Color(149, 149, 149), 1, 5); - chartsNames = new String[typeName.length][]; - for (int i = 0; i < typeName.length; i++) { - BaseChart[] rowCharts = BaseChartGetter.getStaticChartTypes(typeName[i].getPlotID()); - chartsNames[i] = new String[rowCharts.length]; - for (int j = 0; j < rowCharts.length; j++) { - chartsNames[i][j] = rowCharts[j].getChartName(); - } - } - } - - private ChartButton[] chartButtons = null; public ChartBlockEditor(PolyDesigner designer, ChartBlockCreator creator) { super(designer, creator); this.resolution = creator.resolution; - //shine:和产品商量后决定把最上面一排切换按钮去掉 -// this.initNorthBarComponent(); } @@ -80,33 +44,6 @@ public class ChartBlockEditor extends BlockEditor Date: Tue, 25 Jun 2019 15:53:27 +0800 Subject: [PATCH 023/217] =?UTF-8?q?REPORT-16346=20alphafine=E9=9D=A2?= =?UTF-8?q?=E6=9D=BF=E5=88=9B=E5=BB=BA=E7=B4=A2=E5=BC=95=E7=BC=93=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/DesignerEnvManager.java | 4 +- .../alphafine/AlphaFineConfigManager.java | 91 ++++++++++-- .../constants/DesignerLaunchStatus.java | 34 +++++ .../design/gui/frpane/BaseHyperlinkGroup.java | 3 + .../design/gui/frpane/HyperlinkGroupType.java | 2 + .../toolbar/UpdateActionManager.java | 135 ++++++++++++++---- .../java/com/fr/design/menu/ToolBarDef.java | 37 ++--- .../fr/design/module/DesignModuleFactory.java | 4 +- .../update/push/DesignerPushUpdateDialog.java | 1 + .../push/DesignerPushUpdateManager.java | 16 ++- .../design/chart/ChartDesignerActivator.java | 3 + .../fr/design/module/ChartHyperlinkGroup.java | 3 + .../fr/design/module/FormHyperlinkGroup.java | 3 + .../fr/design/mainframe/ElementCasePane.java | 5 +- .../fr/design/mainframe/bbs/UserInfoPane.java | 10 +- .../mainframe/cell/QuickEditorRegion.java | 2 +- .../src/main/java/com/fr/grid/GridUI.java | 21 +-- .../com/fr/start/fx/PrismImageLoader2.java | 15 +- .../com/fr/start/module/DesignerStartup.java | 17 +-- .../module/DesignerWorkspaceProvider.java | 14 +- 20 files changed, 326 insertions(+), 94 deletions(-) create mode 100644 designer-base/src/main/java/com/fr/design/constants/DesignerLaunchStatus.java diff --git a/designer-base/src/main/java/com/fr/design/DesignerEnvManager.java b/designer-base/src/main/java/com/fr/design/DesignerEnvManager.java index dcc588fa3..17ca1083a 100644 --- a/designer-base/src/main/java/com/fr/design/DesignerEnvManager.java +++ b/designer-base/src/main/java/com/fr/design/DesignerEnvManager.java @@ -146,7 +146,7 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter { /** * alphafine */ - private AlphaFineConfigManager alphaFineConfigManager = new AlphaFineConfigManager(); + private AlphaFineConfigManager alphaFineConfigManager = AlphaFineConfigManager.getInstance(); private DesignerPushUpdateConfigManager designerPushUpdateConfigManager = DesignerPushUpdateConfigManager.getInstance(); @@ -1510,7 +1510,7 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter { } private void readAlphaFineAttr(XMLableReader reader) { - reader.readXMLObject(this.alphaFineConfigManager = new AlphaFineConfigManager()); + reader.readXMLObject(this.alphaFineConfigManager = AlphaFineConfigManager.getInstance()); } private void readHttpsParas(XMLableReader reader) { diff --git a/designer-base/src/main/java/com/fr/design/actions/help/alphafine/AlphaFineConfigManager.java b/designer-base/src/main/java/com/fr/design/actions/help/alphafine/AlphaFineConfigManager.java index c853db169..029632709 100644 --- a/designer-base/src/main/java/com/fr/design/actions/help/alphafine/AlphaFineConfigManager.java +++ b/designer-base/src/main/java/com/fr/design/actions/help/alphafine/AlphaFineConfigManager.java @@ -1,19 +1,29 @@ package com.fr.design.actions.help.alphafine; +import com.fr.general.ComparatorUtils; import com.fr.license.function.VT4FR; import com.fr.stable.OperatingSystem; import com.fr.stable.StringUtils; import com.fr.stable.xml.XMLPrintWriter; +import com.fr.stable.xml.XMLReadable; import com.fr.stable.xml.XMLable; import com.fr.stable.xml.XMLableReader; +import org.jetbrains.annotations.NotNull; import javax.swing.*; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; /** - * Created by XiaXiang on 2017/4/5. + * AlphaFine配置类 + * + * @author XiaXiang + * @date 2017/4/5 */ public class AlphaFineConfigManager implements XMLable { + private static final long serialVersionUID = -8170289826729582122L; private static AlphaFineConfigManager alphaFineConfigManager = new AlphaFineConfigManager(); /** * 是否开启alphafine @@ -56,12 +66,12 @@ public class AlphaFineConfigManager implements XMLable { */ private boolean containPlugin = true; /** - * 分词搜索 - */ + * 分词搜索 + */ private boolean needSegmentationCheckbox = true; /** - * 智能客服 - */ + * 智能客服 + */ private boolean needIntelligentCustomerService = true; /** * 快捷键 @@ -71,24 +81,30 @@ public class AlphaFineConfigManager implements XMLable { * 是否提醒 */ private boolean needRemind = true; + + private Map actionSearchTextCache = new HashMap<>(8); + + private String cacheBuildNO; /** * 直接操作菜单次数 */ private int operateCount; + private AlphaFineConfigManager() { + } + public static AlphaFineConfigManager getInstance() { return alphaFineConfigManager; } public static boolean isALPHALicAvailable() { - + return VT4FR.AlphaFine.isSupport(); } @Override public Object clone() throws CloneNotSupportedException { - AlphaFineConfigManager manager = (AlphaFineConfigManager) super.clone(); - return manager; + return super.clone(); } @Override @@ -107,9 +123,33 @@ public class AlphaFineConfigManager implements XMLable { this.setShortcuts(reader.getAttrAsString("shortcuts", getDefaultShortCuts())); this.setNeedRemind(reader.getAttrAsBoolean("isNeedRemind", true)); this.setOperateCount(reader.getAttrAsInt("operateCount", 0)); - + } else if (reader.isChildNode()) { + if (ComparatorUtils.equals(reader.getTagName(), "ActionSearchTextCache")) { + readActionSearchTextCacheXML(reader); + } } + } + /** + * 读出搜索缓存 + */ + private void readActionSearchTextCacheXML(XMLableReader reader) { + reader.readXMLObject(new XMLReadable() { + @Override + public void readXML(XMLableReader reader) { + if (ComparatorUtils.equals(reader.getTagName(), "ActionSearchTextCache")) { + setCacheBuildNO(reader.getAttrAsString("buildNO", "")); + } else if (ComparatorUtils.equals(reader.getTagName(), "item")) { + String tmpVal = reader.getElementValue(); + if (tmpVal != null) { + actionSearchTextCache.put(reader.getAttrAsString("key", ""), tmpVal); + } else { + actionSearchTextCache.put(reader.getAttrAsString("key", ""), StringUtils.EMPTY); + } + + } + } + }); } @Override @@ -128,6 +168,18 @@ public class AlphaFineConfigManager implements XMLable { .attr("operateCount", this.getOperateCount()) .attr("needSegmentationCheckbox", this.isNeedSegmentationCheckbox()) .attr("needIntelligentCustomerService", this.isNeedIntelligentCustomerService()); + writeActionSearchTextCacheXML(writer); + writer.end(); + } + + /** + * 写入搜索缓存 + */ + private void writeActionSearchTextCacheXML(XMLPrintWriter writer) { + writer.startTAG("ActionSearchTextCache").attr("buildNO", cacheBuildNO); + for (Map.Entry item : actionSearchTextCache.entrySet()) { + writer.startTAG("item").attr("key", item.getKey()).textNode(item.getValue()).end(); + } writer.end(); } @@ -262,4 +314,25 @@ public class AlphaFineConfigManager implements XMLable { public void setOperateCount(int operateCount) { this.operateCount = operateCount; } + + @NotNull + public Map getActionSearchTextCache() { + return Collections.unmodifiableMap(actionSearchTextCache); + } + + public void setActionSearchTextCache(@NotNull String key, @NotNull String value) { + this.actionSearchTextCache.put(key, value); + } + + @NotNull + public String getCacheBuildNO() { + if (cacheBuildNO == null) { + return StringUtils.EMPTY; + } + return cacheBuildNO; + } + + public void setCacheBuildNO(@NotNull String cacheBuildNO) { + this.cacheBuildNO = cacheBuildNO; + } } diff --git a/designer-base/src/main/java/com/fr/design/constants/DesignerLaunchStatus.java b/designer-base/src/main/java/com/fr/design/constants/DesignerLaunchStatus.java new file mode 100644 index 000000000..d62a84f78 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/constants/DesignerLaunchStatus.java @@ -0,0 +1,34 @@ +package com.fr.design.constants; + +import com.fr.event.Event; +import com.fr.event.EventDispatcher; +import com.fr.event.Null; + +/** + * 设计器启动事件类型 + * + * @author vito + * @date 2019-06-18 + */ +public enum DesignerLaunchStatus implements Event { + /** + * 初始化环境完成 + */ + WORKSPACE_INIT_COMPLETE, + + /** + * 设计器模块启动完成 + */ + DESIGNER_INIT_COMPLETE; + + private static DesignerLaunchStatus status; + + public static DesignerLaunchStatus getStatus() { + return status; + } + + public static void setStatus(DesignerLaunchStatus state) { + status = state; + EventDispatcher.fire(DesignerLaunchStatus.getStatus()); + } +} diff --git a/designer-base/src/main/java/com/fr/design/gui/frpane/BaseHyperlinkGroup.java b/designer-base/src/main/java/com/fr/design/gui/frpane/BaseHyperlinkGroup.java index 898101698..0c02e6c5c 100644 --- a/designer-base/src/main/java/com/fr/design/gui/frpane/BaseHyperlinkGroup.java +++ b/designer-base/src/main/java/com/fr/design/gui/frpane/BaseHyperlinkGroup.java @@ -4,6 +4,7 @@ import com.fr.design.gui.controlpane.NameableCreator; import com.fr.design.module.DesignModuleFactory; import com.fr.js.JavaScript; import com.fr.stable.Filter; +import org.jetbrains.annotations.NotNull; /** * 基础的超级链接类型, 不包括图表相关超链. @@ -18,6 +19,8 @@ public class BaseHyperlinkGroup implements HyperlinkGroupType { * * @return NameableCreator[] */ + @NotNull + @Override public NameableCreator[] getHyperlinkCreators() { return DesignModuleFactory.getCreators4Hyperlink(); } diff --git a/designer-base/src/main/java/com/fr/design/gui/frpane/HyperlinkGroupType.java b/designer-base/src/main/java/com/fr/design/gui/frpane/HyperlinkGroupType.java index 8db0b9b94..4c5aec60e 100644 --- a/designer-base/src/main/java/com/fr/design/gui/frpane/HyperlinkGroupType.java +++ b/designer-base/src/main/java/com/fr/design/gui/frpane/HyperlinkGroupType.java @@ -3,6 +3,7 @@ package com.fr.design.gui.frpane; import com.fr.design.gui.controlpane.NameableCreator; import com.fr.js.JavaScript; import com.fr.stable.Filter; +import org.jetbrains.annotations.NotNull; /** * 超级链接 支持的类型 种类. @@ -17,6 +18,7 @@ public interface HyperlinkGroupType { * * @return NameableCreator[] */ + @NotNull NameableCreator[] getHyperlinkCreators(); diff --git a/designer-base/src/main/java/com/fr/design/mainframe/toolbar/UpdateActionManager.java b/designer-base/src/main/java/com/fr/design/mainframe/toolbar/UpdateActionManager.java index dcc053e12..8f4a4f3d8 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/toolbar/UpdateActionManager.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/toolbar/UpdateActionManager.java @@ -1,29 +1,46 @@ package com.fr.design.mainframe.toolbar; +import com.fr.concurrent.NamedThreadFactory; import com.fr.design.actions.UpdateAction; +import com.fr.design.actions.help.alphafine.AlphaFineConfigManager; +import com.fr.design.constants.DesignerLaunchStatus; import com.fr.design.gui.frpane.LoadingBasicPane; -import com.fr.design.utils.concurrent.ThreadFactoryBuilder; +import com.fr.event.Event; +import com.fr.event.EventDispatcher; +import com.fr.event.Listener; +import com.fr.event.Null; import com.fr.general.ComparatorUtils; +import com.fr.general.GeneralUtils; import com.fr.log.FineLoggerFactory; import com.fr.stable.StableUtils; -import javax.swing.JPanel; +import javax.swing.*; +import java.util.HashMap; import java.util.List; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; +import java.util.Map; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; /** - * Created by XiaXiang on 2017/4/13. + * 按钮面板管理类 + * + * @author XiaXiang + * @date 2017/4/13 */ public class UpdateActionManager { private static UpdateActionManager updateActionManager = null; + private List updateActions; - private ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor( - 1, 2, - 30000L, TimeUnit.MILLISECONDS, - new LinkedBlockingQueue(), - new ThreadFactoryBuilder().setNameFormat("alphafine-thread-%s").build());//目前测下来一个线程慢慢做处理总共大概也只要两秒,暂时就这样 + + private Map updateActionsIndexCache = new HashMap<>(16); + + private static boolean isRegisterIndexSearchTextTask = false; + + /** + * 限制初始化 + */ + private UpdateActionManager() { + } public synchronized static UpdateActionManager getUpdateActionManager() { if (updateActionManager == null) { @@ -55,22 +72,92 @@ public class UpdateActionManager { return null; } - public synchronized void dealWithSearchText(final String paneClass, final UpdateAction updateAction) { - threadPoolExecutor.allowCoreThreadTimeOut(true); - threadPoolExecutor.execute(new Runnable() { + /** + * 处理action的搜索文本。 + * 缓存逻辑: + * 1.首次索引或缓存失效的时候(更新版本会使缓存失效),会将索引缓存存到env.xml, + * 下次直接加载。 + * 2.需要重新索引,则等待设计器初始化完毕之后单线程运行索引任务。 + * + * @param paneClass 面板类名 + * @param updateAction 待处理的updateAction + */ + public void dealWithSearchText(String paneClass, UpdateAction updateAction) { + Map actionSearchTextCache = AlphaFineConfigManager.getInstance().getActionSearchTextCache(); + if (!cacheValid() + || actionSearchTextCache.isEmpty() + || !actionSearchTextCache.containsKey(paneClass)) { + if (!updateActionsIndexCache.containsKey(paneClass)) { + updateActionsIndexCache.put(paneClass, updateAction); + } + registerIndexSearchTextTask(); + } else { + updateAction.setSearchText(actionSearchTextCache.get(paneClass)); + } + } + + /** + * 缓存是否有效。 + * 注意:开发工程版本为不是安装版本, + * 索引只会出现在首次启动。 + * + * @return true有效,false失效 + */ + private boolean cacheValid() { + return ComparatorUtils.equals(GeneralUtils.readBuildNO(), AlphaFineConfigManager.getInstance().getCacheBuildNO()); + } + + /** + * 由于是UI线程不考虑并发问题 + */ + private void registerIndexSearchTextTask() { + if (isRegisterIndexSearchTextTask) { + return; + } + isRegisterIndexSearchTextTask = true; + // 没有缓存或者缓存失效的时候,等待设计器启动之后开始索引任务 + EventDispatcher.listen(DesignerLaunchStatus.DESIGNER_INIT_COMPLETE, new Listener() { @Override - public void run() { - JPanel panel = null; - try { - panel = (JPanel) StableUtils.classForName(paneClass).newInstance(); - if (panel instanceof LoadingBasicPane) { - panel = ((LoadingBasicPane) panel).getAllComponents(); - } - updateAction.setSearchText(updateAction.getComponentTexts(panel, "_", new StringBuffer(), new StringBuffer(), new StringBuffer())); - } catch (Exception e) { - FineLoggerFactory.getLogger().error(e.getMessage(), e); + public void on(Event event, Null param) { + // 使用单线程索引 + ExecutorService es = Executors.newSingleThreadExecutor(new NamedThreadFactory("IndexAlphaFineSearchText")); + for (Map.Entry cache : updateActionsIndexCache.entrySet()) { + es.execute(new IndexTask(cache.getKey(), cache.getValue())); } + updateActionsIndexCache = null; + es.shutdown(); + // 标记一下缓存版本 + AlphaFineConfigManager.getInstance().setCacheBuildNO(GeneralUtils.readBuildNO()); } }); } + + /** + * 索引任务 + */ + class IndexTask implements Runnable { + private String className; + private UpdateAction updateAction; + + IndexTask(String className, UpdateAction updateAction) { + this.className = className; + this.updateAction = updateAction; + } + + @Override + public void run() { + JPanel panel; + try { + panel = (JPanel) StableUtils.classForName(className).newInstance(); + if (panel instanceof LoadingBasicPane) { + panel = ((LoadingBasicPane) panel).getAllComponents(); + } + String componentTexts = updateAction.getComponentTexts(panel, "_", new StringBuffer(), new StringBuffer(), new StringBuffer()); + updateAction.setSearchText(componentTexts); + AlphaFineConfigManager.getInstance().setActionSearchTextCache(className, componentTexts); + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } + } + } } \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/menu/ToolBarDef.java b/designer-base/src/main/java/com/fr/design/menu/ToolBarDef.java index dde3acec6..07c51312e 100644 --- a/designer-base/src/main/java/com/fr/design/menu/ToolBarDef.java +++ b/designer-base/src/main/java/com/fr/design/menu/ToolBarDef.java @@ -2,25 +2,27 @@ package com.fr.design.menu; import com.fr.design.gui.itoolbar.UIToolBarUI; import com.fr.design.gui.itoolbar.UIToolbar; +import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.awt.*; import java.util.ArrayList; +import java.util.Collections; import java.util.List; /** * Define toolbar.. */ -public class ToolBarDef { - +public class ToolBarDef { + // item List. private List shortcutList = new ArrayList(); - /* + /** * 一个static的方法生成一个JToolBar */ public static UIToolbar createJToolBar(final Color background) { - UIToolbar toolbar = new UIToolbar(FlowLayout.LEFT, new UIToolBarUI(){ + UIToolbar toolbar = new UIToolbar(FlowLayout.LEFT, new UIToolBarUI() { @Override public void paint(Graphics g, JComponent c) { Graphics2D g2 = (Graphics2D) g; @@ -33,13 +35,13 @@ public class ToolBarDef { } - /* + /** * 一个static的方法生成一个JToolBar */ public static UIToolbar createJToolBar() { - UIToolbar toolbar = new UIToolbar(FlowLayout.LEFT); + UIToolbar toolbar = new UIToolbar(FlowLayout.LEFT); toolbar.setBorder(BorderFactory.createEmptyBorder(2, 0, 2, 0)); - return toolbar; + return toolbar; } public ToolBarDef() { @@ -49,31 +51,34 @@ public class ToolBarDef { return this.shortcutList.size(); } + @Nullable public ShortCut getShortCut(int index) { return this.shortcutList.get(index); } -// 用可变参数,方便添加数组 + /** + * 用可变参数,方便添加数组 + */ public void addShortCut(ShortCut... shortcut) { - for(ShortCut i : shortcut){ - this.shortcutList.add(i); - } + Collections.addAll(this.shortcutList, shortcut); } - + public void clearShortCuts() { this.shortcutList.clear(); } - /* + /** * 根据当前的ToolBarDef,更新toolBar */ public void updateToolBar(UIToolbar toolBar) { toolBar.removeAll(); - + int actionCount = this.getShortCutCount(); for (int i = 0; i < actionCount; i++) { - ShortCut shortcut = this.getShortCut(i); - shortcut.intoJToolBar(toolBar); + ShortCut shortcut = this.getShortCut(i); + if (shortcut != null) { + shortcut.intoJToolBar(toolBar); + } } } diff --git a/designer-base/src/main/java/com/fr/design/module/DesignModuleFactory.java b/designer-base/src/main/java/com/fr/design/module/DesignModuleFactory.java index 22ea7aa35..74cf7cbd3 100644 --- a/designer-base/src/main/java/com/fr/design/module/DesignModuleFactory.java +++ b/designer-base/src/main/java/com/fr/design/module/DesignModuleFactory.java @@ -16,6 +16,7 @@ import com.fr.design.parameter.ParameterReader; import com.fr.form.ui.Widget; import com.fr.log.FineLoggerFactory; import com.fr.stable.StableUtils; +import org.jetbrains.annotations.NotNull; import java.awt.Dialog; import java.awt.Frame; @@ -65,8 +66,9 @@ public class DesignModuleFactory { instance.creators4Hyperlink = nameableCreators; } + @NotNull public static NameableCreator[] getCreators4Hyperlink() { - return instance.creators4Hyperlink; + return instance.creators4Hyperlink == null? new NameableCreator[0]:instance.creators4Hyperlink; } public static void registerExtraWidgetOptions(WidgetOption[] options) { diff --git a/designer-base/src/main/java/com/fr/design/update/push/DesignerPushUpdateDialog.java b/designer-base/src/main/java/com/fr/design/update/push/DesignerPushUpdateDialog.java index ab093605e..d35b1dd54 100644 --- a/designer-base/src/main/java/com/fr/design/update/push/DesignerPushUpdateDialog.java +++ b/designer-base/src/main/java/com/fr/design/update/push/DesignerPushUpdateDialog.java @@ -37,6 +37,7 @@ class DesignerPushUpdateDialog extends UIDialog { static void createAndShow(final Frame parent, final DesignerUpdateInfo updateInfo) { SwingUtilities.invokeLater(new Runnable() { + @Override public void run() { DesignerPushUpdateDialog dialog = new DesignerPushUpdateDialog(parent); dialog.populate(updateInfo); diff --git a/designer-base/src/main/java/com/fr/design/update/push/DesignerPushUpdateManager.java b/designer-base/src/main/java/com/fr/design/update/push/DesignerPushUpdateManager.java index dcb5d45fd..44cfb146b 100644 --- a/designer-base/src/main/java/com/fr/design/update/push/DesignerPushUpdateManager.java +++ b/designer-base/src/main/java/com/fr/design/update/push/DesignerPushUpdateManager.java @@ -1,5 +1,6 @@ package com.fr.design.update.push; +import com.fr.concurrent.NamedThreadFactory; import com.fr.design.event.DesignerOpenedListener; import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.DesignerFrame; @@ -13,12 +14,17 @@ import com.fr.log.FineLoggerFactory; import com.fr.stable.StringUtils; import com.fr.workspace.WorkContext; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + /** * Created by plough on 2019/4/8. */ public class DesignerPushUpdateManager { private static final String SPLIT_CHAR = "-"; private static DesignerPushUpdateManager singleton; + private final ExecutorService checkUpdateService = Executors.newSingleThreadExecutor(new NamedThreadFactory("DesignerCheckUpdate")); + private final ExecutorService updateService = Executors.newSingleThreadExecutor(new NamedThreadFactory("DesignerUpdate")); private DesignerUpdateInfo updateInfo; @@ -94,7 +100,7 @@ public class DesignerPushUpdateManager { * 检查更新,如果有合适的更新版本,则弹窗 */ private void checkAndPop() { - new Thread() { + checkUpdateService.execute(new Runnable() { @Override public void run() { if (!shouldPopUp()) { @@ -104,7 +110,8 @@ public class DesignerPushUpdateManager { final DesignerFrame designerFrame = DesignerContext.getDesignerFrame(); DesignerPushUpdateDialog.createAndShow(designerFrame, updateInfo); } - }.start(); + }); + checkUpdateService.shutdown(); } private boolean shouldPopUp() { @@ -146,14 +153,15 @@ public class DesignerPushUpdateManager { * 跳转到更新升级窗口,并自动开始更新 */ void doUpdate() { - new Thread() { + updateService.execute(new Runnable() { @Override public void run() { UpdateMainDialog dialog = new UpdateMainDialog(DesignerContext.getDesignerFrame()); dialog.setAutoUpdateAfterInit(); dialog.showDialog(); } - }.start(); + }); + updateService.shutdown(); } /** diff --git a/designer-chart/src/main/java/com/fr/design/chart/ChartDesignerActivator.java b/designer-chart/src/main/java/com/fr/design/chart/ChartDesignerActivator.java index c3213c10b..2034f4591 100644 --- a/designer-chart/src/main/java/com/fr/design/chart/ChartDesignerActivator.java +++ b/designer-chart/src/main/java/com/fr/design/chart/ChartDesignerActivator.java @@ -4,6 +4,7 @@ import com.fr.chart.chartattr.ChartCollection; import com.fr.design.ChartTypeInterfaceManager; import com.fr.design.actions.core.ActionFactory; import com.fr.design.chart.gui.ChartComponent; +import com.fr.design.constants.DesignerLaunchStatus; import com.fr.design.file.HistoryTemplateListPane; import com.fr.design.mainframe.ChartPropertyPane; import com.fr.design.module.ChartEmptyDataStyleAction; @@ -53,6 +54,8 @@ public class ChartDesignerActivator extends Activator implements Prepare { DesignImageEvent.registerDefaultCallbackEvent(HistoryTemplateListPane.getInstance()); DesignImageEvent.registerDownloadSourcesEvent(new DownloadOnlineSourcesHelper()); + DesignerLaunchStatus.setStatus(DesignerLaunchStatus.DESIGNER_INIT_COMPLETE); + ChartTypeInterfaceManager.addPluginChangedListener(); } diff --git a/designer-chart/src/main/java/com/fr/design/module/ChartHyperlinkGroup.java b/designer-chart/src/main/java/com/fr/design/module/ChartHyperlinkGroup.java index 4e5037109..1c4d92752 100644 --- a/designer-chart/src/main/java/com/fr/design/module/ChartHyperlinkGroup.java +++ b/designer-chart/src/main/java/com/fr/design/module/ChartHyperlinkGroup.java @@ -19,6 +19,7 @@ import com.fr.js.JavaScript; import com.fr.stable.ArrayUtils; import com.fr.stable.Filter; import com.fr.stable.bridge.StableFactory; +import org.jetbrains.annotations.NotNull; /** * 图表的超级链接界面. 比一般的HyperlinkGroupPane多了图表的相关超级链接 @@ -33,6 +34,8 @@ public class ChartHyperlinkGroup extends BaseHyperlinkGroup { * * @return NameableCreator[] */ + @NotNull + @Override public NameableCreator[] getHyperlinkCreators() { FormHyperlinkProvider formHyperlink = StableFactory.getMarkedInstanceObjectFromClass(FormHyperlinkProvider.XML_TAG, FormHyperlinkProvider.class); diff --git a/designer-chart/src/main/java/com/fr/design/module/FormHyperlinkGroup.java b/designer-chart/src/main/java/com/fr/design/module/FormHyperlinkGroup.java index f10964d4c..65ad2594d 100644 --- a/designer-chart/src/main/java/com/fr/design/module/FormHyperlinkGroup.java +++ b/designer-chart/src/main/java/com/fr/design/module/FormHyperlinkGroup.java @@ -11,6 +11,7 @@ import com.fr.design.gui.frpane.BaseHyperlinkGroup; import com.fr.js.FormHyperlinkProvider; import com.fr.stable.ArrayUtils; import com.fr.stable.bridge.StableFactory; +import org.jetbrains.annotations.NotNull; /** * Created with IntelliJ IDEA. @@ -25,6 +26,8 @@ public class FormHyperlinkGroup extends BaseHyperlinkGroup { * * @return NameableCreator[] */ + @NotNull + @Override public NameableCreator[] getHyperlinkCreators() { FormHyperlinkProvider formHyperlink = StableFactory.getMarkedInstanceObjectFromClass(FormHyperlinkProvider.XML_TAG, FormHyperlinkProvider.class); NameableCreator[] related4ChartHyper = { diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/ElementCasePane.java b/designer-realize/src/main/java/com/fr/design/mainframe/ElementCasePane.java index b16aa1b42..b68a5f72e 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/ElementCasePane.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/ElementCasePane.java @@ -526,7 +526,10 @@ public abstract class ElementCasePane extends Tar !ComparatorUtils.equals(EastRegionContainerPane.getInstance().getCellAttrPane(), CellElementPropertyPane.getInstance())) { try { //旧选中内容编辑器释放模板对象 - this.getCurrentEditor().release(); + QuickEditor editor = this.getCurrentEditor(); + if(editor != null){ + editor.release(); + } } catch (UnsupportedOperationException e) { FineLoggerFactory.getLogger().info("Nothing to release"); } diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/bbs/UserInfoPane.java b/designer-realize/src/main/java/com/fr/design/mainframe/bbs/UserInfoPane.java index 629839a29..24ae13eda 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/bbs/UserInfoPane.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/bbs/UserInfoPane.java @@ -4,6 +4,7 @@ package com.fr.design.mainframe.bbs; import com.fr.base.FRContext; +import com.fr.concurrent.NamedThreadFactory; import com.fr.config.MarketConfig; import com.fr.design.DesignerEnvManager; import com.fr.design.constants.UIConstants; @@ -20,6 +21,8 @@ import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; /** @@ -111,7 +114,7 @@ public class UserInfoPane extends BasicPane { return StringUtils.EMPTY; } - public void updateBBSUserInfo(){ + public void updateBBSUserInfo() { String username = MarketConfig.getInstance().getBbsUsername(); if (StringUtils.isEmpty(username)) { markUnSignIn(); @@ -149,7 +152,8 @@ public class UserInfoPane extends BasicPane { } private void autoPushLoginDialog() { - Thread showBBSThread = new Thread(new Runnable() { + ExecutorService executorService = Executors.newSingleThreadExecutor(new NamedThreadFactory("BBSAutoPushLogin")); + executorService.execute(new Runnable() { @Override public void run() { @@ -185,7 +189,7 @@ public class UserInfoPane extends BasicPane { } }); - showBBSThread.start(); + executorService.shutdown(); } diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/cell/QuickEditorRegion.java b/designer-realize/src/main/java/com/fr/design/mainframe/cell/QuickEditorRegion.java index 77dcebef1..6291c5ddf 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/cell/QuickEditorRegion.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/cell/QuickEditorRegion.java @@ -46,7 +46,7 @@ public class QuickEditorRegion extends JPanel { */ public void populate(final QuickEditor currentEditor) { this.removeAll(); - if (currentEditor.getComponentCount() == 0) { + if (currentEditor == null || currentEditor.getComponentCount() == 0) { this.add(getEmptyEditor(), BorderLayout.CENTER); } else { this.add(currentEditor, BorderLayout.CENTER); diff --git a/designer-realize/src/main/java/com/fr/grid/GridUI.java b/designer-realize/src/main/java/com/fr/grid/GridUI.java index 1bb88c7b0..f2f5395f1 100644 --- a/designer-realize/src/main/java/com/fr/grid/GridUI.java +++ b/designer-realize/src/main/java/com/fr/grid/GridUI.java @@ -26,6 +26,7 @@ import com.fr.main.FineBook; import com.fr.page.PaperSettingProvider; import com.fr.page.ReportSettingsProvider; import com.fr.page.WatermarkPainter; +import com.fr.page.stable.PaperSetting; import com.fr.report.ReportHelper; import com.fr.report.cell.CellElement; import com.fr.report.cell.FloatElement; @@ -48,20 +49,9 @@ import com.fr.stable.script.CalculatorUtils; import com.fr.stable.unit.FU; import com.fr.third.antlr.ANTLRException; -import javax.swing.JComponent; -import javax.swing.UIManager; +import javax.swing.*; import javax.swing.plaf.ComponentUI; -import java.awt.AlphaComposite; -import java.awt.BasicStroke; -import java.awt.Color; -import java.awt.Composite; -import java.awt.Dimension; -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.Paint; -import java.awt.Rectangle; -import java.awt.Shape; -import java.awt.Stroke; +import java.awt.*; import java.awt.geom.Area; import java.awt.geom.GeneralPath; import java.awt.geom.Line2D; @@ -118,7 +108,7 @@ public class GridUI extends ComponentUI { protected ReportSettingsProvider getReportSettings(ElementCase elementCase) { if (elementCase instanceof Report) { return ReportUtils.getReportSettings((Report) elementCase); - } else if(elementCase instanceof FormElementCase){ + } else if (elementCase instanceof FormElementCase) { return ((FormElementCase) elementCase).getReportSettings(); } else { return new ReportSettings(); @@ -141,6 +131,9 @@ public class GridUI extends ComponentUI { // richer;聚合报表设计中,最初的ElementCase还没有加到Report中,所以elementCase.getReport()可能为空 ReportSettingsProvider reportSettings = getReportSettings(elementCase); PaperSettingProvider psetting = reportSettings.getPaperSetting(); + if (psetting == null) { + psetting = new PaperSetting(); + } if (grid.getPaginateLineShowType() != Grid.NO_PAGINATE_LINE) {// paint paper margin line. PaperSize paperSize = psetting.getPaperSize(); Margin margin = psetting.getMargin(); diff --git a/designer-realize/src/main/java/com/fr/start/fx/PrismImageLoader2.java b/designer-realize/src/main/java/com/fr/start/fx/PrismImageLoader2.java index 99066e964..470b382c9 100644 --- a/designer-realize/src/main/java/com/fr/start/fx/PrismImageLoader2.java +++ b/designer-realize/src/main/java/com/fr/start/fx/PrismImageLoader2.java @@ -1,5 +1,6 @@ package com.fr.start.fx; +import com.fr.concurrent.NamedThreadFactory; import com.sun.javafx.iio.ImageFrame; import com.sun.javafx.iio.ImageLoadListener; import com.sun.javafx.iio.ImageLoader; @@ -14,6 +15,8 @@ import com.sun.prism.impl.PrismSettings; import java.io.IOException; import java.io.InputStream; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; /** * 边加载边播放的gif加载器 @@ -36,7 +39,8 @@ class PrismImageLoader2 implements com.sun.javafx.tk.ImageLoader { delayTimes = new int[gifCount]; this.width = width; this.height = height; - new Thread() { + ExecutorService es = Executors.newSingleThreadExecutor(new NamedThreadFactory("PrismImageLoader2")); + es.execute(new Runnable() { @Override public void run() { InputStream inputStream = null; @@ -47,14 +51,16 @@ class PrismImageLoader2 implements com.sun.javafx.tk.ImageLoader { e.printStackTrace(); } finally { try { - inputStream.close(); + if (inputStream != null) { + inputStream.close(); + } } catch (IOException e) { e.printStackTrace(); } } } - }.start(); - + }); + es.shutdown(); } @Override @@ -108,6 +114,7 @@ class PrismImageLoader2 implements com.sun.javafx.tk.ImageLoader { return 40; } + @Override public int getLoopCount() { return 0; } diff --git a/designer-realize/src/main/java/com/fr/start/module/DesignerStartup.java b/designer-realize/src/main/java/com/fr/start/module/DesignerStartup.java index 539e8359a..49d12eb9c 100644 --- a/designer-realize/src/main/java/com/fr/start/module/DesignerStartup.java +++ b/designer-realize/src/main/java/com/fr/start/module/DesignerStartup.java @@ -12,30 +12,31 @@ import com.fr.start.ServerStarter; */ @EnableMetrics public class DesignerStartup extends Activator { - + @Override @Metrics public void start() { - startSub(PreStartActivator.class); +// startSub(DesignerInitActivator.class); +// startSub(DesignerShowActivator.class); getSub("parallel").start(); //designer模块启动好后,查看demo browserDemo(); - startSub(DesignerShowActivator.class); + startSub(StartFinishActivator.class); FineRuntime.startFinish(); } - + private void browserDemo() { - + if (getModule().leftFindSingleton(StartupArgs.class) != null && getModule().leftFindSingleton(StartupArgs.class).isDemo()) { ServerStarter.browserDemoURL(); } } - - + + @Override public void stop() { - + } } diff --git a/designer-realize/src/main/java/com/fr/start/module/DesignerWorkspaceProvider.java b/designer-realize/src/main/java/com/fr/start/module/DesignerWorkspaceProvider.java index a6ba2c009..e1779c3e2 100644 --- a/designer-realize/src/main/java/com/fr/start/module/DesignerWorkspaceProvider.java +++ b/designer-realize/src/main/java/com/fr/start/module/DesignerWorkspaceProvider.java @@ -2,6 +2,7 @@ package com.fr.start.module; import com.fr.design.DesignerEnvManager; import com.fr.design.EnvChangeEntrance; +import com.fr.design.constants.DesignerLaunchStatus; import com.fr.design.env.DesignerWorkspaceGenerator; import com.fr.design.env.DesignerWorkspaceInfo; import com.fr.log.FineLoggerFactory; @@ -15,12 +16,12 @@ import com.fr.workspace.Workspace; * 设计器启动时的环境相关模块activator */ public class DesignerWorkspaceProvider extends Activator { - + @Override public void start() { //检查环境 DesignerEnvManager.checkNameEnvMap(); - + if (getModule().leftFindSingleton(StartupArgs.class) != null && getModule().leftFindSingleton(StartupArgs.class).isDemo()) { DesignerEnvManager.getEnvManager().setCurrentEnv2Default(); } else { @@ -39,13 +40,12 @@ public class DesignerWorkspaceProvider extends Activator { EnvChangeEntrance.getInstance().dealEvnExceptionWhenStartDesigner(); } } + DesignerLaunchStatus.setStatus(DesignerLaunchStatus.WORKSPACE_INIT_COMPLETE); } - - + @Override public void stop() { - + } - - + } From 4b4e946f8db4aa13744af8bc30064f88e6cd92c1 Mon Sep 17 00:00:00 2001 From: vito Date: Tue, 25 Jun 2019 15:56:09 +0800 Subject: [PATCH 024/217] =?UTF-8?q?=E8=AF=AF=E4=BC=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fr/start/module/DesignerStartup.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/start/module/DesignerStartup.java b/designer-realize/src/main/java/com/fr/start/module/DesignerStartup.java index 49d12eb9c..dec3a508f 100644 --- a/designer-realize/src/main/java/com/fr/start/module/DesignerStartup.java +++ b/designer-realize/src/main/java/com/fr/start/module/DesignerStartup.java @@ -16,13 +16,14 @@ public class DesignerStartup extends Activator { @Override @Metrics public void start() { + startSub(PreStartActivator.class); -// startSub(DesignerInitActivator.class); -// startSub(DesignerShowActivator.class); + startSub(DesignerInitActivator.class); + startSub(DesignerShowActivator.class); getSub("parallel").start(); //designer模块启动好后,查看demo browserDemo(); - + startSub(DesignerShowActivator.class); startSub(StartFinishActivator.class); FineRuntime.startFinish(); } From ddc82345a6e60e99d47089bf56c0abebefb99690 Mon Sep 17 00:00:00 2001 From: vito Date: Tue, 25 Jun 2019 15:57:31 +0800 Subject: [PATCH 025/217] =?UTF-8?q?=E8=AF=AF=E4=BC=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fr/start/module/DesignerStartup.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/start/module/DesignerStartup.java b/designer-realize/src/main/java/com/fr/start/module/DesignerStartup.java index dec3a508f..b1ad72251 100644 --- a/designer-realize/src/main/java/com/fr/start/module/DesignerStartup.java +++ b/designer-realize/src/main/java/com/fr/start/module/DesignerStartup.java @@ -18,8 +18,6 @@ public class DesignerStartup extends Activator { public void start() { startSub(PreStartActivator.class); - startSub(DesignerInitActivator.class); - startSub(DesignerShowActivator.class); getSub("parallel").start(); //designer模块启动好后,查看demo browserDemo(); From 69b9f00781d2540387c79d4b79e7325f033d4309 Mon Sep 17 00:00:00 2001 From: vito Date: Tue, 25 Jun 2019 16:09:05 +0800 Subject: [PATCH 026/217] =?UTF-8?q?=E6=97=A0jira=E4=BB=BB=E5=8A=A1=20impor?= =?UTF-8?q?t=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fr/grid/GridUI.java | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/grid/GridUI.java b/designer-realize/src/main/java/com/fr/grid/GridUI.java index f2f5395f1..c7ea41368 100644 --- a/designer-realize/src/main/java/com/fr/grid/GridUI.java +++ b/designer-realize/src/main/java/com/fr/grid/GridUI.java @@ -49,9 +49,20 @@ import com.fr.stable.script.CalculatorUtils; import com.fr.stable.unit.FU; import com.fr.third.antlr.ANTLRException; -import javax.swing.*; +import javax.swing.JComponent; +import javax.swing.UIManager; import javax.swing.plaf.ComponentUI; -import java.awt.*; +import java.awt.AlphaComposite; +import java.awt.BasicStroke; +import java.awt.Color; +import java.awt.Composite; +import java.awt.Dimension; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Paint; +import java.awt.Rectangle; +import java.awt.Shape; +import java.awt.Stroke; import java.awt.geom.Area; import java.awt.geom.GeneralPath; import java.awt.geom.Line2D; From 8ea122559a1a0a3c34209ce7fe3c8ae8ab21e303 Mon Sep 17 00:00:00 2001 From: neil <459208047@qq.com> Date: Tue, 25 Jun 2019 18:24:06 +0800 Subject: [PATCH 027/217] ct --- .../main/java/com/fr/start/SplashContext.java | 20 +++++++++---------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/start/SplashContext.java b/designer-realize/src/main/java/com/fr/start/SplashContext.java index 8ae77ee09..e45eee48f 100644 --- a/designer-realize/src/main/java/com/fr/start/SplashContext.java +++ b/designer-realize/src/main/java/com/fr/start/SplashContext.java @@ -1,12 +1,15 @@ package com.fr.start; import com.fr.concurrent.NamedThreadFactory; -import com.fr.design.DesignerEnvManager; +import com.fr.design.i18n.Toolkit; +import com.fr.design.locale.impl.SplashMark; import com.fr.design.mainframe.bbs.BBSConstants; import com.fr.event.Event; import com.fr.event.EventDispatcher; import com.fr.event.Listener; import com.fr.general.GeneralContext; +import com.fr.general.locale.LocaleCenter; +import com.fr.general.locale.LocaleMark; import com.fr.module.ModuleEvent; import com.fr.stable.StringUtils; @@ -27,6 +30,7 @@ public class SplashContext { public static final String SPLASH_PATH = getSplashPath(); public static final String SPLASH_CACHE_NAME = SPLASH_PATH.substring(SPLASH_PATH.lastIndexOf("/") + 1); private static final int FETCH_ONLINE_MAX_TIMES = 50; + private static final String THANKS = Toolkit.i18nText("Fine-Design_Report_Thanks_To"); private static final SplashContext SPLASH_CONTEXT = new SplashContext(); @@ -148,7 +152,7 @@ public class SplashContext { if (shouldShowThanks()) { tryFetchOnline(); if (StringUtils.isNotEmpty(guest)) { - updateThanksLog(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Thanks_To") + guest); + updateThanksLog(THANKS + guest); } } } @@ -167,13 +171,7 @@ public class SplashContext { } private static String getSplashPath() { - Locale locale = DesignerEnvManager.getEnvManager().getLanguage(); - if (Locale.US.equals(locale) || Locale.KOREA.equals(locale) || Locale.TAIWAN.equals(locale)) { - return "/com/fr/design/images/splash_10_en.gif"; - } else if (Locale.JAPAN.equals(locale)) { - return "/com/fr/design/images/splash_10_jp.gif"; - } else { - return "/com/fr/design/images/splash_10.gif"; - } + LocaleMark localeMark = LocaleCenter.getMark(SplashMark.class); + return localeMark.getValue(); } -} +} \ No newline at end of file From 210d02fc79f54fdb8742f48239194bc7af331f3d Mon Sep 17 00:00:00 2001 From: neil <459208047@qq.com> Date: Tue, 25 Jun 2019 18:25:19 +0800 Subject: [PATCH 028/217] ct --- .../constants/DesignerLaunchStatus.java | 34 +++++++++++++++++++ .../main/java/com/fr/start/SplashContext.java | 1 - 2 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 designer-base/src/main/java/com/fr/design/constants/DesignerLaunchStatus.java diff --git a/designer-base/src/main/java/com/fr/design/constants/DesignerLaunchStatus.java b/designer-base/src/main/java/com/fr/design/constants/DesignerLaunchStatus.java new file mode 100644 index 000000000..d62a84f78 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/constants/DesignerLaunchStatus.java @@ -0,0 +1,34 @@ +package com.fr.design.constants; + +import com.fr.event.Event; +import com.fr.event.EventDispatcher; +import com.fr.event.Null; + +/** + * 设计器启动事件类型 + * + * @author vito + * @date 2019-06-18 + */ +public enum DesignerLaunchStatus implements Event { + /** + * 初始化环境完成 + */ + WORKSPACE_INIT_COMPLETE, + + /** + * 设计器模块启动完成 + */ + DESIGNER_INIT_COMPLETE; + + private static DesignerLaunchStatus status; + + public static DesignerLaunchStatus getStatus() { + return status; + } + + public static void setStatus(DesignerLaunchStatus state) { + status = state; + EventDispatcher.fire(DesignerLaunchStatus.getStatus()); + } +} diff --git a/designer-realize/src/main/java/com/fr/start/SplashContext.java b/designer-realize/src/main/java/com/fr/start/SplashContext.java index e45eee48f..7c5e208bc 100644 --- a/designer-realize/src/main/java/com/fr/start/SplashContext.java +++ b/designer-realize/src/main/java/com/fr/start/SplashContext.java @@ -1,6 +1,5 @@ package com.fr.start; -import com.fr.concurrent.NamedThreadFactory; import com.fr.design.i18n.Toolkit; import com.fr.design.locale.impl.SplashMark; import com.fr.design.mainframe.bbs.BBSConstants; From e19197474d4639bff2aab648590a2b49ae67c5bb Mon Sep 17 00:00:00 2001 From: neil <459208047@qq.com> Date: Tue, 25 Jun 2019 18:27:53 +0800 Subject: [PATCH 029/217] ct --- designer-realize/src/main/java/com/fr/start/SplashContext.java | 1 + 1 file changed, 1 insertion(+) diff --git a/designer-realize/src/main/java/com/fr/start/SplashContext.java b/designer-realize/src/main/java/com/fr/start/SplashContext.java index 7c5e208bc..e45eee48f 100644 --- a/designer-realize/src/main/java/com/fr/start/SplashContext.java +++ b/designer-realize/src/main/java/com/fr/start/SplashContext.java @@ -1,5 +1,6 @@ package com.fr.start; +import com.fr.concurrent.NamedThreadFactory; import com.fr.design.i18n.Toolkit; import com.fr.design.locale.impl.SplashMark; import com.fr.design.mainframe.bbs.BBSConstants; From 77d9207fc4b0a43870f76c02acfc88555a52d591 Mon Sep 17 00:00:00 2001 From: zheng Date: Tue, 25 Jun 2019 19:42:41 +0800 Subject: [PATCH 030/217] xchart rename to chartProvider --- .../java/com/fr/design/gui/chart/MiddleChartComponent.java | 4 ++-- .../main/java/com/fr/design/ChartTypeInterfaceManager.java | 4 ++-- .../src/main/java/com/fr/design/chart/ChartTypePane.java | 6 +++--- .../main/java/com/fr/design/chart/gui/ChartComponent.java | 4 ++-- .../java/com/fr/design/chart/gui/ChartWidgetOption.java | 6 +++--- .../series/SeriesCondition/impl/ChartHyperPoplinkPane.java | 6 +++--- .../fr/design/mainframe/chart/gui/ChartTypeButtonPane.java | 6 +++--- .../mainframe/chart/gui/type/AbstractChartTypePane.java | 4 ++-- .../main/java/com/fr/extended/chart/ExtendedTypePane.java | 4 ++-- 9 files changed, 22 insertions(+), 22 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/gui/chart/MiddleChartComponent.java b/designer-base/src/main/java/com/fr/design/gui/chart/MiddleChartComponent.java index 025c669bc..01d9e7dd3 100644 --- a/designer-base/src/main/java/com/fr/design/gui/chart/MiddleChartComponent.java +++ b/designer-base/src/main/java/com/fr/design/gui/chart/MiddleChartComponent.java @@ -1,7 +1,7 @@ package com.fr.design.gui.chart; import com.fr.base.chart.BaseChartCollection; -import com.fr.chartx.attr.XChart; +import com.fr.chartx.attr.ChartProvider; import com.fr.stable.core.PropertyChangeListener; import javax.swing.JComponent; @@ -18,7 +18,7 @@ public abstract class MiddleChartComponent extends JComponent { public abstract void reset(); - public abstract XChart getEditingChart(); + public abstract ChartProvider getEditingChart(); public abstract void addStopEditingListener(PropertyChangeListener list); } \ No newline at end of file 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 a188737c0..72585ade8 100644 --- a/designer-chart/src/main/java/com/fr/design/ChartTypeInterfaceManager.java +++ b/designer-chart/src/main/java/com/fr/design/ChartTypeInterfaceManager.java @@ -5,7 +5,7 @@ import com.fr.chart.base.ChartInternationalNameContentBean; import com.fr.chart.chartattr.Chart; import com.fr.chart.chartattr.Plot; import com.fr.chart.charttypes.ChartTypeManager; -import com.fr.chartx.attr.XChart; +import com.fr.chartx.attr.ChartProvider; import com.fr.design.beans.BasicBeanPane; import com.fr.design.beans.FurtherBasicBeanPane; import com.fr.design.chart.fun.IndependentChartUIProvider; @@ -162,7 +162,7 @@ public class ChartTypeInterfaceManager implements ExtraChartDesignClassManagerPr int index = 0; for (ChartInternationalNameContentBean bean : typeName) { String plotID = bean.getPlotID(); - XChart[] rowChart = ChartTypeManager.getInstance().getChartTypes(plotID); + ChartProvider[] rowChart = ChartTypeManager.getInstance().getChartTypes(plotID); if (ArrayUtils.isEmpty(rowChart) && !ChartTypeManager.innerChart(plotID)) { continue; } diff --git a/designer-chart/src/main/java/com/fr/design/chart/ChartTypePane.java b/designer-chart/src/main/java/com/fr/design/chart/ChartTypePane.java index ed1e2656e..2a19072e0 100644 --- a/designer-chart/src/main/java/com/fr/design/chart/ChartTypePane.java +++ b/designer-chart/src/main/java/com/fr/design/chart/ChartTypePane.java @@ -11,7 +11,7 @@ import com.fr.chart.chartattr.ChartIcon; import com.fr.chart.chartattr.MapPlot; import com.fr.chart.chartattr.Plot; import com.fr.chart.charttypes.ChartTypeManager; -import com.fr.chartx.attr.XChart; +import com.fr.chartx.attr.ChartProvider; import com.fr.design.gui.ilable.UILabel; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.utils.gui.GUICoreUtils; @@ -43,7 +43,7 @@ public class ChartTypePane extends ChartCommonWizardPane { { charts4Icon = new Chart[this.typeName.length][]; for (int i = 0; i < this.typeName.length; i++) { - XChart[] rowCharts = ChartTypeManager.getInstanceWithCheck().getChartTypes(this.typeName[i].getPlotID()); + ChartProvider[] rowCharts = ChartTypeManager.getInstanceWithCheck().getChartTypes(this.typeName[i].getPlotID()); int rowChartsCount = rowCharts.length; charts4Icon[i] = new Chart[rowChartsCount]; for (int j = 0; j < rowChartsCount; j++) { @@ -147,7 +147,7 @@ public class ChartTypePane extends ChartCommonWizardPane { int subIndex = 0; for (int i = 0; i < typeName.length; i++) { - XChart[] charts = ChartTypeManager.getInstanceWithCheck().getChartTypes(typeName[i].getPlotID()); + ChartProvider[] charts = ChartTypeManager.getInstanceWithCheck().getChartTypes(typeName[i].getPlotID()); for (int j = 0; j < charts.length; j++) { if (((Chart) charts[j]).getPlot().match4GUI(plot)) { mainIndex = i; diff --git a/designer-chart/src/main/java/com/fr/design/chart/gui/ChartComponent.java b/designer-chart/src/main/java/com/fr/design/chart/gui/ChartComponent.java index 85fcaaeff..31baca071 100644 --- a/designer-chart/src/main/java/com/fr/design/chart/gui/ChartComponent.java +++ b/designer-chart/src/main/java/com/fr/design/chart/gui/ChartComponent.java @@ -9,7 +9,7 @@ import com.fr.chart.chartattr.Axis; import com.fr.chart.chartattr.Chart; import com.fr.chart.chartattr.ChartCollection; import com.fr.chart.chartglyph.AxisGlyph; -import com.fr.chartx.attr.XChart; +import com.fr.chartx.attr.ChartProvider; import com.fr.design.chart.gui.active.ActiveGlyph; import com.fr.design.chart.gui.active.ChartActiveGlyph; import com.fr.design.file.HistoryTemplateListPane; @@ -162,7 +162,7 @@ public class ChartComponent extends MiddleChartComponent implements MouseListene return (this.chartCollection4Design == null) ? 0 : this.chartCollection4Design.getChartCount(); } - public XChart getEditingChart() { + public ChartProvider getEditingChart() { return editingChart; } diff --git a/designer-chart/src/main/java/com/fr/design/chart/gui/ChartWidgetOption.java b/designer-chart/src/main/java/com/fr/design/chart/gui/ChartWidgetOption.java index d52dcbfde..eb36aadea 100644 --- a/designer-chart/src/main/java/com/fr/design/chart/gui/ChartWidgetOption.java +++ b/designer-chart/src/main/java/com/fr/design/chart/gui/ChartWidgetOption.java @@ -1,7 +1,7 @@ package com.fr.design.chart.gui; import com.fr.chart.charttypes.ChartTypeManager; -import com.fr.chartx.attr.XChart; +import com.fr.chartx.attr.ChartProvider; import com.fr.design.gui.core.WidgetOption; import com.fr.form.ui.ChartEditor; import com.fr.form.ui.Widget; @@ -38,8 +38,8 @@ public class ChartWidgetOption extends WidgetOption { Class clz = widgetClass(); try { ChartEditor widget = clz.newInstance(); - XChart chart = ChartTypeManager.getInstanceWithCheck().getChartTypes(this.chartID)[0]; - widget.addChart((XChart) chart.clone()); + ChartProvider chart = ChartTypeManager.getInstanceWithCheck().getChartTypes(this.chartID)[0]; + widget.addChart((ChartProvider) chart.clone()); return widget; } catch (InstantiationException e) { FineLoggerFactory.getLogger().error(e.getMessage(), e); diff --git a/designer-chart/src/main/java/com/fr/design/chart/series/SeriesCondition/impl/ChartHyperPoplinkPane.java b/designer-chart/src/main/java/com/fr/design/chart/series/SeriesCondition/impl/ChartHyperPoplinkPane.java index 01c5a156e..74c78ff2d 100644 --- a/designer-chart/src/main/java/com/fr/design/chart/series/SeriesCondition/impl/ChartHyperPoplinkPane.java +++ b/designer-chart/src/main/java/com/fr/design/chart/series/SeriesCondition/impl/ChartHyperPoplinkPane.java @@ -6,7 +6,7 @@ import com.fr.chart.chartattr.Chart; import com.fr.chart.chartattr.ChartCollection; import com.fr.chart.charttypes.ChartTypeManager; import com.fr.chart.web.ChartHyperPoplink; -import com.fr.chartx.attr.XChart; +import com.fr.chartx.attr.ChartProvider; import com.fr.design.chart.gui.ChartComponent; import com.fr.design.gui.itextfield.UITextField; import com.fr.design.hyperlink.AbstractHyperLinkPane; @@ -67,10 +67,10 @@ public class ChartHyperPoplinkPane extends AbstractHyperLinkPane implemen if (editingCollection != null) { //点击添加按钮,则会触发切换状态 - XChart chart = editingCollection.getChangeStateNewChart(); + ChartProvider chart = editingCollection.getChangeStateNewChart(); try { - XChart newChart = (XChart) chart.clone(); + ChartProvider newChart = (ChartProvider) chart.clone(); editingCollection.addNamedChart(name, newChart); } catch (CloneNotSupportedException e1) { FineLoggerFactory.getLogger().error("Error in Clone"); diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/AbstractChartTypePane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/AbstractChartTypePane.java index 46447495d..47de03b56 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/AbstractChartTypePane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/AbstractChartTypePane.java @@ -17,7 +17,7 @@ import com.fr.chart.chartattr.Plot; import com.fr.chart.chartattr.Title; import com.fr.chart.chartglyph.ConditionAttr; import com.fr.chart.charttypes.BarIndependentChart; -import com.fr.chartx.attr.XChart; +import com.fr.chartx.attr.ChartProvider; import com.fr.design.beans.FurtherBasicBeanPane; import com.fr.design.chart.series.PlotStyle.ChartSelectDemoPane; import com.fr.design.gui.ilable.BoldFontTextLabel; @@ -617,7 +617,7 @@ public abstract class AbstractChartTypePane extends FurtherBasicBeanPane{ return typePane; } - public XChart getDefaultChart() { + public ChartProvider getDefaultChart() { return BarIndependentChart.barChartTypes[0]; } } \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/extended/chart/ExtendedTypePane.java b/designer-chart/src/main/java/com/fr/extended/chart/ExtendedTypePane.java index 331e51164..ccc39b525 100644 --- a/designer-chart/src/main/java/com/fr/extended/chart/ExtendedTypePane.java +++ b/designer-chart/src/main/java/com/fr/extended/chart/ExtendedTypePane.java @@ -2,7 +2,7 @@ package com.fr.extended.chart; import com.fr.chart.chartattr.Chart; import com.fr.chart.charttypes.ChartTypeManager; -import com.fr.chartx.attr.XChart; +import com.fr.chartx.attr.ChartProvider; import com.fr.design.mainframe.chart.gui.type.AbstractChartTypePane; import com.fr.design.mainframe.chart.gui.type.ChartImagePane; @@ -66,7 +66,7 @@ public class ExtendedTypePane extends AbstractChartType } @Override - public XChart getDefaultChart() { + public ChartProvider getDefaultChart() { return ChartTypeManager.getInstance().getChartTypes(getPlotID())[0]; } From 675523e91b3fad67d4ed2456c2c95026379dbc8d Mon Sep 17 00:00:00 2001 From: vito Date: Tue, 25 Jun 2019 20:28:59 +0800 Subject: [PATCH 031/217] =?UTF-8?q?REPORT-16346=20=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../constants/DesignerLaunchStatus.java | 9 +++- .../toolbar/UpdateActionManager.java | 2 +- .../fr/start/module/DesignerActivator.java | 53 ------------------- .../fr/start/module/PreStartActivator.java | 31 ----------- 4 files changed, 8 insertions(+), 87 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/constants/DesignerLaunchStatus.java b/designer-base/src/main/java/com/fr/design/constants/DesignerLaunchStatus.java index d62a84f78..9b7919933 100644 --- a/designer-base/src/main/java/com/fr/design/constants/DesignerLaunchStatus.java +++ b/designer-base/src/main/java/com/fr/design/constants/DesignerLaunchStatus.java @@ -19,7 +19,12 @@ public enum DesignerLaunchStatus implements Event { /** * 设计器模块启动完成 */ - DESIGNER_INIT_COMPLETE; + DESIGNER_INIT_COMPLETE, + + /** + * 启动完成 + */ + OPEN_LAST_FILE_COMPLETE; private static DesignerLaunchStatus status; @@ -29,6 +34,6 @@ public enum DesignerLaunchStatus implements Event { public static void setStatus(DesignerLaunchStatus state) { status = state; - EventDispatcher.fire(DesignerLaunchStatus.getStatus()); + EventDispatcher.asyncFire(DesignerLaunchStatus.getStatus()); } } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/toolbar/UpdateActionManager.java b/designer-base/src/main/java/com/fr/design/mainframe/toolbar/UpdateActionManager.java index 8f4a4f3d8..7f6ec1eb7 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/toolbar/UpdateActionManager.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/toolbar/UpdateActionManager.java @@ -116,7 +116,7 @@ public class UpdateActionManager { } isRegisterIndexSearchTextTask = true; // 没有缓存或者缓存失效的时候,等待设计器启动之后开始索引任务 - EventDispatcher.listen(DesignerLaunchStatus.DESIGNER_INIT_COMPLETE, new Listener() { + EventDispatcher.listen(DesignerLaunchStatus.OPEN_LAST_FILE_COMPLETE, new Listener() { @Override public void on(Event event, Null param) { // 使用单线程索引 diff --git a/designer-realize/src/main/java/com/fr/start/module/DesignerActivator.java b/designer-realize/src/main/java/com/fr/start/module/DesignerActivator.java index 9ab53f1b0..ebfb8ef09 100644 --- a/designer-realize/src/main/java/com/fr/start/module/DesignerActivator.java +++ b/designer-realize/src/main/java/com/fr/start/module/DesignerActivator.java @@ -5,7 +5,6 @@ import com.fr.base.Formula; import com.fr.base.MultiFieldParameter; import com.fr.base.process.ProcessOperator; import com.fr.chart.chartattr.ChartCollection; -import com.fr.concurrent.NamedThreadFactory; import com.fr.design.ExtraDesignClassManager; import com.fr.design.actions.NewFormAction; import com.fr.design.actions.core.ActionFactory; @@ -22,7 +21,6 @@ import com.fr.design.actions.insert.flot.FormulaFloatAction; import com.fr.design.actions.insert.flot.ImageFloatAction; import com.fr.design.actions.insert.flot.TextBoxFloatAction; import com.fr.design.bridge.DesignToolbarProvider; -import com.fr.design.file.HistoryTemplateListPane; import com.fr.design.form.parameter.FormParaDesigner; import com.fr.design.fun.ElementUIProvider; import com.fr.design.gui.controlpane.NameObjectCreator; @@ -35,9 +33,6 @@ import com.fr.design.javascript.JavaScriptImplPane; import com.fr.design.javascript.ParameterJavaScriptPane; import com.fr.design.javascript.ProcessTransitionAdapter; import com.fr.design.mainframe.BaseJForm; -import com.fr.design.mainframe.CellElementPropertyPane; -import com.fr.design.mainframe.DesignerFrameFileDealerPane; -import com.fr.design.mainframe.EastRegionContainerPane; import com.fr.design.mainframe.ElementCaseThumbnail; import com.fr.design.mainframe.FormHierarchyTreePane; import com.fr.design.mainframe.InformationCollector; @@ -51,7 +46,6 @@ import com.fr.design.mainframe.form.FormECDesignerProvider; import com.fr.design.mainframe.form.FormElementCaseDesigner; import com.fr.design.mainframe.form.FormReportComponentComposite; import com.fr.design.mainframe.loghandler.DesignerLogAppender; -import com.fr.design.mainframe.loghandler.LogMessageBar; import com.fr.design.mainframe.socketio.DesignerSocketIO; import com.fr.design.module.DesignModuleFactory; import com.fr.design.parameter.FormParameterReader; @@ -59,7 +53,6 @@ import com.fr.design.parameter.ParameterPropertyPane; import com.fr.design.parameter.WorkBookParameterReader; import com.fr.design.widget.ui.btn.FormSubmitButtonDetailPane; import com.fr.form.stable.ElementCaseThumbnailProcessor; -import com.fr.form.ui.WidgetInfoConfig; import com.fr.general.xml.GeneralXMLTools; import com.fr.js.EmailJavaScript; import com.fr.js.JavaScriptImpl; @@ -105,8 +98,6 @@ import java.awt.image.BufferedImage; import java.util.ArrayList; import java.util.List; import java.util.Set; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; /** * Created by juhaoyu on 2018/1/31. @@ -126,7 +117,6 @@ public class DesignerActivator extends Activator { } } designerModuleStart(); - preLoadPane(); loadLogAppender(); DesignerSocketIO.update(); UserInfoPane.getInstance().updateBBSUserInfo(); @@ -169,49 +159,6 @@ public class DesignerActivator extends Activator { InformationCollector.getInstance().collectStartTime(); } - private static void preLoadPane() { - ExecutorService service = Executors.newCachedThreadPool(new NamedThreadFactory("PreLoadPane")); - service.submit(new Runnable() { - @Override - public void run() { - LogMessageBar.getInstance(); - } - }); - - service.submit(new Runnable() { - @Override - public void run() { - HistoryTemplateListPane.getInstance(); - } - }); - service.submit(new Runnable() { - @Override - public void run() { - WidgetInfoConfig.getInstance(); - } - }); - service.submit(new Runnable() { - @Override - public void run() { - CellElementPropertyPane.getInstance(); - } - }); - service.submit(new Runnable() { - @Override - public void run() { - DesignerFrameFileDealerPane.getInstance();//这边会涉及到TemplateTreePane - } - }); - - service.submit(new Runnable() { - @Override - public void run() { - EastRegionContainerPane.getInstance(); - } - }); - service.shutdown(); - } - private static Class[] actionsForInsertCellElement() { List> classes = new ArrayList<>(); Set providers = ExtraDesignClassManager.getInstance().getArray(ElementUIProvider.MARK_STRING); diff --git a/designer-realize/src/main/java/com/fr/start/module/PreStartActivator.java b/designer-realize/src/main/java/com/fr/start/module/PreStartActivator.java index 3a9f59140..630f96b20 100644 --- a/designer-realize/src/main/java/com/fr/start/module/PreStartActivator.java +++ b/designer-realize/src/main/java/com/fr/start/module/PreStartActivator.java @@ -1,11 +1,9 @@ package com.fr.start.module; -import com.fr.concurrent.NamedThreadFactory; import com.fr.design.DesignerEnvManager; import com.fr.design.RestartHelper; import com.fr.design.fun.OemProcessor; import com.fr.design.i18n.Toolkit; -import com.fr.design.mainframe.template.info.TemplateInfoCollector; import com.fr.design.utils.DesignUtils; import com.fr.design.utils.DesignerPort; import com.fr.event.EventDispatcher; @@ -24,11 +22,8 @@ import com.fr.start.SplashContext; import com.fr.start.SplashStrategy; import com.fr.start.fx.SplashFx; import com.fr.start.jni.SplashMac; -import com.fr.start.preload.ImagePreLoader; import java.io.File; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; /** * Created by juhaoyu on 2018/1/8. @@ -52,8 +47,6 @@ public class PreStartActivator extends Activator { RestartHelper.deleteRecordFilesWhenStart(); - preloadResource(); - SplashContext.getInstance().registerSplash(createSplash()); SplashContext.getInstance().show(); @@ -115,30 +108,6 @@ public class PreStartActivator extends Activator { return new String[]{".cpt", ".xls", ".xlsx", ".frm", ".form", ".cht", ".chart"}; } - private static void preloadResource() { - - ExecutorService service = Executors.newCachedThreadPool(new NamedThreadFactory("PreLoadResource")); - - service.submit(new Runnable() { - - @Override - public void run() { - - new ImagePreLoader(); - } - }); - - service.submit(new Runnable() { - - @Override - public void run() { - - TemplateInfoCollector.getInstance(); - } - }); - service.shutdown(); - } - private SplashStrategy createSplash() { OemProcessor oemProcessor = OemHandler.findOem(); From f8cad425d15d5186558804ad0197e3787b39636a Mon Sep 17 00:00:00 2001 From: "yaoh.wu" Date: Tue, 25 Jun 2019 15:47:51 +0800 Subject: [PATCH 032/217] =?UTF-8?q?=E6=97=A0=E4=BB=BB=E5=8A=A1=EF=BC=8C?= =?UTF-8?q?=E5=8D=95=E5=85=83=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/actions/help/TutorialActionTest.java | 3 ++- .../mainframe/template/info/TemplateInfoCollectorTest.java | 6 ++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/designer-base/src/test/java/com/fr/design/actions/help/TutorialActionTest.java b/designer-base/src/test/java/com/fr/design/actions/help/TutorialActionTest.java index 7e4dad651..dc1e871b4 100644 --- a/designer-base/src/test/java/com/fr/design/actions/help/TutorialActionTest.java +++ b/designer-base/src/test/java/com/fr/design/actions/help/TutorialActionTest.java @@ -7,7 +7,7 @@ import junit.framework.TestCase; import java.util.Locale; import java.util.UUID; -public class TutorialActionTest extends TestCase{ +public class TutorialActionTest extends TestCase { public void testCreateKey() { TutorialAction action = new TutorialAction(); @@ -24,6 +24,7 @@ public class TutorialActionTest extends TestCase{ GeneralContext.setLocale(pt); String ptKey = action.createDocKey(); assertTrue(ptKey.contains(pt.toString())); + GeneralContext.setLocale(Locale.CHINA); } public void testServerOnline() { diff --git a/designer-base/src/test/java/com/fr/design/mainframe/template/info/TemplateInfoCollectorTest.java b/designer-base/src/test/java/com/fr/design/mainframe/template/info/TemplateInfoCollectorTest.java index e83a523fc..d93a7476a 100644 --- a/designer-base/src/test/java/com/fr/design/mainframe/template/info/TemplateInfoCollectorTest.java +++ b/designer-base/src/test/java/com/fr/design/mainframe/template/info/TemplateInfoCollectorTest.java @@ -56,6 +56,8 @@ public class TemplateInfoCollectorTest { initialFileContent = FileUtils.readFileToString(new File(filePath), "utf-8"); Reflect.on(TemplateInfoCollector.class).set("instance", null); + // 后执行 testReadXML 用例时,之前保留的单例会造成影响 + Reflect.on(DesignerOpenHistory.class).set("singleton", null); } @After @@ -89,7 +91,7 @@ public class TemplateInfoCollectorTest { assertJsonStringEquals("{\"process\":\"\",\"float_count\":1,\"widget_count\":0," + "\"cell_count\":13,\"block_count\":3,\"report_type\":0," + - "\"templateID\":\"16a988ce-8529-42f5-b17c-2ee849355071\"}",templateInfo.getProcessMapJsonString()); + "\"templateID\":\"16a988ce-8529-42f5-b17c-2ee849355071\"}", templateInfo.getProcessMapJsonString()); assertJsonStringEquals("{\"activitykey\":\"2e0ea413-fa9c241e0-9723-4354fce51e81\"," + "\"jar_time\":\"不是安装版本\",\"create_time\":\"2019-03-26 16:13\"," + @@ -118,7 +120,7 @@ public class TemplateInfoCollectorTest { assertJsonStringEquals("{\"process\":\"\",\"float_count\":1,\"widget_count\":0," + "\"cell_count\":13,\"block_count\":3,\"report_type\":0," + - "\"templateID\":\"73a97777-8jnk-47cd-b57c-2ee89991279796\"}",templateInfo.getProcessMapJsonString()); + "\"templateID\":\"73a97777-8jnk-47cd-b57c-2ee89991279796\"}", templateInfo.getProcessMapJsonString()); Map consumingMap = Reflect.on(templateInfo).field("consumingMap").get(); assertEquals(templateID, consumingMap.get("templateID")); From 215703525ac1bad0c62f02ff690ba8872f2b58c9 Mon Sep 17 00:00:00 2001 From: "yaoh.wu" Date: Tue, 25 Jun 2019 19:10:35 +0800 Subject: [PATCH 033/217] =?UTF-8?q?=E6=97=A0=E4=BB=BB=E5=8A=A1=EF=BC=8C?= =?UTF-8?q?=E5=8D=95=E5=85=83=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/formula/FunctionConstantsTest.java | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/designer-base/src/test/java/com/fr/design/formula/FunctionConstantsTest.java b/designer-base/src/test/java/com/fr/design/formula/FunctionConstantsTest.java index 75c9c9e5b..b53d47780 100644 --- a/designer-base/src/test/java/com/fr/design/formula/FunctionConstantsTest.java +++ b/designer-base/src/test/java/com/fr/design/formula/FunctionConstantsTest.java @@ -2,6 +2,7 @@ package com.fr.design.formula; import com.fr.general.GeneralUtils; import com.fr.invoke.Reflect; +import com.fr.log.FineLoggerFactory; import org.easymock.EasyMock; import org.junit.Test; import org.junit.runner.RunWith; @@ -9,10 +10,10 @@ import org.powermock.api.easymock.PowerMock; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; -import static junit.framework.Assert.fail; import static junit.framework.TestCase.assertEquals; import static junit.framework.TestCase.assertTrue; import static org.junit.Assert.assertFalse; +import static org.junit.Assert.fail; /** * Created by plough on 2018/12/7. @@ -20,6 +21,7 @@ import static org.junit.Assert.assertFalse; @RunWith(PowerMockRunner.class) @PrepareForTest(GeneralUtils.class) public class FunctionConstantsTest { + @Test public void testNewInstanceFail() throws Exception { try { @@ -31,7 +33,7 @@ public class FunctionConstantsTest { } @Test - public void testEmbedFuntionsAfterStaticInit() { + public void testEmbedFunctionsAfterStaticInit() { NameAndTypeAndFunctionList[] embFunctionLists = FunctionConstants.EMBFUNCTIONS; // 一共有 8 个分类 assertEquals(8, embFunctionLists.length); @@ -43,13 +45,17 @@ public class FunctionConstantsTest { } @Test - public void testCommonFuntionsAfterStaticInit() { + public void testCommonFunctionsAfterStaticInit() { NameAndFunctionList commonFunctionList = FunctionConstants.COMMON; assertEquals(9, commonFunctionList.getDescriptions().length); } @Test public void testIsCustomFormulaPathRunWithCode() { + // mock 的 GeneralUtils.readBuildNO()).andReturn("不是安装版本").anyTimes() + // 会影响 FunctionConstants.class 静态代码块 loadEmbededFunctions 执行,先加载这个类,执行静态代码块 + FineLoggerFactory.getLogger().info(String.valueOf(FunctionConstants.EMBFUNCTIONS.length)); + PowerMock.mockStatic(GeneralUtils.class); EasyMock.expect(GeneralUtils.readBuildNO()).andReturn("不是安装版本").anyTimes(); PowerMock.replayAll(); @@ -63,6 +69,10 @@ public class FunctionConstantsTest { @Test public void testIsCustomFormulaPathRunWithJar() { + // mock 的 GeneralUtils.readBuildNO()).andReturn("不是安装版本").anyTimes() + // 会影响 FunctionConstants.class 静态代码块 loadEmbededFunctions 执行,先加载这个类,执行静态代码块 + FineLoggerFactory.getLogger().info(String.valueOf(FunctionConstants.EMBFUNCTIONS.length)); + PowerMock.mockStatic(GeneralUtils.class); EasyMock.expect(GeneralUtils.readBuildNO()).andReturn("Build#release-2018.12.10.12.11.09.95").anyTimes(); PowerMock.replayAll(); From eba5d13d8fc2410224e9b3e6856c1856d29f4efb Mon Sep 17 00:00:00 2001 From: zheng Date: Thu, 27 Jun 2019 13:50:02 +0800 Subject: [PATCH 034/217] =?UTF-8?q?CHART-9141=20ChartRequestService?= =?UTF-8?q?=E6=96=B0=E5=A2=9E+chart=20service=20move=20to=20chart=20module?= =?UTF-8?q?+chartdata=20remove=20from=20engine-cross?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/chart/ChartControlPane.java | 128 ------------------ .../chart/gui/other/ChartSwitchPane.java | 94 ------------- 2 files changed, 222 deletions(-) delete mode 100644 designer-chart/src/main/java/com/fr/design/chart/ChartControlPane.java delete mode 100644 designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/other/ChartSwitchPane.java diff --git a/designer-chart/src/main/java/com/fr/design/chart/ChartControlPane.java b/designer-chart/src/main/java/com/fr/design/chart/ChartControlPane.java deleted file mode 100644 index e0493cc70..000000000 --- a/designer-chart/src/main/java/com/fr/design/chart/ChartControlPane.java +++ /dev/null @@ -1,128 +0,0 @@ -package com.fr.design.chart; - -import com.fr.chart.chartattr.Chart; -import com.fr.chart.chartattr.ChartCollection; -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.layout.FRGUIPaneFactory; - -import com.fr.general.NameObject; -import com.fr.stable.Nameable; - -import java.awt.*; -import java.util.HashMap; - -/** - * 管理图表类型Pane - * @author kunsnat: ChartComponent移出. - */ -public class ChartControlPane extends JListControlPane { - private static final long serialVersionUID = 7336270815128413184L; - - public ChartControlPane() { - super(); - // 重新设定大小. 因为JControlPane默认的(450,450) 不适合图表这边 @ChartSize -// this.setPreferredSize(new Dimension(770, 520)); - } - - @Override - public NameableCreator[] createNameableCreators() { - return new NameableCreator[] { - new NameObjectCreator(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Chart"), Chart.class, ChartTypeUpdatePane.class) - }; - } - - @Override - protected String title4PopupWindow() { - return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Manage_Chart_Type"); - } - - public void populate(ChartCollection cc) { - if(cc == null)return; - - NameObject[] nameObjects = new NameObject[cc.getChartCount()]; - for (int i = 0; i < nameObjects.length; i++) { - nameObjects[i] = new NameObject(cc.getChartName(i), cc.getChart(i)); - } - - populate(nameObjects); - // kunsnat: 选中当前图表选中的name - String chartSelectedName = cc.getChartName(cc.getSelectedIndex() < cc.getChartCount() ? cc.getSelectedIndex() : 0); - setSelectedName(chartSelectedName); - } - - public void update(ChartCollection cc) { - HashMap namesChart = new HashMap();// 暂存判断是否有必要更新 - for(int i = 0; i < cc.getChartCount(); i++) { - try { - namesChart.put(cc.getChartName(i), cc.getChart(i).clone()); - } catch (CloneNotSupportedException e) { - - } - } - - Nameable[] nameables = update(); - if (nameables.length == 0 || cc == null) { - return; - } - - cc.removeAllNameObject(); - String select = getSelectedName(); - for (int i = 0; i < nameables.length; i++) { - if (nameables[i] instanceof NameObject && ((NameObject)nameables[i]).getObject() instanceof Chart) { - NameObject no = (NameObject)nameables[i]; - - String name = no.getName(); - Chart chart = (Chart)no.getObject(); - if(namesChart.containsKey(name)) { - Chart tmpChart = (Chart)namesChart.get(name); - if(chart.getPlot() != null && tmpChart.getPlot() != null - && chart.getPlot().match4GUI(tmpChart.getPlot())) { - chart = tmpChart;// 代替之前做过编辑的Chart - } - } - cc.addNamedChart(name, chart); - if(no.getName().equals(select)) { - cc.setSelectedIndex(i); - } - } - } - } - - /* - * alex:继承UpdatePane的ChartTypePane - */ - public static class ChartTypeUpdatePane extends BasicBeanPane { - private static final long serialVersionUID = -7058348930816218415L; - private Chart editing; - - private ChartTypePane typePane; - - public ChartTypeUpdatePane() { - this.setLayout(FRGUIPaneFactory.createBorderLayout()); - - typePane = new ChartTypePane(); - this.add(typePane, BorderLayout.CENTER); - } - - @Override - protected String title4PopupWindow() { - return "Chart Type"; - } - - @Override - public void populateBean(Chart ob) { - editing = ob; - typePane.populate(ob); - } - - @Override - public Chart updateBean() { - typePane.update(editing); - - return editing; - } - } -} \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/other/ChartSwitchPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/other/ChartSwitchPane.java deleted file mode 100644 index 6288b7ecf..000000000 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/other/ChartSwitchPane.java +++ /dev/null @@ -1,94 +0,0 @@ -package com.fr.design.mainframe.chart.gui.other; - -import java.awt.BorderLayout; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; - -import javax.swing.JPanel; -import javax.swing.SwingUtilities; - -import com.fr.design.chart.ChartControlPane; -import com.fr.chart.chartattr.ChartCollection; -import com.fr.design.gui.frpane.AbstractAttrNoScrollPane; -import com.fr.design.gui.ibutton.UIButton; -import com.fr.design.mainframe.chart.ChartEditPane; -import com.fr.design.mainframe.chart.PaneTitleConstants; -import com.fr.design.dialog.BasicDialog; -import com.fr.design.dialog.DialogActionAdapter; - - -public class ChartSwitchPane extends AbstractAttrNoScrollPane{ - - private UIButton changeButton; - - private ChartCollection editingChartCollection; - - private ChartEditPane currentChartEditPane; - - public ChartSwitchPane() { - - } - - @Override - protected JPanel createContentPane() { - JPanel pane = new JPanel(); - pane.setLayout(new BorderLayout()); - - changeButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Switch")); - - pane.add(changeButton, BorderLayout.NORTH); - - changeButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - final ChartControlPane chartTypeManager = new ChartControlPane(); - chartTypeManager.populate(editingChartCollection); - - BasicDialog dlg = chartTypeManager.showWindow4ChartType(SwingUtilities.getWindowAncestor(new JPanel()), new DialogActionAdapter() { - public void doOk() { - chartTypeManager.update(editingChartCollection);//kunsnat: 确定刷新"chartSelectIndex" - - if(currentChartEditPane != null) { - currentChartEditPane.populate(editingChartCollection);// 选中新Plot之后 刷新对应界面, 比如超级链接等, 然后才能update. - currentChartEditPane.gotoPane(PaneTitleConstants.CHART_TYPE_TITLE); - currentChartEditPane.gotoPane(PaneTitleConstants.CHART_OTHER_TITLE, PaneTitleConstants.CHART_OTHER_TITLE_CHANGE); - currentChartEditPane.fire(); - } - } - }); - - dlg.setVisible(true); - } - }); - - return pane; - } - - /** - * 注册 切换事件的改变 和超链不同. - * @param listener - */ - public void registerChartEditPane(ChartEditPane currentChartEditPane) { - this.currentChartEditPane = currentChartEditPane; - } - - public void populateBean(ChartCollection c) { - this.editingChartCollection = c; - } - - public void updateBean(ChartCollection c) { - - } - - /** - * 界面标题 - * @param 返回标题 - */ - public String title4PopupWindow() { - return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Switch_Chart"); - } - - @Override - public String getIconPath() { - return null; - } -} \ No newline at end of file From 1261ddbaba46fe68b6d438ede2b5c57151ead7e8 Mon Sep 17 00:00:00 2001 From: vito Date: Mon, 1 Jul 2019 20:20:19 +0800 Subject: [PATCH 035/217] =?UTF-8?q?REPORT-16346=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E4=B8=80=E4=BA=9BUI=E4=B8=8A=E7=AA=81=E5=87=BA=E7=9A=84?= =?UTF-8?q?=E4=B8=80=E4=BA=9B=E9=87=8D=E5=A4=8D=E5=88=9B=E5=BB=BA=E7=9A=84?= =?UTF-8?q?=E7=95=8C=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/fr/design/DesignState.java | 2 - .../actions/community/QuestionAction.java | 65 ++++++----- .../gui/iprogressbar/ProgressDialog.java | 20 ++-- .../fr/design/mainframe/DesignerFrame.java | 104 +++++++++++------- .../DesignerFrameFileDealerPane.java | 10 +- .../mainframe/toolbar/ToolBarMenuDock.java | 39 +++++-- .../mainframe/toolbar/UpdateActionModel.java | 19 +++- .../main/java/com/fr/start/BaseDesigner.java | 73 ++++++++---- .../start/server/FineEmbedServerMonitor.java | 56 +++++----- .../com/fr/design/mainframe/FormArea.java | 2 +- .../fr/design/mainframe/ElementCasePane.java | 22 ++-- .../com/fr/design/mainframe/JWorkBook.java | 1 - .../errorinfo/ErrorInfoUploader.java | 9 +- .../src/main/java/com/fr/start/Designer.java | 20 ++-- .../com/fr/start/module/DesignerStartup.java | 2 - .../module/DesignerWorkspaceActivator.java | 2 - 16 files changed, 271 insertions(+), 175 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/DesignState.java b/designer-base/src/main/java/com/fr/design/DesignState.java index fcc971b7e..239093d3f 100644 --- a/designer-base/src/main/java/com/fr/design/DesignState.java +++ b/designer-base/src/main/java/com/fr/design/DesignState.java @@ -1,9 +1,7 @@ package com.fr.design; -import com.fr.base.BaseUtils; import com.fr.base.vcs.DesignerMode; import com.fr.design.mainframe.toolbar.ToolBarMenuDockPlus; -import com.fr.workspace.WorkContext; /** * Created by IntelliJ IDEA. diff --git a/designer-base/src/main/java/com/fr/design/actions/community/QuestionAction.java b/designer-base/src/main/java/com/fr/design/actions/community/QuestionAction.java index 717537df6..9a19ef4cc 100644 --- a/designer-base/src/main/java/com/fr/design/actions/community/QuestionAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/community/QuestionAction.java @@ -10,38 +10,37 @@ import javax.swing.*; import java.awt.event.ActionEvent; -public class QuestionAction extends UpdateAction -{ - - public QuestionAction() - { this.setMenuKeySet(QUESTIONS); - this.setName(getMenuKeySet().getMenuName()); - this.setMnemonic(getMenuKeySet().getMnemonic()); - this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/bbs/question.png")); - -} - -@Override -public void actionPerformed(ActionEvent arg0) -{ - String url = CloudCenter.getInstance().acquireUrlByKind("bbs.questions"); - BrowseUtils.browser(url); -} - public static final MenuKeySet QUESTIONS = new MenuKeySet() { - @Override - public char getMnemonic() { - return 'Q'; - } - - @Override - public String getMenuName() { - return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Community_Questions"); - } - - @Override - public KeyStroke getKeyStroke() { - return null; - } - }; +public class QuestionAction extends UpdateAction { + + public QuestionAction() { + this.setMenuKeySet(QUESTIONS); + this.setName(getMenuKeySet().getMenuName()); + this.setMnemonic(getMenuKeySet().getMnemonic()); + this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/bbs/question.png")); + + } + + @Override + public void actionPerformed(ActionEvent arg0) { + String url = CloudCenter.getInstance().acquireUrlByKind("bbs.questions"); + BrowseUtils.browser(url); + } + + public static final MenuKeySet QUESTIONS = new MenuKeySet() { + @Override + public char getMnemonic() { + return 'Q'; + } + + @Override + public String getMenuName() { + return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Community_Questions"); + } + + @Override + public KeyStroke getKeyStroke() { + return null; + } + }; } diff --git a/designer-base/src/main/java/com/fr/design/gui/iprogressbar/ProgressDialog.java b/designer-base/src/main/java/com/fr/design/gui/iprogressbar/ProgressDialog.java index 049b868c4..d684e6a57 100644 --- a/designer-base/src/main/java/com/fr/design/gui/iprogressbar/ProgressDialog.java +++ b/designer-base/src/main/java/com/fr/design/gui/iprogressbar/ProgressDialog.java @@ -1,12 +1,10 @@ package com.fr.design.gui.iprogressbar; import com.fr.design.constants.UIConstants; -import com.fr.design.dialog.UIDialog; import com.fr.design.gui.ilable.UILabel; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.general.FRFont; - import javax.swing.JDialog; import javax.swing.JLabel; import javax.swing.JPanel; @@ -19,7 +17,7 @@ import java.awt.Frame; /** * 加载进度弹窗 */ -public class ProgressDialog extends UIDialog { +public class ProgressDialog extends JDialog { private JProgressBar progressBar; private JDialog centerDialog; private JLabel text; @@ -47,6 +45,7 @@ public class ProgressDialog extends UIDialog { progressBar.setBorderPainted(false); progressBar.setOpaque(false); progressBar.setBorder(null); + progressBar.setMaximum(1000); panel.add(progressBar, BorderLayout.CENTER); text = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Loading_Project"), JLabel.CENTER); FRFont font = FRFont.getInstance().applySize(14).applyForeground(new ColorUIResource(333334)); @@ -54,12 +53,6 @@ public class ProgressDialog extends UIDialog { panel.add(text, BorderLayout.SOUTH); panel.setVisible(true); centerDialog.getContentPane().add(panel); - - } - - @Override - public void checkValid() throws Exception { - } @Override @@ -72,11 +65,20 @@ public class ProgressDialog extends UIDialog { progressBar.setValue(value); } + public void setProgressMaximum(int value) { + progressBar.setMaximum(value); + } + + public int getProgressMaximum() { + return progressBar.getMaximum(); + } + @Override public void dispose() { centerDialog.dispose(); super.dispose(); } + public void updateLoadingText(String text) { this.text.setText(text); } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java index 277ca93eb..f8f513870 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java @@ -63,6 +63,7 @@ import com.fr.start.OemHandler; import com.fr.workspace.WorkContext; import com.fr.workspace.Workspace; import com.fr.workspace.connect.WorkspaceConnectionInfo; +import org.jetbrains.annotations.Nullable; import javax.swing.Icon; import javax.swing.JComponent; @@ -169,6 +170,7 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta private WindowAdapter windowAdapter = new WindowAdapter() { + @Override public void windowOpened(WindowEvent e) { } @@ -194,6 +196,7 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta private JComponent closeButton = new JComponent() { + @Override protected void paintComponent(Graphics g) { g.setColor(UIConstants.NORMAL_BACKGROUND); @@ -205,6 +208,7 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta private MouseListener closeMouseListener = new MouseAdapter() { + @Override public void mousePressed(MouseEvent e) { closeMode = UIConstants.CLOSE_PRESS_AUTHORITY; @@ -212,6 +216,7 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta closeButton.repaint(); } + @Override public void mouseExited(MouseEvent e) { closeMode = UIConstants.CLOSE_OF_AUTHORITY; @@ -219,6 +224,7 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta closeButton.repaint(); } + @Override public void mouseMoved(MouseEvent e) { closeMode = UIConstants.CLOSE_OVER_AUTHORITY; @@ -226,12 +232,14 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta closeButton.repaint(); } + @Override public void mouseReleased(MouseEvent e) { if (DesignModeContext.isAuthorityEditing()) { closeAuthorityEditing(); } } + @Override public void mouseEntered(MouseEvent e) { closeMode = UIConstants.CLOSE_OVER_AUTHORITY; @@ -255,6 +263,7 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta basePane.setLayout(new BorderLayout()); toolbarPane = new JPanel() { + @Override public Dimension getPreferredSize() { Dimension dim = super.getPreferredSize(); @@ -266,7 +275,8 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta JPanel eastPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); eastPane.add(ad.createLargeToolbar(), BorderLayout.WEST); eastCenterPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - eastCenterPane.add(combineUp = combineUpTooBar(null), BorderLayout.NORTH); + combineUpTooBar(); + eastCenterPane.add(combineUp, BorderLayout.NORTH); JPanel panel = FRGUIPaneFactory.createBorderLayout_S_Pane(); panel.add(newWorkBookPane = ad.getNewTemplatePane(), BorderLayout.WEST); panel.add(MutilTempalteTabPane.getInstance(), BorderLayout.CENTER); @@ -300,6 +310,7 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta this.addComponentListener(new ComponentAdapter() { + @Override public void componentResized(ComponentEvent e) { reCalculateFrameSize(); @@ -316,14 +327,14 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta initMenuPane(); this.progressDialog = new ProgressDialog(this); } - + public void resizeFrame() { - + HistoryTemplateListPane.getInstance().getCurrentEditingTemplate().setComposite(); reCalculateFrameSize(); HistoryTemplateListPane.getInstance().getCurrentEditingTemplate().doResize(); } - + public void closeAuthorityEditing() { DesignModeContext.switchTo(com.fr.design.base.mode.DesignerMode.NORMAL); WestRegionContainerPane.getInstance().replaceDownPane( @@ -333,7 +344,7 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta HistoryTemplateListCache.getInstance().getCurrentEditingTemplate().getToolBarMenuDockPlus()); needToAddAuhtorityPaint(); refreshDottedLine(); - fireAuthorityStateToNomal(); + fireAuthorityStateToNormal(); EventDispatcher.fire(DesignAuthorityEventType.StopEdit, DesignerFrame.this); } @@ -603,13 +614,13 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta /** * 退出权限编辑时,将所有的做过权限编辑的状态,作为一个状态赋给报、报表主体 */ - private void fireAuthorityStateToNomal() { + private void fireAuthorityStateToNormal() { java.util.List> opendedTemplate = HistoryTemplateListPane.getInstance().getHistoryList(); - for (int i = 0; i < opendedTemplate.size(); i++) { + for (JTemplate jTemplate : opendedTemplate) { // 如果在权限编辑时做过操作,则将做过的操作作为一个整体状态赋给正在报表 - if (opendedTemplate.get(i).isDoSomethingInAuthority()) { - opendedTemplate.get(i).fireAuthorityStateToNomal(); + if (jTemplate.isDoSomethingInAuthority()) { + jTemplate.fireAuthorityStateToNomal(); } } } @@ -619,31 +630,47 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta this.closeMode = closeMode; } - private UIToolbar combineUpTooBar(JComponent[] toolbar4Form) { - + /** + * 创建上工具栏 + */ + private void combineUpTooBar() { combineUp = new UIToolbar(FlowLayout.LEFT); combineUp.setBorder(new MatteBorder(new Insets(0, LEFT_ALIGN_GAP, 1, 0), UIConstants.LINE_COLOR)); combineUp.setLayout(new FlowLayout(FlowLayout.LEFT, 5, 2)); + setUpUpToolBar(null); + + } + + /** + * 重置上工具栏 + */ + private void resetCombineUpTooBar(JComponent[] toolbar4Form) { + combineUp.removeAll(); + setUpUpToolBar(toolbar4Form); + } + + /** + * 填充上工具栏的中的工具 + * + * @param toolbar4Form 目标组件 + */ + private void setUpUpToolBar(@Nullable JComponent[] toolbar4Form) { UIButton[] fixButtons = ad.createUp(); - for (int i = 0; i < fixButtons.length; i++) { - combineUp.add(fixButtons[i]); + for (UIButton fixButton : fixButtons) { + combineUp.add(fixButton); } if (!DesignerMode.isAuthorityEditing()) { combineUp.addSeparator(new Dimension(2, 16)); if (toolbar4Form != null) { - for (int i = 0; i < toolbar4Form.length; i++) { - combineUp.add(toolbar4Form[i]); + for (JComponent jComponent : toolbar4Form) { + combineUp.add(jComponent); } } } - //添加分享按钮 addShareButton(); - //添加插件中的按钮 addExtraButtons(); - - return combineUp; } private void addExtraButtons() { @@ -655,8 +682,8 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta UIButton[] extraButtons = jt.createExtraButtons(); - for (int i = 0; i < extraButtons.length; i++) { - combineUp.add(extraButtons[i]); + for (UIButton extraButton : extraButtons) { + combineUp.add(extraButton); } if (extraButtons.length > 0) { combineUp.addSeparator(new Dimension(2, 16)); @@ -672,8 +699,8 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta combineUp.addSeparator(new Dimension(2, 16)); UIButton[] shareButtons = jt.createShareButton(); - for (int i = 0; i < shareButtons.length; i++) { - combineUp.add(shareButtons[i]); + for (UIButton shareButton : shareButtons) { + combineUp.add(shareButton); } } @@ -710,25 +737,20 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta DesignState designState = new DesignState(plus); MenuManager.getInstance().setMenus4Designer(designState); - if (menuBar != null) { - menuPane.remove(menuBar); - } - menuPane.add(menuBar = ad.createJMenuBar(plus), BorderLayout.CENTER); - - if (combineUp != null) { - eastCenterPane.remove(combineUp); - combineUp = null; + if (menuBar == null) { + menuPane.add(menuBar = ad.createJMenuBar(plus), BorderLayout.CENTER); + } else { + ad.resetJMenuBar(menuBar, plus); } - // 保存撤销那些按钮的面板 - eastCenterPane.add(combineUp = combineUpTooBar(ad.resetUpToolBar(plus)), BorderLayout.NORTH); - - if (toolbarComponent != null) { - toolbarPane.remove(toolbarComponent); - } + resetCombineUpTooBar(ad.resetUpToolBar(plus)); // 颜色,字体那些按钮的工具栏 - toolbarPane.add(toolbarComponent = ad.resetToolBar(toolbarComponent, plus), BorderLayout.CENTER); + if (toolbarComponent == null) { + toolbarPane.add(toolbarComponent = ad.resetToolBar(null, plus), BorderLayout.CENTER); + } else { + ad.resetToolBar(toolbarComponent, plus); + } this.checkToolbarMenuEnable(); this.validate(); @@ -751,7 +773,7 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta Set extraShortCuts = ExtraDesignClassManager.getInstance().getExtraShortCuts(); for (ShortCut shortCut : extraShortCuts) { if (shortCut instanceof AbstractTemplateTreeShortCutProvider) { - ((AbstractTemplateTreeShortCutProvider) shortCut).notifyFromAuhtorityChange(DesignerMode.isAuthorityEditing()); + shortCut.notifyFromAuhtorityChange(DesignerMode.isAuthorityEditing()); } } } @@ -949,6 +971,7 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta * * @param e 事件 */ + @Override public void targetModified(TargetModifiedEvent e) { this.checkToolbarMenuEnable(); @@ -959,6 +982,7 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta * * @param jt 模板 */ + @Override public void templateClosed(JTemplate jt) { } @@ -968,6 +992,7 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta * * @param jt 模板 */ + @Override public void templateOpened(JTemplate jt) { } @@ -977,6 +1002,7 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta * * @param jt 模板 */ + @Override public void templateSaved(JTemplate jt) { this.checkToolbarMenuEnable(); diff --git a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java index b48433c5c..458a0ef75 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java @@ -210,15 +210,17 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt /** * 添加VcsAction + * * @param toolbarDef */ private void addVcsAction(ToolBarDef toolbarDef) { if (VcsHelper.getInstance().needInit()) { vcsAction = new VcsAction(); - if (FineClusterConfig.getInstance().isCluster()) { - vcsAction.setName(Toolkit.i18nText("Fine-Design_Vcs_NotSupportRemote")); - } else { + + if (WorkContext.getCurrent().isLocal()) { vcsAction.setName(Toolkit.i18nText("Fine-Design_Vcs_Title")); + } else { + vcsAction.setName(Toolkit.i18nText("Fine-Design_Vcs_NotSupportRemote")); } toolbarDef.addShortCut(vcsAction); @@ -367,8 +369,6 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt } - - if (WorkContext.getCurrent() != null) { if (!WorkContext.getCurrent().isLocal()) { //当前环境为远程环境时 diff --git a/designer-base/src/main/java/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java b/designer-base/src/main/java/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java index 8a739f54f..262dbe6d5 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java @@ -47,20 +47,20 @@ import com.fr.design.gui.imenu.UIMenu; import com.fr.design.gui.imenu.UIMenuBar; import com.fr.design.gui.itoolbar.UILargeToolbar; import com.fr.design.gui.itoolbar.UIToolbar; +import com.fr.design.locale.impl.SupportLocaleImpl; import com.fr.design.mainframe.JTemplate; import com.fr.design.mainframe.ToolBarNewTemplatePane; import com.fr.design.menu.MenuDef; import com.fr.design.menu.SeparatorDef; import com.fr.design.menu.ShortCut; import com.fr.design.menu.ToolBarDef; -import com.fr.design.update.actions.SoftwareUpdateAction; import com.fr.design.remote.action.RemoteDesignAuthManagerAction; +import com.fr.design.update.actions.SoftwareUpdateAction; import com.fr.design.utils.ThemeUtils; import com.fr.general.ComparatorUtils; import com.fr.general.GeneralContext; import com.fr.general.locale.LocaleAction; import com.fr.general.locale.LocaleCenter; -import com.fr.design.locale.impl.SupportLocaleImpl; import com.fr.log.FineLoggerFactory; import com.fr.plugin.context.PluginContext; import com.fr.plugin.context.PluginRuntime; @@ -72,6 +72,7 @@ import com.fr.stable.ArrayUtils; import com.fr.stable.StringUtils; import com.fr.start.OemHandler; import com.fr.workspace.WorkContext; +import org.jetbrains.annotations.Nullable; import javax.swing.JComponent; import javax.swing.JMenuBar; @@ -197,14 +198,30 @@ public abstract class ToolBarMenuDock { */ public final JMenuBar createJMenuBar(ToolBarMenuDockPlus plus) { UIMenuBar jMenuBar = new UIMenuBar() { + private Dimension dim; + @Override public Dimension getPreferredSize() { - Dimension dim = super.getPreferredSize(); - dim.height = MENUBAR_HEIGHT; + if (dim == null) { + dim = super.getPreferredSize(); + dim.height = MENUBAR_HEIGHT; + } return dim; } }; + resetJMenuBar(jMenuBar, plus); + return jMenuBar; + } + + /** + * 重置菜单栏 + * + * @param jMenuBar 当前菜单栏 + * @param plus 对象 + */ + public final void resetJMenuBar(JMenuBar jMenuBar, ToolBarMenuDockPlus plus) { + jMenuBar.removeAll(); this.menus = menus(plus); try { OemProcessor oemProcessor = OemHandler.findOem(); @@ -218,13 +235,12 @@ public abstract class ToolBarMenuDock { FineLoggerFactory.getLogger().error(e.getMessage(), e); this.menus = menus(plus); } - for (int i = 0; i < menus.length; i++) { - menus[i].setHasRecMenu(true); - UIMenu subMenu = menus[i].createJMenu(); + for (MenuDef menu : menus) { + menu.setHasRecMenu(true); + UIMenu subMenu = menu.createJMenu(); jMenuBar.add(subMenu); - menus[i].updateMenu(); + menu.updateMenu(); } - return jMenuBar; } ////////////////////////////////////////////////////////////////////////////////////////// @@ -585,7 +601,7 @@ public abstract class ToolBarMenuDock { * @param plus 对象 * @return 工具栏 */ - public JComponent resetToolBar(JComponent toolbarComponent, ToolBarMenuDockPlus plus) { + public JComponent resetToolBar(@Nullable JComponent toolbarComponent, ToolBarMenuDockPlus plus) { ToolBarDef[] plusToolBarDefs = plus.toolbars4Target(); UIToolbar toolBar; if (toolbarComponent instanceof UIToolbar) { @@ -599,8 +615,7 @@ public abstract class ToolBarMenuDock { toolBarDef = new ToolBarDef(); if (plusToolBarDefs != null) { - for (int i = 0; i < plusToolBarDefs.length; i++) { - ToolBarDef def = plusToolBarDefs[i]; + for (ToolBarDef def : plusToolBarDefs) { for (int di = 0, dlen = def.getShortCutCount(); di < dlen; di++) { toolBarDef.addShortCut(def.getShortCut(di)); } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/toolbar/UpdateActionModel.java b/designer-base/src/main/java/com/fr/design/mainframe/toolbar/UpdateActionModel.java index cb16c62ee..e3af1bcba 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/toolbar/UpdateActionModel.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/toolbar/UpdateActionModel.java @@ -32,15 +32,22 @@ public class UpdateActionModel { * @param action */ private void setSearchKey(String parentName, UpdateAction action) { - StringBuffer buffer = new StringBuffer(); if (actionName == null) { return; } - buffer.append(parentName).append(SEPARATOR).append(PinyinHelper.convertToPinyinString(parentName, "", PinyinFormat.WITHOUT_TONE)) - .append(SEPARATOR).append(PinyinHelper.getShortPinyin(parentName)).append(SEPARATOR) - .append(actionName).append(SEPARATOR).append(PinyinHelper.convertToPinyinString(actionName, "", PinyinFormat.WITHOUT_TONE)) - .append(SEPARATOR).append(PinyinHelper.getShortPinyin(actionName)).append(action.getSearchText()); - this.searchKey = buffer.toString().toLowerCase(); + String buffer = parentName + + SEPARATOR + + PinyinHelper.convertToPinyinString(parentName, "", PinyinFormat.WITHOUT_TONE) + + SEPARATOR + + PinyinHelper.getShortPinyin(parentName) + + SEPARATOR + + actionName + + SEPARATOR + + PinyinHelper.convertToPinyinString(actionName, "", PinyinFormat.WITHOUT_TONE) + + SEPARATOR + + PinyinHelper.getShortPinyin(actionName) + + action.getSearchText(); + this.searchKey = buffer.toLowerCase(); } /** diff --git a/designer-base/src/main/java/com/fr/start/BaseDesigner.java b/designer-base/src/main/java/com/fr/start/BaseDesigner.java index 05d41a1e7..7bd6fbbd2 100644 --- a/designer-base/src/main/java/com/fr/start/BaseDesigner.java +++ b/designer-base/src/main/java/com/fr/start/BaseDesigner.java @@ -5,24 +5,27 @@ package com.fr.start; import com.fr.design.DesignerEnvManager; import com.fr.design.ExtraDesignClassManager; +import com.fr.design.constants.DesignerLaunchStatus; import com.fr.design.file.HistoryTemplateListPane; import com.fr.design.file.MutilTempalteTabPane; import com.fr.design.file.TemplateTreePane; import com.fr.design.fun.DesignerStartOpenFileProcessor; -import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.DesignerFrame; import com.fr.design.mainframe.toolbar.ToolBarMenuDock; import com.fr.design.utils.DesignUtils; +import com.fr.event.Event; import com.fr.event.EventDispatcher; +import com.fr.event.Listener; +import com.fr.event.Null; import com.fr.file.FILE; import com.fr.file.FILEFactory; import com.fr.file.FileFILE; import com.fr.general.ComparatorUtils; import com.fr.log.FineLoggerFactory; -import com.fr.module.ModuleEvent; import com.fr.stable.OperatingSystem; +import javax.swing.SwingUtilities; import java.awt.Window; import java.io.File; import java.lang.reflect.Method; @@ -31,17 +34,17 @@ import java.lang.reflect.Method; * The main class of Report Designer. */ public abstract class BaseDesigner extends ToolBarMenuDock { - + private static final int LOAD_TREE_MAXNUM = 10; - + private final String[] args; public BaseDesigner(String[] args) { - + this.args = args; init(); } - + private void init() { // 初始化look and feel.这个在预加载之前执行是因为lookAndFeel里的东西,预加载时也要用到 DesignUtils.initLookAndFeel(); @@ -49,27 +52,60 @@ public abstract class BaseDesigner extends ToolBarMenuDock { DesignerEnvManager.loadLogSetting(); createDesignerFrame(); } - + public void show() { - collectUserInformation(); - showDesignerFrame(false); - + if (DesignerLaunchStatus.getStatus() == DesignerLaunchStatus.WORKSPACE_INIT_COMPLETE) { + refreshTemplateTree(); + } else { + EventDispatcher.listen(DesignerLaunchStatus.WORKSPACE_INIT_COMPLETE, new Listener() { + @Override + public void on(Event event, Null param) { + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + refreshTemplateTree(); + } + }); + } + }); + } + + EventDispatcher.listen(DesignerLaunchStatus.DESIGNER_INIT_COMPLETE, new Listener() { + @Override + public void on(Event event, Null param) { + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + // 打开上次的文件 + showDesignerFrame(false); + DesignerContext.getDesignerFrame().resizeFrame(); + EventDispatcher.asyncFire(DesignerLaunchStatus.OPEN_LAST_FILE_COMPLETE); + } + }); + } + }); + EventDispatcher.listen(DesignerLaunchStatus.OPEN_LAST_FILE_COMPLETE, new Listener() { + @Override + public void on(Event event, Null param) { + collectUserInformation(); + } + }); + // 启动界面 + DesignerContext.getDesignerFrame().setVisible(true); + } + + private void refreshTemplateTree() { //TODO: 2019-06-14 这里有啥作用? DesignerContext.getDesignerFrame().refreshEnv(); for (int i = 0; !TemplateTreePane.getInstance().getTemplateFileTree().isTemplateShowing() && i < LOAD_TREE_MAXNUM; i++) { TemplateTreePane.getInstance().getTemplateFileTree().refresh(); } - DesignerContext.getDesignerFrame().setVisible(true); - DesignerContext.getDesignerFrame().resizeFrame(); } - private void createDesignerFrame() { - new DesignerFrame(this); } - - + private void showDesignerFrame(boolean isException) { try { FILE file = null; @@ -94,8 +130,7 @@ public abstract class BaseDesigner extends ToolBarMenuDock { } } } else { - file = FILEFactory.createFILE(FILEFactory.ENV_PREFIX - + DesignerEnvManager.getEnvManager().getLastOpenFile()); + file = FILEFactory.createFILE(FILEFactory.ENV_PREFIX + DesignerEnvManager.getEnvManager().getLastOpenFile()); } DesignerFrame df = DesignerContext.getDesignerFrame(); isException = openFile(df, isException, file); @@ -134,7 +169,7 @@ public abstract class BaseDesigner extends ToolBarMenuDock { df.getSelectedJTemplate().requestGridFocus(); return isException; } - + private void enableFullScreenMode(Window window) { String className = "com.apple.eawt.FullScreenUtilities"; String methodName = "setWindowCanFullScreen"; diff --git a/designer-base/src/main/java/com/fr/start/server/FineEmbedServerMonitor.java b/designer-base/src/main/java/com/fr/start/server/FineEmbedServerMonitor.java index 5807773bf..fe0c8ea86 100644 --- a/designer-base/src/main/java/com/fr/start/server/FineEmbedServerMonitor.java +++ b/designer-base/src/main/java/com/fr/start/server/FineEmbedServerMonitor.java @@ -1,25 +1,32 @@ package com.fr.start.server; import com.fr.concurrent.NamedThreadFactory; +import com.fr.design.gui.iprogressbar.ProgressDialog; import com.fr.design.mainframe.DesignerContext; import com.fr.event.Event; import com.fr.event.EventDispatcher; import com.fr.event.Listener; import com.fr.event.Null; -import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; /** * 内置服务器启动监视器 - * Created by zack on 2018/8/21. + * + * @author zack + * @date 2018/8/21 */ public class FineEmbedServerMonitor { private int progress; - private static final int COMPLETE = 100;//启动完成 - private static final int STEP = 5;//随便设置一个假的进度条 - private static final int STEP_HEARTBEAT = 2000;//2秒更新进度 + private static final int STEP = 1; + /** + * 40ms更新进度 + */ + private static final int STEP_HEARTBEAT = 40; private static volatile FineEmbedServerMonitor monitor; + private static ProgressDialog progressBar = DesignerContext.getDesignerFrame().getProgressDialog(); private FineEmbedServerMonitor() { } @@ -29,7 +36,7 @@ public class FineEmbedServerMonitor { @Override public void on(Event event, Null aNull) { getInstance().reset(); - DesignerContext.getDesignerFrame().hideProgressDialog(); + DesignerContext.getDesignerFrame().disposeProgressDialog(); } }); } @@ -46,7 +53,7 @@ public class FineEmbedServerMonitor { } public int getProgress() { - if (progress == COMPLETE) { + if (progress == progressBar.getProgressMaximum()) { return progress; } else { progress += STEP; @@ -55,7 +62,7 @@ public class FineEmbedServerMonitor { } public void setComplete() { - this.progress = COMPLETE; + this.progress = progressBar.getProgressMaximum(); } public void reset() { @@ -63,29 +70,28 @@ public class FineEmbedServerMonitor { } public boolean isComplete() { - return this.progress == COMPLETE; + return this.progress >= progressBar.getProgressMaximum(); } public void monitor() { - ExecutorService service = Executors.newSingleThreadExecutor(new NamedThreadFactory("FineEmbedServerMonitor")); - service.submit(new Runnable() { - + final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1, + new NamedThreadFactory("FineEmbedServerMonitor")); + scheduler.scheduleAtFixedRate(new Runnable() { @Override public void run() { - while (!isComplete()) { - if (!DesignerContext.getDesignerFrame().getProgressDialog().isVisible()) { - DesignerContext.getDesignerFrame().showProgressDialog(); - DesignerContext.getDesignerFrame().getProgressDialog().updateLoadingText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Loading_Embed_Server")); - } - DesignerContext.getDesignerFrame().updateProgress(getProgress()); - try { - Thread.sleep(STEP_HEARTBEAT); - } catch (InterruptedException ignore) { - } + if (isComplete()) { + scheduler.shutdown(); + DesignerContext.getDesignerFrame().hideProgressDialog(); + return; + } + if (!DesignerContext.getDesignerFrame().getProgressDialog().isVisible()) { + DesignerContext.getDesignerFrame().showProgressDialog(); + DesignerContext.getDesignerFrame().getProgressDialog() + .updateLoadingText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Loading_Embed_Server")); } - DesignerContext.getDesignerFrame().hideProgressDialog(); + DesignerContext.getDesignerFrame().updateProgress(getProgress()); } - }); - service.shutdown(); + }, 0, STEP_HEARTBEAT, TimeUnit.MILLISECONDS); + } } diff --git a/designer-form/src/main/java/com/fr/design/mainframe/FormArea.java b/designer-form/src/main/java/com/fr/design/mainframe/FormArea.java index b42d1b41e..048d342ee 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/FormArea.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/FormArea.java @@ -188,7 +188,7 @@ public class FormArea extends JComponent implements ScrollRulerComponent { value = value > SHOWVALMAX ? SHOWVALMAX : value; value = value < SHOWVALMIN ? SHOWVALMIN : value; JForm jf = (JForm) HistoryTemplateListPane.getInstance().getCurrentEditingTemplate(); - jf.resolution = (int) value; + jf.setResolution((int) value); jf.getFormDesign().setResolution((int) value); jf.getFormDesign().getArea().resolution = (int) value; reCalculateRoot(value, true); diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/ElementCasePane.java b/designer-realize/src/main/java/com/fr/design/mainframe/ElementCasePane.java index b68a5f72e..a28156110 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/ElementCasePane.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/ElementCasePane.java @@ -117,6 +117,7 @@ import javax.swing.JPanel; import javax.swing.JPopupMenu; import javax.swing.JScrollBar; import javax.swing.KeyStroke; +import javax.swing.SwingUtilities; import java.awt.AWTEvent; import java.awt.Adjustable; import java.awt.Dimension; @@ -527,7 +528,7 @@ public abstract class ElementCasePane extends Tar try { //旧选中内容编辑器释放模板对象 QuickEditor editor = this.getCurrentEditor(); - if(editor != null){ + if (editor != null) { editor.release(); } } catch (UnsupportedOperationException e) { @@ -853,15 +854,20 @@ public abstract class ElementCasePane extends Tar */ public void fireSelectionChangeListener() { // Guaranteed to return a non-null array - Object[] listeners = listenerList.getListenerList(); + final Object[] listeners = listenerList.getListenerList(); - // Process the listeners last to first, notifying - // those that are interested in this event - for (int i = listeners.length - 2; i >= 0; i -= 2) { - if (listeners[i] == SelectionListener.class) { - ((SelectionListener) listeners[i + 1]).selectionChanged(new SelectionEvent(this)); + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + // Process the listeners last to first, notifying + // those that are interested in this event + for (int i = listeners.length - 2; i >= 0; i -= 2) { + if (listeners[i] == SelectionListener.class) { + ((SelectionListener) listeners[i + 1]).selectionChanged(new SelectionEvent(this)); + } + } } - } + }); } /** diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/JWorkBook.java b/designer-realize/src/main/java/com/fr/design/mainframe/JWorkBook.java index 6e72e98fe..009197eee 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/JWorkBook.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/JWorkBook.java @@ -90,7 +90,6 @@ import com.fr.report.elementcase.TemplateElementCase; import com.fr.report.poly.PolyWorkSheet; import com.fr.report.worksheet.WorkSheet; import com.fr.stable.ArrayUtils; -import com.fr.stable.CoreGraphHelper; import com.fr.stable.StableUtils; import com.fr.stable.StringUtils; import com.fr.stable.module.Module; diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/errorinfo/ErrorInfoUploader.java b/designer-realize/src/main/java/com/fr/design/mainframe/errorinfo/ErrorInfoUploader.java index 737d47044..e22e1059e 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/errorinfo/ErrorInfoUploader.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/errorinfo/ErrorInfoUploader.java @@ -1,5 +1,6 @@ package com.fr.design.mainframe.errorinfo; +import com.fr.concurrent.NamedThreadFactory; import com.fr.design.mainframe.SiteCenterToken; import com.fr.general.CloudCenter; import com.fr.general.CommonIOUtils; @@ -24,6 +25,8 @@ import java.io.InputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; /** * Created by Administrator on 2017/7/24 0024. @@ -81,8 +84,8 @@ public class ErrorInfoUploader { return; } - - Thread updateThread = new Thread(new Runnable() { + ExecutorService es = Executors.newSingleThreadExecutor(new NamedThreadFactory("ErrorInfoUploader")); + es.submit(new Runnable() { @Override public void run() { String localCacheFilePath = StableUtils.pathJoin(ProductConstants.getEnvHome(), "solution", "solution.zip"); @@ -92,7 +95,7 @@ public class ErrorInfoUploader { } } }); - updateThread.start(); + es.shutdown(); } private void downloadSolution(File localCacheZip) { diff --git a/designer-realize/src/main/java/com/fr/start/Designer.java b/designer-realize/src/main/java/com/fr/start/Designer.java index 654f396c8..19c9a5dba 100644 --- a/designer-realize/src/main/java/com/fr/start/Designer.java +++ b/designer-realize/src/main/java/com/fr/start/Designer.java @@ -82,6 +82,7 @@ public class Designer extends BaseDesigner { private UIButton saveButton; private UIButton undo; private UIButton redo; + private UIButton[] upToolBar; private UIPreviewButton run; public Designer(String[] args) { @@ -94,7 +95,7 @@ public class Designer extends BaseDesigner { * @param args 参数 */ public static void main(String[] args) { - + StopWatch watch = new StopWatch(); watch.start(); //启动运行时 @@ -210,11 +211,17 @@ public class Designer extends BaseDesigner { */ @Override public UIButton[] createUp() { - return new UIButton[]{createSaveButton(), createUndoButton(), createRedoButton()}; + if (upToolBar == null) { + createSaveButton(); + createUndoButton(); + createRedoButton(); + return upToolBar = new UIButton[]{saveButton, undo, redo}; + } + return upToolBar; } - private UIButton createSaveButton() { + private void createSaveButton() { saveButton = new UIButton(BaseUtils.readIcon("/com/fr/design/images/buttonicon/save.png")); saveButton.setToolTipText(KeySetUtils.SAVE_TEMPLATE.getMenuKeySetName()); saveButton.set4ToolbarButton(); @@ -227,11 +234,10 @@ public class Designer extends BaseDesigner { jt.requestFocus(); } }); - return saveButton; } - private UIButton createUndoButton() { + private void createUndoButton() { undo = new UIButton(BaseUtils.readIcon("/com/fr/design/images/buttonicon/undo.png")); undo.setToolTipText(KeySetUtils.UNDO.getMenuKeySetName()); undo.set4ToolbarButton(); @@ -244,10 +250,9 @@ public class Designer extends BaseDesigner { } } }); - return undo; } - private UIButton createRedoButton() { + private void createRedoButton() { redo = new UIButton(BaseUtils.readIcon("/com/fr/design/images/buttonicon/redo.png")); redo.setToolTipText(KeySetUtils.REDO.getMenuKeySetName()); redo.set4ToolbarButton(); @@ -260,7 +265,6 @@ public class Designer extends BaseDesigner { } } }); - return redo; } private void createRunButton(UILargeToolbar largeToolbar) { diff --git a/designer-realize/src/main/java/com/fr/start/module/DesignerStartup.java b/designer-realize/src/main/java/com/fr/start/module/DesignerStartup.java index b1ad72251..7c3a1e7a6 100644 --- a/designer-realize/src/main/java/com/fr/start/module/DesignerStartup.java +++ b/designer-realize/src/main/java/com/fr/start/module/DesignerStartup.java @@ -16,12 +16,10 @@ public class DesignerStartup extends Activator { @Override @Metrics public void start() { - startSub(PreStartActivator.class); getSub("parallel").start(); //designer模块启动好后,查看demo browserDemo(); - startSub(DesignerShowActivator.class); startSub(StartFinishActivator.class); FineRuntime.startFinish(); } diff --git a/designer-realize/src/main/java/com/fr/start/module/DesignerWorkspaceActivator.java b/designer-realize/src/main/java/com/fr/start/module/DesignerWorkspaceActivator.java index e652cda6f..ab4448434 100644 --- a/designer-realize/src/main/java/com/fr/start/module/DesignerWorkspaceActivator.java +++ b/designer-realize/src/main/java/com/fr/start/module/DesignerWorkspaceActivator.java @@ -6,7 +6,6 @@ import com.fr.event.Event; import com.fr.event.Listener; import com.fr.module.Activator; import com.fr.start.server.FineEmbedServer; -import com.fr.workspace.WorkContext; import com.fr.workspace.Workspace; import com.fr.workspace.WorkspaceEvent; @@ -22,7 +21,6 @@ public class DesignerWorkspaceActivator extends Activator { public void start() { registerEnvListener(); - startServer(WorkContext.getCurrent()); } /** From 838d8faf3356e791debe97796456793ef7cbbcd9 Mon Sep 17 00:00:00 2001 From: zheng Date: Wed, 10 Jul 2019 18:37:27 +0800 Subject: [PATCH 036/217] =?UTF-8?q?CHART-9141=20replace=20chart=20with=20c?= =?UTF-8?q?hartProvider(eg:typePane)=20&&=20=E5=9B=BE=E8=A1=A8=E5=85=AC?= =?UTF-8?q?=E5=BC=8F=E7=9B=B8=E5=85=B3=E6=8E=A5=E5=8F=A3=20&&=20=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E5=9B=BE=E8=A1=A8=E5=86=85=E9=83=A8=E5=AF=B9datamodel?= =?UTF-8?q?=E7=9A=84cache(=E5=92=8Cengine=E7=A1=AE=E8=AE=A4=E8=BF=87)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/ChartTypeInterfaceManager.java | 16 +- .../design/chart/ChartCommonWizardPane.java | 14 +- .../com/fr/design/chart/ChartTypePane.java | 86 +--- .../design/chart/gui/ChartWidgetOption.java | 10 +- .../active/action/ChartComponentAction.java | 5 - .../impl/ChartHyperPoplinkPane.java | 3 +- .../design/mainframe/chart/ChartEditPane.java | 43 +- .../chart/gui/ChartTypeButtonPane.java | 68 ++- .../mainframe/chart/gui/ChartTypePane.java | 69 +-- .../mainframe/chart/gui/StylePane4Chart.java | 33 -- .../chart/gui/type/AbstractBarPane.java | 6 +- .../chart/gui/type/AbstractChartTypePane.java | 394 +---------------- .../type/AbstractDeprecatedChartTypePane.java | 409 ++++++++++++++++++ .../chart/gui/type/AreaPlotPane.java | 2 +- .../chart/gui/type/BubblePlotPane.java | 4 +- .../chart/gui/type/CustomPlotPane.java | 2 +- .../chart/gui/type/DonutPlotPane.java | 8 +- .../chart/gui/type/FunnelPlotPane.java | 2 +- .../chart/gui/type/GanttPlotPane.java | 2 +- .../chart/gui/type/GisMapPlotPane.java | 6 +- .../chart/gui/type/LinePlotPane.java | 2 +- .../mainframe/chart/gui/type/MapPlotPane.java | 2 +- .../chart/gui/type/MeterPlotPane.java | 6 +- .../mainframe/chart/gui/type/PiePlotPane.java | 4 +- .../chart/gui/type/RadarPlotPane.java | 2 +- .../chart/gui/type/RangePlotPane.java | 2 +- .../chart/gui/type/StockPlotPane.java | 4 +- .../gui/type/UserDefinedChartTypePane.java | 4 +- .../chart/gui/type/XYScatterPlotPane.java | 2 +- .../fr/extended/chart/ExtendedTypePane.java | 7 +- .../type/AbstractVanChartTypePane.java | 5 +- .../java/com/fr/poly/PolyComponentsBar.java | 4 +- 32 files changed, 602 insertions(+), 624 deletions(-) delete mode 100644 designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/StylePane4Chart.java create mode 100644 designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/AbstractDeprecatedChartTypePane.java 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 72585ade8..8c3f56ae0 100644 --- a/designer-chart/src/main/java/com/fr/design/ChartTypeInterfaceManager.java +++ b/designer-chart/src/main/java/com/fr/design/ChartTypeInterfaceManager.java @@ -2,7 +2,6 @@ package com.fr.design; import com.fr.chart.base.ChartConstants; import com.fr.chart.base.ChartInternationalNameContentBean; -import com.fr.chart.chartattr.Chart; import com.fr.chart.chartattr.Plot; import com.fr.chart.charttypes.ChartTypeManager; import com.fr.chartx.attr.ChartProvider; @@ -161,7 +160,7 @@ public class ChartTypeInterfaceManager implements ExtraChartDesignClassManagerPr ChartWidgetOption[] child = new ChartWidgetOption[typeName.length]; int index = 0; for (ChartInternationalNameContentBean bean : typeName) { - String plotID = bean.getPlotID(); + String plotID = bean.getChartID(); ChartProvider[] rowChart = ChartTypeManager.getInstance().getChartTypes(plotID); if (ArrayUtils.isEmpty(rowChart) && !ChartTypeManager.innerChart(plotID)) { continue; @@ -254,7 +253,7 @@ public class ChartTypeInterfaceManager implements ExtraChartDesignClassManagerPr * * @param paneList pane容器 */ - public void addPlotTypePaneList(List> paneList, Map>> allChartTypePane) { + public void addPlotTypePaneList(List> paneList, Map>> allChartTypePane) { List priorityList = getPriorityInOrder(); for (Integer aPriorityList : priorityList) { @@ -264,7 +263,7 @@ public class ChartTypeInterfaceManager implements ExtraChartDesignClassManagerPr } - public void addPlotTypePaneList(String priority, List> paneList, Map>> allChartTypePane) { + public void addPlotTypePaneList(String priority, List> paneList, Map>> allChartTypePane) { if (chartTypeInterfaces != null && chartTypeInterfaces.containsKey(priority)) { @@ -283,7 +282,7 @@ public class ChartTypeInterfaceManager implements ExtraChartDesignClassManagerPr paneList.add(pane); if (allChartTypePane.get(priority) == null) { - allChartTypePane.put(priority, new LinkedHashMap>()); + allChartTypePane.put(priority, new LinkedHashMap>()); } allChartTypePane.get(priority).put(plotID, pane); } @@ -450,9 +449,10 @@ public class ChartTypeInterfaceManager implements ExtraChartDesignClassManagerPr return true; } - public boolean needChartChangePane(Chart chart) { - if (chart != null && chart.getPlot() != null) { - IndependentChartUIProvider provider = getChartTypeInterface(chart.getPlot().getPlotID()); + public boolean needChartChangePane(ChartProvider chart) { + if (chart != null) { + String chartID = chart.getID(); + IndependentChartUIProvider provider = getChartTypeInterface(chartID); if (provider != null) { return provider.needChartChangePane(); } diff --git a/designer-chart/src/main/java/com/fr/design/chart/ChartCommonWizardPane.java b/designer-chart/src/main/java/com/fr/design/chart/ChartCommonWizardPane.java index 7fefabd3e..6ff6e0639 100644 --- a/designer-chart/src/main/java/com/fr/design/chart/ChartCommonWizardPane.java +++ b/designer-chart/src/main/java/com/fr/design/chart/ChartCommonWizardPane.java @@ -1,7 +1,7 @@ package com.fr.design.chart; -import com.fr.chart.chartattr.Chart; import com.fr.chart.chartattr.ChartCollection; +import com.fr.chartx.attr.ChartProvider; public abstract class ChartCommonWizardPane extends ChartWizardPane { private static final long serialVersionUID = 2467967841657570498L; @@ -11,12 +11,12 @@ public abstract class ChartCommonWizardPane extends ChartWizardPane { if (cc == null) { return; } - - populate(cc.getSelectedChart()); + + populate(cc.getSelectedChartProvider()); } - - public abstract void populate(Chart chart); - - public abstract void update(Chart oldChart); + + public abstract void populate(ChartProvider chart); + + public abstract void update(ChartProvider oldChart); } \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/design/chart/ChartTypePane.java b/designer-chart/src/main/java/com/fr/design/chart/ChartTypePane.java index 2a19072e0..257fb8826 100644 --- a/designer-chart/src/main/java/com/fr/design/chart/ChartTypePane.java +++ b/designer-chart/src/main/java/com/fr/design/chart/ChartTypePane.java @@ -5,18 +5,13 @@ package com.fr.design.chart; */ import com.fr.chart.base.ChartInternationalNameContentBean; -import com.fr.chart.chartattr.Chart; import com.fr.chart.chartattr.ChartCollection; import com.fr.chart.chartattr.ChartIcon; -import com.fr.chart.chartattr.MapPlot; -import com.fr.chart.chartattr.Plot; import com.fr.chart.charttypes.ChartTypeManager; import com.fr.chartx.attr.ChartProvider; import com.fr.design.gui.ilable.UILabel; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.utils.gui.GUICoreUtils; -import com.fr.license.exception.RegistEditionException; -import com.fr.license.function.VT4FR; import com.fr.locale.InterProviderFactory; import com.fr.log.FineLoggerFactory; @@ -24,7 +19,6 @@ import javax.swing.BorderFactory; import javax.swing.DefaultListCellRenderer; import javax.swing.DefaultListModel; import javax.swing.JList; -import javax.swing.JOptionPane; import javax.swing.JScrollPane; import javax.swing.JSplitPane; import javax.swing.ListCellRenderer; @@ -37,22 +31,22 @@ public class ChartTypePane extends ChartCommonWizardPane { private static final long serialVersionUID = -1175602484968520546L; private ChartInternationalNameContentBean[] typeName = ChartTypeManager.getInstanceWithCheck().getAllChartBaseNames(); - //todo@shinerefactor 这个页面所有强转Chart的地方都要处理一下 - private Chart[][] charts4Icon = null; + private ChartProvider[][] charts4Icon = null; { - charts4Icon = new Chart[this.typeName.length][]; + charts4Icon = new ChartProvider[this.typeName.length][]; for (int i = 0; i < this.typeName.length; i++) { - ChartProvider[] rowCharts = ChartTypeManager.getInstanceWithCheck().getChartTypes(this.typeName[i].getPlotID()); + ChartProvider[] rowCharts = ChartTypeManager.getInstanceWithCheck().getChartTypes(this.typeName[i].getChartID()); int rowChartsCount = rowCharts.length; - charts4Icon[i] = new Chart[rowChartsCount]; + charts4Icon[i] = new ChartProvider[rowChartsCount]; for (int j = 0; j < rowChartsCount; j++) { try { - charts4Icon[i][j] = (Chart) rowCharts[j].clone(); - charts4Icon[i][j].setTitle(null); - if(charts4Icon[i][j].getPlot() != null){ - charts4Icon[i][j].getPlot().setLegend(null); - } + charts4Icon[i][j] = (ChartProvider) rowCharts[j].clone(); + //todo@shinerefactor 老图表也是提供一张图片 这边就不用setTitle(null) 然后实时去画 +// charts4Icon[i][j].setTitle(null); +// if(charts4Icon[i][j].getPlot() != null){ +// charts4Icon[i][j].getPlot().setLegend(null); +// } } catch (CloneNotSupportedException e) { FineLoggerFactory.getLogger().error(e.getMessage(), e); } @@ -123,7 +117,7 @@ public class ChartTypePane extends ChartCommonWizardPane { protected ListSelectionListener listSelectionListener = new ListSelectionListener() { public void valueChanged(ListSelectionEvent e) { int main_index = mainTypeList.getSelectedIndex(); - Chart[] sub_charts = ChartTypePane.this.charts4Icon[main_index]; + ChartProvider[] sub_charts = ChartTypePane.this.charts4Icon[main_index]; ChartTypePane.this.iconListModel.clear(); for (int i = 0; i < sub_charts.length; i++) { ChartTypePane.this.iconListModel.addElement(new ChartIcon(sub_charts[i])); @@ -133,56 +127,14 @@ public class ChartTypePane extends ChartCommonWizardPane { }; public String getChartName(ChartIcon chartIcon) { - Chart chart = (Chart)chartIcon.getChart(); - return chart.getChartName(); + ChartProvider chart = chartIcon.getChart(); + return ChartTypeManager.getInstanceWithCheck().getChartName(chart.getID()); } - public void populate(Chart chart) { - if (chart == null) { - return; - } - Plot plot = chart.getPlot(); - - int mainIndex = 0; - int subIndex = 0; - - for (int i = 0; i < typeName.length; i++) { - ChartProvider[] charts = ChartTypeManager.getInstanceWithCheck().getChartTypes(typeName[i].getPlotID()); - for (int j = 0; j < charts.length; j++) { - if (((Chart) charts[j]).getPlot().match4GUI(plot)) { - mainIndex = i; - subIndex = j; - // 一旦匹配 立马中断 - break; - } - } - } - - mainTypeList.setSelectedIndex(mainIndex); - iconViewList.setSelectedIndex(subIndex); - } - - public void update(Chart oldChart) { - String plotID = typeName[mainTypeList.getSelectedIndex()].getPlotID(); - Chart chart = (Chart) ChartTypeManager.getInstanceWithCheck().getChartTypes(plotID)[iconViewList.getSelectedIndex()]; - if(chart.getPlot() != null){ - if(chart.getPlot() instanceof MapPlot && !supportMap()){ - JOptionPane.showMessageDialog(null, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Map_Not_Supported")); - throw new RegistEditionException(VT4FR.ChartMap); - } - - if (chart.getPlot() != null) { - try { - oldChart.changePlotInNewType((Plot) chart.getPlot().clone()); - } catch (CloneNotSupportedException e) { - FineLoggerFactory.getLogger().error(e.getMessage(), e); - } - } - } + public void populate(ChartProvider chart) { } - private boolean supportMap() { - return VT4FR.ChartMap.isSupport(); + public void update(ChartProvider oldChart) { } public void update(ChartCollection cc) { @@ -190,12 +142,12 @@ public class ChartTypePane extends ChartCommonWizardPane { return; } - Chart chart4Update = cc.getSelectedChart(); + ChartProvider chart4Update = cc.getSelectedChartProvider(); if (chart4Update == null) { - String plotID = typeName[mainTypeList.getSelectedIndex()].getPlotID(); - Chart chart = (Chart) ChartTypeManager.getInstance().getChartTypes(plotID)[iconViewList.getSelectedIndex()]; + String plotID = typeName[mainTypeList.getSelectedIndex()].getChartID(); + ChartProvider chart = ChartTypeManager.getInstance().getChartTypes(plotID)[iconViewList.getSelectedIndex()]; try{ - chart4Update = (Chart)chart.clone(); + chart4Update = (ChartProvider) chart.clone(); cc.addChart(chart4Update); }catch (CloneNotSupportedException ex){ FineLoggerFactory.getLogger().error(ex.getMessage(), ex); diff --git a/designer-chart/src/main/java/com/fr/design/chart/gui/ChartWidgetOption.java b/designer-chart/src/main/java/com/fr/design/chart/gui/ChartWidgetOption.java index eb36aadea..753bb47cd 100644 --- a/designer-chart/src/main/java/com/fr/design/chart/gui/ChartWidgetOption.java +++ b/designer-chart/src/main/java/com/fr/design/chart/gui/ChartWidgetOption.java @@ -1,7 +1,6 @@ package com.fr.design.chart.gui; -import com.fr.chart.charttypes.ChartTypeManager; -import com.fr.chartx.attr.ChartProvider; +import com.fr.base.chart.BaseChartGetter; import com.fr.design.gui.core.WidgetOption; import com.fr.form.ui.ChartEditor; import com.fr.form.ui.Widget; @@ -38,14 +37,11 @@ public class ChartWidgetOption extends WidgetOption { Class clz = widgetClass(); try { ChartEditor widget = clz.newInstance(); - ChartProvider chart = ChartTypeManager.getInstanceWithCheck().getChartTypes(this.chartID)[0]; - widget.addChart((ChartProvider) chart.clone()); + widget.setChartCollection(BaseChartGetter.createChartCollection(this.chartID)); return widget; } catch (InstantiationException e) { - FineLoggerFactory.getLogger().error(e.getMessage(), e); + FineLoggerFactory.getLogger().error(e.getMessage(), e); } catch (IllegalAccessException e) { - FineLoggerFactory.getLogger().error(e.getMessage(), e); - } catch (CloneNotSupportedException e) { FineLoggerFactory.getLogger().error(e.getMessage(), e); } diff --git a/designer-chart/src/main/java/com/fr/design/chart/gui/active/action/ChartComponentAction.java b/designer-chart/src/main/java/com/fr/design/chart/gui/active/action/ChartComponentAction.java index 9bedc637d..83d471068 100644 --- a/designer-chart/src/main/java/com/fr/design/chart/gui/active/action/ChartComponentAction.java +++ b/designer-chart/src/main/java/com/fr/design/chart/gui/active/action/ChartComponentAction.java @@ -1,6 +1,5 @@ package com.fr.design.chart.gui.active.action; -import com.fr.chart.chartattr.Axis; import com.fr.chart.chartattr.ChartCollection; import com.fr.chart.chartglyph.AxisGlyph; import com.fr.design.actions.UpdateAction; @@ -32,10 +31,6 @@ public abstract class ChartComponentAction extends UpdateAction { return chartComponent.getChartCollection(); } - public Axis getActiveAxis() { - return chartComponent.getActiveAxis(); - } - public AxisGlyph getActiveAxisGlyph() { return chartComponent.getActiveAxisGlyph(); } diff --git a/designer-chart/src/main/java/com/fr/design/chart/series/SeriesCondition/impl/ChartHyperPoplinkPane.java b/designer-chart/src/main/java/com/fr/design/chart/series/SeriesCondition/impl/ChartHyperPoplinkPane.java index 74c78ff2d..7083da681 100644 --- a/designer-chart/src/main/java/com/fr/design/chart/series/SeriesCondition/impl/ChartHyperPoplinkPane.java +++ b/designer-chart/src/main/java/com/fr/design/chart/series/SeriesCondition/impl/ChartHyperPoplinkPane.java @@ -1,6 +1,5 @@ package com.fr.design.chart.series.SeriesCondition.impl; -import com.fr.base.chart.BaseChartCollection; import com.fr.chart.chartattr.Bar2DPlot; import com.fr.chart.chartattr.Chart; import com.fr.chart.chartattr.ChartCollection; @@ -92,7 +91,7 @@ public class ChartHyperPoplinkPane extends AbstractHyperLinkPane(); addTypePane(); - boolean isDefault = true; - String plotID = ""; - if(currentChart.getPlot() != null){ - plotID = currentChart.getPlot().getPlotID(); - isDefault = ChartTypeInterfaceManager.getInstance().isUseDefaultPane(plotID); - } + String chartID = currentChart.getID(); + boolean isDefault = ChartTypeInterfaceManager.getInstance().isUseDefaultPane(chartID); if(isDefault){ paneList.add(dataPane4SupportCell); @@ -152,11 +151,11 @@ public class ChartEditPane extends BasicPane implements AttributeChange,Prepare4 paneList.add(otherPane); this.isDefaultPane = true; }else{ - ChartDataPane chartDataPane = createChartDataPane(plotID); + ChartDataPane chartDataPane = createChartDataPane(chartID); if (chartDataPane != null) { paneList.add(chartDataPane); } - AbstractChartAttrPane[] otherPaneList = ChartTypeInterfaceManager.getInstance().getAttrPaneArray(plotID, listener); + AbstractChartAttrPane[] otherPaneList = ChartTypeInterfaceManager.getInstance().getAttrPaneArray(chartID, listener); for(int i = 0; i < otherPaneList.length; i++){ otherPaneList[i].addAttributeChangeListener(listener); paneList.add(otherPaneList[i]); @@ -226,8 +225,8 @@ public class ChartEditPane extends BasicPane implements AttributeChange,Prepare4 return; } - if(checkNeedsReLayout(collection.getSelectedChart())){ - reLayout(collection.getSelectedChart()); + if (checkNeedsReLayout(collection.getSelectedChartProvider())) { + reLayout(collection.getSelectedChartProvider()); } this.collection = collection; @@ -253,7 +252,7 @@ public class ChartEditPane extends BasicPane implements AttributeChange,Prepare4 } } - public int getSelectedChartIndex(Chart chart){ + public int getSelectedChartIndex(ChartProvider chart) { int index = 0; if(typePane != null){ FurtherBasicBeanPane[] paneList = typePane.getPaneList(); @@ -267,15 +266,13 @@ public class ChartEditPane extends BasicPane implements AttributeChange,Prepare4 } //populate的时候看看要不要重构面板 - private boolean checkNeedsReLayout(Chart chart){ + private boolean checkNeedsReLayout(ChartProvider chart) { if(chart != null){ int lastIndex = typePane.getSelectedIndex(); int currentIndex = getSelectedChartIndex(chart); - boolean currentPane = true; - if(chart.getPlot() != null){ - String plotID = chart.getPlot().getPlotID(); - currentPane = ChartTypeInterfaceManager.getInstance().isUseDefaultPane(plotID); - } + String chartID = chart.getID(); + boolean currentPane = ChartTypeInterfaceManager.getInstance().isUseDefaultPane(chartID); + return (currentPane != isDefaultPane) || (!currentPane && lastIndex != currentIndex); } return false; diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/ChartTypeButtonPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/ChartTypeButtonPane.java index ef5f8e1d4..4d7221113 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/ChartTypeButtonPane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/ChartTypeButtonPane.java @@ -19,6 +19,7 @@ import com.fr.design.gui.itextfield.UITextField; import com.fr.design.mainframe.chart.gui.ChartTypePane.ComboBoxPane; import com.fr.general.ComparatorUtils; import com.fr.log.FineLoggerFactory; +import com.fr.plugin.chart.vanchart.VanChart; import com.fr.stable.StringUtils; import javax.swing.BorderFactory; @@ -42,6 +43,8 @@ import java.awt.event.MouseListener; import java.awt.geom.Rectangle2D; import java.awt.image.BufferedImage; import java.util.ArrayList; +import java.util.HashSet; +import java.util.Set; /** * 图表 类型 增删 控制按钮界面. @@ -56,6 +59,12 @@ public class ChartTypeButtonPane extends BasicBeanPane implemen private static final int P_W = 300; private static final int P_H = 400; + private static Set> supportChangeConfigChartClassSet = new HashSet>(); + + static { + registerSupportChangeConfigChartClass(VanChart.class); + } + private UIButton addButton; private UIButton configButton; private ArrayList indexList = new ArrayList(); @@ -109,6 +118,10 @@ public class ChartTypeButtonPane extends BasicBeanPane implemen // Toolkit.getDefaultToolkit().addAWTEventListener(awt, AWTEvent.MOUSE_EVENT_MASK); } + public static void registerSupportChangeConfigChartClass(Class cls) { + supportChangeConfigChartClassSet.add(cls); + } + private void initConfigCreator() { configCreator = new UIMenuNameableCreator(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Change_Config_Attributes"), new AttrChangeConfig(), ChangeConfigPane.class); } @@ -135,7 +148,7 @@ public class ChartTypeButtonPane extends BasicBeanPane implemen if (editingCollection != null) { //点击添加按钮,则会触发切换状态 - ChartProvider chart = editingCollection.getChangeStateNewChart(); + ChartProvider chart = getChangeStateNewChart(); try { ChartProvider newChart = (ChartProvider) chart.clone(); editingCollection.addNamedChart(name, newChart); @@ -150,12 +163,51 @@ public class ChartTypeButtonPane extends BasicBeanPane implemen //获取图表收集器的状态 private void checkoutChange(){ - editingCollection.calculateMultiChartMode(); + calculateMultiChartMode(); if (parent != null){ parent.relayoutChartTypePane(editingCollection); } //检查是否可以配置切换 - configButton.setEnabled(editingCollection.changeEnable()); + configButton.setEnabled(changeEnable()); + } + + /** + * 获取切花状态下的图表 + * + * @return + */ + public ChartProvider getChangeStateNewChart() { + ChartProvider chart = editingCollection.getSelectedChartProvider(); + String priority = ChartTypeManager.VAN_CHART_PRIORITY; + //todo@shinerefactor + // chart.getPriority(); + return ChartTypeManager.getInstanceWithCheck().getFirstChart(priority); + } + + //图表收集器模式状态改变 + private void calculateMultiChartMode() { + //设置切换功能是否可用 + editingCollection.getChangeConfigAttr().setEnable(changeEnable()); + //多图表切换模式 + if (editingCollection.getChartCount() > 1) { + editingCollection.setState(SwitchState.CHANGE); + } else { + editingCollection.setState(SwitchState.DEFAULT); + } + } + + /** + * 是否支持图表切换的配置 + * + * @return + */ + private boolean changeEnable() { + return editingCollection.getChartCount() > 1 + && supportChange(); + } + + private boolean supportChange() { + return supportChangeConfigChartClassSet.contains(editingCollection.getSelectedChartProvider().getClass()); } ActionListener configListener = new ActionListener() { @@ -310,11 +362,11 @@ public class ChartTypeButtonPane extends BasicBeanPane implemen } private void checkConfigButtonVisible() { - addButton.setVisible(ChartTypeManager.enabledChart(editingCollection.getSelectedChart().getPlot().getPlotID())); + addButton.setVisible(ChartTypeManager.enabledChart(editingCollection.getSelectedChartProvider().getID())); //新建一个collection - if(editingCollection.getState() == SwitchState.DEFAULT && editingCollection.getSelectedChart() != null){ + if (editingCollection.getState() == SwitchState.DEFAULT && editingCollection.getSelectedChartProvider() != null) { //Chart 不支持图表切换 - configButton.setVisible(editingCollection.getSelectedChart().supportChange()); + configButton.setVisible(supportChange()); } } @@ -440,7 +492,7 @@ public class ChartTypeButtonPane extends BasicBeanPane implemen private void deleteAButton() { //先重构属性,在重构面板,否则面板在重构过程中,会重新将属性中的切换图表加到indexList中,导致面板无法删除 //记录改变前的plotID - String lastPlotID = editingCollection == null ? StringUtils.EMPTY : editingCollection.getSelectedChart().getPlot().getPlotID(); + String lastPlotID = editingCollection == null ? StringUtils.EMPTY : editingCollection.getSelectedChartProvider().getID(); if (editingCollection != null) { int count = editingCollection.getChartCount(); for (int i = 0; i < count; i++) { @@ -520,7 +572,7 @@ public class ChartTypeButtonPane extends BasicBeanPane implemen if (isEnabled()) { noSelected(); //记录改变前的plotID - String lastPlotID = editingCollection == null ? StringUtils.EMPTY : editingCollection.getSelectedChart().getPlot().getPlotID(); + String lastPlotID = editingCollection == null ? StringUtils.EMPTY : editingCollection.getSelectedChartProvider().getID(); changeCollectionSelected(getButtonName()); setSelectedWithFireListener(true); fireSelectedChanged(); 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 56547842c..8ac031f75 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 @@ -2,9 +2,9 @@ package com.fr.design.mainframe.chart.gui; import com.fr.chart.chartattr.Chart; import com.fr.chart.chartattr.ChartCollection; -import com.fr.chart.chartattr.Plot; import com.fr.chart.chartattr.SwitchState; import com.fr.chart.charttypes.ChartTypeManager; +import com.fr.chartx.attr.ChartProvider; import com.fr.design.ChartTypeInterfaceManager; import com.fr.design.beans.FurtherBasicBeanPane; import com.fr.design.dialog.BasicScrollPane; @@ -98,14 +98,14 @@ public class ChartTypePane extends AbstractChartAttrPane{ public String title4PopupWindow() { return PaneTitleConstants.CHART_TYPE_TITLE; } - - class ComboBoxPane extends UIComboBoxPane{ - private Map>> allChartTypePane; + + class ComboBoxPane extends UIComboBoxPane { + private Map>> allChartTypePane; @Override - protected List> initPaneList() { - List> paneList = new ArrayList>(); - allChartTypePane = new LinkedHashMap>>(); + protected List> initPaneList() { + List> paneList = new ArrayList>(); + allChartTypePane = new LinkedHashMap>>(); ChartTypeInterfaceManager.getInstance().addPlotTypePaneList(paneList, allChartTypePane); return paneList; } @@ -121,13 +121,12 @@ public class ChartTypePane extends AbstractChartAttrPane{ * 如果是切换图表的不同图表之间切换,则collection的选择下标会改变 * @param chart */ - public void updateBean(Chart chart) { + public void updateBean(ChartProvider chart) { - Plot oldPlot = chart.getPlot(); - String lastPlotID = oldPlot == null ? StringUtils.EMPTY : oldPlot.getPlotID(); + String lastPlotID = chart.getID(); try{ - Chart newDefaultChart = (Chart)((AbstractChartTypePane)getSelectedPane()).getDefaultChart().clone(); + ChartProvider newDefaultChart = (ChartProvider) ((AbstractChartTypePane) getSelectedPane()).getDefaultChart().clone(); if (!ComparatorUtils.equals(chart.getClass(), newDefaultChart.getClass())) { //vanChart 和 chart 之间切换 //不同chart之间切换 @@ -142,20 +141,20 @@ public class ChartTypePane extends AbstractChartAttrPane{ //这一步会替换plot ((AbstractChartTypePane)getSelectedPane()).updateBean(chart); - Plot plot = chart.getPlot(); - - if(plot != null){ - String plotID = plot.getPlotID(); + String chartID = chart.getID(); - //plot改变的话图表类型就算改变了 + //chartID改变的话图表类型就算改变了 + if (StringUtils.isNotEmpty(chartID)) { - chart.setWrapperName(ChartTypeManager.getInstanceWithCheck().getWrapperName(plotID)); - - chart.setChartImagePath(ChartTypeManager.getInstanceWithCheck().getChartImagePath(plotID)); + if (chart instanceof Chart) { + //todo@shinerefactor: 这边看下是否可以删除 + ((Chart) chart).setWrapperName(ChartTypeManager.getInstanceWithCheck().getWrapperName(chartID)); + ((Chart) chart).setChartImagePath(ChartTypeManager.getInstanceWithCheck().getChartImagePath(chartID)); + } - boolean isUseDefault = ChartTypeInterfaceManager.getInstance().isUseDefaultPane(plotID); + boolean isUseDefault = ChartTypeInterfaceManager.getInstance().isUseDefaultPane(chartID); - if(editPane.isDefaultPane() != isUseDefault || (!isUseDefault && !ComparatorUtils.equals(lastPlotID, plotID))){ + if (editPane.isDefaultPane() != isUseDefault || (!isUseDefault && !ComparatorUtils.equals(lastPlotID, chartID))) { editPane.reLayout(chart); } } @@ -195,12 +194,12 @@ public class ChartTypePane extends AbstractChartAttrPane{ private void addOnePriorityCards(String priority, boolean ignore) { - Map> map = allChartTypePane.get(priority); + Map> map = allChartTypePane.get(priority); - Iterator>> iterator = map.entrySet().iterator(); + Iterator>> iterator = map.entrySet().iterator(); while (iterator.hasNext()) { - Map.Entry> entry = iterator.next(); + Map.Entry> entry = iterator.next(); String plotID = entry.getKey(); if (ignore || ChartTypeManager.enabledChart(plotID)) { cards.add(entry.getValue()); @@ -217,9 +216,11 @@ public class ChartTypePane extends AbstractChartAttrPane{ //处理办法:这边除了重构 下拉项选项和cardNames 还需要把cards重构下(不需要init pane,只需要我需要的拿出来就好了) private void relayout(ChartCollection collection){ //重构需要重构下拉框选项和cardNames - Chart chart = collection.getSelectedChart(); - String priority = chart.getPriority(); - String plotID = chart.getPlot().getPlotID(); + ChartProvider chart = collection.getSelectedChartProvider(); + String priority = ChartTypeManager.VAN_CHART_PRIORITY; + //TODO@shinerefactor + // chart.getPriority(); + String plotID = chart.getID(); boolean enabledChart = ChartTypeManager.enabledChart(plotID); String item = ChartTypeInterfaceManager.getInstance().getTitle4PopupWindow(priority, plotID); @@ -262,7 +263,7 @@ public class ChartTypePane extends AbstractChartAttrPane{ } @Override - public void populateBean(Chart ob) { + public void populateBean(ChartProvider ob) { for (int i = 0; i < this.cards.size(); i++) { FurtherBasicBeanPane pane = cards.get(i); if (pane.accept(ob)) { @@ -279,12 +280,12 @@ public class ChartTypePane extends AbstractChartAttrPane{ } @Override - public Chart updateBean() { + public ChartProvider updateBean() { return getSelectedPane().updateBean(); } @Override - public FurtherBasicBeanPane getSelectedPane(){ + public FurtherBasicBeanPane getSelectedPane() { Object item = jcb.getSelectedItem(); for (int i = 0; i < cards.size(); i++){ if (ComparatorUtils.equals(item, cards.get(i).title4PopupWindow())){ @@ -303,8 +304,8 @@ public class ChartTypePane extends AbstractChartAttrPane{ * @param collection */ public void reLayoutEditPane(String lastPlotID, ChartCollection collection){ - Chart chart = collection.getSelectedChart(); - String plotID = chart.getPlot().getPlotID(); + ChartProvider chart = collection.getSelectedChartProvider(); + String plotID = chart.getID(); boolean isUseDefault = ChartTypeInterfaceManager.getInstance().isUseDefaultPane(plotID); if (editPane != null && editPane.isDefaultPane() != isUseDefault || (!isUseDefault && !ComparatorUtils.equals(lastPlotID, plotID))){ editPane.reLayout(chart); @@ -322,7 +323,7 @@ public class ChartTypePane extends AbstractChartAttrPane{ public void populate(ChartCollection collection) { editingCollection = collection; - Chart chart = collection.getSelectedChart(); + ChartProvider chart = collection.getSelectedChartProvider(); this.remove(leftContentPane); initContentPane(); @@ -340,7 +341,7 @@ public class ChartTypePane extends AbstractChartAttrPane{ public void update(ChartCollection collection) { editingCollection = collection; buttonPane.update(collection);// 内部操作时 已经做过处理. - Chart chart = collection.getSelectedChart(); + ChartProvider chart = collection.getSelectedChartProvider(); chartTypeComBox.updateBean(chart); } diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/StylePane4Chart.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/StylePane4Chart.java deleted file mode 100644 index 9ce3afd91..000000000 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/StylePane4Chart.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.fr.design.mainframe.chart.gui; - -import com.fr.chart.chartattr.ChartCollection; -import com.fr.design.gui.frpane.AttributeChangeListener; -import com.fr.design.mainframe.chart.gui.style.series.ChartSeriesPane; -import com.fr.design.mainframe.chart.gui.style.series.SeriesPane4ChartDesigner; - -/** - * 图表设计器的样式面板 - * Created by IntelliJ IDEA. - * Author : daisy - * Version: 6.5.6 - * Date: 14-10-25 - * Time: 下午6:56 - */ -public class StylePane4Chart extends ChartStylePane { - - public StylePane4Chart(AttributeChangeListener listener, boolean isNeedFormula) { - super(listener, isNeedFormula); - } - - public void update(ChartCollection collection) { - int selectIndex = collection.getSelectedIndex(); - super.update(collection); - collection.getSelectedChart().setStyleGlobal(false); - collection.setChartName(selectIndex, collection.getSelectedChart().getTitle().getTextObject().toString()); - } - - protected ChartSeriesPane createChartSeriesPane(){ - return new SeriesPane4ChartDesigner(StylePane4Chart.this); - } - -} \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/AbstractBarPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/AbstractBarPane.java index 4561549d4..639a41e42 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/AbstractBarPane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/AbstractBarPane.java @@ -9,9 +9,9 @@ import com.fr.chart.chartattr.Chart; * @author kunsnat E-mail:kunsnat@gmail.com * @version 创建时间:2012-12-25 下午04:55:05 */ -public abstract class AbstractBarPane extends AbstractChartTypePane { - - protected static final int COLOMN_CHART = 0; +public abstract class AbstractBarPane extends AbstractDeprecatedChartTypePane { + + protected static final int COLOMN_CHART = 0; protected static final int STACK_COLOMN_CHART = 1; protected static final int PERCENT_STACK_COLOMN_CHART = 2; protected static final int THREE_D_COLOMN_CHART = 3; diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/AbstractChartTypePane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/AbstractChartTypePane.java index 47de03b56..263424762 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/AbstractChartTypePane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/AbstractChartTypePane.java @@ -1,21 +1,9 @@ package com.fr.design.mainframe.chart.gui.type; -import com.fr.base.ChartColorMatching; -import com.fr.base.ChartPreStyleConfig; -import com.fr.base.background.ColorBackground; -import com.fr.chart.base.AttrContents; -import com.fr.chart.base.AttrFillStyle; import com.fr.chart.base.ChartConstants; -import com.fr.chart.base.ChartUtils; -import com.fr.chart.base.DataSeriesCondition; -import com.fr.chart.base.TextAttr; -import com.fr.chart.chartattr.Axis; -import com.fr.chart.chartattr.CategoryPlot; import com.fr.chart.chartattr.Chart; -import com.fr.chart.chartattr.Legend; import com.fr.chart.chartattr.Plot; import com.fr.chart.chartattr.Title; -import com.fr.chart.chartglyph.ConditionAttr; import com.fr.chart.charttypes.BarIndependentChart; import com.fr.chartx.attr.ChartProvider; import com.fr.design.beans.FurtherBasicBeanPane; @@ -25,9 +13,6 @@ import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.layout.TableLayout; import com.fr.design.layout.TableLayoutHelper; import com.fr.general.ComparatorUtils; -import com.fr.general.FRFont; -import com.fr.js.NameJavaScriptGroup; -import com.fr.log.FineLoggerFactory; import com.fr.stable.Constants; import javax.swing.JPanel; @@ -35,12 +20,11 @@ import javax.swing.JSeparator; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; -import java.awt.Font; import java.util.ArrayList; import java.util.List; -public abstract class AbstractChartTypePane extends FurtherBasicBeanPane{ +public abstract class AbstractChartTypePane extends FurtherBasicBeanPane { private static final int ONE_LINE_NUM = 4; @@ -163,50 +147,6 @@ public abstract class AbstractChartTypePane extends FurtherBasicBeanPane{ } } } - /** - * 更新界面属性 - */ - public void populateBean(Chart chart) { - for(ChartImagePane imagePane : typeDemo) { - imagePane.isPressing = false; - } - for(ChartImagePane imagePane : styleList) { - imagePane.isPressing = false; - } - - if(styleList != null && !styleList.isEmpty()){ - int plotStyle = chart.getPlot().getPlotStyle(); - String styleName = chart.getPlot().getPlotFillStyle().getFillStyleName(); - - switch (plotStyle){ - case ChartConstants.STYLE_SHADE: if(ComparatorUtils.equals(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Style_Retro"), styleName)){ - styleList.get(STYLE_SHADE).isPressing = true; - lastStyleIndex = STYLE_SHADE; - } - break; - case ChartConstants.STYLE_TRANSPARENT:if(ComparatorUtils.equals(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Style_Fresh"), styleName)){ - styleList.get(STYLE_TRANSPARENT).isPressing = true; - lastStyleIndex = STYLE_TRANSPARENT; - } - break; - case ChartConstants.STYLE_3D: if(ComparatorUtils.equals(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Style_Bright"), styleName)){ - styleList.get(STYLE_PLANE3D).isPressing = true; - lastStyleIndex = STYLE_PLANE3D; - } - break; - case ChartConstants.STYLE_OUTER:if(ComparatorUtils.equals(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Style_Bright"), styleName)){ - styleList.get(STYLE_HIGHLIGHT).isPressing = true; - lastStyleIndex = STYLE_HIGHLIGHT; - } - break; - default: - lastStyleIndex = -1; - break; - } - stylePane.setVisible(!(chart.getPlot().isSupport3D())); - this.repaint(); - } - } protected void checkDemosBackground() { if(this.styleList != null && !styleList.isEmpty()){ @@ -222,119 +162,10 @@ public abstract class AbstractChartTypePane extends FurtherBasicBeanPane{ } } - private void setPlotFillStyle(Chart chart){ - ChartPreStyleConfig manager = ChartPreStyleConfig.getInstance(); - Plot plot = chart.getPlot(); - Object preStyle = null; - String name = ""; - if(styleList.get(STYLE_SHADE).isPressing){ - name = com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Style_Retro"); - preStyle = manager.getPreStyle(name); - }else if(styleList.get(STYLE_TRANSPARENT).isPressing){ - name = com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Style_Fresh"); - preStyle = manager.getPreStyle(name); - }else if(styleList.get(STYLE_PLANE3D).isPressing){ - name = com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Style_Bright"); - preStyle = manager.getPreStyle(name); - }else if(styleList.get(STYLE_HIGHLIGHT).isPressing){ - name = com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Style_Bright"); - preStyle = manager.getPreStyle(name); - } - if(preStyle == null){ - plot.getPlotFillStyle().setColorStyle(ChartConstants.COLOR_DEFAULT); - }else{ - AttrFillStyle fillStyle = ChartUtils.chartColorMatching2AttrFillStyle((ChartColorMatching) preStyle); - fillStyle.setFillStyleName(name); - plot.setPlotFillStyle(fillStyle); - } - } - - /** - * 保存风格,对选中的风格做设置 - */ - public void updateBean(Chart chart) { - Plot oldPlot = chart.getPlot(); - Plot newPlot = this.setSelectedClonedPlotWithCondition(oldPlot); - checkTypeChange(oldPlot);//判断图表的类型是否发生变化 - if(styleList != null && !styleList.isEmpty()){ - if(styleList.get(STYLE_SHADE).isPressing && lastStyleIndex != STYLE_SHADE){ - lastStyleIndex = STYLE_SHADE; - chart.setPlot(newPlot); - chart.getPlot().setPlotStyle(ChartConstants.STYLE_SHADE); - resetChart(chart); - createCondition4Shade(chart); - setPlotFillStyle(chart); - }else if(styleList.get(STYLE_TRANSPARENT).isPressing && lastStyleIndex != STYLE_TRANSPARENT){ - lastStyleIndex = STYLE_TRANSPARENT; - chart.setPlot(newPlot); - chart.getPlot().setPlotStyle(ChartConstants.STYLE_TRANSPARENT); - resetChart(chart); - createCondition4Transparent(chart); - setPlotFillStyle(chart); - }else if(styleList.get(STYLE_PLANE3D).isPressing && lastStyleIndex != STYLE_PLANE3D){ - lastStyleIndex = STYLE_PLANE3D; - chart.setPlot(newPlot); - chart.getPlot().setPlotStyle(ChartConstants.STYLE_3D); - resetChart(chart); - createCondition4Plane3D(chart); - setPlotFillStyle(chart); - }else if(styleList.get(STYLE_HIGHLIGHT).isPressing && lastStyleIndex != STYLE_HIGHLIGHT){ - lastStyleIndex = STYLE_HIGHLIGHT; - chart.setPlot(newPlot); - chart.getPlot().setPlotStyle(ChartConstants.STYLE_OUTER); - resetChart(chart); - createCondition4HighLight(chart); - setPlotFillStyle(chart); - }else if(lastStyleIndex >= STYLE_SHADE && lastStyleIndex <= STYLE_HIGHLIGHT){ - if(styleList.get(lastStyleIndex).isDoubleClicked || typeChanged){ - chart.setPlot(newPlot); - resetChart(chart); - styleList.get(lastStyleIndex).isPressing = false; - checkDemosBackground(); - lastStyleIndex = -1; - } - } - - stylePane.setVisible(!(chart.getPlot().isSupport3D())); - this.repaint(); - } - } - - private Plot setSelectedClonedPlotWithCondition(Plot oldPlot){ - Plot newPlot = getSelectedClonedPlot(); - if(oldPlot != null && ComparatorUtils.equals(newPlot.getClass(), oldPlot.getClass())){ - if(oldPlot.getHotHyperLink() != null){ - NameJavaScriptGroup hotHyper = oldPlot.getHotHyperLink(); - try { - newPlot.setHotHyperLink((NameJavaScriptGroup)hotHyper.clone()); - } catch (CloneNotSupportedException e) { - FineLoggerFactory.getLogger().error("Error in Hyperlink, Please Check it.", e); - } - } - newPlot.setConditionCollection(oldPlot.getConditionCollection()); - newPlot.setSeriesDragEnable(oldPlot.isSeriesDragEnable()); - if(newPlot.isSupportZoomCategoryAxis() && newPlot.getxAxis() != null) { - newPlot.getxAxis().setZoom(oldPlot.getxAxis().isZoom()); - } - if(newPlot.isSupportTooltipInInteractivePane()) { - newPlot.setHotTooltipStyle(oldPlot.getHotTooltipStyle()); - } - - if(newPlot.isSupportAutoRefresh()) { - newPlot.setAutoRefreshPerSecond(oldPlot.getAutoRefreshPerSecond()); - } - - if (newPlot.isSupportAxisTip()) { - newPlot.setInteractiveAxisTooltip(oldPlot.isInteractiveAxisTooltip()); - } - } - return newPlot; - } - /** * 更新整个新的Chart类型 */ - public Chart updateBean() { + public T updateBean() { return null; } @@ -346,14 +177,6 @@ public abstract class AbstractChartTypePane extends FurtherBasicBeanPane{ chart.setBackground(null); } - protected void changePlotWithClone(Chart chart, Plot plot) { - try { - chart.switchPlot((Plot)plot.clone()); - } catch (CloneNotSupportedException e) { - FineLoggerFactory.getLogger().error("Error in change plot"); - } - } - /** * 重置 */ @@ -394,219 +217,6 @@ public abstract class AbstractChartTypePane extends FurtherBasicBeanPane{ return false; } - //高光渐变的默认属性设置 - private void createCondition4HighLight(Chart chart){ - if(chart != null){ - //标题 - Title title = new Title(chart.getTitle().getTextObject()); - chart.setTitle(title); - title.setTitleVisible(true); - TextAttr textAttr = title.getTextAttr(); - if (textAttr == null) { - textAttr = new TextAttr(); - title.setTextAttr(textAttr); - } - title.setPosition(Constants.LEFT); - textAttr.setFRFont(FRFont.getInstance("Microsoft YaHei", Font.BOLD, 16f, new Color(51, 51, 51))); - - //图例 - Legend legend = new Legend(); - legend.setFRFont(FRFont.getInstance("SimSun", Font.PLAIN, 9f, new Color(138,140,139))); - legend.setPosition(Constants.RIGHT_TOP); - chart.getPlot().setLegend(legend); - - //分类轴,现在只有柱形图,条形图,面积图 - if(chart.getPlot() instanceof CategoryPlot){ - CategoryPlot plot = (CategoryPlot)chart.getPlot(); - - //分类轴设置 - Axis cateAxis = plot.getxAxis(); - cateAxis.setAxisStyle(Constants.LINE_THICK); - cateAxis.setAxisColor(new Color(204, 220, 228)); - cateAxis.setTickMarkType(Constants.TICK_MARK_INSIDE); - cateAxis.setSecTickMarkType(Constants.TICK_MARK_NONE); - cateAxis.setShowAxisLabel(true); - cateAxis.getTextAttr().setFRFont(FRFont.getInstance("Microsoft YaHei", Font.PLAIN, 10f, new Color(138,140,139))); - - //值轴 - Axis valueAxis = plot.getyAxis(); - valueAxis.setAxisStyle(Constants.NONE); - valueAxis.setAxisColor(null); - valueAxis.setTickMarkType(Constants.TICK_MARK_INSIDE); - valueAxis.setSecTickMarkType(Constants.TICK_MARK_NONE); - valueAxis.setShowAxisLabel(true); - valueAxis.getTextAttr().setFRFont(FRFont.getInstance("SimSun", Font.PLAIN, 10f, new Color(138,140,139))); - - //绘图区 - plot.setBorderStyle(Constants.LINE_THIN); - plot.setBorderColor(new Color(204, 220, 228)); - plot.setBackground(ColorBackground.getInstance(new Color(248, 247, 245))); - plot.getyAxis().setMainGridStyle(Constants.LINE_THIN); - plot.getyAxis().setMainGridColor(new Color(192,192,192)); - } - - } - } - - //平面3D的默认属性设置 - private void createCondition4Plane3D(Chart chart){ - if(chart != null){ - //标题 - Title title = new Title(chart.getTitle().getTextObject()); - chart.setTitle(title); - title.setTitleVisible(true); - TextAttr textAttr = title.getTextAttr(); - if (textAttr == null) { - textAttr = new TextAttr(); - title.setTextAttr(textAttr); - } - title.setPosition(Constants.CENTER); - textAttr.setFRFont(FRFont.getInstance("Microsoft YaHei", Font.PLAIN, 16f, new Color(51,51,51))); - - //图例 - Legend legend = new Legend(); - legend.setFRFont(FRFont.getInstance("SimSun", Font.PLAIN, 9f, new Color(128,128,128))); - legend.setPosition(Constants.TOP); - chart.getPlot().setLegend(legend); - - //分类轴,现在只有柱形图,条形图,面积图 - if(chart.getPlot() instanceof CategoryPlot){ - CategoryPlot plot = (CategoryPlot)chart.getPlot(); - //分类轴设置 - Axis cateAxis = plot.getxAxis(); - cateAxis.setAxisStyle(Constants.LINE_THICK); - cateAxis.setAxisColor(new Color(57, 57, 57)); - cateAxis.setTickMarkType(Constants.TICK_MARK_NONE); - cateAxis.setSecTickMarkType(Constants.TICK_MARK_NONE); - cateAxis.setShowAxisLabel(true); - cateAxis.getTextAttr().setFRFont(FRFont.getInstance("Microsoft YaHei", Font.PLAIN, 10f, new Color(57,57,57))); - - //值轴设置 - Axis valueAxis = plot.getyAxis(); - valueAxis.setAxisStyle(Constants.LINE_NONE); - valueAxis.setTickMarkType(Constants.TICK_MARK_NONE); - valueAxis.setSecTickMarkType(Constants.TICK_MARK_NONE); - valueAxis.setShowAxisLabel(false); - - //绘图区 - plot.getyAxis().setMainGridStyle(Constants.LINE_THIN); - plot.getyAxis().setMainGridColor(new Color(192,192,192)); - chart.setBorderStyle(Constants.LINE_NONE); - - //数据标签 - ConditionAttr attrList = plot.getConditionCollection().getDefaultAttr(); - DataSeriesCondition attr = attrList.getExisted(AttrContents.class); - if(attr != null) { - attrList.remove(attr); - } - AttrContents attrContents = new AttrContents(); - attrContents.setPosition(Constants.OUTSIDE); - attrContents.setSeriesLabel(ChartConstants.VALUE_PARA); - attrContents.setTextAttr(new TextAttr(FRFont.getInstance("SimSun", Font.PLAIN, 9f, new Color(51,51,51)))); - attrList.addDataSeriesCondition(attrContents); - } - } - } - - //透明风格的默认属性设置 - private void createCondition4Transparent(Chart chart){ - if(chart != null){ - //标题 - Title title = new Title(chart.getTitle().getTextObject()); - chart.setTitle(title); - title.setTitleVisible(true); - TextAttr textAttr = title.getTextAttr(); - if (textAttr == null) { - textAttr = new TextAttr(); - title.setTextAttr(textAttr); - } - title.setPosition(Constants.LEFT); - textAttr.setFRFont(FRFont.getInstance("Microsoft YaHei", Font.BOLD, 16f, new Color(192,192,192))); - - //图例 - Legend legend = new Legend(); - legend.setFRFont(FRFont.getInstance("SimSun", Font.PLAIN, 9f, new Color(138,140,139))); - legend.setPosition(Constants.RIGHT_TOP); - chart.getPlot().setLegend(legend); - - Plot plot = chart.getPlot(); - //绘图区 - chart.setBackground(ColorBackground.getInstance(new Color(51,51,51))); - - //分类轴,现在只有柱形图,条形图,面积图 - if(plot instanceof CategoryPlot){ - //边框 - plot.setBorderStyle(Constants.LINE_THIN); - plot.setBorderColor(new Color(65,65,65)); - - //分类轴设置 - Axis cateAxis = plot.getxAxis(); - cateAxis.setAxisStyle(Constants.LINE_THICK); - cateAxis.setAxisColor(new Color(192,192,192)); - cateAxis.setTickMarkType(Constants.TICK_MARK_NONE); - cateAxis.setSecTickMarkType(Constants.TICK_MARK_NONE); - cateAxis.setShowAxisLabel(true); - cateAxis.getTextAttr().setFRFont(FRFont.getInstance("Microsoft YaHei", Font.PLAIN, 10f, new Color(150,150,150))); - - //值轴 - Axis valueAxis = plot.getyAxis(); - valueAxis.setShowAxisLabel(true); - valueAxis.setAxisStyle(Constants.LINE_NONE); - valueAxis.getTextAttr().setFRFont(FRFont.getInstance("SimSun", Font.PLAIN, 10f, new Color(150,150,150))); - valueAxis.setMainGridStyle(Constants.LINE_THIN); - valueAxis.setMainGridColor(new Color(63, 62, 62)); - } - } - } - - //渐变的默认属性设置 - private void createCondition4Shade(Chart chart){ - if(chart != null){ - //标题 - Title title = new Title(chart.getTitle().getTextObject()); - chart.setTitle(title); - title.setTitleVisible(true); - TextAttr textAttr = title.getTextAttr(); - if (textAttr == null) { - textAttr = new TextAttr(); - title.setTextAttr(textAttr); - } - title.setPosition(Constants.CENTER); - textAttr.setFRFont(FRFont.getInstance("Microsoft YaHei", Font.BOLD, 16f, new Color(0,51,102))); - - //图例 - Legend legend = new Legend(); - legend.setFRFont(FRFont.getInstance("SimSun", Font.PLAIN, 9f, new Color(128,128,128))); - legend.setPosition(Constants.BOTTOM); - chart.getPlot().setLegend(legend); - - //分类轴,现在只有柱形图,条形图,面积图 - if(chart.getPlot() instanceof CategoryPlot){ - CategoryPlot plot = (CategoryPlot)chart.getPlot(); - - //分类轴设置 - Axis cateAxis = plot.getxAxis(); - cateAxis.setAxisStyle(Constants.LINE_THICK); - cateAxis.setAxisColor(new Color(73, 100, 117)); - cateAxis.setTickMarkType(Constants.TICK_MARK_NONE); - cateAxis.setSecTickMarkType(Constants.TICK_MARK_NONE); - cateAxis.setShowAxisLabel(true); - cateAxis.getTextAttr().setFRFont(FRFont.getInstance("Microsoft YaHei", Font.PLAIN, 10f, new Color(128,128,128))); - - //值轴 - Axis valueAxis = plot.getyAxis(); - valueAxis.setShowAxisLabel(true); - valueAxis.getTextAttr().setFRFont(FRFont.getInstance("SimSun", Font.PLAIN, 10f, new Color(128,128,128))); - valueAxis.setAxisStyle(Constants.LINE_NONE); - - //绘图区 - plot.getyAxis().setMainGridStyle(Constants.LINE_THIN); - plot.getyAxis().setMainGridColor(new Color(192,192,192)); - plot.setHorizontalIntervalBackgroundColor(new Color(243,243,243)); - } - } - } - protected boolean needsResetChart(Chart chart){ return chart != null &&chart.getPlot() != null diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/AbstractDeprecatedChartTypePane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/AbstractDeprecatedChartTypePane.java new file mode 100644 index 000000000..81578ded5 --- /dev/null +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/AbstractDeprecatedChartTypePane.java @@ -0,0 +1,409 @@ +package com.fr.design.mainframe.chart.gui.type; + +import com.fr.base.ChartColorMatching; +import com.fr.base.ChartPreStyleConfig; +import com.fr.base.background.ColorBackground; +import com.fr.chart.base.AttrContents; +import com.fr.chart.base.AttrFillStyle; +import com.fr.chart.base.ChartConstants; +import com.fr.chart.base.ChartUtils; +import com.fr.chart.base.DataSeriesCondition; +import com.fr.chart.base.TextAttr; +import com.fr.chart.chartattr.Axis; +import com.fr.chart.chartattr.CategoryPlot; +import com.fr.chart.chartattr.Chart; +import com.fr.chart.chartattr.Legend; +import com.fr.chart.chartattr.Plot; +import com.fr.chart.chartattr.Title; +import com.fr.chart.chartglyph.ConditionAttr; +import com.fr.general.ComparatorUtils; +import com.fr.general.FRFont; +import com.fr.js.NameJavaScriptGroup; +import com.fr.log.FineLoggerFactory; +import com.fr.stable.Constants; + +import java.awt.Color; +import java.awt.Font; + +/** + * Created by shine on 2019/7/1. + */ +public abstract class AbstractDeprecatedChartTypePane extends AbstractChartTypePane { + + protected void changePlotWithClone(Chart chart, Plot plot) { + try { + chart.switchPlot((Plot) plot.clone()); + } catch (CloneNotSupportedException e) { + FineLoggerFactory.getLogger().error("Error in change plot"); + } + } + + /** + * 更新界面属性 + */ + public void populateBean(Chart chart) { + for (ChartImagePane imagePane : typeDemo) { + imagePane.isPressing = false; + } + for (ChartImagePane imagePane : styleList) { + imagePane.isPressing = false; + } + + if (styleList != null && !styleList.isEmpty()) { + int plotStyle = chart.getPlot().getPlotStyle(); + String styleName = chart.getPlot().getPlotFillStyle().getFillStyleName(); + + switch (plotStyle) { + case ChartConstants.STYLE_SHADE: + if (ComparatorUtils.equals(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Style_Retro"), styleName)) { + styleList.get(STYLE_SHADE).isPressing = true; + lastStyleIndex = STYLE_SHADE; + } + break; + case ChartConstants.STYLE_TRANSPARENT: + if (ComparatorUtils.equals(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Style_Fresh"), styleName)) { + styleList.get(STYLE_TRANSPARENT).isPressing = true; + lastStyleIndex = STYLE_TRANSPARENT; + } + break; + case ChartConstants.STYLE_3D: + if (ComparatorUtils.equals(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Style_Bright"), styleName)) { + styleList.get(STYLE_PLANE3D).isPressing = true; + lastStyleIndex = STYLE_PLANE3D; + } + break; + case ChartConstants.STYLE_OUTER: + if (ComparatorUtils.equals(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Style_Bright"), styleName)) { + styleList.get(STYLE_HIGHLIGHT).isPressing = true; + lastStyleIndex = STYLE_HIGHLIGHT; + } + break; + default: + lastStyleIndex = -1; + break; + } + stylePane.setVisible(!(chart.getPlot().isSupport3D())); + this.repaint(); + } + } + + public void updateBean(Chart chart) { + Plot oldPlot = chart.getPlot(); + Plot newPlot = this.setSelectedClonedPlotWithCondition(oldPlot); + checkTypeChange(oldPlot);//判断图表的类型是否发生变化 + if (styleList != null && !styleList.isEmpty()) { + if (styleList.get(STYLE_SHADE).isPressing && lastStyleIndex != STYLE_SHADE) { + lastStyleIndex = STYLE_SHADE; + chart.setPlot(newPlot); + chart.getPlot().setPlotStyle(ChartConstants.STYLE_SHADE); + resetChart(chart); + createCondition4Shade(chart); + setPlotFillStyle(chart); + } else if (styleList.get(STYLE_TRANSPARENT).isPressing && lastStyleIndex != STYLE_TRANSPARENT) { + lastStyleIndex = STYLE_TRANSPARENT; + chart.setPlot(newPlot); + chart.getPlot().setPlotStyle(ChartConstants.STYLE_TRANSPARENT); + resetChart(chart); + createCondition4Transparent(chart); + setPlotFillStyle(chart); + } else if (styleList.get(STYLE_PLANE3D).isPressing && lastStyleIndex != STYLE_PLANE3D) { + lastStyleIndex = STYLE_PLANE3D; + chart.setPlot(newPlot); + chart.getPlot().setPlotStyle(ChartConstants.STYLE_3D); + resetChart(chart); + createCondition4Plane3D(chart); + setPlotFillStyle(chart); + } else if (styleList.get(STYLE_HIGHLIGHT).isPressing && lastStyleIndex != STYLE_HIGHLIGHT) { + lastStyleIndex = STYLE_HIGHLIGHT; + chart.setPlot(newPlot); + chart.getPlot().setPlotStyle(ChartConstants.STYLE_OUTER); + resetChart(chart); + createCondition4HighLight(chart); + setPlotFillStyle(chart); + } else if (lastStyleIndex >= STYLE_SHADE && lastStyleIndex <= STYLE_HIGHLIGHT) { + if (styleList.get(lastStyleIndex).isDoubleClicked || typeChanged) { + chart.setPlot(newPlot); + resetChart(chart); + styleList.get(lastStyleIndex).isPressing = false; + checkDemosBackground(); + lastStyleIndex = -1; + } + } + + stylePane.setVisible(!(chart.getPlot().isSupport3D())); + this.repaint(); + } + } + + private Plot setSelectedClonedPlotWithCondition(Plot oldPlot) { + Plot newPlot = getSelectedClonedPlot(); + if (oldPlot != null && ComparatorUtils.equals(newPlot.getClass(), oldPlot.getClass())) { + if (oldPlot.getHotHyperLink() != null) { + NameJavaScriptGroup hotHyper = oldPlot.getHotHyperLink(); + try { + newPlot.setHotHyperLink((NameJavaScriptGroup) hotHyper.clone()); + } catch (CloneNotSupportedException e) { + FineLoggerFactory.getLogger().error("Error in Hyperlink, Please Check it.", e); + } + } + newPlot.setConditionCollection(oldPlot.getConditionCollection()); + newPlot.setSeriesDragEnable(oldPlot.isSeriesDragEnable()); + if (newPlot.isSupportZoomCategoryAxis() && newPlot.getxAxis() != null) { + newPlot.getxAxis().setZoom(oldPlot.getxAxis().isZoom()); + } + if (newPlot.isSupportTooltipInInteractivePane()) { + newPlot.setHotTooltipStyle(oldPlot.getHotTooltipStyle()); + } + + if (newPlot.isSupportAutoRefresh()) { + newPlot.setAutoRefreshPerSecond(oldPlot.getAutoRefreshPerSecond()); + } + + if (newPlot.isSupportAxisTip()) { + newPlot.setInteractiveAxisTooltip(oldPlot.isInteractiveAxisTooltip()); + } + } + return newPlot; + } + + //平面3D的默认属性设置 + private void createCondition4Plane3D(Chart chart) { + if (chart != null) { + //标题 + Title title = new Title(chart.getTitle().getTextObject()); + chart.setTitle(title); + title.setTitleVisible(true); + TextAttr textAttr = title.getTextAttr(); + if (textAttr == null) { + textAttr = new TextAttr(); + title.setTextAttr(textAttr); + } + title.setPosition(Constants.CENTER); + textAttr.setFRFont(FRFont.getInstance("Microsoft YaHei", Font.PLAIN, 16f, new Color(51, 51, 51))); + + //图例 + Legend legend = new Legend(); + legend.setFRFont(FRFont.getInstance("SimSun", Font.PLAIN, 9f, new Color(128, 128, 128))); + legend.setPosition(Constants.TOP); + chart.getPlot().setLegend(legend); + + //分类轴,现在只有柱形图,条形图,面积图 + if (chart.getPlot() instanceof CategoryPlot) { + CategoryPlot plot = (CategoryPlot) chart.getPlot(); + //分类轴设置 + Axis cateAxis = plot.getxAxis(); + cateAxis.setAxisStyle(Constants.LINE_THICK); + cateAxis.setAxisColor(new Color(57, 57, 57)); + cateAxis.setTickMarkType(Constants.TICK_MARK_NONE); + cateAxis.setSecTickMarkType(Constants.TICK_MARK_NONE); + cateAxis.setShowAxisLabel(true); + cateAxis.getTextAttr().setFRFont(FRFont.getInstance("Microsoft YaHei", Font.PLAIN, 10f, new Color(57, 57, 57))); + + //值轴设置 + Axis valueAxis = plot.getyAxis(); + valueAxis.setAxisStyle(Constants.LINE_NONE); + valueAxis.setTickMarkType(Constants.TICK_MARK_NONE); + valueAxis.setSecTickMarkType(Constants.TICK_MARK_NONE); + valueAxis.setShowAxisLabel(false); + + //绘图区 + plot.getyAxis().setMainGridStyle(Constants.LINE_THIN); + plot.getyAxis().setMainGridColor(new Color(192, 192, 192)); + chart.setBorderStyle(Constants.LINE_NONE); + + //数据标签 + ConditionAttr attrList = plot.getConditionCollection().getDefaultAttr(); + DataSeriesCondition attr = attrList.getExisted(AttrContents.class); + if (attr != null) { + attrList.remove(attr); + } + AttrContents attrContents = new AttrContents(); + attrContents.setPosition(Constants.OUTSIDE); + attrContents.setSeriesLabel(ChartConstants.VALUE_PARA); + attrContents.setTextAttr(new TextAttr(FRFont.getInstance("SimSun", Font.PLAIN, 9f, new Color(51, 51, 51)))); + attrList.addDataSeriesCondition(attrContents); + } + } + } + + //透明风格的默认属性设置 + private void createCondition4Transparent(Chart chart) { + if (chart != null) { + //标题 + Title title = new Title(chart.getTitle().getTextObject()); + chart.setTitle(title); + title.setTitleVisible(true); + TextAttr textAttr = title.getTextAttr(); + if (textAttr == null) { + textAttr = new TextAttr(); + title.setTextAttr(textAttr); + } + title.setPosition(Constants.LEFT); + textAttr.setFRFont(FRFont.getInstance("Microsoft YaHei", Font.BOLD, 16f, new Color(192, 192, 192))); + + //图例 + Legend legend = new Legend(); + legend.setFRFont(FRFont.getInstance("SimSun", Font.PLAIN, 9f, new Color(138, 140, 139))); + legend.setPosition(Constants.RIGHT_TOP); + chart.getPlot().setLegend(legend); + + Plot plot = chart.getPlot(); + //绘图区 + chart.setBackground(ColorBackground.getInstance(new Color(51, 51, 51))); + + //分类轴,现在只有柱形图,条形图,面积图 + if (plot instanceof CategoryPlot) { + //边框 + plot.setBorderStyle(Constants.LINE_THIN); + plot.setBorderColor(new Color(65, 65, 65)); + + //分类轴设置 + Axis cateAxis = plot.getxAxis(); + cateAxis.setAxisStyle(Constants.LINE_THICK); + cateAxis.setAxisColor(new Color(192, 192, 192)); + cateAxis.setTickMarkType(Constants.TICK_MARK_NONE); + cateAxis.setSecTickMarkType(Constants.TICK_MARK_NONE); + cateAxis.setShowAxisLabel(true); + cateAxis.getTextAttr().setFRFont(FRFont.getInstance("Microsoft YaHei", Font.PLAIN, 10f, new Color(150, 150, 150))); + + //值轴 + Axis valueAxis = plot.getyAxis(); + valueAxis.setShowAxisLabel(true); + valueAxis.setAxisStyle(Constants.LINE_NONE); + valueAxis.getTextAttr().setFRFont(FRFont.getInstance("SimSun", Font.PLAIN, 10f, new Color(150, 150, 150))); + valueAxis.setMainGridStyle(Constants.LINE_THIN); + valueAxis.setMainGridColor(new Color(63, 62, 62)); + } + } + } + + //渐变的默认属性设置 + private void createCondition4Shade(Chart chart) { + if (chart != null) { + //标题 + Title title = new Title(chart.getTitle().getTextObject()); + chart.setTitle(title); + title.setTitleVisible(true); + TextAttr textAttr = title.getTextAttr(); + if (textAttr == null) { + textAttr = new TextAttr(); + title.setTextAttr(textAttr); + } + title.setPosition(Constants.CENTER); + textAttr.setFRFont(FRFont.getInstance("Microsoft YaHei", Font.BOLD, 16f, new Color(0, 51, 102))); + + //图例 + Legend legend = new Legend(); + legend.setFRFont(FRFont.getInstance("SimSun", Font.PLAIN, 9f, new Color(128, 128, 128))); + legend.setPosition(Constants.BOTTOM); + chart.getPlot().setLegend(legend); + + //分类轴,现在只有柱形图,条形图,面积图 + if (chart.getPlot() instanceof CategoryPlot) { + CategoryPlot plot = (CategoryPlot) chart.getPlot(); + + //分类轴设置 + Axis cateAxis = plot.getxAxis(); + cateAxis.setAxisStyle(Constants.LINE_THICK); + cateAxis.setAxisColor(new Color(73, 100, 117)); + cateAxis.setTickMarkType(Constants.TICK_MARK_NONE); + cateAxis.setSecTickMarkType(Constants.TICK_MARK_NONE); + cateAxis.setShowAxisLabel(true); + cateAxis.getTextAttr().setFRFont(FRFont.getInstance("Microsoft YaHei", Font.PLAIN, 10f, new Color(128, 128, 128))); + + //值轴 + Axis valueAxis = plot.getyAxis(); + valueAxis.setShowAxisLabel(true); + valueAxis.getTextAttr().setFRFont(FRFont.getInstance("SimSun", Font.PLAIN, 10f, new Color(128, 128, 128))); + valueAxis.setAxisStyle(Constants.LINE_NONE); + + //绘图区 + plot.getyAxis().setMainGridStyle(Constants.LINE_THIN); + plot.getyAxis().setMainGridColor(new Color(192, 192, 192)); + plot.setHorizontalIntervalBackgroundColor(new Color(243, 243, 243)); + } + } + } + + //高光渐变的默认属性设置 + private void createCondition4HighLight(Chart chart) { + if (chart != null) { + //标题 + Title title = new Title(chart.getTitle().getTextObject()); + chart.setTitle(title); + title.setTitleVisible(true); + TextAttr textAttr = title.getTextAttr(); + if (textAttr == null) { + textAttr = new TextAttr(); + title.setTextAttr(textAttr); + } + title.setPosition(Constants.LEFT); + textAttr.setFRFont(FRFont.getInstance("Microsoft YaHei", Font.BOLD, 16f, new Color(51, 51, 51))); + + //图例 + Legend legend = new Legend(); + legend.setFRFont(FRFont.getInstance("SimSun", Font.PLAIN, 9f, new Color(138, 140, 139))); + legend.setPosition(Constants.RIGHT_TOP); + chart.getPlot().setLegend(legend); + + //分类轴,现在只有柱形图,条形图,面积图 + if (chart.getPlot() instanceof CategoryPlot) { + CategoryPlot plot = (CategoryPlot) chart.getPlot(); + + //分类轴设置 + Axis cateAxis = plot.getxAxis(); + cateAxis.setAxisStyle(Constants.LINE_THICK); + cateAxis.setAxisColor(new Color(204, 220, 228)); + cateAxis.setTickMarkType(Constants.TICK_MARK_INSIDE); + cateAxis.setSecTickMarkType(Constants.TICK_MARK_NONE); + cateAxis.setShowAxisLabel(true); + cateAxis.getTextAttr().setFRFont(FRFont.getInstance("Microsoft YaHei", Font.PLAIN, 10f, new Color(138, 140, 139))); + + //值轴 + Axis valueAxis = plot.getyAxis(); + valueAxis.setAxisStyle(Constants.NONE); + valueAxis.setAxisColor(null); + valueAxis.setTickMarkType(Constants.TICK_MARK_INSIDE); + valueAxis.setSecTickMarkType(Constants.TICK_MARK_NONE); + valueAxis.setShowAxisLabel(true); + valueAxis.getTextAttr().setFRFont(FRFont.getInstance("SimSun", Font.PLAIN, 10f, new Color(138, 140, 139))); + + //绘图区 + plot.setBorderStyle(Constants.LINE_THIN); + plot.setBorderColor(new Color(204, 220, 228)); + plot.setBackground(ColorBackground.getInstance(new Color(248, 247, 245))); + plot.getyAxis().setMainGridStyle(Constants.LINE_THIN); + plot.getyAxis().setMainGridColor(new Color(192, 192, 192)); + } + + } + } + + private void setPlotFillStyle(Chart chart) { + ChartPreStyleConfig manager = ChartPreStyleConfig.getInstance(); + Plot plot = chart.getPlot(); + Object preStyle = null; + String name = ""; + if (styleList.get(STYLE_SHADE).isPressing) { + name = com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Style_Retro"); + preStyle = manager.getPreStyle(name); + } else if (styleList.get(STYLE_TRANSPARENT).isPressing) { + name = com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Style_Fresh"); + preStyle = manager.getPreStyle(name); + } else if (styleList.get(STYLE_PLANE3D).isPressing) { + name = com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Style_Bright"); + preStyle = manager.getPreStyle(name); + } else if (styleList.get(STYLE_HIGHLIGHT).isPressing) { + name = com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Style_Bright"); + preStyle = manager.getPreStyle(name); + } + if (preStyle == null) { + plot.getPlotFillStyle().setColorStyle(ChartConstants.COLOR_DEFAULT); + } else { + AttrFillStyle fillStyle = ChartUtils.chartColorMatching2AttrFillStyle((ChartColorMatching) preStyle); + fillStyle.setFillStyleName(name); + plot.setPlotFillStyle(fillStyle); + } + } + +} diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/AreaPlotPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/AreaPlotPane.java index 425f50807..a50bc52b5 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/AreaPlotPane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/AreaPlotPane.java @@ -17,7 +17,7 @@ import com.fr.locale.InterProviderFactory; * @author kunsnat E-mail:kunsnat@gmail.com * @version 创建时间:2012-12-25 下午06:57:36 */ -public class AreaPlotPane extends AbstractChartTypePane{ +public class AreaPlotPane extends AbstractDeprecatedChartTypePane { private static final int STACK_AREA_CHART = 0; private static final int PERCENT_AREA_LINE_CHART = 1; diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/BubblePlotPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/BubblePlotPane.java index b3e7cd34a..551a97523 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/BubblePlotPane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/BubblePlotPane.java @@ -13,8 +13,8 @@ import com.fr.locale.InterProviderFactory; * @author kunsnat E-mail:kunsnat@gmail.com * @version 创建时间:2012-12-25 下午06:56:47 */ -public class BubblePlotPane extends AbstractChartTypePane { - private static final long serialVersionUID = -601566194238908115L; +public class BubblePlotPane extends AbstractDeprecatedChartTypePane { + private static final long serialVersionUID = -601566194238908115L; private static final int BUBBLE_CHART = 0; diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/CustomPlotPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/CustomPlotPane.java index 8e367444f..f81b1168c 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/CustomPlotPane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/CustomPlotPane.java @@ -11,7 +11,7 @@ import com.fr.locale.InterProviderFactory; * @author kunsnat E-mail:kunsnat@gmail.com * @version 创建时间:2012-12-21 下午06:17:40 */ -public class CustomPlotPane extends AbstractChartTypePane { +public class CustomPlotPane extends AbstractDeprecatedChartTypePane { @Override protected String getPlotTypeID() { diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/DonutPlotPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/DonutPlotPane.java index c1cd47d78..0b57d225d 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/DonutPlotPane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/DonutPlotPane.java @@ -22,10 +22,10 @@ import java.text.DecimalFormat; * @author eason * */ -public class DonutPlotPane extends AbstractChartTypePane{ - private static final long serialVersionUID = -7084314809934346710L; - private static final int DONUT_CHART = 0; //2d圆环图 - private static final int THREE_D_DONUT_CHART = 1; //3D圆环图 +public class DonutPlotPane extends AbstractDeprecatedChartTypePane { + private static final long serialVersionUID = -7084314809934346710L; + private static final int DONUT_CHART = 0; //2d圆环图 + private static final int THREE_D_DONUT_CHART = 1; //3D圆环图 @Override protected String[] getTypeIconPath() { diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/FunnelPlotPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/FunnelPlotPane.java index 2de685cb8..1b00f7a2a 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/FunnelPlotPane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/FunnelPlotPane.java @@ -18,7 +18,7 @@ import java.text.DecimalFormat; * Time: 下午2:50 * To change this template use File | Settings | File Templates. */ -public class FunnelPlotPane extends AbstractChartTypePane{ +public class FunnelPlotPane extends AbstractDeprecatedChartTypePane { private static final int FUNNEL_CHART = 0; diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/GanttPlotPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/GanttPlotPane.java index b1845bfe4..1bae398b5 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/GanttPlotPane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/GanttPlotPane.java @@ -11,7 +11,7 @@ import com.fr.locale.InterProviderFactory; * @author kunsnat E-mail:kunsnat@gmail.com * @version 创建时间:2012-12-26 上午10:38:18 */ -public class GanttPlotPane extends AbstractChartTypePane{ +public class GanttPlotPane extends AbstractDeprecatedChartTypePane { private static final long serialVersionUID = -601566194238908115L; private static final int GANTT = 0; diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/GisMapPlotPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/GisMapPlotPane.java index 9911ce4fb..e62f2e5c5 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/GisMapPlotPane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/GisMapPlotPane.java @@ -19,10 +19,10 @@ import java.awt.BorderLayout; import java.awt.Component; -public class GisMapPlotPane extends AbstractChartTypePane{ - +public class GisMapPlotPane extends AbstractDeprecatedChartTypePane { + private static final long serialVersionUID = 2595221900000305396L; - + private static final int GISMAP = 0; private UITextField keyInput; diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/LinePlotPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/LinePlotPane.java index 0f93938bb..e5e23d2bc 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/LinePlotPane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/LinePlotPane.java @@ -9,7 +9,7 @@ import com.fr.locale.InterProviderFactory; import com.fr.log.FineLoggerFactory; -public class LinePlotPane extends AbstractChartTypePane{ +public class LinePlotPane extends AbstractDeprecatedChartTypePane { private static final int LINE_CHART = 0; diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/MapPlotPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/MapPlotPane.java index d761be371..2b606fc06 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/MapPlotPane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/MapPlotPane.java @@ -16,7 +16,7 @@ import com.fr.log.FineLoggerFactory; import javax.swing.JPanel; import java.awt.BorderLayout; -public class MapPlotPane extends AbstractChartTypePane { +public class MapPlotPane extends AbstractDeprecatedChartTypePane { private boolean isSvgMap = true; // 默认是svg地图 diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/MeterPlotPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/MeterPlotPane.java index 10293b68c..a02bcf5d1 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/MeterPlotPane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/MeterPlotPane.java @@ -16,9 +16,9 @@ import com.fr.log.FineLoggerFactory; * @author kunsnat E-mail:kunsnat@gmail.com * @version 创建时间:2012-12-26 上午10:48:57 */ -public class MeterPlotPane extends AbstractChartTypePane { - - private static final int METER = 0; +public class MeterPlotPane extends AbstractDeprecatedChartTypePane { + + private static final int METER = 0; private static final int BLUE_METER =1; private static final int SIMPLE_METER = 2; diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/PiePlotPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/PiePlotPane.java index eeccd2246..4212d76c4 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/PiePlotPane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/PiePlotPane.java @@ -21,8 +21,8 @@ import java.text.DecimalFormat; * @author kunsnat E-mail:kunsnat@gmail.com * @version 创建时间:2012-12-25 下午06:55:33 */ -public class PiePlotPane extends AbstractChartTypePane{ - private static final long serialVersionUID = -601566194238908115L; +public class PiePlotPane extends AbstractDeprecatedChartTypePane { + private static final long serialVersionUID = -601566194238908115L; private static final int PIE_CHART = 0; private static final int THREE_D_PIE_CHART = 1; diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/RadarPlotPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/RadarPlotPane.java index 50e4a756e..e3e55cb85 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/RadarPlotPane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/RadarPlotPane.java @@ -11,7 +11,7 @@ import com.fr.locale.InterProviderFactory; * @author kunsnat E-mail:kunsnat@gmail.com * @version 创建时间:2012-12-26 上午09:55:01 */ -public class RadarPlotPane extends AbstractChartTypePane{ +public class RadarPlotPane extends AbstractDeprecatedChartTypePane { private static final long serialVersionUID = -601566194238908115L; private static final int RADAR = 0; diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/RangePlotPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/RangePlotPane.java index f87c6074d..c685b4c3b 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/RangePlotPane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/RangePlotPane.java @@ -12,7 +12,7 @@ import com.fr.locale.InterProviderFactory; * @author kunsnat E-mail:kunsnat@gmail.com * @version 创建时间:2012-12-26 上午10:43:50 */ -public class RangePlotPane extends AbstractChartTypePane{ +public class RangePlotPane extends AbstractDeprecatedChartTypePane { private static final long serialVersionUID = -601566194238908115L; private static final int RANGE = 0; diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/StockPlotPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/StockPlotPane.java index 63f4ead33..c8c88fae1 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/StockPlotPane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/StockPlotPane.java @@ -11,8 +11,8 @@ import com.fr.locale.InterProviderFactory; * @author kunsnat E-mail:kunsnat@gmail.com * @version 创建时间:2012-12-26 上午10:52:36 */ -public class StockPlotPane extends AbstractChartTypePane { - +public class StockPlotPane extends AbstractDeprecatedChartTypePane { + private static final int STOCK = 0; diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/UserDefinedChartTypePane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/UserDefinedChartTypePane.java index 1f40de8be..473c16c37 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/UserDefinedChartTypePane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/UserDefinedChartTypePane.java @@ -1,12 +1,14 @@ package com.fr.design.mainframe.chart.gui.type; import com.fr.chart.chartattr.Chart; +import com.fr.common.annotations.Compatible; /** * Created by mengao on 2017/8/30. * 不能删掉这个类,echarts插件中用到 */ -public abstract class UserDefinedChartTypePane extends AbstractChartTypePane { +@Compatible +public abstract class UserDefinedChartTypePane extends AbstractDeprecatedChartTypePane { protected String[] getTypeLayoutPath() { return new String[0]; } diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/XYScatterPlotPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/XYScatterPlotPane.java index 46a5b13c0..eab3a9837 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/XYScatterPlotPane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/XYScatterPlotPane.java @@ -14,7 +14,7 @@ import com.fr.stable.Constants; * @author kunsnat E-mail:kunsnat@gmail.com * @version 创建时间:2012-12-25 下午08:33:55 */ -public class XYScatterPlotPane extends AbstractChartTypePane{ +public class XYScatterPlotPane extends AbstractDeprecatedChartTypePane { private static final long serialVersionUID = -601566194238908115L; private static final int XYSCATTER_CHART = 0; diff --git a/designer-chart/src/main/java/com/fr/extended/chart/ExtendedTypePane.java b/designer-chart/src/main/java/com/fr/extended/chart/ExtendedTypePane.java index ccc39b525..affc3a611 100644 --- a/designer-chart/src/main/java/com/fr/extended/chart/ExtendedTypePane.java +++ b/designer-chart/src/main/java/com/fr/extended/chart/ExtendedTypePane.java @@ -1,6 +1,5 @@ package com.fr.extended.chart; -import com.fr.chart.chartattr.Chart; import com.fr.chart.charttypes.ChartTypeManager; import com.fr.chartx.attr.ChartProvider; import com.fr.design.mainframe.chart.gui.type.AbstractChartTypePane; @@ -9,7 +8,7 @@ import com.fr.design.mainframe.chart.gui.type.ChartImagePane; /** * Created by shine on 2018/3/5. */ -public class ExtendedTypePane extends AbstractChartTypePane { +public class ExtendedTypePane extends AbstractChartTypePane { @Override protected String[] getTypeIconPath() { @@ -35,7 +34,7 @@ public class ExtendedTypePane extends AbstractChartType } @Override - public void populateBean(Chart chart) { + public void populateBean(AbstractChart chart) { if (getTypeIconPath().length > 0) { for (ChartImagePane imagePane : typeDemo) { imagePane.isPressing = false; @@ -47,7 +46,7 @@ public class ExtendedTypePane extends AbstractChartType } @Override - public void updateBean(Chart chart) { + public void updateBean(AbstractChart chart) { update((T) chart); if (getTypeIconPath().length > 0) { diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/type/AbstractVanChartTypePane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/type/AbstractVanChartTypePane.java index b16c9237e..9ae650d97 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/type/AbstractVanChartTypePane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/type/AbstractVanChartTypePane.java @@ -12,9 +12,8 @@ import com.fr.design.gui.ilable.MultilineLabel; import com.fr.design.mainframe.chart.gui.type.AbstractChartTypePane; import com.fr.design.mainframe.chart.gui.type.ChartImagePane; import com.fr.general.Background; -import com.fr.log.FineLoggerFactory; - import com.fr.js.NameJavaScriptGroup; +import com.fr.log.FineLoggerFactory; import com.fr.plugin.chart.attr.plot.VanChartPlot; import com.fr.plugin.chart.base.VanChartTools; import com.fr.plugin.chart.base.VanChartZoom; @@ -25,7 +24,7 @@ import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; -public abstract class AbstractVanChartTypePane extends AbstractChartTypePane{ +public abstract class AbstractVanChartTypePane extends AbstractChartTypePane { private static final long serialVersionUID = 7743244512351499265L; private UICheckBox largeModelCheckBox; diff --git a/designer-realize/src/main/java/com/fr/poly/PolyComponentsBar.java b/designer-realize/src/main/java/com/fr/poly/PolyComponentsBar.java index 097528c68..d06f77af4 100644 --- a/designer-realize/src/main/java/com/fr/poly/PolyComponentsBar.java +++ b/designer-realize/src/main/java/com/fr/poly/PolyComponentsBar.java @@ -64,9 +64,9 @@ public class PolyComponentsBar extends JToolBar { ); this.add(serIcons[0]); for (int i = 0; i < typeLen; i++) { - String chartID = typeName[i].getPlotID(); + String chartID = typeName[i].getChartID(); String iconPath = ChartTypeInterfaceManager.getInstance().getIconPath(chartID); - BaseChartCollection chartCollection = BaseChartGetter.getStaticChartCollection(chartID); + BaseChartCollection chartCollection = BaseChartGetter.createChartCollection(chartID); serIcons[i + 1] = new SerIcon(chartCollection, InterProviderFactory.getProvider().getLocText(typeName[i].getName()), iconPath); this.add(serIcons[i + 1]); } From a8993872e22b49fd7e857a83d34c4f4a69b27ca9 Mon Sep 17 00:00:00 2001 From: zheng Date: Wed, 10 Jul 2019 19:19:21 +0800 Subject: [PATCH 037/217] =?UTF-8?q?CHART-9141=20=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E5=9B=BE=E8=A1=A8=E8=AE=BE=E8=AE=A1=E5=99=A8=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chart/gui/ChartDesignerOtherPane.java | 65 ------------------- 1 file changed, 65 deletions(-) delete mode 100644 designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/ChartDesignerOtherPane.java diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/ChartDesignerOtherPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/ChartDesignerOtherPane.java deleted file mode 100644 index 4f109bd55..000000000 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/ChartDesignerOtherPane.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (c) 2001-2014,FineReport Inc, All Rights Reserved. - */ - -package com.fr.design.mainframe.chart.gui; - -import com.fr.design.mainframe.chart.gui.other.ChartDesignerConditionAttrPane; -import com.fr.design.mainframe.chart.gui.other.ChartDesignerInteractivePane; -import com.fr.design.dialog.BasicPane; - - -import javax.swing.*; -import java.awt.*; -import java.util.*; - -/** - * 图表设计器的图标属性表高级tab - * Created by IntelliJ IDEA. - * Author : daisy - * Version: 6.5.6 - * Date: 14-10-16 - * Time: 下午2:04 - */ -public class ChartDesignerOtherPane extends ChartOtherPane { - - @Override - protected JPanel createContentPane() { - JPanel content = new JPanel(new BorderLayout()); - otherPane = new ChartTabPane(); - content.add(otherPane, BorderLayout.CENTER); - return content; - } - - /** - * 界面标题 - * - * @return 返回标题. - */ - public String title4PopupWindow() { - return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Advanced"); - } - - private boolean isHaveCondition() { - return hasCondition; - } - - - private class ChartTabPane extends TabPane { - - @Override - protected java.util.List initPaneList() { - java.util.List paneList = new ArrayList(); - interactivePane = new ChartDesignerInteractivePane(ChartDesignerOtherPane.this); - - paneList.add(interactivePane); - - if (ChartDesignerOtherPane.this.isHaveCondition()) { - conditionAttrPane = new ChartDesignerConditionAttrPane(); - paneList.add(conditionAttrPane); - } - return paneList; - } - - } -} \ No newline at end of file From 7c76b1e46323e216467734712141381b0884c84e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E5=B2=B3?= <445798420@qq.com> Date: Wed, 17 Jul 2019 17:25:55 +0800 Subject: [PATCH 038/217] =?UTF-8?q?CHART-4798=20=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E9=9B=86=E6=95=B0=E6=8D=AE=E6=BA=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 分类系列使用字段名时,value和series的fieldName放反了 --- .../chartx/component/SeriesValueFieldComboBoxPane.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/designer-chart/src/main/java/com/fr/design/chartx/component/SeriesValueFieldComboBoxPane.java b/designer-chart/src/main/java/com/fr/design/chartx/component/SeriesValueFieldComboBoxPane.java index 30ae364b7..4372cf0db 100644 --- a/designer-chart/src/main/java/com/fr/design/chartx/component/SeriesValueFieldComboBoxPane.java +++ b/designer-chart/src/main/java/com/fr/design/chartx/component/SeriesValueFieldComboBoxPane.java @@ -79,8 +79,8 @@ public class SeriesValueFieldComboBoxPane extends AbstractCustomFieldComboBoxPan List list = new ArrayList(); for (SeriesValueField seriesValueField : seriesValueCorrelationDefinition.getSeriesValueFieldList()) { Object[] array = new Object[]{ - seriesValueField.getSeries().getFieldName(), seriesValueField.getValue().getFieldName(), + seriesValueField.getSeries().getFieldName(), DataPaneHelper.getFunctionString(seriesValueField.getValue().getDataFunction()) }; list.add(array); @@ -92,8 +92,8 @@ public class SeriesValueFieldComboBoxPane extends AbstractCustomFieldComboBoxPan protected void setTableModelListToTBean(List tableValues, SeriesValueCorrelationDefinition seriesValueCorrelationDefinition) { List seriesValueFields = new ArrayList(); for (Object[] line : tableValues) { - ColumnField series = new ColumnField(GeneralUtils.objectToString(line[0])); - ColumnField value = new ColumnField(GeneralUtils.objectToString(line[1])); + ColumnField value = new ColumnField(GeneralUtils.objectToString(line[0])); + ColumnField series = new ColumnField(GeneralUtils.objectToString(line[1])); value.setDataFunction(DataPaneHelper.getFunctionByName(GeneralUtils.objectToString(line[2]))); SeriesValueField seriesValueField = new SeriesValueField(); seriesValueField.setValue(value); From e191c65c9ca7afec2c14851c416f522a923a6f31 Mon Sep 17 00:00:00 2001 From: zheng Date: Thu, 18 Jul 2019 17:49:03 +0800 Subject: [PATCH 039/217] =?UTF-8?q?CHART-9141=20filter=E7=95=8C=E9=9D=A2&x?= =?UTF-8?q?ml=E3=80=81processor=E4=B8=8D=E5=90=88=E7=90=86=E6=94=B9?= =?UTF-8?q?=E6=88=90=E6=9E=9A=E4=B8=BE=E3=80=81result=E6=B5=81=E7=A8=8B?= =?UTF-8?q?=E4=B8=80=E9=83=A8=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../component/AbstractSingleFilterPane.java | 171 ++++++++++++++++++ .../diff/MultiCategoryCellDataFieldsPane.java | 47 +++++ .../diff/MultiCategoryDataSetFieldsPane.java | 47 +++++ .../actions/insert/flot/ChartFloatAction.java | 8 +- 4 files changed, 268 insertions(+), 5 deletions(-) create mode 100644 designer-chart/src/main/java/com/fr/design/chartx/component/AbstractSingleFilterPane.java diff --git a/designer-chart/src/main/java/com/fr/design/chartx/component/AbstractSingleFilterPane.java b/designer-chart/src/main/java/com/fr/design/chartx/component/AbstractSingleFilterPane.java new file mode 100644 index 000000000..7c494aac1 --- /dev/null +++ b/designer-chart/src/main/java/com/fr/design/chartx/component/AbstractSingleFilterPane.java @@ -0,0 +1,171 @@ +package com.fr.design.chartx.component; + +import com.fr.base.Utils; +import com.fr.chartx.data.field.DataFilterProperties; +import com.fr.design.gui.frpane.AbstractAttrNoScrollPane; +import com.fr.design.gui.icheckbox.UICheckBox; +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.data.PresentComboBox; +import com.fr.design.mainframe.chart.gui.style.AbstractChartTabPane; +import com.fr.van.chart.designer.TableLayout4VanChartHelper; + +import javax.swing.BorderFactory; +import javax.swing.JPanel; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; +import java.awt.BorderLayout; +import java.awt.Component; +import java.awt.Dimension; + +/** + * Created by shine on 2019/07/18. + */ +public abstract class AbstractSingleFilterPane extends AbstractChartTabPane { + + private static final int FIL_HEIGHT = 150; + + private UICheckBox useTopCheckBox; + + private UITextField topNumTextField; + private UICheckBox hideNullCheckBox; + private UICheckBox mergeOtherCheckBox; + + private PresentComboBox present; + + private AbstractAttrNoScrollPane parent; + + private JPanel topPane; + + public AbstractSingleFilterPane() { + super(true); + //todo@shinerefactor present的时候这边可以整理下 + // this.parent = parent; + } + + @Override + public Dimension getPreferredSize() { + Dimension dim = super.getPreferredSize(); + dim.height = FIL_HEIGHT; + return dim; + } + + + protected void layoutContentPane() { + super.layoutContentPane(); + leftcontentPane.setBorder(BorderFactory.createEmptyBorder()); + } + + public void reloaPane(JPanel pane) { + super.reloaPane(pane); + leftcontentPane.setBorder(BorderFactory.createEmptyBorder()); + } + + @Override + protected JPanel createContentPane() { + this.setLayout(new BorderLayout()); + JPanel pane = initPane(); + this.add(pane, BorderLayout.NORTH); + return pane; + } + + + private JPanel initPane() { + useTopCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Only_Use_Before_Records")); + JPanel panel1 = new JPanel(new BorderLayout()); + JPanel panel2 = new JPanel(new BorderLayout()); + panel1.add(useTopCheckBox, BorderLayout.NORTH); + topNumTextField = new UITextField(); + UILabel label = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Records_Num")); + mergeOtherCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Data_CombineOther")); + mergeOtherCheckBox.setSelected(true); + double p = TableLayout.PREFERRED; + double f = TableLayout.FILL; + double[] columnSize = {p, f}; + double[] rowSize = {p, p}; + Component[][] components = new Component[][]{ + new Component[]{label, topNumTextField}, + new Component[]{mergeOtherCheckBox, null} + }; + + topPane = TableLayout4VanChartHelper.createGapTableLayoutPane(components, rowSize, columnSize); + topPane.setBorder(BorderFactory.createEmptyBorder(10, 15, 0, 0)); + //默认不显示 + topPane.setVisible(false); + panel1.add(topPane, BorderLayout.CENTER); + hideNullCheckBox = new UICheckBox(title4PopupWindow() + " is null, hidden"); + panel2.add(hideNullCheckBox, BorderLayout.NORTH); + + useTopCheckBox.addChangeListener(new ChangeListener() { + public void stateChanged(ChangeEvent e) { + checkBoxUse(); + } + }); + + present = new PresentComboBox() { + protected void fireChange() { + fire(); + } + }; + JPanel presentPane = TableLayout4VanChartHelper.createGapTableLayoutPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Style_Present"), present); + panel2.add(presentPane, BorderLayout.SOUTH); + + double[] column = {f}; + double[] row = {p, p}; + Component[][] coms = new Component[][]{ + new Component[]{panel1}, + new Component[]{panel2} + }; + return TableLayout4VanChartHelper.createGapTableLayoutPane(coms, row, column); + } + + + private void fire() { + if (this.parent != null) { + parent.attributeChanged(); + } + } + + /** + * 检查Box是否可用 + */ + public void checkBoxUse() { + topPane.setVisible(useTopCheckBox.isSelected()); + } + + @Override + public void populateBean(DataFilterProperties ob) { + useTopCheckBox.setSelected(ob.isUseTop()); + + topNumTextField.setText(String.valueOf(ob.getTop())); + + hideNullCheckBox.setSelected(ob.isHideNull()); + + mergeOtherCheckBox.setSelected(ob.isMerge()); + + present.populate(ob.getPresent()); + + checkBoxUse(); + } + + @Override + public DataFilterProperties updateBean() { + DataFilterProperties dataFilterProperties = new DataFilterProperties(); + + dataFilterProperties.setUseTop(useTopCheckBox.isSelected()); + + Number number = Utils.objectToNumber(topNumTextField.getText(), true); + if (number != null) { + dataFilterProperties.setTop(number.intValue()); + } + dataFilterProperties.setHideNull(hideNullCheckBox.isSelected()); + + dataFilterProperties.setMerge(mergeOtherCheckBox.isSelected()); + + dataFilterProperties.setPresent(present.update()); + + return dataFilterProperties; + } + +} diff --git a/designer-chart/src/main/java/com/fr/design/chartx/fields/diff/MultiCategoryCellDataFieldsPane.java b/designer-chart/src/main/java/com/fr/design/chartx/fields/diff/MultiCategoryCellDataFieldsPane.java index 76588271e..3645a08db 100644 --- a/designer-chart/src/main/java/com/fr/design/chartx/fields/diff/MultiCategoryCellDataFieldsPane.java +++ b/designer-chart/src/main/java/com/fr/design/chartx/fields/diff/MultiCategoryCellDataFieldsPane.java @@ -1,9 +1,12 @@ package com.fr.design.chartx.fields.diff; import com.fr.chartx.data.field.ColumnField; +import com.fr.chartx.data.field.SeriesValueCorrelationDefinition; import com.fr.chartx.data.field.diff.MultiCategoryColumnFieldCollection; +import com.fr.design.chartx.component.AbstractSingleFilterPane; import com.fr.design.chartx.component.MultiTinyFormulaPane; import com.fr.design.formula.TinyFormulaPane; +import com.fr.van.chart.map.designer.VanChartGroupPane; import javax.swing.JPanel; import java.util.List; @@ -15,6 +18,9 @@ public class MultiCategoryCellDataFieldsPane extends AbstractCellDataFieldsWithS private MultiTinyFormulaPane multiCategoryPane; + private AbstractSingleFilterPane seriesFilterPane; + private AbstractSingleFilterPane categoryFilterPane; + private void createMultiFormulaPane() { if (multiCategoryPane == null) { multiCategoryPane = new MultiTinyFormulaPane(); @@ -29,6 +35,28 @@ public class MultiCategoryCellDataFieldsPane extends AbstractCellDataFieldsWithS return multiCategoryPane; } + @Override + protected JPanel createSouthPane() { + if (seriesFilterPane == null) { + seriesFilterPane = new AbstractSingleFilterPane() { + @Override + public String title4PopupWindow() { + //todo@shinerefactor + return "series"; + } + }; + categoryFilterPane = new AbstractSingleFilterPane() { + @Override + public String title4PopupWindow() { + return "category"; + } + }; + } + return new VanChartGroupPane(new String[]{seriesFilterPane.title4PopupWindow(), categoryFilterPane.title4PopupWindow()} + , new JPanel[]{seriesFilterPane, categoryFilterPane}) { + }; + } + @Override protected String[] fieldLabels() { return new String[0]; @@ -51,6 +79,16 @@ public class MultiCategoryCellDataFieldsPane extends AbstractCellDataFieldsWithS multiCategoryPane.populate(categoryList); populateSeriesValuePane(multiCategoryColumnFieldCollection); + + SeriesValueCorrelationDefinition seriesValueCorrelationDefinition = multiCategoryColumnFieldCollection.getSeriesValueCorrelationDefinition(); + if (seriesValueCorrelationDefinition != null) { + seriesFilterPane.populateBean(seriesValueCorrelationDefinition.getFilterProperties()); + + } + + if (categoryList != null && !categoryList.isEmpty()) { + categoryFilterPane.populateBean(categoryList.get(0).getFilterProperties()); + } } @Override @@ -63,6 +101,15 @@ public class MultiCategoryCellDataFieldsPane extends AbstractCellDataFieldsWithS updateSeriesValuePane(fieldCollection); + SeriesValueCorrelationDefinition seriesValueCorrelationDefinition = fieldCollection.getSeriesValueCorrelationDefinition(); + if (seriesValueCorrelationDefinition != null) { + seriesValueCorrelationDefinition.setFilterProperties(seriesFilterPane.updateBean()); + } + + if (categoryList != null && !categoryList.isEmpty()) { + categoryList.get(0).setFilterProperties(categoryFilterPane.updateBean()); + } + return fieldCollection; } } diff --git a/designer-chart/src/main/java/com/fr/design/chartx/fields/diff/MultiCategoryDataSetFieldsPane.java b/designer-chart/src/main/java/com/fr/design/chartx/fields/diff/MultiCategoryDataSetFieldsPane.java index 1abe2b184..5b18d8ae8 100644 --- a/designer-chart/src/main/java/com/fr/design/chartx/fields/diff/MultiCategoryDataSetFieldsPane.java +++ b/designer-chart/src/main/java/com/fr/design/chartx/fields/diff/MultiCategoryDataSetFieldsPane.java @@ -1,9 +1,12 @@ package com.fr.design.chartx.fields.diff; import com.fr.chartx.data.field.ColumnField; +import com.fr.chartx.data.field.SeriesValueCorrelationDefinition; import com.fr.chartx.data.field.diff.MultiCategoryColumnFieldCollection; +import com.fr.design.chartx.component.AbstractSingleFilterPane; import com.fr.design.chartx.component.MultiComboBoxPane; import com.fr.design.gui.icombobox.UIComboBox; +import com.fr.van.chart.map.designer.VanChartGroupPane; import javax.swing.JPanel; import java.util.List; @@ -16,6 +19,9 @@ public class MultiCategoryDataSetFieldsPane extends AbstractDataSetFieldsWithSer private MultiComboBoxPane multiCategoryPane; + private AbstractSingleFilterPane seriesFilterPane; + private AbstractSingleFilterPane categoryFilterPane; + @Override protected String[] fieldLabels() { return new String[0]; @@ -39,6 +45,28 @@ public class MultiCategoryDataSetFieldsPane extends AbstractDataSetFieldsWithSer return initMultiCategoryPane(); } + @Override + protected JPanel createSouthPane() { + if (seriesFilterPane == null) { + seriesFilterPane = new AbstractSingleFilterPane() { + @Override + public String title4PopupWindow() { + //todo@shinerefactor + return "series"; + } + }; + categoryFilterPane = new AbstractSingleFilterPane() { + @Override + public String title4PopupWindow() { + return "category"; + } + }; + } + return new VanChartGroupPane(new String[]{seriesFilterPane.title4PopupWindow(), categoryFilterPane.title4PopupWindow()} + , new JPanel[]{seriesFilterPane, categoryFilterPane}) { + }; + } + @Override public void refreshBoxListWithSelectTableData(List columnNameList) { super.refreshBoxListWithSelectTableData(columnNameList); @@ -52,6 +80,16 @@ public class MultiCategoryDataSetFieldsPane extends AbstractDataSetFieldsWithSer multiCategoryPane.populate(categoryList); populateSeriesValuePane(multiCategoryColumnFieldCollection); + + SeriesValueCorrelationDefinition seriesValueCorrelationDefinition = multiCategoryColumnFieldCollection.getSeriesValueCorrelationDefinition(); + if (seriesValueCorrelationDefinition != null) { + seriesFilterPane.populateBean(seriesValueCorrelationDefinition.getFilterProperties()); + + } + + if (categoryList != null && !categoryList.isEmpty()) { + categoryFilterPane.populateBean(categoryList.get(0).getFilterProperties()); + } } @Override @@ -64,6 +102,15 @@ public class MultiCategoryDataSetFieldsPane extends AbstractDataSetFieldsWithSer updateSeriesValuePane(columnFieldCollection); + SeriesValueCorrelationDefinition seriesValueCorrelationDefinition = columnFieldCollection.getSeriesValueCorrelationDefinition(); + if (seriesValueCorrelationDefinition != null) { + seriesValueCorrelationDefinition.setFilterProperties(seriesFilterPane.updateBean()); + } + + if (categoryList != null && !categoryList.isEmpty()) { + categoryList.get(0).setFilterProperties(categoryFilterPane.updateBean()); + } + return columnFieldCollection; } } diff --git a/designer-realize/src/main/java/com/fr/design/actions/insert/flot/ChartFloatAction.java b/designer-realize/src/main/java/com/fr/design/actions/insert/flot/ChartFloatAction.java index d7ab0f9b1..b8f05c2e4 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/insert/flot/ChartFloatAction.java +++ b/designer-realize/src/main/java/com/fr/design/actions/insert/flot/ChartFloatAction.java @@ -15,10 +15,9 @@ import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.ElementCasePane; import com.fr.design.menu.MenuKeySet; import com.fr.design.module.DesignModuleFactory; -import com.fr.log.FineLoggerFactory; - import com.fr.grid.Grid; import com.fr.grid.selection.FloatSelection; +import com.fr.log.FineLoggerFactory; import com.fr.report.ReportHelper; import com.fr.report.cell.FloatElement; import com.fr.report.elementcase.TemplateElementCase; @@ -27,8 +26,8 @@ import com.fr.stable.bridge.StableFactory; import com.fr.stable.unit.FU; import com.fr.stable.unit.OLDPIX; -import javax.swing.*; -import java.awt.*; +import javax.swing.KeyStroke; +import java.awt.Color; /** * 图表插入悬浮元素的操作. @@ -80,7 +79,6 @@ public class ChartFloatAction extends ElementCaseAction { reportPane.stopEditing(); final BaseChartCollection cc = (BaseChartCollection) StableFactory.createXmlObject(BaseChartCollection.XML_TAG); - cc.removeAllNameObject(); final MiddleChartDialog chartDialog = DesignModuleFactory.getChartDialog(DesignerContext.getDesignerFrame()); chartDialog.populate(cc); chartDialog.addDialogActionListener(new DialogActionAdapter() { From 6374c2d6f20418b64c9278cae4bddeb815907687 Mon Sep 17 00:00:00 2001 From: "Hugh.C" Date: Fri, 19 Jul 2019 11:54:32 +0800 Subject: [PATCH 040/217] =?UTF-8?q?KERNEL-896=20=E4=BF=AE=E6=94=B9vcs?= =?UTF-8?q?=E7=9B=AE=E5=BD=95=E4=BD=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vcs/VcsFolderManagerActivator.java | 17 +++++++++++++++++ .../vcs/common/VcsCacheFileNodeFile.java | 18 +++++++++--------- .../design/mainframe/vcs/common/VcsHelper.java | 8 ++++---- 3 files changed, 30 insertions(+), 13 deletions(-) create mode 100644 designer-base/src/main/java/com/fr/design/mainframe/vcs/VcsFolderManagerActivator.java diff --git a/designer-base/src/main/java/com/fr/design/mainframe/vcs/VcsFolderManagerActivator.java b/designer-base/src/main/java/com/fr/design/mainframe/vcs/VcsFolderManagerActivator.java new file mode 100644 index 000000000..cf44f1207 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/mainframe/vcs/VcsFolderManagerActivator.java @@ -0,0 +1,17 @@ +package com.fr.design.mainframe.vcs; + +import com.fr.module.Activator; +import com.fr.workspace.WorkContext; +import com.fr.workspace.server.vcs.VcsOperator; + +public class VcsFolderManagerActivator extends Activator { + @Override + public void start() { + WorkContext.getCurrent().get(VcsOperator.class).moveVscFolder(); + } + + @Override + public void stop() { + + } +} diff --git a/designer-base/src/main/java/com/fr/design/mainframe/vcs/common/VcsCacheFileNodeFile.java b/designer-base/src/main/java/com/fr/design/mainframe/vcs/common/VcsCacheFileNodeFile.java index 40edc01f0..67ab8dfb0 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/vcs/common/VcsCacheFileNodeFile.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/vcs/common/VcsCacheFileNodeFile.java @@ -8,6 +8,7 @@ import com.fr.stable.StableUtils; import com.fr.workspace.WorkContext; import com.fr.workspace.resource.WorkResourceOutputStream; import com.fr.workspace.server.lock.TplOperator; +import com.fr.workspace.server.vcs.filesystem.VcsFileSystem; import java.io.ByteArrayInputStream; import java.io.InputStream; @@ -34,16 +35,15 @@ public class VcsCacheFileNodeFile extends FileNodeFILE { if (node == null) { return null; } - + String vcsCacheDir = VcsFileSystem.getInstance().getVcsCacheRelativePath(); String envPath = node.getEnvPath(); - // envPath必须以vcs开头 - if (!envPath.startsWith(VcsHelper.VCS_CACHE_DIR)) { + // envPath必须以VcsCacheRelativePath开头 + if (!envPath.startsWith(vcsCacheDir)) { return null; } - InputStream in = new ByteArrayInputStream( WorkContext.getCurrent().get(TplOperator.class).readAndLockFile( - StableUtils.pathJoin(VcsHelper.VCS_CACHE_DIR, envPath.substring(VcsHelper.VCS_CACHE_DIR.length() + 1)) + StableUtils.pathJoin(vcsCacheDir, envPath.substring(vcsCacheDir.length() + 1)) ) ); @@ -63,13 +63,13 @@ public class VcsCacheFileNodeFile extends FileNodeFILE { if (ComparatorUtils.equals(node, null)) { return null; } - + String vcsCacheDir = VcsFileSystem.getInstance().getVcsCacheRelativePath(); String envPath = node.getEnvPath(); - // envPath必须以reportLets开头 - if (!envPath.startsWith(VcsHelper.VCS_CACHE_DIR)) { + // envPath必须以VcsCacheRelativePath开头 + if (!envPath.startsWith(vcsCacheDir)) { return null; } - return new WorkResourceOutputStream(StableUtils.pathJoin(VcsHelper.VCS_CACHE_DIR, envPath.substring(VcsHelper.VCS_CACHE_DIR.length() + 1))); + return new WorkResourceOutputStream(StableUtils.pathJoin(vcsCacheDir, envPath.substring(vcsCacheDir.length() + 1))); } } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/vcs/common/VcsHelper.java b/designer-base/src/main/java/com/fr/design/mainframe/vcs/common/VcsHelper.java index fa649b66a..0b3213ac5 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/vcs/common/VcsHelper.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/vcs/common/VcsHelper.java @@ -19,6 +19,7 @@ import com.fr.stable.StringUtils; import com.fr.stable.project.ProjectConstants; import com.fr.workspace.WorkContext; import com.fr.workspace.server.vcs.VcsOperator; +import com.fr.workspace.server.vcs.filesystem.VcsFileSystem; import javax.swing.Icon; import javax.swing.border.EmptyBorder; @@ -45,8 +46,6 @@ public class VcsHelper implements JTemplateActionListener { public final static Icon VCS_USER_PNG = IOUtils.readIcon("/com/fr/design/images/vcs/icon_user@1x.png"); public final static Icon VCS_REVERT = IOUtils.readIcon("/com/fr/design/images/vcs/icon_revert.png"); public final static int OFFSET = 2; - private final static String VCS_DIR = "vcs"; - public final static String VCS_CACHE_DIR = pathJoin(VCS_DIR, "cache"); private static final int MINUTE = 60 * 1000; private final static String VCS_PLUGIN_ID = "com.fr.plugin.vcs.v10"; private static final VcsHelper instance = new VcsHelper(); @@ -89,12 +88,13 @@ public class VcsHelper implements JTemplateActionListener { } private String getEditingFilename() { + String vcsCacheDir = VcsFileSystem.getInstance().getVcsCacheRelativePath(); JTemplate jt = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); String editingFilePath = jt.getEditingFILE().getPath(); if (editingFilePath.startsWith(ProjectConstants.REPORTLETS_NAME)) { editingFilePath = editingFilePath.replaceFirst(ProjectConstants.REPORTLETS_NAME, StringUtils.EMPTY); - } else if (editingFilePath.startsWith(VcsHelper.VCS_CACHE_DIR)) { - editingFilePath = editingFilePath.replaceFirst(VcsHelper.VCS_CACHE_DIR, StringUtils.EMPTY); + } else if (editingFilePath.startsWith(vcsCacheDir)) { + editingFilePath = editingFilePath.replaceFirst(vcsCacheDir, StringUtils.EMPTY); } if (editingFilePath.startsWith("/")) { editingFilePath = editingFilePath.substring(1); From ab97341b397454410dc8bf390c6102fb0fb2bf90 Mon Sep 17 00:00:00 2001 From: "Hugh.C" Date: Fri, 19 Jul 2019 13:59:01 +0800 Subject: [PATCH 041/217] =?UTF-8?q?KERNEL-896=20=E4=BF=AE=E6=94=B9VcsFolde?= =?UTF-8?q?rManagerActivator=E4=BD=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vcs/VcsFolderManagerActivator.java | 17 ----------------- 1 file changed, 17 deletions(-) delete mode 100644 designer-base/src/main/java/com/fr/design/mainframe/vcs/VcsFolderManagerActivator.java diff --git a/designer-base/src/main/java/com/fr/design/mainframe/vcs/VcsFolderManagerActivator.java b/designer-base/src/main/java/com/fr/design/mainframe/vcs/VcsFolderManagerActivator.java deleted file mode 100644 index cf44f1207..000000000 --- a/designer-base/src/main/java/com/fr/design/mainframe/vcs/VcsFolderManagerActivator.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.fr.design.mainframe.vcs; - -import com.fr.module.Activator; -import com.fr.workspace.WorkContext; -import com.fr.workspace.server.vcs.VcsOperator; - -public class VcsFolderManagerActivator extends Activator { - @Override - public void start() { - WorkContext.getCurrent().get(VcsOperator.class).moveVscFolder(); - } - - @Override - public void stop() { - - } -} From ed5a2a53477680ca61e8d3acd3021da8d49ea788 Mon Sep 17 00:00:00 2001 From: "alex.sung" Date: Thu, 25 Jul 2019 17:22:17 +0800 Subject: [PATCH 042/217] =?UTF-8?q?=E6=97=A0JIRA=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=EF=BC=8Csonar=E9=97=AE=E9=A2=98=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/DesignerEnvManager.java | 13 +++++- .../java/com/fr/design/RestartHelper.java | 11 ++++- .../java/com/fr/design/extra/PluginUtils.java | 43 ++++++++++++------- .../fr/design/formula/FunctionConstants.java | 10 ++++- .../rsyntaxtextarea/CodeTemplateManager.java | 7 ++- 5 files changed, 62 insertions(+), 22 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/DesignerEnvManager.java b/designer-base/src/main/java/com/fr/design/DesignerEnvManager.java index bd464d77e..7c37b13b8 100644 --- a/designer-base/src/main/java/com/fr/design/DesignerEnvManager.java +++ b/designer-base/src/main/java/com/fr/design/DesignerEnvManager.java @@ -310,8 +310,9 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter { } private void createEnvFile(File envFile) { + FileWriter fileWriter = null; try { - FileWriter fileWriter = new FileWriter(envFile); + fileWriter = new FileWriter(envFile); File oldEnvFile = new File(ProductConstants.getEnvHome() + File.separator + ProductConstants.APP_NAME + "6-1" + "Env.xml"); File envFile80 = new File(getEnvHome(VERSION_80) + File.separator + getEnvFile().getName()); if (oldEnvFile.exists()) { @@ -327,9 +328,17 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter { Utils.copyCharTo(stringReader, fileWriter); stringReader.close(); } - fileWriter.close(); + } catch (IOException e) { FineLoggerFactory.getLogger().error(e.getMessage(), e); + } finally { + if (null != fileWriter) { + try { + fileWriter.close(); + } catch (IOException e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } + } } } diff --git a/designer-base/src/main/java/com/fr/design/RestartHelper.java b/designer-base/src/main/java/com/fr/design/RestartHelper.java index 6f1b77acb..7f2aeeb78 100644 --- a/designer-base/src/main/java/com/fr/design/RestartHelper.java +++ b/designer-base/src/main/java/com/fr/design/RestartHelper.java @@ -154,12 +154,12 @@ public class RestartHelper { deleteWhenDebug(); return; } - + RandomAccessFile randomAccessFile = null; try { try { File restartLockFile = new File(StableUtils.pathJoin(StableUtils.getInstallHome(), "restart.lock")); StableUtils.makesureFileExist(restartLockFile); - RandomAccessFile randomAccessFile = new RandomAccessFile(restartLockFile,"rw"); + randomAccessFile = new RandomAccessFile(restartLockFile,"rw"); FileChannel restartLockFC = randomAccessFile.getChannel(); FileLock restartLock = restartLockFC.tryLock(); if(restartLock == null) { @@ -176,6 +176,13 @@ public class RestartHelper { } catch (Exception e) { FineLoggerFactory.getLogger().error(e.getMessage(), e); } finally { + try { + if (null != randomAccessFile) { + randomAccessFile.close(); + } + } catch (IOException e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } DesignerContext.getDesignerFrame().exit(); } } diff --git a/designer-base/src/main/java/com/fr/design/extra/PluginUtils.java b/designer-base/src/main/java/com/fr/design/extra/PluginUtils.java index 92a838864..1674616c9 100644 --- a/designer-base/src/main/java/com/fr/design/extra/PluginUtils.java +++ b/designer-base/src/main/java/com/fr/design/extra/PluginUtils.java @@ -85,24 +85,35 @@ public class PluginUtils { public static void downloadShopScripts(String id, Process p) throws Exception { HttpClient httpClient = new HttpClient(getDownloadPath(id)); if (httpClient.getResponseCode() == HttpURLConnection.HTTP_OK) { - int totalSize = httpClient.getContentLength(); - InputStream reader = httpClient.getResponseStream(); - String temp = StableUtils.pathJoin(PluginConstants.DOWNLOAD_PATH, PluginConstants.TEMP_FILE); - StableUtils.makesureFileExist(new File(temp)); - FileOutputStream writer = new FileOutputStream(temp); - byte[] buffer = new byte[PluginConstants.BYTES_NUM]; - int bytesRead = 0; - int totalBytesRead = 0; + InputStream reader = null; + FileOutputStream writer = null; + try { + int totalSize = httpClient.getContentLength(); + reader = httpClient.getResponseStream(); + String temp = StableUtils.pathJoin(PluginConstants.DOWNLOAD_PATH, PluginConstants.TEMP_FILE); + StableUtils.makesureFileExist(new File(temp)); + writer = new FileOutputStream(temp); + byte[] buffer = new byte[PluginConstants.BYTES_NUM]; + int bytesRead = 0; + int totalBytesRead = 0; - while ((bytesRead = reader.read(buffer)) > 0) { - writer.write(buffer, 0, bytesRead); - buffer = new byte[PluginConstants.BYTES_NUM]; - totalBytesRead += bytesRead; - p.process(totalBytesRead / (double) totalSize); + while ((bytesRead = reader.read(buffer)) > 0) { + writer.write(buffer, 0, bytesRead); + buffer = new byte[PluginConstants.BYTES_NUM]; + totalBytesRead += bytesRead; + p.process(totalBytesRead / (double) totalSize); + } + }catch (Exception e){ + throw new Exception(); + }finally { + if(null != reader){ + reader.close(); + } + if(null != writer){ + writer.flush(); + writer.close(); + } } - reader.close(); - writer.flush(); - writer.close(); } else { throw new com.fr.plugin.PluginVerifyException(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Connect_Server_Error")); } diff --git a/designer-base/src/main/java/com/fr/design/formula/FunctionConstants.java b/designer-base/src/main/java/com/fr/design/formula/FunctionConstants.java index 3d0460e86..28bb98555 100644 --- a/designer-base/src/main/java/com/fr/design/formula/FunctionConstants.java +++ b/designer-base/src/main/java/com/fr/design/formula/FunctionConstants.java @@ -174,7 +174,7 @@ public final class FunctionConstants { jarPath = StringUtils.perfectStart(jarPath, "/"); } - ZipFile zip; + ZipFile zip = null; try { zip = new ZipFile(jarPath); Enumeration entries = zip.entries(); @@ -193,6 +193,14 @@ public final class FunctionConstants { } } catch (IOException e) { FineLoggerFactory.getLogger().error(e.getMessage(), e); + } finally { + if(null != zip){ + try { + zip.close(); + } catch (IOException e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } + } } } else { File dir = new File(filePath); diff --git a/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rsyntaxtextarea/CodeTemplateManager.java b/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rsyntaxtextarea/CodeTemplateManager.java index ddefec8b7..f57666a81 100644 --- a/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rsyntaxtextarea/CodeTemplateManager.java +++ b/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rsyntaxtextarea/CodeTemplateManager.java @@ -276,8 +276,9 @@ public class CodeTemplateManager { temp.addAll(templates); for (int i=0; i Date: Thu, 25 Jul 2019 21:14:59 +0800 Subject: [PATCH 043/217] =?UTF-8?q?close=E7=9A=84=E4=B8=80=E4=BA=9B?= =?UTF-8?q?=E7=BB=86=E8=8A=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/extra/PluginUtils.java | 51 ++++++++++++------- .../com/fr/design/extra/WebViewDlgHelper.java | 21 +++----- 2 files changed, 39 insertions(+), 33 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/extra/PluginUtils.java b/designer-base/src/main/java/com/fr/design/extra/PluginUtils.java index 1c9e518e3..170f5da2d 100644 --- a/designer-base/src/main/java/com/fr/design/extra/PluginUtils.java +++ b/designer-base/src/main/java/com/fr/design/extra/PluginUtils.java @@ -6,6 +6,7 @@ import com.fr.general.http.HttpClient; import com.fr.json.JSONArray; import com.fr.json.JSONObject; import com.fr.log.FineLoggerFactory; +import com.fr.plugin.PluginVerifyException; import com.fr.plugin.basic.version.Version; import com.fr.plugin.basic.version.VersionIntervalFactory; import com.fr.plugin.context.PluginContext; @@ -18,6 +19,7 @@ import com.fr.stable.ProductConstants; import com.fr.stable.StableUtils; import com.fr.stable.StringUtils; +import javax.swing.JOptionPane; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; @@ -82,12 +84,12 @@ public class PluginUtils { return jsonArray.toString(); } - public static void downloadShopScripts(String id, Process p) throws Exception { - HttpClient httpClient = new HttpClient(getDownloadPath(id)); - if (httpClient.getResponseCode() == HttpURLConnection.HTTP_OK) { - InputStream reader = null; - FileOutputStream writer = null; - try { + public static boolean downloadShopScripts(String id, Process p) { + InputStream reader = null; + FileOutputStream writer = null; + try { + HttpClient httpClient = new HttpClient(getDownloadPath(id)); + if (httpClient.getResponseCode() == HttpURLConnection.HTTP_OK) { int totalSize = httpClient.getContentLength(); reader = httpClient.getResponseStream(); String temp = StableUtils.pathJoin(PluginConstants.DOWNLOAD_PATH, PluginConstants.TEMP_FILE); @@ -103,19 +105,32 @@ public class PluginUtils { totalBytesRead += bytesRead; p.process(totalBytesRead / (double) totalSize); } - }catch (Exception e){ - throw new Exception(); - }finally { - if(null != reader){ - reader.close(); - } - if(null != writer){ - writer.flush(); - writer.close(); - } + } else { + throw new com.fr.plugin.PluginVerifyException(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Connect_Server_Error")); } - } else { - throw new com.fr.plugin.PluginVerifyException(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Connect_Server_Error")); + } catch (PluginVerifyException e) { + JOptionPane.showMessageDialog(null, e.getMessage(), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Warning"), JOptionPane.ERROR_MESSAGE); + return false; + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + return false; + } finally { + closeStream(reader, writer); + } + return true; + } + + private static void closeStream(InputStream reader, FileOutputStream writer){ + try { + if (null != reader) { + reader.close(); + } + if (null != writer) { + writer.flush(); + writer.close(); + } + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); } } diff --git a/designer-base/src/main/java/com/fr/design/extra/WebViewDlgHelper.java b/designer-base/src/main/java/com/fr/design/extra/WebViewDlgHelper.java index 54ddcd8c0..fef7c5159 100644 --- a/designer-base/src/main/java/com/fr/design/extra/WebViewDlgHelper.java +++ b/designer-base/src/main/java/com/fr/design/extra/WebViewDlgHelper.java @@ -259,21 +259,12 @@ public class WebViewDlgHelper { new SwingWorker() { @Override protected Boolean doInBackground() throws Exception { - try { - PluginUtils.downloadShopScripts(scriptsId, new Process() { - @Override - public void process(Double integer) { - // 这个注释毫无意义,就是为了通过SonarQube - } - }); - } catch (PluginVerifyException e) { - JOptionPane.showMessageDialog(null, e.getMessage(), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Warning"), JOptionPane.ERROR_MESSAGE); - return false; - } catch (Exception e) { - FineLoggerFactory.getLogger().error(e.getMessage(), e); - return false; - } - return true; + return PluginUtils.downloadShopScripts(scriptsId, new Process() { + @Override + public void process(Double integer) { + // 这个注释毫无意义,就是为了通过SonarQube + } + }); } @Override From 08d97d7f577e97e35ffa91b0c98d6853cc2146df Mon Sep 17 00:00:00 2001 From: "alex.sung" Date: Thu, 25 Jul 2019 21:16:03 +0800 Subject: [PATCH 044/217] =?UTF-8?q?=E4=B8=8D=E8=A6=81=E9=87=8D=E5=A4=8Dclo?= =?UTF-8?q?se?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gui/syntax/ui/rsyntaxtextarea/CodeTemplateManager.java | 1 - 1 file changed, 1 deletion(-) diff --git a/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rsyntaxtextarea/CodeTemplateManager.java b/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rsyntaxtextarea/CodeTemplateManager.java index f57666a81..61b201861 100644 --- a/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rsyntaxtextarea/CodeTemplateManager.java +++ b/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rsyntaxtextarea/CodeTemplateManager.java @@ -286,7 +286,6 @@ public class CodeTemplateManager { files[i].getAbsolutePath()); } temp.add((CodeTemplate)obj); - d.close(); } catch (/*IO, NoSuchElement*/Exception e) { // NoSuchElementException can be thrown when reading // an XML file not in the format expected by XMLDecoder. From 3b54e720080c85f0a855ad1373453294b1d2657a Mon Sep 17 00:00:00 2001 From: Hades Date: Fri, 2 Aug 2019 17:37:19 +0800 Subject: [PATCH 045/217] =?UTF-8?q?=E6=97=A0jira=20sonar=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../design/file/HistoryTemplateListCache.java | 15 +++----- .../design/update/actions/FileDownloader.java | 25 ++++++------ .../factory/DirectoryOperationFactory.java | 15 +++----- .../update/ui/dialog/EncodingDetect.java | 31 +++++++-------- .../update/ui/dialog/UpdateMainDialog.java | 38 +++++++++---------- .../manager/impl/PluginSearchManager.java | 19 +++++----- .../manager/impl/RecommendSearchManager.java | 20 +++++----- .../manager/impl/SegmentationManager.java | 18 ++++----- .../manager/impl/SimilarSearchManager.java | 20 +++++----- 9 files changed, 93 insertions(+), 108 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/file/HistoryTemplateListCache.java b/designer-base/src/main/java/com/fr/design/file/HistoryTemplateListCache.java index fc46ff59b..cb839c6d7 100644 --- a/designer-base/src/main/java/com/fr/design/file/HistoryTemplateListCache.java +++ b/designer-base/src/main/java/com/fr/design/file/HistoryTemplateListCache.java @@ -41,17 +41,12 @@ public class HistoryTemplateListCache implements CallbackEvent { private List> historyList; private JTemplate editingTemplate; - private static volatile HistoryTemplateListCache instacne; - public static HistoryTemplateListCache getInstance() { - if (instacne == null) { - synchronized (HistoryTemplateListCache.class) { - if (instacne == null) { - instacne = new HistoryTemplateListCache(); - } - } - } - return instacne; + return Holder.INSTANCE; + } + + private static class Holder { + private static final HistoryTemplateListCache INSTANCE = new HistoryTemplateListCache(); } private HistoryTemplateListCache() { diff --git a/designer-base/src/main/java/com/fr/design/update/actions/FileDownloader.java b/designer-base/src/main/java/com/fr/design/update/actions/FileDownloader.java index 556fa5113..4da324f29 100644 --- a/designer-base/src/main/java/com/fr/design/update/actions/FileDownloader.java +++ b/designer-base/src/main/java/com/fr/design/update/actions/FileDownloader.java @@ -80,22 +80,21 @@ public abstract class FileDownloader extends SwingWorker URLConnection connection = url.openConnection(); int total = connection.getContentLength(); item.setTotalLength(total); - InputStream reader = connection.getInputStream(); File tempFile = new File(StableUtils.pathJoin(saveDir, item.getName())); StableUtils.makesureFileExist(tempFile); - FileOutputStream writer = new FileOutputStream(tempFile); - byte[] buffer = new byte[UpdateConstants.BYTE]; - int bytesRead = 0; - int totalBytesRead = 0; - while ((bytesRead = reader.read(buffer)) != -1) { - writer.write(buffer, 0, bytesRead); - buffer = new byte[UpdateConstants.BYTE]; - totalBytesRead += bytesRead; - item.setDownloadLength(totalBytesRead); - publish(item); + try ( InputStream reader = connection.getInputStream(); + FileOutputStream writer = new FileOutputStream(tempFile)) { + byte[] buffer = new byte[UpdateConstants.BYTE]; + int bytesRead = 0; + int totalBytesRead = 0; + while ((bytesRead = reader.read(buffer)) != -1) { + writer.write(buffer, 0, bytesRead); + buffer = new byte[UpdateConstants.BYTE]; + totalBytesRead += bytesRead; + item.setDownloadLength(totalBytesRead); + publish(item); + } } - reader.close(); - writer.close(); } /** diff --git a/designer-base/src/main/java/com/fr/design/update/factory/DirectoryOperationFactory.java b/designer-base/src/main/java/com/fr/design/update/factory/DirectoryOperationFactory.java index 906b71412..48c151488 100644 --- a/designer-base/src/main/java/com/fr/design/update/factory/DirectoryOperationFactory.java +++ b/designer-base/src/main/java/com/fr/design/update/factory/DirectoryOperationFactory.java @@ -82,15 +82,12 @@ public class DirectoryOperationFactory { } private static void copy(String path1, String path2) throws IOException { - DataInputStream in = new DataInputStream(new BufferedInputStream(new FileInputStream(path1))); - DataOutputStream out = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(path2))); - byte[] date = new byte[in.available()]; - - in.read(date); - out.write(date); - - in.close(); - out.close(); + try (DataInputStream in = new DataInputStream(new BufferedInputStream(new FileInputStream(path1))); + DataOutputStream out = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(path2)))) { + byte[] date = new byte[in.available()]; + in.read(date); + out.write(date); + } } /** diff --git a/designer-base/src/main/java/com/fr/design/update/ui/dialog/EncodingDetect.java b/designer-base/src/main/java/com/fr/design/update/ui/dialog/EncodingDetect.java index 41bba0f4f..e21bb1dcc 100644 --- a/designer-base/src/main/java/com/fr/design/update/ui/dialog/EncodingDetect.java +++ b/designer-base/src/main/java/com/fr/design/update/ui/dialog/EncodingDetect.java @@ -11,12 +11,12 @@ import java.io.FileInputStream; * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * EncodingDetect.java
* 自动获取文件的编码 * @author Mata * @since Create on 2018-08-23 - * @version 1.0 + * @version 1.0 */ public class EncodingDetect { /** @@ -25,11 +25,11 @@ public class EncodingDetect { * @return 文件的编码 */ public static String getJavaEncode(File file){ - BytesEncodingDetect s = new BytesEncodingDetect(); + BytesEncodingDetect s = new BytesEncodingDetect(); String fileCode = BytesEncodingDetect.javaname[s.detectEncoding(file)]; return fileCode; } - + } @@ -75,17 +75,14 @@ class BytesEncodingDetect extends Encoding { * type. The encoding type with the highest probability is returned. */ public int detectEncoding(File testfile) { - FileInputStream chinesefile; - byte[] rawtext; - rawtext = new byte[(int) testfile.length()]; - try { - chinesefile = new FileInputStream(testfile); - chinesefile.read(rawtext); - chinesefile.close(); - } catch (Exception e) { - System.err.println("Error: " + e); - } - return detectEncoding(rawtext); + byte[] rawtext = new byte[(int) testfile.length()]; + try(FileInputStream chinesefile = new FileInputStream(testfile)) { + chinesefile.read(rawtext); + chinesefile.close(); + } catch (Exception e) { + System.err.println("Error: " + e); + } + return detectEncoding(rawtext); } /** @@ -647,7 +644,7 @@ class BytesEncodingDetect extends Encoding { * (byte)0xDF) == rawtext[i]) { // Two bytes if (i+1 < rawtextlen && (rawtext[i+1] & (byte)0xBF) == rawtext[i+1]) { * goodbytes += 2; i++; } } else if ((rawtext[i] & (byte)0xEF) == rawtext[i]) { // Three bytes if (i+2 < rawtextlen && * (rawtext[i+1] & (byte)0xBF) == rawtext[i+1] && (rawtext[i+2] & (byte)0xBF) == rawtext[i+2]) { goodbytes += 3; i+=2; } } } - * + * * score = (int)(100 * ((float)goodbytes/(float)rawtext.length)); // An all ASCII file is also a good UTF8 file, but I'd * rather it // get identified as ASCII. Can delete following 3 lines otherwise if (goodbytes == asciibytes) { score = 0; } // * If not above 90, reduce to zero to prevent coincidental matches if (score > 90) { return score; } else { return 0; } @@ -4551,5 +4548,5 @@ class BytesEncodingDetect extends Encoding { nicename[ASCII] = "ASCII"; nicename[OTHER] = "OTHER"; } - + } \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/update/ui/dialog/UpdateMainDialog.java b/designer-base/src/main/java/com/fr/design/update/ui/dialog/UpdateMainDialog.java index e59cc09ff..81239d84b 100644 --- a/designer-base/src/main/java/com/fr/design/update/ui/dialog/UpdateMainDialog.java +++ b/designer-base/src/main/java/com/fr/design/update/ui/dialog/UpdateMainDialog.java @@ -468,30 +468,28 @@ public class UpdateMainDialog extends UIDialog { return; } if (cacheFile.exists()) { - InputStreamReader streamReader = new InputStreamReader(new FileInputStream(cacheFile), "UTF-8"); - BufferedReader br = new BufferedReader(streamReader); - String readStr, updateTimeStr; - - while ((readStr = br.readLine()) != null) { - String[] updateInfo = readStr.split("\\t"); - if (updateInfo.length == 2) { - updateTimeStr = updateInfo[0]; - Date updateTime = CHANGELOG_FORMAT.parse(updateTimeStr); - //形如 Build#release-2018.07.31.03.03.52.80 - String currentNO = GeneralUtils.readBuildNO(); - Date curJarDate = UPDATE_INFO_TABLE_FORMAT.parse(currentNO, new ParsePosition(currentNO.indexOf("-") + 1)); - if (!ComparatorUtils.equals(keyword, StringUtils.EMPTY)) { - if (!containsKeyword(UPDATE_INFO_TABLE_FORMAT.format(updateTime), keyword) && !containsKeyword(updateInfo[1], keyword)) { - continue; + try (InputStreamReader streamReader = new InputStreamReader(new FileInputStream(cacheFile), "UTF-8"); + BufferedReader br = new BufferedReader(streamReader)) { + String readStr, updateTimeStr; + while ((readStr = br.readLine()) != null) { + String[] updateInfo = readStr.split("\\t"); + if (updateInfo.length == 2) { + updateTimeStr = updateInfo[0]; + Date updateTime = CHANGELOG_FORMAT.parse(updateTimeStr); + //形如 Build#release-2018.07.31.03.03.52.80 + String currentNO = GeneralUtils.readBuildNO(); + Date curJarDate = UPDATE_INFO_TABLE_FORMAT.parse(currentNO, new ParsePosition(currentNO.indexOf("-") + 1)); + if (!ComparatorUtils.equals(keyword, StringUtils.EMPTY)) { + if (!containsKeyword(UPDATE_INFO_TABLE_FORMAT.format(updateTime), keyword) && !containsKeyword(updateInfo[1], keyword)) { + continue; + } + } + if (isValidLogInfo(updateInfo[1])) { + updateInfoList.add(new Object[]{UPDATE_INFO_TABLE_FORMAT.format(updateTime), updateInfo[1], updateTime.after(curJarDate)}); } - } - if (isValidLogInfo(updateInfo[1])) { - updateInfoList.add(new Object[]{UPDATE_INFO_TABLE_FORMAT.format(updateTime), updateInfo[1], updateTime.after(curJarDate)}); } } } - br.close(); - streamReader.close(); } } diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/PluginSearchManager.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/PluginSearchManager.java index ddd3bc0fc..a902d0e00 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/PluginSearchManager.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/PluginSearchManager.java @@ -27,21 +27,20 @@ import java.net.URLEncoder; * Created by XiaXiang on 2017/3/27. */ public class PluginSearchManager implements AlphaFineSearchProvider { - private static volatile PluginSearchManager instance; private SearchResult lessModelList; private SearchResult moreModelList; + private PluginSearchManager() { + + } public static PluginSearchManager getInstance() { - if (instance == null) { - synchronized (PluginSearchManager.class) { - if (instance == null) { - instance = new PluginSearchManager(); - } - } - } - return instance; + return Holder.INSTANCE; + + } + private static class Holder { + private static final PluginSearchManager INSTANCE = new PluginSearchManager(); } private static boolean isCompatibleCurrentEnv(String envVersion) { @@ -105,7 +104,7 @@ public class PluginSearchManager implements AlphaFineSearchProvider { lessModelList.add(new MoreModel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Plugin_Addon"))); return lessModelList; } - SearchResult noConnectList = AlphaFineHelper.getNoConnectList(instance); + SearchResult noConnectList = AlphaFineHelper.getNoConnectList(Holder.INSTANCE); if(noConnectList != null){ return noConnectList; } diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/RecommendSearchManager.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/RecommendSearchManager.java index e15c5b966..05267220b 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/RecommendSearchManager.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/RecommendSearchManager.java @@ -25,22 +25,22 @@ import java.util.List; * Created by XiaXiang on 2017/3/31. */ public class RecommendSearchManager implements AlphaFineSearchProvider { - private static volatile RecommendSearchManager instance; private SearchResult modelList = new SearchResult(); private SearchResult recommendModelList = new SearchResult(); private SearchResult complementAdviceModelList; private SearchResult moreModelList = new SearchResult(); + private RecommendSearchManager() { + + } + public static RecommendSearchManager getInstance() { - if (instance == null) { - synchronized (RecentSearchManager.class) { - if (instance == null) { - instance = new RecommendSearchManager(); - } - } - } - return instance; + return Holder.INSTANCE; + } + + private static class Holder { + private static final RecommendSearchManager INSTANCE = new RecommendSearchManager(); } @Override @@ -51,7 +51,7 @@ public class RecommendSearchManager implements AlphaFineSearchProvider { if (ArrayUtils.isEmpty(searchText)) { return new SearchResult(); } - SearchResult noConnectList = AlphaFineHelper.getNoConnectList(instance); + SearchResult noConnectList = AlphaFineHelper.getNoConnectList(Holder.INSTANCE); if (noConnectList != null) { return noConnectList; } diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/SegmentationManager.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/SegmentationManager.java index 40c37341c..c9622193c 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/SegmentationManager.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/SegmentationManager.java @@ -13,18 +13,18 @@ import java.util.regex.Pattern; * Created by alex.sung on 2018/8/3. */ public class SegmentationManager { - private static volatile SegmentationManager segmentationManager = null; private static final int MAX_CHINESE_CHARACTERS_NUM = 4; + private SegmentationManager() { + + } + public static SegmentationManager getInstance() { - if (segmentationManager == null) { - synchronized (SegmentationManager.class) { - if (segmentationManager == null) { - segmentationManager = new SegmentationManager(); - } - } - } - return segmentationManager; + return Holder.INSTANCE; + } + + private static class Holder { + private static final SegmentationManager INSTANCE = new SegmentationManager(); } /** diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/SimilarSearchManager.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/SimilarSearchManager.java index 1754b1284..f353573b4 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/SimilarSearchManager.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/SimilarSearchManager.java @@ -18,19 +18,19 @@ import com.fr.third.org.apache.commons.codec.digest.DigestUtils; * Created by alex.sung on 2018/8/3. */ public class SimilarSearchManager implements AlphaFineSearchProvider { - private static volatile SimilarSearchManager instance; private SearchResult lessModelList; private SearchResult moreModelList = new SearchResult(); + private SimilarSearchManager() { + + } + public static SimilarSearchManager getInstance() { - if (instance == null) { - synchronized (SimilarSearchManager.class) { - if (instance == null) { - instance = new SimilarSearchManager(); - } - } - } - return instance; + return Holder.INSTANCE; + } + + private static class Holder { + private static final SimilarSearchManager INSTANCE = new SimilarSearchManager(); } @Override @@ -40,7 +40,7 @@ public class SimilarSearchManager implements AlphaFineSearchProvider { if (ArrayUtils.isEmpty(searchText)) { return new SearchResult(); } - SearchResult noConnectList = AlphaFineHelper.getNoConnectList(instance); + SearchResult noConnectList = AlphaFineHelper.getNoConnectList(Holder.INSTANCE); if (noConnectList != null) { return noConnectList; } From 33642afad2d1fd74f4a16806834fe1b61fd6f51a Mon Sep 17 00:00:00 2001 From: Harrison Date: Mon, 5 Aug 2019 09:40:46 +0800 Subject: [PATCH 046/217] =?UTF-8?q?=E6=97=A0=20jira=20=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=EF=BC=8C=20=E5=8D=95=E5=85=83=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mainframe/alphafine/AlphaFineHelperTest.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/designer-realize/src/test/java/com.fr/design/mainframe/alphafine/AlphaFineHelperTest.java b/designer-realize/src/test/java/com.fr/design/mainframe/alphafine/AlphaFineHelperTest.java index 3c14275b7..21df0da47 100644 --- a/designer-realize/src/test/java/com.fr/design/mainframe/alphafine/AlphaFineHelperTest.java +++ b/designer-realize/src/test/java/com.fr/design/mainframe/alphafine/AlphaFineHelperTest.java @@ -11,8 +11,7 @@ import org.powermock.api.easymock.PowerMock; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.core.classloader.annotations.SuppressStaticInitializationFor; import org.powermock.modules.junit4.PowerMockRunner; - -import static org.junit.Assert.*; +import org.powermock.reflect.Whitebox; @RunWith(PowerMockRunner.class) public class AlphaFineHelperTest { @@ -25,8 +24,13 @@ public class AlphaFineHelperTest { PowerMock.mockStatic(GeneralContext.class); EasyMock.expect(GeneralContext.isChineseEnv()).andReturn(true).times(1).andReturn(false).times(1); + AlphaFineConfigManager mockConfig = EasyMock.partialMockBuilder(AlphaFineConfigManager.class).createMock(); + Whitebox.setInternalState(mockConfig,"searchOnLine", true); + EasyMock.replay(mockConfig); + DesignerEnvManager manager = EasyMock.mock(DesignerEnvManager.class); - EasyMock.expect(manager.getAlphaFineConfigManager()).andReturn(new AlphaFineConfigManager()).anyTimes(); + EasyMock.expect(manager.getAlphaFineConfigManager()).andReturn(mockConfig).anyTimes(); + EasyMock.replay(manager); PowerMock.mockStatic(DesignerEnvManager.class); From c9958151e0b8426bcec1ec0e2e93c7c35ad0e54e Mon Sep 17 00:00:00 2001 From: Hades Date: Mon, 5 Aug 2019 16:01:02 +0800 Subject: [PATCH 047/217] update --- .../java/com/fr/design/update/ui/dialog/EncodingDetect.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/update/ui/dialog/EncodingDetect.java b/designer-base/src/main/java/com/fr/design/update/ui/dialog/EncodingDetect.java index e21bb1dcc..d782428ce 100644 --- a/designer-base/src/main/java/com/fr/design/update/ui/dialog/EncodingDetect.java +++ b/designer-base/src/main/java/com/fr/design/update/ui/dialog/EncodingDetect.java @@ -1,5 +1,6 @@ package com.fr.design.update.ui.dialog; +import com.fr.log.FineLoggerFactory; import java.io.File; import java.io.FileInputStream; @@ -76,11 +77,10 @@ class BytesEncodingDetect extends Encoding { */ public int detectEncoding(File testfile) { byte[] rawtext = new byte[(int) testfile.length()]; - try(FileInputStream chinesefile = new FileInputStream(testfile)) { + try (FileInputStream chinesefile = new FileInputStream(testfile)) { chinesefile.read(rawtext); - chinesefile.close(); } catch (Exception e) { - System.err.println("Error: " + e); + FineLoggerFactory.getLogger().error(e.getMessage(), e); } return detectEncoding(rawtext); } From 2372920230fbf6e880b6732e816558e51e96f86f Mon Sep 17 00:00:00 2001 From: WeiYanglu Date: Sat, 10 Aug 2019 21:09:59 +0800 Subject: [PATCH 048/217] =?UTF-8?q?MOBILE-21673=20&=20MOBILE-21669=20?= =?UTF-8?q?=E7=A7=BB=E5=8A=A8=E7=AB=AF=E6=8E=A7=E4=BB=B6=E6=8F=92=E4=BB=B6?= =?UTF-8?q?=E5=8C=96=E6=8E=A5=E5=8F=A3=E8=AE=BE=E8=AE=A1=E5=99=A8=E6=94=AF?= =?UTF-8?q?=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/ExtraDesignClassManager.java | 22 ++- .../design/fun/MobileWidgetStyleProvider.java | 24 ++++ .../AbstractMobileWidgetStyleProvider.java | 20 +++ .../DefaultMobileStyleCustomDefinePane.java | 39 ++++++ .../ui/DefaultMobileWidgetStyleProvider.java | 30 ++++ .../ui/MobileStyleCustomDefinePane.java | 22 +++ .../mobile/ui/MobileStyleDefinePane.java | 115 ++++++++++++++++ .../mainframe/mobile/ui/MobileStylePane.java | 130 ++++++++++++++++++ .../AccessibleMobileStyleEditor.java | 36 +++++ .../widget/wrappers/MobileStyleWrapper.java | 26 ++++ .../design/designer/creator/XChartEditor.java | 5 + .../fr/design/designer/creator/XCreator.java | 9 +- .../design/designer/creator/XElementCase.java | 5 + .../designer/creator/XLayoutContainer.java | 5 + .../designer/creator/XWScaleLayout.java | 5 + .../mobile/MobileStylePropertyUI.java | 31 +++++ .../design/mainframe/WidgetPropertyPane.java | 7 +- .../mobile/MobileWidgetStyleDefinePane.java | 85 ++++++++++++ 18 files changed, 608 insertions(+), 8 deletions(-) create mode 100644 designer-base/src/main/java/com/fr/design/fun/MobileWidgetStyleProvider.java create mode 100644 designer-base/src/main/java/com/fr/design/fun/impl/AbstractMobileWidgetStyleProvider.java create mode 100644 designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/DefaultMobileStyleCustomDefinePane.java create mode 100644 designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/DefaultMobileWidgetStyleProvider.java create mode 100644 designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileStyleCustomDefinePane.java create mode 100644 designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileStyleDefinePane.java create mode 100644 designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileStylePane.java create mode 100644 designer-base/src/main/java/com/fr/design/mainframe/widget/accessibles/AccessibleMobileStyleEditor.java create mode 100644 designer-base/src/main/java/com/fr/design/mainframe/widget/wrappers/MobileStyleWrapper.java create mode 100644 designer-form/src/main/java/com/fr/design/designer/properties/mobile/MobileStylePropertyUI.java create mode 100644 designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/MobileWidgetStyleDefinePane.java diff --git a/designer-base/src/main/java/com/fr/design/ExtraDesignClassManager.java b/designer-base/src/main/java/com/fr/design/ExtraDesignClassManager.java index beb62c06e..874a8f8b1 100644 --- a/designer-base/src/main/java/com/fr/design/ExtraDesignClassManager.java +++ b/designer-base/src/main/java/com/fr/design/ExtraDesignClassManager.java @@ -6,18 +6,14 @@ package com.fr.design; import com.fr.base.BaseUtils; import com.fr.design.data.datapane.TableDataNameObjectCreator; -import com.fr.design.fun.CellWidgetOptionProvider; -import com.fr.design.fun.FormWidgetOptionProvider; -import com.fr.design.fun.ParameterWidgetOptionProvider; -import com.fr.design.fun.ServerTableDataDefineProvider; -import com.fr.design.fun.TableDataDefineProvider; -import com.fr.design.fun.ToolbarItemProvider; +import com.fr.design.fun.*; import com.fr.design.gui.core.WidgetOption; import com.fr.design.gui.core.WidgetOptionFactory; import com.fr.design.menu.ShortCut; import com.fr.design.widget.Appearance; import com.fr.design.widget.mobile.WidgetMobilePane; import com.fr.form.ui.Widget; +import com.fr.general.ComparatorUtils; import com.fr.general.IOUtils; import com.fr.plugin.AbstractExtraClassManager; import com.fr.plugin.injectable.PluginModule; @@ -207,6 +203,20 @@ public class ExtraDesignClassManager extends AbstractExtraClassManager implement return map; } + public MobileWidgetStyleProvider[] getMobileStyleOfWidget(String xType) { + Set set = getArray(MobileWidgetStyleProvider.XML_TAG); + if (set.isEmpty()) { + return new MobileWidgetStyleProvider[0]; + } + List providers = new ArrayList<>(); + for (MobileWidgetStyleProvider provider: set) { + if(ComparatorUtils.equalsIgnoreCase(provider.xTypeForWidget(), xType)) { + providers.add(provider); + } + } + return providers.toArray(new MobileWidgetStyleProvider[providers.size()]); + } + @Override protected boolean demountSpecific(PluginSingleInjection injection) { diff --git a/designer-base/src/main/java/com/fr/design/fun/MobileWidgetStyleProvider.java b/designer-base/src/main/java/com/fr/design/fun/MobileWidgetStyleProvider.java new file mode 100644 index 000000000..bc01837ee --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/fun/MobileWidgetStyleProvider.java @@ -0,0 +1,24 @@ +package com.fr.design.fun; + +import com.fr.design.mainframe.mobile.ui.MobileStyleCustomDefinePane; +import com.fr.form.ui.mobile.MobileStyle; +import com.fr.stable.fun.mark.Mutable; + +/** + * 移动端组件样式扩展接口 + */ +public interface MobileWidgetStyleProvider extends Mutable { + + String XML_TAG = "MobileWidgetStyleProvider"; + + int CURRENT_LEVEL = 1; + + Class classForMobileStyle(); + + Class classForWidgetAppearance(); + + String xTypeForWidget(); + + String displayName(); + +} diff --git a/designer-base/src/main/java/com/fr/design/fun/impl/AbstractMobileWidgetStyleProvider.java b/designer-base/src/main/java/com/fr/design/fun/impl/AbstractMobileWidgetStyleProvider.java new file mode 100644 index 000000000..407aa058c --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/fun/impl/AbstractMobileWidgetStyleProvider.java @@ -0,0 +1,20 @@ +package com.fr.design.fun.impl; + +import com.fr.design.fun.MobileWidgetStyleProvider; +import com.fr.stable.fun.impl.AbstractProvider; +import com.fr.stable.fun.mark.API; + +@API(level = MobileWidgetStyleProvider.CURRENT_LEVEL) +public abstract class AbstractMobileWidgetStyleProvider extends AbstractProvider implements MobileWidgetStyleProvider { + + @Override + public int currentAPILevel() { + return CURRENT_LEVEL; + } + + @Override + public String mark4Provider() { + return getClass().getName(); + } + +} diff --git a/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/DefaultMobileStyleCustomDefinePane.java b/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/DefaultMobileStyleCustomDefinePane.java new file mode 100644 index 000000000..62257fde5 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/DefaultMobileStyleCustomDefinePane.java @@ -0,0 +1,39 @@ +package com.fr.design.mainframe.mobile.ui; + +import com.fr.form.ui.Widget; +import com.fr.form.ui.mobile.MobileStyle; + +import javax.swing.*; + +public class DefaultMobileStyleCustomDefinePane extends MobileStyleCustomDefinePane { + + + public DefaultMobileStyleCustomDefinePane(Widget widget) { + super(widget); + } + + @Override + protected JPanel createPreviewPane() { + return null; + } + + @Override + public void populateBean(MobileStyle ob) { + + } + + @Override + public MobileStyle updateBean() { + return null; + } + + @Override + protected String title4PopupWindow() { + return null; + } + + @Override + protected void init() { + + } +} diff --git a/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/DefaultMobileWidgetStyleProvider.java b/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/DefaultMobileWidgetStyleProvider.java new file mode 100644 index 000000000..b1710ff14 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/DefaultMobileWidgetStyleProvider.java @@ -0,0 +1,30 @@ +package com.fr.design.mainframe.mobile.ui; + +import com.fr.design.fun.impl.AbstractMobileWidgetStyleProvider; +import com.fr.form.ui.mobile.DefaultMobileStyle; +import com.fr.form.ui.mobile.MobileStyle; +import com.fr.locale.InterProviderFactory; + +public class DefaultMobileWidgetStyleProvider extends AbstractMobileWidgetStyleProvider { + + @Override + public Class classForMobileStyle() { + return DefaultMobileStyle.class; + } + + @Override + public Class classForWidgetAppearance() { + return DefaultMobileStyleCustomDefinePane.class; + } + + @Override + public String xTypeForWidget() { + return null; + } + + @Override + public String displayName() { + return InterProviderFactory.getProvider().getLocText("Fine-Engine_Report_DEFAULT"); + } + +} diff --git a/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileStyleCustomDefinePane.java b/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileStyleCustomDefinePane.java new file mode 100644 index 000000000..91729eb96 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileStyleCustomDefinePane.java @@ -0,0 +1,22 @@ +package com.fr.design.mainframe.mobile.ui; + +import com.fr.design.beans.BasicBeanPane; +import com.fr.form.ui.Widget; +import com.fr.form.ui.mobile.MobileStyle; + +import javax.swing.*; + +public abstract class MobileStyleCustomDefinePane extends BasicBeanPane { + + protected Widget widget; + + public MobileStyleCustomDefinePane(Widget widget) { + this.widget = widget; + init(); + } + + protected abstract JPanel createPreviewPane(); + + protected abstract void init(); + +} diff --git a/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileStyleDefinePane.java b/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileStyleDefinePane.java new file mode 100644 index 000000000..ef1327ccf --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileStyleDefinePane.java @@ -0,0 +1,115 @@ +package com.fr.design.mainframe.mobile.ui; + +import com.fr.design.beans.BasicBeanPane; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.i18n.Toolkit; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.style.color.NewColorSelectBox; +import com.fr.design.utils.gui.GUICoreUtils; +import com.fr.form.ui.Widget; +import com.fr.form.ui.mobile.MobileStyle; +import com.fr.general.FRFont; +import com.fr.invoke.Reflect; + +import javax.swing.*; +import javax.swing.border.TitledBorder; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; +import java.awt.*; + +public class MobileStyleDefinePane extends BasicBeanPane { + + private Widget widget; + private MobileStyleCustomDefinePane customBeanPane; + private Class mobileStyleClazz; + private NewColorSelectBox colorSelectBox; + + MobileStyleDefinePane(Widget widget, Class customBeanPaneClass, + Class mobileStyleClazz) { + this.widget = widget; + this.customBeanPane = Reflect.on(customBeanPaneClass).create(widget).get(); + this.mobileStyleClazz = mobileStyleClazz; + init(); + } + + @Override + public void populateBean(MobileStyle ob) { + this.customBeanPane.populateBean(ob); + colorSelectBox.setSelectObject(ob.getBackground()); + } + + @Override + public MobileStyle updateBean() { + MobileStyle mobileStyle = Reflect.on(mobileStyleClazz).create().get(); + this.widget.setMobileStyle(mobileStyle); + this.customBeanPane.updateBean(); + mobileStyle.setBackground(colorSelectBox.getBackground()); + return mobileStyle; + } + + @Override + protected String title4PopupWindow() { + return null; + } + + private void init() { + this.setLayout(FRGUIPaneFactory.createBorderLayout()); + createGeneralPane(); + createCustomPane(); + } + + private void createGeneralPane() { + createPreviewPane(); + createBackgroundPane(); + } + + private void createPreviewPane() { + JPanel mobileStylePreviewPane = this.customBeanPane.createPreviewPane(); + if(mobileStylePreviewPane != null) { + JPanel previewPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); + TitledBorder titledBorder = GUICoreUtils.createTitledBorder(Toolkit.i18nText("Fine-Design_Basic_Widget_Style_Preview"), null); + titledBorder.setTitleFont(FRFont.getInstance("PingFangSC-Regular", Font.PLAIN, 12, new Color(0x2f8ef100))); + previewPane.setBorder(titledBorder); + previewPane.setPreferredSize(new Dimension(500, 83)); + previewPane.add(mobileStylePreviewPane, BorderLayout.CENTER); + this.add(previewPane, BorderLayout.NORTH); + } + } + + private void createBackgroundPane() { + + JPanel backgroundPane = new JPanel(); + backgroundPane.setLayout(new FlowLayout(FlowLayout.LEFT, 10, 5)); + backgroundPane.setPreferredSize(new Dimension(500, 65)); + + TitledBorder titledBorder = GUICoreUtils.createTitledBorder(Toolkit.i18nText("Fine-Design_Mobile_Common_Attribute"), null); + titledBorder.setTitleFont(FRFont.getInstance("PingFangSC-Regular", Font.PLAIN, 12, Color.BLUE)); + backgroundPane.setBorder(titledBorder); + + UILabel colorSelectLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Mobile_Widget_Background"), UILabel.RIGHT); + colorSelectLabel.setPreferredSize(new Dimension(65, 20)); + + colorSelectBox = new NewColorSelectBox(152); + colorSelectBox.addSelectChangeListener(new ChangeListener() { + @Override + public void stateChanged(ChangeEvent e) { + } + }); + + backgroundPane.add(colorSelectLabel); + backgroundPane.add(colorSelectBox); + + this.add(backgroundPane, BorderLayout.NORTH); + } + + private void createCustomPane() { + JPanel configPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); + TitledBorder titledBorder = GUICoreUtils.createTitledBorder(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Set"), null); + titledBorder.setTitleFont(FRFont.getInstance("PingFangSC-Regular", Font.PLAIN, 12, Color.BLUE)); + configPane.setBorder(titledBorder); + + configPane.add(this.customBeanPane, BorderLayout.CENTER); + + this.add(configPane, BorderLayout.CENTER); + } +} diff --git a/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileStylePane.java b/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileStylePane.java new file mode 100644 index 000000000..c048c0d21 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileStylePane.java @@ -0,0 +1,130 @@ +package com.fr.design.mainframe.mobile.ui; + +import com.fr.design.ExtraDesignClassManager; +import com.fr.design.beans.BasicBeanPane; +import com.fr.design.dialog.BasicPane; +import com.fr.design.fun.MobileWidgetStyleProvider; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.form.ui.Widget; +import com.fr.form.ui.mobile.MobileStyle; +import com.fr.log.FineLoggerFactory; +import com.fr.stable.ArrayUtils; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.util.HashMap; +import java.util.Map; + +public class MobileStylePane extends BasicPane { + + private Widget widget; + private DefaultListModel listModel; + private JPanel right; + private CardLayout card; + private JList styleList; + private Map> map = new HashMap<>(); + + public MobileStylePane(Widget widget) { + this.widget = widget; + init(); + } + + @Override + protected String title4PopupWindow() { + return null; + } + + public void populate(MobileStyle mobileStyle) { + if(mobileStyle != null) { + MobileWidgetStyleProvider[] styleProviders = getMobileWidgetStyleProviders(); + for(int i = 0; i < styleProviders.length; i ++) { + if(mobileStyle.getClass() == styleProviders[i].classForMobileStyle()) { + String displayName = styleProviders[i].displayName(); + styleList.setSelectedIndex(i); + map.get(displayName).populateBean(mobileStyle); + card.show(right, displayName); + return; + } + } + } + styleList.setSelectedIndex(0); + } + + public MobileStyle update() { + return map.get(styleList.getSelectedValue()).updateBean(); + } + + private void init() { + this.setLayout(FRGUIPaneFactory.createBorderLayout()); + listModel = new DefaultListModel<>(); + card = new CardLayout(); + right = FRGUIPaneFactory.createCardLayout_S_Pane(); + right.setLayout(card); + MobileWidgetStyleProvider[] styleProviders = getMobileWidgetStyleProviders(); + for(MobileWidgetStyleProvider styleProvider: styleProviders) { + this.addProvider2View(styleProvider); + } + this.addWestList(); + this.addCenterConfig(); + } + + private void addWestList() { + styleList = new JList<>(listModel); + styleList.setCellRenderer(render); + styleList.addMouseListener(new MouseAdapter() { + public void mouseClicked(MouseEvent e) { + String selectedValue = (String)styleList.getSelectedValue(); + card.show(right, selectedValue); + } + }); + JPanel westPane = FRGUIPaneFactory.createBorderLayout_L_Pane(); + westPane.add(styleList, BorderLayout.CENTER); + westPane.setPreferredSize(new Dimension(100, 500)); + this.add(westPane, BorderLayout.WEST); + } + + private void addCenterConfig() { + JPanel centerPane = FRGUIPaneFactory.createBorderLayout_L_Pane(); + JPanel attrConfPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); + centerPane.setPreferredSize(new Dimension(500, 500)); + attrConfPane.add(right, BorderLayout.CENTER); + centerPane.add(attrConfPane, BorderLayout.CENTER); + this.add(centerPane, BorderLayout.CENTER); + } + + private void addProvider2View(MobileWidgetStyleProvider styleProvider) { + String displayName = styleProvider.displayName(); + Class appearanceClazz = styleProvider.classForWidgetAppearance(); + Class mobileStyleClazz = styleProvider.classForMobileStyle(); + + listModel.addElement(displayName); + try { + BasicBeanPane mobileStyleBasicBeanPane = new MobileStyleDefinePane(widget, appearanceClazz, mobileStyleClazz); + right.add(displayName, mobileStyleBasicBeanPane); + map.put(displayName, mobileStyleBasicBeanPane); + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } + } + + private static ListCellRenderer render = new DefaultListCellRenderer() { + @Override + public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { + super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); + if (value instanceof MobileStyle) { + MobileStyle l = (MobileStyle) value; + this.setText(l.toString()); + } + return this; + } + }; + + private MobileWidgetStyleProvider[] getMobileWidgetStyleProviders() { + DefaultMobileWidgetStyleProvider defaultMobileWidgetStyleProvider = new DefaultMobileWidgetStyleProvider(); + MobileWidgetStyleProvider[] styleProviders = ExtraDesignClassManager.getInstance().getMobileStyleOfWidget(widget.getXType()); + styleProviders = ArrayUtils.insert(0, styleProviders, defaultMobileWidgetStyleProvider); + return styleProviders; + } +} \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/mainframe/widget/accessibles/AccessibleMobileStyleEditor.java b/designer-base/src/main/java/com/fr/design/mainframe/widget/accessibles/AccessibleMobileStyleEditor.java new file mode 100644 index 000000000..e18e8e49d --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/mainframe/widget/accessibles/AccessibleMobileStyleEditor.java @@ -0,0 +1,36 @@ +package com.fr.design.mainframe.widget.accessibles; + +import com.fr.design.dialog.BasicDialog; +import com.fr.design.dialog.DialogActionAdapter; +import com.fr.design.mainframe.mobile.ui.MobileStylePane; +import com.fr.design.mainframe.widget.wrappers.MobileStyleWrapper; +import com.fr.form.ui.mobile.MobileStyle; + +import javax.swing.SwingUtilities; +import java.awt.Dimension; + +public class AccessibleMobileStyleEditor extends UneditableAccessibleEditor { + + private MobileStylePane stylePane; + private static final Dimension DEFAULT_DIMENSION = new Dimension(600, 400); + + public AccessibleMobileStyleEditor(MobileStylePane stylePane) { + super(new MobileStyleWrapper()); + this.stylePane = stylePane; + } + + @Override + protected void showEditorPane() { + stylePane.setPreferredSize(DEFAULT_DIMENSION); + BasicDialog dlg = stylePane.showWindow(SwingUtilities.getWindowAncestor(this)); + dlg.addDialogActionListener(new DialogActionAdapter() { + @Override + public void doOk() { + setValue(stylePane.update()); + fireStateChanged(); + } + }); + stylePane.populate((MobileStyle) getValue()); + dlg.setVisible(true); + } +} diff --git a/designer-base/src/main/java/com/fr/design/mainframe/widget/wrappers/MobileStyleWrapper.java b/designer-base/src/main/java/com/fr/design/mainframe/widget/wrappers/MobileStyleWrapper.java new file mode 100644 index 000000000..a8ceb7c46 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/mainframe/widget/wrappers/MobileStyleWrapper.java @@ -0,0 +1,26 @@ +package com.fr.design.mainframe.widget.wrappers; + +import com.fr.design.Exception.ValidationException; +import com.fr.design.designer.properties.Decoder; +import com.fr.design.designer.properties.Encoder; +import com.fr.locale.InterProviderFactory; + +public class MobileStyleWrapper implements Encoder, Decoder { + @Override + public Object decode(String txt) { + return null; + } + + @Override + public void validate(String txt) throws ValidationException { + + } + + @Override + public String encode(Object v) { + if (v == null) { + return InterProviderFactory.getProvider().getLocText("Fine-Engine_Report_DEFAULT"); + } + return v.toString(); + } +} diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/XChartEditor.java b/designer-form/src/main/java/com/fr/design/designer/creator/XChartEditor.java index 29ce253f5..14a5e3c96 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/XChartEditor.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/XChartEditor.java @@ -339,4 +339,9 @@ public class XChartEditor extends XBorderStyleWidgetCreator { public boolean isSupportShared() { return true; } + + @Override + public boolean supportMobileStyle() { + return false; + } } 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 b7d7b3a45..bef18f96f 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 @@ -3,7 +3,6 @@ */ package com.fr.design.designer.creator; -import com.fr.base.BaseUtils; import com.fr.base.GraphHelper; import com.fr.base.vcs.DesignerMode; import com.fr.design.actions.UpdateAction; @@ -591,6 +590,14 @@ public abstract class XCreator extends JPanel implements XComponent, XCreatorToo return; } + /** + * 是否支持定义移动端样式,默认true + * @return 是否支持定义移动端样式 + */ + public boolean supportMobileStyle() { + return true; + } + /** * 获取当前组件自定义的属性表tab * diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/XElementCase.java b/designer-form/src/main/java/com/fr/design/designer/creator/XElementCase.java index 480412287..ec06a1597 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/XElementCase.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/XElementCase.java @@ -121,6 +121,11 @@ public class XElementCase extends XBorderStyleWidgetCreator implements FormEleme return ArrayUtils.add(extraTableEditor, reportFitEditor); } + @Override + public boolean supportMobileStyle() { + return false; + } + private CRPropertyDescriptor getReportFitEditor() { this.designer = WidgetPropertyPane.getInstance().getEditingFormDesigner(); FitProvider wbTpl = designer.getTarget(); diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/XLayoutContainer.java b/designer-form/src/main/java/com/fr/design/designer/creator/XLayoutContainer.java index 45764e746..9044d6c3c 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/XLayoutContainer.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/XLayoutContainer.java @@ -572,4 +572,9 @@ public abstract class XLayoutContainer extends XBorderStyleWidgetCreator impleme return false; } + @Override + public boolean supportMobileStyle() { + return false; + } + } diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/XWScaleLayout.java b/designer-form/src/main/java/com/fr/design/designer/creator/XWScaleLayout.java index 1db5e4045..5225a3b4f 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/XWScaleLayout.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/XWScaleLayout.java @@ -179,4 +179,9 @@ public class XWScaleLayout extends DedicateLayoutContainer { } return super.getWidgetPropertyUIProviders(); } + + @Override + public boolean supportMobileStyle() { + return true; + } } \ No newline at end of file diff --git a/designer-form/src/main/java/com/fr/design/designer/properties/mobile/MobileStylePropertyUI.java b/designer-form/src/main/java/com/fr/design/designer/properties/mobile/MobileStylePropertyUI.java new file mode 100644 index 000000000..1f52694b8 --- /dev/null +++ b/designer-form/src/main/java/com/fr/design/designer/properties/mobile/MobileStylePropertyUI.java @@ -0,0 +1,31 @@ +package com.fr.design.designer.properties.mobile; + +import com.fr.design.designer.creator.XCreator; +import com.fr.design.dialog.BasicPane; +import com.fr.design.fun.impl.AbstractWidgetPropertyUIProvider; +import com.fr.design.gui.itable.AbstractPropertyTable; +import com.fr.design.widget.ui.designer.mobile.MobileWidgetStyleDefinePane; + +public class MobileStylePropertyUI extends AbstractWidgetPropertyUIProvider { + + private XCreator xCreator; + + public MobileStylePropertyUI(XCreator xCreator) { + this.xCreator = xCreator; + } + + @Override + public AbstractPropertyTable createWidgetAttrTable() { + return null; + } + + @Override + public BasicPane createWidgetAttrPane() { + return new MobileWidgetStyleDefinePane(xCreator); + } + + @Override + public String tableTitle() { + return null; + } +} diff --git a/designer-form/src/main/java/com/fr/design/mainframe/WidgetPropertyPane.java b/designer-form/src/main/java/com/fr/design/mainframe/WidgetPropertyPane.java index af17389be..8195fbb50 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/WidgetPropertyPane.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/WidgetPropertyPane.java @@ -7,6 +7,7 @@ import com.fr.design.designer.beans.events.DesignerEditListener; import com.fr.design.designer.beans.events.DesignerEvent; import com.fr.design.designer.creator.*; import com.fr.design.designer.properties.EventPropertyTable; +import com.fr.design.designer.properties.mobile.MobileStylePropertyUI; import com.fr.design.fun.WidgetPropertyUIProvider; import com.fr.design.gui.ibutton.UIHeadGroup; import com.fr.design.gui.icontainer.UIScrollPane; @@ -172,8 +173,12 @@ public class WidgetPropertyPane extends FormDockView implements BaseWidgetProper private WidgetPropertyUIProvider[] getExtraPropertyUIProviders() { FormSelection selection = designer.getSelectionModel().getSelection(); WidgetPropertyUIProvider[] embeddedPropertyUIProviders = null; - if (selection != null && selection.getSelectedCreator() != null) { + XCreator xCreator = selection.getSelectedCreator(); + if (selection != null && xCreator != null) { embeddedPropertyUIProviders = selection.getSelectedCreator().getWidgetPropertyUIProviders(); + if(!designer.getDesignerMode().isFormParameterEditor() && xCreator.supportMobileStyle()) { + embeddedPropertyUIProviders = ArrayUtils.insert(0, embeddedPropertyUIProviders, new MobileStylePropertyUI(xCreator)); + } } Set set = ExtraDesignClassManager.getInstance().getArray(WidgetPropertyUIProvider.XML_TAG); return ArrayUtils.addAll(embeddedPropertyUIProviders, set.toArray(new WidgetPropertyUIProvider[set.size()])); diff --git a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/MobileWidgetStyleDefinePane.java b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/MobileWidgetStyleDefinePane.java new file mode 100644 index 000000000..fb6f81fe5 --- /dev/null +++ b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/MobileWidgetStyleDefinePane.java @@ -0,0 +1,85 @@ +package com.fr.design.widget.ui.designer.mobile; + +import com.fr.design.constants.LayoutConstants; +import com.fr.design.designer.IntervalConstants; +import com.fr.design.designer.creator.XCreator; +import com.fr.design.gui.frpane.AttributeChangeListener; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.layout.TableLayoutHelper; +import com.fr.design.mainframe.DesignerContext; +import com.fr.design.mainframe.FormDesigner; +import com.fr.design.mainframe.widget.accessibles.AccessibleMobileStyleEditor; +import com.fr.design.mainframe.mobile.ui.MobileStylePane; +import com.fr.form.ui.mobile.MobileStyle; + +import javax.swing.*; +import java.awt.*; + +public class MobileWidgetStyleDefinePane extends MobileWidgetDefinePane { + + private XCreator xCreator; + private AccessibleMobileStyleEditor mobileStyleEditor; + private AttributeChangeListener changeListener; + + public MobileWidgetStyleDefinePane(XCreator xCreator) { + this.xCreator = xCreator; + } + + @Override + public void setPreferredSize(Dimension dimension) { + super.setPreferredSize(dimension); + } + + @Override + public void initPropertyGroups(Object source) { + this.setLayout(FRGUIPaneFactory.createBorderLayout()); + UILabel label = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Tab_Style_Template")); + mobileStyleEditor = new AccessibleMobileStyleEditor(new MobileStylePane(this.xCreator.toData())); + JPanel jPanel = TableLayoutHelper.createGapTableLayoutPane( + new Component[][]{new Component[]{label, mobileStyleEditor}}, + TableLayoutHelper.FILL_LASTCOLUMN, IntervalConstants.INTERVAL_L1, LayoutConstants.VGAP_LARGE + ); + JPanel holder = FRGUIPaneFactory.createBorderLayout_S_Pane(); + holder.add(jPanel, BorderLayout.NORTH); + + this.add(holder, BorderLayout.NORTH); + } + + @Override + public void populate(FormDesigner designer) { + mobileStyleEditor.setValue(xCreator.toData().getMobileStyle()); + this.bindListeners2Widgets(); + this.addAttributeChangeListener(changeListener); + } + + @Override + public void update() { + xCreator.toData().setMobileStyle((MobileStyle) mobileStyleEditor.getValue()); + DesignerContext.getDesignerFrame().getSelectedJTemplate().fireTargetModified(); + } + + @Override + public Dimension getPreferredSize() { + return new Dimension(super.getPreferredSize().width, 30); + } + + @Override + public Dimension getMaximumSize() { + return new Dimension(400, 200); + } + + private void bindListeners2Widgets() { + reInitAllListeners(); + this.changeListener = new AttributeChangeListener() { + @Override + public void attributeChange() { + update(); + } + }; + } + + private void reInitAllListeners() { + initListener(this); + } +} From 2d8fef4603267b7a10e17ebb7ad35f6b7311440e Mon Sep 17 00:00:00 2001 From: WeiYanglu Date: Sun, 11 Aug 2019 02:05:27 +0800 Subject: [PATCH 049/217] =?UTF-8?q?=E6=97=A5=E5=8E=86=E3=80=81=E4=B8=8B?= =?UTF-8?q?=E6=8B=89=E6=A1=86=E7=AD=89=E5=85=A8=E8=A2=ABScale=E5=8C=85?= =?UTF-8?q?=E4=BD=8F=E4=BA=86=EF=BC=8C=E8=AE=BE=E7=BD=AE=E6=88=90=E7=9C=9F?= =?UTF-8?q?=E5=AE=9E=E7=9A=84=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/mainframe/mobile/ui/MobileStylePane.java | 8 +++++++- .../designer/properties/mobile/MobileStylePropertyUI.java | 7 ++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileStylePane.java b/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileStylePane.java index c048c0d21..d0e949fa9 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileStylePane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileStylePane.java @@ -6,7 +6,9 @@ import com.fr.design.dialog.BasicPane; import com.fr.design.fun.MobileWidgetStyleProvider; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.form.ui.Widget; +import com.fr.form.ui.container.WScaleLayout; import com.fr.form.ui.mobile.MobileStyle; +import com.fr.form.ui.widget.CRBoundsWidget; import com.fr.log.FineLoggerFactory; import com.fr.stable.ArrayUtils; @@ -27,7 +29,11 @@ public class MobileStylePane extends BasicPane { private Map> map = new HashMap<>(); public MobileStylePane(Widget widget) { - this.widget = widget; + if(widget instanceof WScaleLayout) { + this.widget = ((CRBoundsWidget)((WScaleLayout) widget).getBoundsWidget()).getWidget(); + } else { + this.widget = widget; + } init(); } diff --git a/designer-form/src/main/java/com/fr/design/designer/properties/mobile/MobileStylePropertyUI.java b/designer-form/src/main/java/com/fr/design/designer/properties/mobile/MobileStylePropertyUI.java index 1f52694b8..831f558cb 100644 --- a/designer-form/src/main/java/com/fr/design/designer/properties/mobile/MobileStylePropertyUI.java +++ b/designer-form/src/main/java/com/fr/design/designer/properties/mobile/MobileStylePropertyUI.java @@ -1,6 +1,7 @@ package com.fr.design.designer.properties.mobile; import com.fr.design.designer.creator.XCreator; +import com.fr.design.designer.creator.XWScaleLayout; import com.fr.design.dialog.BasicPane; import com.fr.design.fun.impl.AbstractWidgetPropertyUIProvider; import com.fr.design.gui.itable.AbstractPropertyTable; @@ -11,7 +12,11 @@ public class MobileStylePropertyUI extends AbstractWidgetPropertyUIProvider { private XCreator xCreator; public MobileStylePropertyUI(XCreator xCreator) { - this.xCreator = xCreator; + if(xCreator instanceof XWScaleLayout) { + this.xCreator = xCreator.getEditingChildCreator(); + } else { + this.xCreator = xCreator; + } } @Override From 205d3149b26a0494494fc0d223558469472e85df Mon Sep 17 00:00:00 2001 From: WeiYanglu Date: Tue, 13 Aug 2019 00:00:55 +0800 Subject: [PATCH 050/217] =?UTF-8?q?MOBILE-21673=20&=20MOBILE-21669=20?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=B8=80=E5=A4=84=E9=A2=9C=E8=89=B2=E9=80=89?= =?UTF-8?q?=E6=8B=A9=E6=A1=86=E8=AF=BB=E5=8F=96=E5=80=BC=E6=97=B6=E6=96=B9?= =?UTF-8?q?=E6=B3=95=E4=BD=BF=E7=94=A8=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/mainframe/mobile/ui/MobileStyleDefinePane.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileStyleDefinePane.java b/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileStyleDefinePane.java index ef1327ccf..82e189943 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileStyleDefinePane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileStyleDefinePane.java @@ -43,7 +43,7 @@ public class MobileStyleDefinePane extends BasicBeanPane { MobileStyle mobileStyle = Reflect.on(mobileStyleClazz).create().get(); this.widget.setMobileStyle(mobileStyle); this.customBeanPane.updateBean(); - mobileStyle.setBackground(colorSelectBox.getBackground()); + mobileStyle.setBackground(colorSelectBox.getSelectObject()); return mobileStyle; } From bc5f6a6cf3bb4e06ecc2e49aa5f50af57ed5ac1c Mon Sep 17 00:00:00 2001 From: Hades Date: Tue, 13 Aug 2019 11:53:17 +0800 Subject: [PATCH 051/217] =?UTF-8?q?REPORT-19465=20=E3=80=90=E5=8C=B9?= =?UTF-8?q?=E9=85=8D=E7=A7=BB=E5=8A=A8=E7=AB=AF=E3=80=91=E6=A8=A1=E6=9D=BF?= =?UTF-8?q?=E7=BA=A7=E5=85=A8=E5=B1=80=E6=8E=A7=E5=88=B6=E7=BC=A9=E6=94=BE?= =?UTF-8?q?=E7=AD=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/form/mobile/FormMobileOthersPane.java | 5 +++++ .../java/com/fr/design/report/mobile/MobileOthersPane.java | 7 +++++++ 2 files changed, 12 insertions(+) diff --git a/designer-form/src/main/java/com/fr/design/form/mobile/FormMobileOthersPane.java b/designer-form/src/main/java/com/fr/design/form/mobile/FormMobileOthersPane.java index 03499286d..60cc6d21f 100644 --- a/designer-form/src/main/java/com/fr/design/form/mobile/FormMobileOthersPane.java +++ b/designer-form/src/main/java/com/fr/design/form/mobile/FormMobileOthersPane.java @@ -18,6 +18,7 @@ public class FormMobileOthersPane extends BasicBeanPane { private MobileRadioCheckPane appearRefreshCheckPane; // 页面再现时刷新 private MobileRadioCheckPane promptWhenLeaveWithoutSubmitCheckPane; // 数据未提交离开提示 + private MobileRadioCheckPane allowDoubleClickOrZoomCheckPane; // 允许双击/双指缩放 public FormMobileOthersPane() { this.initComponents(); @@ -32,6 +33,8 @@ public class FormMobileOthersPane extends BasicBeanPane { contentPane.add(appearRefreshCheckPane, BorderLayout.WEST); promptWhenLeaveWithoutSubmitCheckPane = new MobileRadioCheckPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Prompt_When_Leave_Without_Submit")); contentPane.add(promptWhenLeaveWithoutSubmitCheckPane, BorderLayout.CENTER); + allowDoubleClickOrZoomCheckPane = new MobileRadioCheckPane(com.fr.design.i18n.Toolkit.i18nText("允许双击/双指缩放")); + contentPane.add(allowDoubleClickOrZoomCheckPane, BorderLayout.EAST); borderPane.add(contentPane); this.add(borderPane); } @@ -43,6 +46,7 @@ public class FormMobileOthersPane extends BasicBeanPane { } this.appearRefreshCheckPane.populateBean(ob.isAppearRefresh()); this.promptWhenLeaveWithoutSubmitCheckPane.populateBean(ob.isPromptWhenLeaveWithoutSubmit()); + this.allowDoubleClickOrZoomCheckPane.populateBean(ob.isAllowDoubleClickOrZoom()); } @Override @@ -55,6 +59,7 @@ public class FormMobileOthersPane extends BasicBeanPane { if(mobileAttr != null) { mobileAttr.setAppearRefresh(this.appearRefreshCheckPane.updateBean()); mobileAttr.setPromptWhenLeaveWithoutSubmit(this.promptWhenLeaveWithoutSubmitCheckPane.updateBean()); + mobileAttr.setAllowDoubleClickOrZoom(this.allowDoubleClickOrZoomCheckPane.updateBean()); } } diff --git a/designer-realize/src/main/java/com/fr/design/report/mobile/MobileOthersPane.java b/designer-realize/src/main/java/com/fr/design/report/mobile/MobileOthersPane.java index 35c7da06d..4f88dcaef 100644 --- a/designer-realize/src/main/java/com/fr/design/report/mobile/MobileOthersPane.java +++ b/designer-realize/src/main/java/com/fr/design/report/mobile/MobileOthersPane.java @@ -18,6 +18,9 @@ public class MobileOthersPane extends BasicBeanPane { private MobileRadioCheckPane appearRefreshCheckPane; // 页面再现时刷新 + // 允许双击/双指缩放 + private MobileRadioCheckPane allowDoubleClickOrZoomCheckPane; + public MobileOthersPane() { this.initComponents(); } @@ -29,6 +32,8 @@ public class MobileOthersPane extends BasicBeanPane { contentPane.setBorder(BorderFactory.createEmptyBorder(0, IntervalConstants.INTERVAL_L1, 0, 0)); appearRefreshCheckPane = new MobileRadioCheckPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Appear_Refresh")); contentPane.add(appearRefreshCheckPane, BorderLayout.WEST); + allowDoubleClickOrZoomCheckPane = new MobileRadioCheckPane(com.fr.design.i18n.Toolkit.i18nText("允许双击/双指缩放")); + contentPane.add(allowDoubleClickOrZoomCheckPane, BorderLayout.CENTER); borderPane.add(contentPane); this.add(borderPane); } @@ -39,6 +44,7 @@ public class MobileOthersPane extends BasicBeanPane { ob = new ElementCaseMobileAttr(); } this.appearRefreshCheckPane.populateBean(ob.isAppearRefresh()); + this.allowDoubleClickOrZoomCheckPane.populateBean(ob.isAllowDoubleClickOrZoom()); } @Override @@ -50,6 +56,7 @@ public class MobileOthersPane extends BasicBeanPane { public void updateBean(ElementCaseMobileAttr mobileAttr) { if(mobileAttr != null) { mobileAttr.setAppearRefresh(this.appearRefreshCheckPane.updateBean()); + mobileAttr.setAllowDoubleClickOrZoom(this.allowDoubleClickOrZoomCheckPane.updateBean()); } } From f5400dd00ac9f03519ba46a563b952435b6fd2ce Mon Sep 17 00:00:00 2001 From: Hades Date: Wed, 14 Aug 2019 10:51:45 +0800 Subject: [PATCH 052/217] =?UTF-8?q?REPORT-19468=20=E3=80=90=E5=8C=B9?= =?UTF-8?q?=E9=85=8D=E7=A7=BB=E5=8A=A8=E7=AB=AF=E3=80=91H5=E8=B6=85?= =?UTF-8?q?=E9=93=BE=E6=A0=87=E9=A2=98=E6=98=BE=E7=A4=BA=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/designer/creator/XWBorderLayout.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/XWBorderLayout.java b/designer-form/src/main/java/com/fr/design/designer/creator/XWBorderLayout.java index a7b74d0fd..ff67634e4 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/XWBorderLayout.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/XWBorderLayout.java @@ -42,6 +42,7 @@ public class XWBorderLayout extends XLayoutContainer { * 默认名称 * @return 名称 */ + @Override public String createDefaultName() { return "border"; } @@ -50,6 +51,7 @@ public class XWBorderLayout extends XLayoutContainer { * 转化成相应 WBorderLayout * @return 相应 WBorderLayout */ + @Override public WBorderLayout toData() { return (WBorderLayout) data; } @@ -62,6 +64,7 @@ public class XWBorderLayout extends XLayoutContainer { * 初始大小 * @return 初始大小 */ + @Override public Dimension initEditorSize() { return new Dimension(WBorderLayout.DEFAULT_WIDTH, WBorderLayout.DEFAULT_HEIGHT); } @@ -71,15 +74,18 @@ public class XWBorderLayout extends XLayoutContainer { * @return 属性名 * @throws java.beans.IntrospectionException 抛错 */ + @Override public CRPropertyDescriptor[] supportedDescriptor() throws IntrospectionException { return new CRPropertyDescriptor[] { - new CRPropertyDescriptor("widgetName", this.data.getClass()).setI18NName(Toolkit.i18nText("Fine-Design_Form_Form_Widget_Name")) + new CRPropertyDescriptor("widgetName", this.data.getClass()).setI18NName(Toolkit.i18nText("Fine-Design_Form_Form_Widget_Name")), + new CRPropertyDescriptor("customTitleName", this.data.getClass()).setI18NName(Toolkit.i18nText("Fine-Design_Form_Title")) }; } /** * 将WLayout转换为XLayoutContainer */ + @Override public void convert() { isRefreshing = true; WBorderLayout wb = this.toData(); @@ -101,6 +107,7 @@ public class XWBorderLayout extends XLayoutContainer { * 设计界面中有组件添加时,要通知WLayout容器重新paint * @param e 事件 */ + @Override public void componentAdded(ContainerEvent e) { if (isRefreshing) { return; @@ -158,6 +165,7 @@ public class XWBorderLayout extends XLayoutContainer { /** * 重新计算大小 */ + @Override public void recalculateChildrenSize() { Dimension d = getSize(); WBorderLayout layout = toData(); @@ -173,6 +181,7 @@ public class XWBorderLayout extends XLayoutContainer { * @param comp 组件 * @param constraints 方位 */ + @Override public void add(Component comp, Object constraints) { super.add(comp, constraints); if (comp == null) { From ca4adb9a4aa5d41b34abcf50e543d1177a7d3354 Mon Sep 17 00:00:00 2001 From: richie Date: Fri, 16 Aug 2019 14:23:50 +0800 Subject: [PATCH 053/217] =?UTF-8?q?=E6=97=A0JIRA=E4=BB=BB=E5=8A=A1=20?= =?UTF-8?q?=E5=BC=80=E6=94=BESDK=E5=AF=B9=E9=9C=80=E8=A6=81=E5=BC=80?= =?UTF-8?q?=E6=94=BE=E7=9A=84=E7=B1=BB=E7=9A=84=E6=A0=87=E8=AE=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../env/DesignerWorkspaceGenerator.java | 26 +-- .../com/fr/sdk/designer/FineDesignUtils.java | 160 +++++++++--------- 2 files changed, 93 insertions(+), 93 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/env/DesignerWorkspaceGenerator.java b/designer-base/src/main/java/com/fr/design/env/DesignerWorkspaceGenerator.java index 1174a8a73..7494bba25 100644 --- a/designer-base/src/main/java/com/fr/design/env/DesignerWorkspaceGenerator.java +++ b/designer-base/src/main/java/com/fr/design/env/DesignerWorkspaceGenerator.java @@ -11,20 +11,20 @@ public class DesignerWorkspaceGenerator { public static Workspace generate(DesignerWorkspaceInfo config) throws Exception { - if (config == null || config.getType() == null) { - return null; - } + if (config == null || config.getType() == null) { + return null; + } - Workspace workspace = null; - switch (config.getType()) { - case Local: { - workspace = WorkContext.getFactory().build(config.getPath()); - break; - } - case Remote: { - WorkspaceClient client = WorkContext.getConnector().connect(config.getConnection()); - if (client != null) { - workspace = new RemoteWorkspace(client, config.getConnection()); + Workspace workspace = null; + switch (config.getType()) { + case Local: { + workspace = WorkContext.getFactory().build(config.getPath()); + break; + } + case Remote: { + WorkspaceClient client = WorkContext.getConnector().connect(config.getConnection()); + if (client != null) { + workspace = new RemoteWorkspace(client, config.getConnection()); } break; } diff --git a/designer-sdk/src/main/java/com/fr/sdk/designer/FineDesignUtils.java b/designer-sdk/src/main/java/com/fr/sdk/designer/FineDesignUtils.java index ea60edf74..7de2f3c2d 100644 --- a/designer-sdk/src/main/java/com/fr/sdk/designer/FineDesignUtils.java +++ b/designer-sdk/src/main/java/com/fr/sdk/designer/FineDesignUtils.java @@ -1,80 +1,80 @@ -package com.fr.sdk.designer; - -import com.fr.config.activator.ConfigurationActivator; -import com.fr.design.env.DesignerWorkspaceGenerator; -import com.fr.design.env.RemoteDesignerWorkspaceInfo; -import com.fr.log.FineLoggerFactory; -import com.fr.module.Activator; -import com.fr.module.Module; -import com.fr.module.tool.ActivatorToolBox; -import com.fr.report.ReportActivator; -import com.fr.report.RestrictionActivator; -import com.fr.report.module.ReportBaseActivator; -import com.fr.scheduler.SchedulerActivator; -import com.fr.sdk.server.shell.ModuleShell; -import com.fr.serialization.SerializationActivator; -import com.fr.stable.StringUtils; -import com.fr.startup.WorkspaceRegister; -import com.fr.store.StateServerActivator; -import com.fr.workspace.WorkContext; -import com.fr.workspace.connect.WorkspaceConnectionInfo; -import com.fr.workspace.engine.WorkspaceActivator; -import com.fr.workspace.server.ServerWorkspaceRegister; - -/** - * 设计器SDK模块工具类,用来放一些设计器相关插件开发过程中常用的工具函数 - */ -public class FineDesignUtils { - - /** - * 创建一个连接远程服务器的模块 - * @param remoteUrl 远程服务器地址 - * @param username 用户名 - * @param password 密码 - * @return 模块代理对象 使用ModuleShell的start和stop控制模块启停 - */ - public static ModuleShell createRemoteServerModule(String remoteUrl, String username, String password) { - return createRemoteServerModule(remoteUrl, username, password, StringUtils.EMPTY, StringUtils.EMPTY); - } - - /** - * 创建一个连接远程服务器的模块 - * @param remoteUrl 远程服务器地址 - * @param username 用户名 - * @param password 密码 - * @param certPath https证书路径 - * @param certSecretKey 证书秘钥 - * @return 模块代理对象 使用ModuleShell的start和stop控制模块启停 - */ - public static ModuleShell createRemoteServerModule(final String remoteUrl, final String username, final String password, final String certPath, final String certSecretKey) { - Module module = ActivatorToolBox.simpleLink( - new WorkspaceActivator(), - new SerializationActivator(), - new Activator() { - @Override - public void start() { - WorkspaceConnectionInfo connectionInfo = new WorkspaceConnectionInfo(remoteUrl, username, password, certPath, certSecretKey); - try { - WorkContext.switchTo(DesignerWorkspaceGenerator.generate(RemoteDesignerWorkspaceInfo.create(connectionInfo))); - } catch (Exception e) { - FineLoggerFactory.getLogger().error(e.getMessage(),e); - } - } - - @Override - public void stop() { - - } - }, - new ConfigurationActivator(), - new StateServerActivator(), - new SchedulerActivator(), - new ReportBaseActivator(), - new RestrictionActivator(), - new ReportActivator(), - new WorkspaceRegister(), - new ServerWorkspaceRegister() - ); - return new ModuleShell(module); - } -} \ No newline at end of file +//package com.fr.sdk.designer; +// +//import com.fr.config.activator.ConfigurationActivator; +//import com.fr.design.env.DesignerWorkspaceGenerator; +//import com.fr.design.env.RemoteDesignerWorkspaceInfo; +//import com.fr.log.FineLoggerFactory; +//import com.fr.module.Activator; +//import com.fr.module.Module; +//import com.fr.module.tool.ActivatorToolBox; +//import com.fr.report.ReportActivator; +//import com.fr.report.RestrictionActivator; +//import com.fr.report.module.ReportBaseActivator; +//import com.fr.scheduler.SchedulerActivator; +//import com.fr.sdk.server.shell.ModuleShell; +//import com.fr.serialization.SerializationActivator; +//import com.fr.stable.StringUtils; +//import com.fr.startup.WorkspaceRegister; +//import com.fr.store.StateServerActivator; +//import com.fr.workspace.WorkContext; +//import com.fr.workspace.connect.WorkspaceConnectionInfo; +//import com.fr.workspace.engine.WorkspaceActivator; +//import com.fr.workspace.server.ServerWorkspaceRegister; +// +///** +// * 设计器SDK模块工具类,用来放一些设计器相关插件开发过程中常用的工具函数 +// */ +//public class FineDesignUtils { +// +// /** +// * 创建一个连接远程服务器的模块 +// * @param remoteUrl 远程服务器地址 +// * @param username 用户名 +// * @param password 密码 +// * @return 模块代理对象 使用ModuleShell的start和stop控制模块启停 +// */ +// public static ModuleShell createRemoteServerModule(String remoteUrl, String username, String password) { +// return createRemoteServerModule(remoteUrl, username, password, StringUtils.EMPTY, StringUtils.EMPTY); +// } +// +// /** +// * 创建一个连接远程服务器的模块 +// * @param remoteUrl 远程服务器地址 +// * @param username 用户名 +// * @param password 密码 +// * @param certPath https证书路径 +// * @param certSecretKey 证书秘钥 +// * @return 模块代理对象 使用ModuleShell的start和stop控制模块启停 +// */ +// public static ModuleShell createRemoteServerModule(final String remoteUrl, final String username, final String password, final String certPath, final String certSecretKey) { +// Module module = ActivatorToolBox.simpleLink( +// new WorkspaceActivator(), +// new SerializationActivator(), +// new Activator() { +// @Override +// public void start() { +// WorkspaceConnectionInfo connectionInfo = new WorkspaceConnectionInfo(remoteUrl, username, password, certPath, certSecretKey); +// try { +// WorkContext.switchTo(DesignerWorkspaceGenerator.generate(RemoteDesignerWorkspaceInfo.create(connectionInfo))); +// } catch (Exception e) { +// FineLoggerFactory.getLogger().error(e.getMessage(),e); +// } +// } +// +// @Override +// public void stop() { +// +// } +// }, +// new ConfigurationActivator(), +// new StateServerActivator(), +// new SchedulerActivator(), +// new ReportBaseActivator(), +// new RestrictionActivator(), +// new ReportActivator(), +// new WorkspaceRegister(), +// new ServerWorkspaceRegister() +// ); +// return new ModuleShell(module); +// } +//} \ No newline at end of file From 9d0ac48c96d511c85fe1c246c47f8a78198916d7 Mon Sep 17 00:00:00 2001 From: richie Date: Fri, 16 Aug 2019 14:25:10 +0800 Subject: [PATCH 054/217] =?UTF-8?q?=E8=AF=AF=E4=BC=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../env/DesignerWorkspaceGenerator.java | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/env/DesignerWorkspaceGenerator.java b/designer-base/src/main/java/com/fr/design/env/DesignerWorkspaceGenerator.java index 7494bba25..1174a8a73 100644 --- a/designer-base/src/main/java/com/fr/design/env/DesignerWorkspaceGenerator.java +++ b/designer-base/src/main/java/com/fr/design/env/DesignerWorkspaceGenerator.java @@ -11,20 +11,20 @@ public class DesignerWorkspaceGenerator { public static Workspace generate(DesignerWorkspaceInfo config) throws Exception { - if (config == null || config.getType() == null) { - return null; - } + if (config == null || config.getType() == null) { + return null; + } - Workspace workspace = null; - switch (config.getType()) { - case Local: { - workspace = WorkContext.getFactory().build(config.getPath()); - break; - } - case Remote: { - WorkspaceClient client = WorkContext.getConnector().connect(config.getConnection()); - if (client != null) { - workspace = new RemoteWorkspace(client, config.getConnection()); + Workspace workspace = null; + switch (config.getType()) { + case Local: { + workspace = WorkContext.getFactory().build(config.getPath()); + break; + } + case Remote: { + WorkspaceClient client = WorkContext.getConnector().connect(config.getConnection()); + if (client != null) { + workspace = new RemoteWorkspace(client, config.getConnection()); } break; } From 27de4a0d2926047a4b6b728e36a5c94e86cc2cb9 Mon Sep 17 00:00:00 2001 From: "Bruce.Deng" Date: Fri, 16 Aug 2019 16:46:23 +0800 Subject: [PATCH 055/217] =?UTF-8?q?REPORT-19466=20=E3=80=90=E5=8C=B9?= =?UTF-8?q?=E9=85=8D=E7=A7=BB=E5=8A=A8=E7=AB=AF=E3=80=91=E7=BB=84=E4=BB=B6?= =?UTF-8?q?=E7=BA=A7=E6=8E=A7=E5=88=B6=E9=80=89=E4=B8=AD=E7=AD=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/designer/mobile/ChartEditorDefinePane.java | 15 ++++++++++++--- .../ui/designer/mobile/ElementCaseDefinePane.java | 8 ++++++++ 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/ChartEditorDefinePane.java b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/ChartEditorDefinePane.java index b9ae12e20..258be7d1b 100644 --- a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/ChartEditorDefinePane.java +++ b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/ChartEditorDefinePane.java @@ -48,6 +48,7 @@ public class ChartEditorDefinePane extends MobileWidgetDefinePane { private AttributeChangeListener changeListener; private UILabel tipLabel; private UICheckBox allowFullCheckBox;//允许全屏 + private UICheckBox functionalWhenUnactivatedCheckBox;//组件未激活时可使用组件内功能 public ChartEditorDefinePane(XCreator xCreator) { this.xCreator = xCreator; @@ -88,6 +89,8 @@ public class ChartEditorDefinePane extends MobileWidgetDefinePane { panel.add(unavailableTipLabel, BorderLayout.NORTH); allowFullCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Allow_Full_Screen")); panel.add(allowFullCheckBox); + functionalWhenUnactivatedCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Functional_When_Unactivated")); + panel.add(functionalWhenUnactivatedCheckBox); return panel; } @@ -98,19 +101,21 @@ public class ChartEditorDefinePane extends MobileWidgetDefinePane { tipLabel.setForeground(Color.gray); updateTipLabel(); allowFullCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Allow_Full_Screen")); + functionalWhenUnactivatedCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Functional_When_Unactivated")); Component[][] components = new Component[][]{ new Component[] {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Zoom_In_Logic"), SwingConstants.LEFT), new UILabel(ChartMobileFitAttrState.PROPORTION.description())}, new Component[] {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Zoom_Out_Logic"), SwingConstants.LEFT), zoomOutComboBox}, new Component[] {tipLabel, null}, - new Component[] {allowFullCheckBox} + new Component[] {allowFullCheckBox}, + new Component[] {functionalWhenUnactivatedCheckBox} }; double f = TableLayout.FILL; double p = TableLayout.PREFERRED; - double[] rowSize = {p, p, p, p}; + double[] rowSize = {p, p, p, p, p}; double[] columnSize = {p,f}; - int[][] rowCount = {{1, 1}, {1, 1}, {1, 1}, {1, 1}}; + int[][] rowCount = {{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}}; final JPanel panel = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, rowCount, 30, LayoutConstants.VGAP_LARGE); panel.setBorder(BorderFactory.createEmptyBorder(10, 0, 0, 0)); final JPanel panelWrapper = FRGUIPaneFactory.createBorderLayout_S_Pane(); @@ -154,6 +159,8 @@ public class ChartEditorDefinePane extends MobileWidgetDefinePane { BaseChartEditor chartEditor = (BaseChartEditor)xCreator.toData(); boolean allowFullScreen = chartEditor.getMobileAttr().isAllowFullScreen(); this.allowFullCheckBox.setSelected(allowFullScreen); + boolean isFunctionalWhenUnactivated = chartEditor.getMobileAttr().isFunctionalWhenUnactivated(); + this.functionalWhenUnactivatedCheckBox.setSelected(isFunctionalWhenUnactivated); this.bindListeners2Widgets(); this.addAttributeChangeListener(changeListener); @@ -188,8 +195,10 @@ public class ChartEditorDefinePane extends MobileWidgetDefinePane { mobileAttr.setZoomInAttr(ChartMobileFitAttrState.PROPORTION); mobileAttr.setZoomOutAttr((ChartMobileFitAttrState) ((Item) zoomOutComboBox.getSelectedItem()).getValue()); mobileAttr.setAllowFullScreen(allowFullCheckBox.isSelected()); + mobileAttr.setFunctionalWhenUnactivated(functionalWhenUnactivatedCheckBox.isSelected()); }else { mobileAttr.setAllowFullScreen(allowFullCheckBox.isSelected()); + mobileAttr.setFunctionalWhenUnactivated(functionalWhenUnactivatedCheckBox.isSelected()); } DesignerContext.getDesignerFrame().getSelectedJTemplate().fireTargetModified(); // 触发设计器保存按钮亮起来 } diff --git a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/ElementCaseDefinePane.java b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/ElementCaseDefinePane.java index 9e833f0ae..43f063f4a 100644 --- a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/ElementCaseDefinePane.java +++ b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/ElementCaseDefinePane.java @@ -50,6 +50,7 @@ public class ElementCaseDefinePane extends MobileWidgetDefinePane{ private UISpinner maxHeightSpinner; // 最大高度Spinner private AttributeChangeListener changeListener; private UICheckBox allowFullCheckBox; + private UICheckBox functionalWhenUnactivatedCheckBox; public ElementCaseDefinePane (XCreator xCreator) { this.xCreator = xCreator; @@ -87,11 +88,14 @@ public class ElementCaseDefinePane extends MobileWidgetDefinePane{ allowFullCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Allow_Full_Screen")); + functionalWhenUnactivatedCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Functional_When_Unactivated")); + Component[][] components = new Component[][]{ new Component[] {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Mobile_Horizontal"), SwingConstants.LEFT), hComboBox}, new Component[] {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Mobile_Vertical"), SwingConstants.LEFT), vComboBox}, new Component[] {heightRestrictCheckBox, null}, new Component[] {allowFullCheckBox}, + new Component[] {functionalWhenUnactivatedCheckBox}, new Component[] {maxHeightLabel, maxHeightSpinner} }; double f = TableLayout.FILL; @@ -139,6 +143,7 @@ public class ElementCaseDefinePane extends MobileWidgetDefinePane{ this.maxHeightSpinner.setVisible(elementCaseEditor.isHeightRestrict()); this.maxHeightSpinner.setValue(elementCaseEditor.getHeightPercent()); this.allowFullCheckBox.setSelected(elementCaseEditor.isAllowFullScreen()); + this.functionalWhenUnactivatedCheckBox.setSelected(elementCaseEditor.isFunctionalWhenUnactivated()); } @Override @@ -163,6 +168,8 @@ public class ElementCaseDefinePane extends MobileWidgetDefinePane{ break; case "allowFullCheckBox": ((ElementCaseEditor)xCreator.toData()).setAllowFullScreen(allowFullCheckBox.isSelected()); + case "functionalWhenUnactivatedCheckBox": + ((ElementCaseEditor)xCreator.toData()).setAllowFullScreen(functionalWhenUnactivatedCheckBox.isSelected()); } } @@ -172,6 +179,7 @@ public class ElementCaseDefinePane extends MobileWidgetDefinePane{ this.heightRestrictCheckBox.setGlobalName("heightRestrictCheckBox"); this.maxHeightSpinner.setGlobalName("maxHeightSpinner"); this.allowFullCheckBox.setGlobalName("allowFullCheckBox"); + this.functionalWhenUnactivatedCheckBox.setGlobalName("functionalWhenUnactivatedCheckBox"); } } From 603d0d2c8202f327fb630a9afd9f2a8bcd3a9c32 Mon Sep 17 00:00:00 2001 From: "Bruce.Deng" Date: Sat, 17 Aug 2019 12:13:09 +0800 Subject: [PATCH 056/217] =?UTF-8?q?REPORT-19466=20=E3=80=90=E5=8C=B9?= =?UTF-8?q?=E9=85=8D=E7=A7=BB=E5=8A=A8=E7=AB=AF=E3=80=91=E7=BB=84=E4=BB=B6?= =?UTF-8?q?=E7=BA=A7=E6=8E=A7=E5=88=B6=E9=80=89=E4=B8=AD=E7=AD=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mobile/ChartEditorDefinePane.java | 4 +-- .../mobile/ElementCaseDefinePane.java | 36 +++++++++---------- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/ChartEditorDefinePane.java b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/ChartEditorDefinePane.java index 258be7d1b..a91ebd749 100644 --- a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/ChartEditorDefinePane.java +++ b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/ChartEditorDefinePane.java @@ -107,8 +107,8 @@ public class ChartEditorDefinePane extends MobileWidgetDefinePane { new Component[] {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Zoom_In_Logic"), SwingConstants.LEFT), new UILabel(ChartMobileFitAttrState.PROPORTION.description())}, new Component[] {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Zoom_Out_Logic"), SwingConstants.LEFT), zoomOutComboBox}, new Component[] {tipLabel, null}, - new Component[] {allowFullCheckBox}, - new Component[] {functionalWhenUnactivatedCheckBox} + new Component[] {allowFullCheckBox, null}, + new Component[] {functionalWhenUnactivatedCheckBox, null} }; double f = TableLayout.FILL; diff --git a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/ElementCaseDefinePane.java b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/ElementCaseDefinePane.java index 43f063f4a..5f255bb60 100644 --- a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/ElementCaseDefinePane.java +++ b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/ElementCaseDefinePane.java @@ -29,10 +29,10 @@ import java.awt.Component; /** * 报表块-移动端属性面板 - * + *

* Created by fanglei on 2017/8/8. */ -public class ElementCaseDefinePane extends MobileWidgetDefinePane{ +public class ElementCaseDefinePane extends MobileWidgetDefinePane { private static final double MAX_HEIGHT_LIMIT = 0.8; private static final Item[] ITEMS = { new Item(MobileFitAttrState.HORIZONTAL.description(), MobileFitAttrState.HORIZONTAL), @@ -52,7 +52,7 @@ public class ElementCaseDefinePane extends MobileWidgetDefinePane{ private UICheckBox allowFullCheckBox; private UICheckBox functionalWhenUnactivatedCheckBox; - public ElementCaseDefinePane (XCreator xCreator) { + public ElementCaseDefinePane(XCreator xCreator) { this.xCreator = xCreator; } @@ -94,16 +94,16 @@ public class ElementCaseDefinePane extends MobileWidgetDefinePane{ new Component[] {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Mobile_Horizontal"), SwingConstants.LEFT), hComboBox}, new Component[] {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Mobile_Vertical"), SwingConstants.LEFT), vComboBox}, new Component[] {heightRestrictCheckBox, null}, - new Component[] {allowFullCheckBox}, - new Component[] {functionalWhenUnactivatedCheckBox}, + new Component[] {allowFullCheckBox, null}, + new Component[] {functionalWhenUnactivatedCheckBox, null}, new Component[] {maxHeightLabel, maxHeightSpinner} }; double f = TableLayout.FILL; double p = TableLayout.PREFERRED; - double[] rowSize = {p, p, p, p, p}; - double[] columnSize = {p,f}; - int[][] rowCount = {{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}}; - final JPanel panel = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, rowCount, 30, LayoutConstants.VGAP_LARGE); + double[] rowSize = {p, p, p, p, p, p}; + double[] columnSize = {p, f}; + int[][] rowCount = {{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}}; + final JPanel panel = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, rowCount, 30, LayoutConstants.VGAP_LARGE); panel.setBorder(BorderFactory.createEmptyBorder(10, 0, 0, 0)); final JPanel panelWrapper = FRGUIPaneFactory.createBorderLayout_S_Pane(); panelWrapper.add(panel, BorderLayout.NORTH); @@ -135,9 +135,9 @@ public class ElementCaseDefinePane extends MobileWidgetDefinePane{ public void populate(FormDesigner designer) { this.designer = designer; this.addAttributeChangeListener(changeListener); - ElementCaseEditor elementCaseEditor = (ElementCaseEditor)xCreator.toData(); - this.hComboBox.setSelectedItem(new Item (elementCaseEditor.getHorziontalAttr().description(), elementCaseEditor.getHorziontalAttr())); - this.vComboBox.setSelectedItem(new Item (elementCaseEditor.getVerticalAttr().description(), elementCaseEditor.getVerticalAttr())); + ElementCaseEditor elementCaseEditor = (ElementCaseEditor) xCreator.toData(); + this.hComboBox.setSelectedItem(new Item(elementCaseEditor.getHorziontalAttr().description(), elementCaseEditor.getHorziontalAttr())); + this.vComboBox.setSelectedItem(new Item(elementCaseEditor.getVerticalAttr().description(), elementCaseEditor.getVerticalAttr())); this.heightRestrictCheckBox.setSelected(elementCaseEditor.isHeightRestrict()); this.maxHeightLabel.setVisible(elementCaseEditor.isHeightRestrict()); this.maxHeightSpinner.setVisible(elementCaseEditor.isHeightRestrict()); @@ -152,24 +152,24 @@ public class ElementCaseDefinePane extends MobileWidgetDefinePane{ String globalName = this.getGlobalName(); switch (globalName) { case "hComboBox": - ((ElementCaseEditor)xCreator.toData()).setHorziontalAttr(((MobileFitAttrState)((Item)hComboBox.getSelectedItem()).getValue())); + ((ElementCaseEditor) xCreator.toData()).setHorziontalAttr(((MobileFitAttrState) ((Item) hComboBox.getSelectedItem()).getValue())); break; case "vComboBox": - ((ElementCaseEditor)xCreator.toData()).setVerticalAttr(((MobileFitAttrState)((Item)vComboBox.getSelectedItem()).getValue())); + ((ElementCaseEditor) xCreator.toData()).setVerticalAttr(((MobileFitAttrState) ((Item) vComboBox.getSelectedItem()).getValue())); break; case "heightRestrictCheckBox": boolean isHeightRestrict = heightRestrictCheckBox.isSelected(); - ((ElementCaseEditor)xCreator.toData()).setHeightRestrict(isHeightRestrict); + ((ElementCaseEditor) xCreator.toData()).setHeightRestrict(isHeightRestrict); maxHeightSpinner.setVisible(isHeightRestrict); maxHeightLabel.setVisible(isHeightRestrict); break; case "maxHeightSpinner": - ((ElementCaseEditor)xCreator.toData()).setHeightPercent(maxHeightSpinner.getValue()); + ((ElementCaseEditor) xCreator.toData()).setHeightPercent(maxHeightSpinner.getValue()); break; case "allowFullCheckBox": - ((ElementCaseEditor)xCreator.toData()).setAllowFullScreen(allowFullCheckBox.isSelected()); + ((ElementCaseEditor) xCreator.toData()).setAllowFullScreen(allowFullCheckBox.isSelected()); case "functionalWhenUnactivatedCheckBox": - ((ElementCaseEditor)xCreator.toData()).setAllowFullScreen(functionalWhenUnactivatedCheckBox.isSelected()); + ((ElementCaseEditor) xCreator.toData()).setFunctionalWhenUnactivated(functionalWhenUnactivatedCheckBox.isSelected()); } } From 70a4c79a8f8cb38ad0dc8a0d4e6f119a3eb76b85 Mon Sep 17 00:00:00 2001 From: zack Date: Sun, 18 Aug 2019 22:37:04 +0800 Subject: [PATCH 057/217] =?UTF-8?q?=E5=86=B2=E7=AA=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../update/ui/dialog/UpdateMainDialog.java | 23 +-- .../java/com/fr/design/utils/DesignUtils.java | 4 +- .../chart/DownloadOnlineSourcesHelper.java | 31 ++-- .../mainframe/InformationCollector.java | 153 ++++++++---------- 4 files changed, 100 insertions(+), 111 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/update/ui/dialog/UpdateMainDialog.java b/designer-base/src/main/java/com/fr/design/update/ui/dialog/UpdateMainDialog.java index 81239d84b..525077d62 100644 --- a/designer-base/src/main/java/com/fr/design/update/ui/dialog/UpdateMainDialog.java +++ b/designer-base/src/main/java/com/fr/design/update/ui/dialog/UpdateMainDialog.java @@ -35,6 +35,7 @@ import com.fr.json.JSONArray; import com.fr.json.JSONObject; import com.fr.log.FineLoggerFactory; import com.fr.stable.ArrayUtils; +import com.fr.stable.EncodeConstants; import com.fr.stable.ProductConstants; import com.fr.stable.StableUtils; import com.fr.stable.StringUtils; @@ -362,10 +363,10 @@ public class UpdateMainDialog extends UIDialog { add(jarVersionInfoPane, BorderLayout.NORTH); //海外版本不显示更新信息 - if (GeneralContext.getLocale().equals(Locale.CHINA) || GeneralContext.getLocale().equals(Locale.TAIWAN)){ + if (GeneralContext.getLocale().equals(Locale.CHINA) || GeneralContext.getLocale().equals(Locale.TAIWAN)) { add(jarUpdateInfoPane, BorderLayout.CENTER); add(updateActionPane, BorderLayout.SOUTH); - }else { + } else { add(updateActionPane, BorderLayout.CENTER); } @@ -513,16 +514,15 @@ public class UpdateMainDialog extends UIDialog { if (endTime.equals(lastUpdateCacheTime) || jsonArray.length() == 0 || ComparatorUtils.compare(endTime, lastUpdateCacheTime) <= 0) { return; } - OutputStreamWriter writerStream = new OutputStreamWriter(new FileOutputStream(cacheFile), "UTF-8"); - BufferedWriter bufferWriter = new BufferedWriter(writerStream); - for (int i = 0; i < jsonArray.length(); i++) { - JSONObject jo = (JSONObject) jsonArray.get(i); - bufferWriter.write((String) jo.get("update") + '\t' + jo.get("title")); - bufferWriter.newLine(); - bufferWriter.flush(); + try (OutputStreamWriter writerStream = new OutputStreamWriter(new FileOutputStream(cacheFile), EncodeConstants.ENCODING_UTF_8); + BufferedWriter bufferWriter = new BufferedWriter(writerStream)) { + for (int i = 0; i < jsonArray.length(); i++) { + JSONObject jo = (JSONObject) jsonArray.get(i); + bufferWriter.write((String) jo.get("update") + '\t' + jo.get("title")); + bufferWriter.newLine(); + bufferWriter.flush(); + } } - bufferWriter.close(); - writerStream.close(); lastUpdateCacheState = UPDATE_CACHE_STATE_SUCCESS; lastUpdateCacheTime = endTime; cacheProperty.updateProperty("updateTime", lastUpdateCacheTime); @@ -634,6 +634,7 @@ public class UpdateMainDialog extends UIDialog { /** * 获取当前jar的md5 + * * @param currentJAR * @return */ diff --git a/designer-base/src/main/java/com/fr/design/utils/DesignUtils.java b/designer-base/src/main/java/com/fr/design/utils/DesignUtils.java index befe47c55..b31209381 100644 --- a/designer-base/src/main/java/com/fr/design/utils/DesignUtils.java +++ b/designer-base/src/main/java/com/fr/design/utils/DesignUtils.java @@ -67,8 +67,7 @@ public class DesignUtils { * @return 启动了返回true */ public static boolean isStarted() { - try { - new Socket("localhost", port); + try (Socket socket = new Socket("localhost", port)) { return true; } catch (Exception ignored) { } @@ -116,6 +115,7 @@ public class DesignUtils { * @param startPort 端口 * @param suffixs 文件后缀 */ + @SuppressWarnings("squid:S2095") public static void createListeningServer(final int startPort, final String[] suffixs) { ExecutorService service = Executors.newSingleThreadExecutor(new NamedThreadFactory("DesignClientListener")); service.execute(new Runnable() { diff --git a/designer-chart/src/main/java/com/fr/van/chart/DownloadOnlineSourcesHelper.java b/designer-chart/src/main/java/com/fr/van/chart/DownloadOnlineSourcesHelper.java index bea3beba9..8849cc17c 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/DownloadOnlineSourcesHelper.java +++ b/designer-chart/src/main/java/com/fr/van/chart/DownloadOnlineSourcesHelper.java @@ -64,7 +64,7 @@ public class DownloadOnlineSourcesHelper implements DownloadSourcesEvent { } public void addSiteInfo(String siteKind, String localDir, double megaBits) { - + if (new File(StableUtils.pathJoin(WorkContext.getCurrent().getPath(), localDir)).exists()) { //本地有这个资源,不下载 return; @@ -86,12 +86,14 @@ public class DownloadOnlineSourcesHelper implements DownloadSourcesEvent { initDialog(); dialog.addWindowListener(new WindowAdapter() { + @Override public void windowClosing(WindowEvent e) { //取消下载 result = false; exitDialog(); } + @Override public void windowOpened(WindowEvent e) { downloadAndInstallPluginDependenceFile(); exitDialog(); @@ -119,25 +121,22 @@ public class DownloadOnlineSourcesHelper implements DownloadSourcesEvent { httpClient = new HttpClient(CloudCenter.getInstance().acquireUrlByKind(siteInfo.siteKind)); if (httpClient.getResponseCode() == HttpURLConnection.HTTP_OK) { - InputStream reader = httpClient.getResponseStream(); String temp = StableUtils.pathJoin(PluginConstants.DOWNLOAD_PATH, PluginConstants.TEMP_FILE); File file = new File(temp); StableUtils.makesureFileExist(file); - FileOutputStream writer = new FileOutputStream(temp); - byte[] buffer = new byte[PluginConstants.BYTES_NUM]; - int bytesRead; - while ((bytesRead = reader.read(buffer)) > 0 && result) { - writer.write(buffer, 0, bytesRead); - buffer = new byte[PluginConstants.BYTES_NUM]; - - currentBytesRead += bytesRead; - setProgress(currentBytesRead); + try (InputStream reader = httpClient.getResponseStream(); + FileOutputStream writer = new FileOutputStream(temp)) { + byte[] buffer = new byte[PluginConstants.BYTES_NUM]; + int bytesRead; + while ((bytesRead = reader.read(buffer)) > 0 && result) { + writer.write(buffer, 0, bytesRead); + buffer = new byte[PluginConstants.BYTES_NUM]; + + currentBytesRead += bytesRead; + setProgress(currentBytesRead); + } + writer.flush(); } - reader.close(); - writer.flush(); - writer.close(); - - if (result) { //安装文件 IOUtils.unZipFilesGBK(temp, StableUtils.pathJoin(WorkContext.getCurrent().getPath(), siteInfo.localDir)); diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/InformationCollector.java b/designer-realize/src/main/java/com/fr/design/mainframe/InformationCollector.java index 148929495..25c8a493e 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/InformationCollector.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/InformationCollector.java @@ -54,7 +54,6 @@ import java.util.concurrent.TimeUnit; /** * @author neil - * * @date: 2015-4-8-下午5:11:46 */ public class InformationCollector implements XMLReadable, XMLWriter { @@ -83,17 +82,17 @@ public class InformationCollector implements XMLReadable, XMLWriter { private String lastTime; private StartStopTime current = new StartStopTime(); - public static InformationCollector getInstance(){ + public static InformationCollector getInstance() { if (collector == null) { collector = new InformationCollector(); - readEncodeXMLFile(collector, collector.getInfoFile()); + readEncodeXMLFile(collector, collector.getInfoFile()); } return collector; } - private static void readEncodeXMLFile(XMLReadable xmlReadable, File xmlFile){ + private static void readEncodeXMLFile(XMLReadable xmlReadable, File xmlFile) { if (xmlFile == null || !xmlFile.exists()) { return; } @@ -110,22 +109,22 @@ public class InformationCollector implements XMLReadable, XMLWriter { } xmlInputStream.close(); } catch (FileNotFoundException e) { - FineLoggerFactory.getLogger().error(e.getMessage(), e); + FineLoggerFactory.getLogger().error(e.getMessage(), e); } catch (IOException e) { - FineLoggerFactory.getLogger().error(e.getMessage(), e); + FineLoggerFactory.getLogger().error(e.getMessage(), e); } catch (XMLStreamException e) { - FineLoggerFactory.getLogger().error(e.getMessage(), e); + FineLoggerFactory.getLogger().error(e.getMessage(), e); } } - private static String getDecodeFileContent(File xmlFile) throws FileNotFoundException, UnsupportedEncodingException{ + private static String getDecodeFileContent(File xmlFile) throws FileNotFoundException, UnsupportedEncodingException { InputStream encodeInputStream = new FileInputStream(xmlFile); String encodeContent = IOUtils.inputStream2String(encodeInputStream); return DesUtils.getDecString(encodeContent); } - private long getLastTimeMillis(){ + private long getLastTimeMillis() { if (StringUtils.isEmpty(this.lastTime)) { return 0; } @@ -138,7 +137,7 @@ public class InformationCollector implements XMLReadable, XMLWriter { } - private JSONObject getJSONContentAsByte(){ + private JSONObject getJSONContentAsByte() { JSONObject content = new JSONObject(); JSONArray startStopArray = new JSONArray(); @@ -159,7 +158,7 @@ public class InformationCollector implements XMLReadable, XMLWriter { return content; } - private void sendUserInfo(){ + private void sendUserInfo() { long currentTime = new Date().getTime(); long lastTime = getLastTimeMillis(); @@ -178,7 +177,7 @@ public class InformationCollector implements XMLReadable, XMLWriter { } catch (Exception e) { FineLoggerFactory.getLogger().error(e.getMessage(), e); } - if (success){ + if (success) { this.reset(); } } @@ -186,13 +185,13 @@ public class InformationCollector implements XMLReadable, XMLWriter { /** * 收集开始使用时间,发送信息 */ - public void collectStartTime(){ + public void collectStartTime() { this.current.setStartDate(dateToString()); sendUserInfoInOtherThread(); } - private void sendUserInfoInOtherThread(){ + private void sendUserInfoInOtherThread() { if (!DesignerEnvManager.getEnvManager().isJoinProductImprove() || !FRContext.isChineseEnv()) { return; } @@ -209,67 +208,57 @@ public class InformationCollector implements XMLReadable, XMLWriter { }, SEND_DELAY, TimeUnit.MILLISECONDS); } - /** - * 收集结束使用时间 - */ - public void collectStopTime(){ + /** + * 收集结束使用时间 + */ + public void collectStopTime() { this.current.setStopDate(dateToString()); } - private String dateToString(){ + private String dateToString() { DateFormat df = FRContext.getDefaultValues().getDateTimeFormat(); return df.format(new Date()); } - private void reset(){ + private void reset() { this.startStop.clear(); this.lastTime = dateToString(); } - private File getInfoFile() { - return new File(StableUtils.pathJoin(ProductConstants.getEnvHome(), FILE_NAME)); - } - - /** - * 保存xml文件 - */ - public void saveXMLFile() { - File xmlFile = this.getInfoFile(); - try{ - ByteArrayOutputStream out = new ByteArrayOutputStream(); + private File getInfoFile() { + return new File(StableUtils.pathJoin(ProductConstants.getEnvHome(), FILE_NAME)); + } + + /** + * 保存xml文件 + */ + public void saveXMLFile() { + File xmlFile = this.getInfoFile(); + try { + ByteArrayOutputStream out = new ByteArrayOutputStream(); XMLTools.writeOutputStreamXML(this, out); out.flush(); out.close(); String fileContent = new String(out.toByteArray(), EncodeConstants.ENCODING_UTF_8); String encodeCotent = DesUtils.getEncString(fileContent); writeEncodeContentToFile(encodeCotent, xmlFile); - }catch (Exception e) { - FineLoggerFactory.getLogger().error(e.getMessage(), e); + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); } - } + } /** * 将文件内容写到输出流中 */ - private static void writeEncodeContentToFile(String fileContent, File file){ - BufferedWriter bw = null; - try { - FileOutputStream fos = new FileOutputStream(file); - OutputStreamWriter osw = new OutputStreamWriter(fos, EncodeConstants.ENCODING_UTF_8); - bw = new BufferedWriter(osw); + private static void writeEncodeContentToFile(String fileContent, File file) { + try (FileOutputStream fos = new FileOutputStream(file); + OutputStreamWriter osw = new OutputStreamWriter(fos, EncodeConstants.ENCODING_UTF_8); + BufferedWriter bw = new BufferedWriter(osw)) { bw.write(fileContent); } catch (Exception e) { - FineLoggerFactory.getLogger().error(e.getMessage(), e); - } finally { - if(bw != null){ - try { - bw.close(); - } catch (IOException e) { - } - } + FineLoggerFactory.getLogger().error(e.getMessage(), e); } - } @Override @@ -284,56 +273,56 @@ public class InformationCollector implements XMLReadable, XMLWriter { writer.end(); } - private void writeStartStopList(XMLPrintWriter writer){ + private void writeStartStopList(XMLPrintWriter writer) { //启停 - writer.startTAG(XML_START_STOP_LIST); - for (int i = 0; i < startStop.size(); i++) { - startStop.get(i).writeXML(writer); + writer.startTAG(XML_START_STOP_LIST); + for (int i = 0; i < startStop.size(); i++) { + startStop.get(i).writeXML(writer); } - writer.end(); + writer.end(); } - private void writeTag(String tag, String content, XMLPrintWriter writer){ + private void writeTag(String tag, String content, XMLPrintWriter writer) { if (StringUtils.isEmpty(content)) { return; } - writer.startTAG(tag); - writer.textNode(content); - writer.end(); + writer.startTAG(tag); + writer.textNode(content); + writer.end(); } @Override public void readXML(XMLableReader reader) { - if (reader.isChildNode()) { - String name = reader.getTagName(); - if (XML_START_STOP_LIST.equals(name)) { - readStartStopList(reader); - } else if(XML_LAST_TIME.equals(name)){ - readLastTime(reader); + if (reader.isChildNode()) { + String name = reader.getTagName(); + if (XML_START_STOP_LIST.equals(name)) { + readStartStopList(reader); + } else if (XML_LAST_TIME.equals(name)) { + readLastTime(reader); } - } + } } - private void readLastTime(XMLableReader reader){ + private void readLastTime(XMLableReader reader) { String tmpVal; if (StringUtils.isNotBlank(tmpVal = reader.getElementValue())) { this.lastTime = tmpVal; } } - private void readStartStopList(XMLableReader reader){ - startStop.clear(); + private void readStartStopList(XMLableReader reader) { + startStop.clear(); reader.readXMLObject(new XMLReadable() { - public void readXML(XMLableReader reader) { - if (XML_START_STOP.equals(reader.getTagName())) { - StartStopTime startStopTime = new StartStopTime(); - reader.readXMLObject(startStopTime); - startStop.add(startStopTime); - } - } - }); + public void readXML(XMLableReader reader) { + if (XML_START_STOP.equals(reader.getTagName())) { + StartStopTime startStopTime = new StartStopTime(); + reader.readXMLObject(startStopTime); + startStop.add(startStopTime); + } + } + }); } private class StartStopTime implements XMLReadable, XMLWriter { @@ -358,14 +347,14 @@ public class InformationCollector implements XMLReadable, XMLWriter { } public void writeXML(XMLPrintWriter writer) { - writer.startTAG(XML_START_STOP); - if (StringUtils.isNotEmpty(startDate)) { - writer.attr(ATTR_START, this.startDate); + writer.startTAG(XML_START_STOP); + if (StringUtils.isNotEmpty(startDate)) { + writer.attr(ATTR_START, this.startDate); } - if (StringUtils.isNotEmpty(stopDate)) { - writer.attr(ATTR_STOP, this.stopDate); + if (StringUtils.isNotEmpty(stopDate)) { + writer.attr(ATTR_STOP, this.stopDate); } - writer.end(); + writer.end(); } public void readXML(XMLableReader reader) { From a5bb0bf8cd3693e0e9bfd4cae579ba01f9b4c625 Mon Sep 17 00:00:00 2001 From: zack Date: Sun, 18 Aug 2019 22:43:27 +0800 Subject: [PATCH 058/217] =?UTF-8?q?=E5=88=A0=E6=8E=89sdk?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- designer-sdk/pom.xml | 5 -- .../com/fr/sdk/designer/FineDesignUtils.java | 80 ------------------- .../java/com/fr/sdk/FineDesignUtilsTest.java | 7 -- 3 files changed, 92 deletions(-) delete mode 100644 designer-sdk/src/main/java/com/fr/sdk/designer/FineDesignUtils.java delete mode 100644 designer-sdk/src/test/java/com/fr/sdk/FineDesignUtilsTest.java diff --git a/designer-sdk/pom.xml b/designer-sdk/pom.xml index 9702536e2..2fb53e1dc 100644 --- a/designer-sdk/pom.xml +++ b/designer-sdk/pom.xml @@ -17,10 +17,5 @@ designer-realize 10.0 - - com.fr.report - sdk-base - 10.0 - \ No newline at end of file diff --git a/designer-sdk/src/main/java/com/fr/sdk/designer/FineDesignUtils.java b/designer-sdk/src/main/java/com/fr/sdk/designer/FineDesignUtils.java deleted file mode 100644 index 7de2f3c2d..000000000 --- a/designer-sdk/src/main/java/com/fr/sdk/designer/FineDesignUtils.java +++ /dev/null @@ -1,80 +0,0 @@ -//package com.fr.sdk.designer; -// -//import com.fr.config.activator.ConfigurationActivator; -//import com.fr.design.env.DesignerWorkspaceGenerator; -//import com.fr.design.env.RemoteDesignerWorkspaceInfo; -//import com.fr.log.FineLoggerFactory; -//import com.fr.module.Activator; -//import com.fr.module.Module; -//import com.fr.module.tool.ActivatorToolBox; -//import com.fr.report.ReportActivator; -//import com.fr.report.RestrictionActivator; -//import com.fr.report.module.ReportBaseActivator; -//import com.fr.scheduler.SchedulerActivator; -//import com.fr.sdk.server.shell.ModuleShell; -//import com.fr.serialization.SerializationActivator; -//import com.fr.stable.StringUtils; -//import com.fr.startup.WorkspaceRegister; -//import com.fr.store.StateServerActivator; -//import com.fr.workspace.WorkContext; -//import com.fr.workspace.connect.WorkspaceConnectionInfo; -//import com.fr.workspace.engine.WorkspaceActivator; -//import com.fr.workspace.server.ServerWorkspaceRegister; -// -///** -// * 设计器SDK模块工具类,用来放一些设计器相关插件开发过程中常用的工具函数 -// */ -//public class FineDesignUtils { -// -// /** -// * 创建一个连接远程服务器的模块 -// * @param remoteUrl 远程服务器地址 -// * @param username 用户名 -// * @param password 密码 -// * @return 模块代理对象 使用ModuleShell的start和stop控制模块启停 -// */ -// public static ModuleShell createRemoteServerModule(String remoteUrl, String username, String password) { -// return createRemoteServerModule(remoteUrl, username, password, StringUtils.EMPTY, StringUtils.EMPTY); -// } -// -// /** -// * 创建一个连接远程服务器的模块 -// * @param remoteUrl 远程服务器地址 -// * @param username 用户名 -// * @param password 密码 -// * @param certPath https证书路径 -// * @param certSecretKey 证书秘钥 -// * @return 模块代理对象 使用ModuleShell的start和stop控制模块启停 -// */ -// public static ModuleShell createRemoteServerModule(final String remoteUrl, final String username, final String password, final String certPath, final String certSecretKey) { -// Module module = ActivatorToolBox.simpleLink( -// new WorkspaceActivator(), -// new SerializationActivator(), -// new Activator() { -// @Override -// public void start() { -// WorkspaceConnectionInfo connectionInfo = new WorkspaceConnectionInfo(remoteUrl, username, password, certPath, certSecretKey); -// try { -// WorkContext.switchTo(DesignerWorkspaceGenerator.generate(RemoteDesignerWorkspaceInfo.create(connectionInfo))); -// } catch (Exception e) { -// FineLoggerFactory.getLogger().error(e.getMessage(),e); -// } -// } -// -// @Override -// public void stop() { -// -// } -// }, -// new ConfigurationActivator(), -// new StateServerActivator(), -// new SchedulerActivator(), -// new ReportBaseActivator(), -// new RestrictionActivator(), -// new ReportActivator(), -// new WorkspaceRegister(), -// new ServerWorkspaceRegister() -// ); -// return new ModuleShell(module); -// } -//} \ No newline at end of file diff --git a/designer-sdk/src/test/java/com/fr/sdk/FineDesignUtilsTest.java b/designer-sdk/src/test/java/com/fr/sdk/FineDesignUtilsTest.java deleted file mode 100644 index ec210321b..000000000 --- a/designer-sdk/src/test/java/com/fr/sdk/FineDesignUtilsTest.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.fr.sdk; - -import junit.framework.TestCase; - -public class FineDesignUtilsTest extends TestCase { - -} \ No newline at end of file From 0e875025d1645230b38e65993b4dbf5a6f4ba376 Mon Sep 17 00:00:00 2001 From: richie Date: Mon, 19 Aug 2019 15:23:24 +0800 Subject: [PATCH 059/217] =?UTF-8?q?=E6=97=A0JIRA=E4=BB=BB=E5=8A=A1=20?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=BC=96=E8=AF=91=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../adapters/layout/FRFitLayoutAdapter.java | 3 ++- .../layout/FRTabFitLayoutAdapter.java | 3 ++- .../creator/XBorderStyleWidgetCreator.java | 13 ++++++------ .../creator/cardlayout/XCardSwitchButton.java | 21 +++++-------------- .../creator/cardlayout/XWCardLayout.java | 9 ++++---- .../cardlayout/XWCardMainBorderLayout.java | 3 ++- .../creator/cardlayout/XWCardTagLayout.java | 12 ++++------- .../layout/WCardTagLayoutDefinePane.java | 4 ++-- 8 files changed, 29 insertions(+), 39 deletions(-) diff --git a/designer-form/src/main/java/com/fr/design/designer/beans/adapters/layout/FRFitLayoutAdapter.java b/designer-form/src/main/java/com/fr/design/designer/beans/adapters/layout/FRFitLayoutAdapter.java index 9aa9e5ab9..f38e44f75 100644 --- a/designer-form/src/main/java/com/fr/design/designer/beans/adapters/layout/FRFitLayoutAdapter.java +++ b/designer-form/src/main/java/com/fr/design/designer/beans/adapters/layout/FRFitLayoutAdapter.java @@ -24,6 +24,7 @@ import com.fr.form.ui.container.WLayout; import com.fr.form.ui.container.WTabDisplayPosition; import com.fr.form.ui.container.cardlayout.WCardMainBorderLayout; import com.fr.general.ComparatorUtils; +import com.fr.general.TextFetcher; import java.awt.Component; import java.awt.Dimension; @@ -284,7 +285,7 @@ public class FRFitLayoutAdapter extends FRBodyLayoutAdapter { backupBound.x -= rec.x; backupBound.y -= rec.y; XWCardLayout cardLayout = mainLayout.getCardPart(); - LayoutBorderStyle style = cardLayout.toData().getBorderStyle(); + TextFetcher style = cardLayout.toData().getBorderStyle(); XWCardTitleLayout xwCardTitleLayout = mainLayout.getTitlePart(); Dimension titleDimension = xwCardTitleLayout.getSize(); diff --git a/designer-form/src/main/java/com/fr/design/designer/beans/adapters/layout/FRTabFitLayoutAdapter.java b/designer-form/src/main/java/com/fr/design/designer/beans/adapters/layout/FRTabFitLayoutAdapter.java index b1ca803c6..b280cb71a 100644 --- a/designer-form/src/main/java/com/fr/design/designer/beans/adapters/layout/FRTabFitLayoutAdapter.java +++ b/designer-form/src/main/java/com/fr/design/designer/beans/adapters/layout/FRTabFitLayoutAdapter.java @@ -19,6 +19,7 @@ import com.fr.form.ui.LayoutBorderStyle; import com.fr.form.ui.container.WBorderLayout; import com.fr.form.ui.container.cardlayout.WCardMainBorderLayout; import com.fr.general.ComparatorUtils; +import com.fr.general.TextFetcher; import java.awt.*; @@ -90,7 +91,7 @@ public class FRTabFitLayoutAdapter extends FRFitLayoutAdapter { // TODO 可以直接在这边将x,y都变成相对坐标,这样在后面判断拖进来的新控件放置方式的时候就不用再判断了 private int adjustY(int y, XWTabFitLayout tabLayout) { XWCardLayout cardLayout = (XWCardLayout) tabLayout.getBackupParent(); - LayoutBorderStyle style = cardLayout.toData().getBorderStyle(); + TextFetcher style = cardLayout.toData().getBorderStyle(); y = y - this.getParaEditorYOffset(); if (ComparatorUtils.equals(style.getType(), LayoutBorderStyle.TITLE)) { y = y - WCardMainBorderLayout.TAB_HEIGHT; diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/XBorderStyleWidgetCreator.java b/designer-form/src/main/java/com/fr/design/designer/creator/XBorderStyleWidgetCreator.java index 046663102..05d35c821 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/XBorderStyleWidgetCreator.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/XBorderStyleWidgetCreator.java @@ -11,6 +11,7 @@ import com.fr.form.ui.WidgetTitle; import com.fr.form.ui.WidgetValue; import com.fr.form.ui.container.WTitleLayout; import com.fr.general.ComparatorUtils; +import com.fr.general.TextFetcher; import com.fr.stable.Constants; import com.fr.stable.StringUtils; @@ -41,7 +42,7 @@ public class XBorderStyleWidgetCreator extends XWidgetCreator{ } protected void initStyle() { - LayoutBorderStyle style = toData().getBorderStyle(); + TextFetcher style = toData().getBorderStyle(); initBorderStyle(); if (ComparatorUtils.equals(style.getType(), LayoutBorderStyle.TITLE)) { initTitleStyle(style); @@ -52,7 +53,7 @@ public class XBorderStyleWidgetCreator extends XWidgetCreator{ // 边框默认值设为NONE,不然像scalelayout这种只用默认边框的会不显示边框 protected void initBorderStyle() { - LayoutBorderStyle style = toData().getBorderStyle(); + TextFetcher style = toData().getBorderStyle(); if (style != null && style.getBorder() != Constants.LINE_NONE) { this.setBorder(new UIRoundedBorder(style.getBorder(), style.getColor(), style.getBorderRadius())); } else { @@ -74,8 +75,8 @@ public class XBorderStyleWidgetCreator extends XWidgetCreator{ * 设置样式为标题样式时,对应组件加上标题 * @param style 样式 */ - protected void initTitleStyle(LayoutBorderStyle style){ - if (style.getTitle() == null) { + protected void initTitleStyle(TextFetcher style){ + if (style.getTextObject() == null) { return; } XWTitleLayout parent = (XWTitleLayout) this.getParent(); @@ -100,13 +101,13 @@ public class XBorderStyleWidgetCreator extends XWidgetCreator{ /** * 更新标题控件所有的样式 */ - private void updateTitleWidgetStyle(Label title, LayoutBorderStyle style) { + private void updateTitleWidgetStyle(Label title, TextFetcher style) { //标题的边框样式目前是取对应的控件的边框样式 title.setBorder(style.getBorder()); title.setColor(style.getColor()); // title.setCorner(style.isCorner()); - WidgetTitle wTitle = style.getTitle(); + WidgetTitle wTitle = WidgetTitle.as(style); //设置成随机不重复的, 不然都用一个名字的话, 联动只能联动一个 title.setWidgetName(wTitle.TITLE_NAME_INDEX + this.toData().getWidgetName()); title.setWidgetValue(getTitleValue(wTitle)); diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XCardSwitchButton.java b/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XCardSwitchButton.java index 72d0669c8..615c328aa 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XCardSwitchButton.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XCardSwitchButton.java @@ -22,7 +22,6 @@ import com.fr.design.mainframe.JForm; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.design.utils.gui.LayoutUtils; import com.fr.form.ui.CardSwitchButton; -import com.fr.form.ui.LayoutBorderStyle; import com.fr.form.ui.WidgetTitle; import com.fr.form.ui.container.WTabTextDirection; import com.fr.form.ui.container.cardlayout.WCardTagLayout; @@ -30,23 +29,13 @@ import com.fr.form.ui.container.cardlayout.WTabFitLayout; import com.fr.general.Background; import com.fr.general.ComparatorUtils; import com.fr.general.FRFont; - +import com.fr.general.TextFetcher; import com.fr.general.cardtag.TemplateStyle; import com.fr.stable.unit.PT; -import javax.swing.Action; -import javax.swing.Icon; -import javax.swing.JComponent; -import javax.swing.JOptionPane; -import javax.swing.JPopupMenu; -import javax.swing.SwingUtilities; +import javax.swing.*; import javax.swing.plaf.basic.BasicLabelUI; -import java.awt.Color; -import java.awt.Dimension; -import java.awt.FontMetrics; -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.Point; +import java.awt.*; import java.awt.event.MouseEvent; import java.awt.geom.Rectangle2D; import java.util.ArrayList; @@ -355,8 +344,8 @@ public class XCardSwitchButton extends XButton { if (this.cardLayout == null) { initRelateLayout(); } - LayoutBorderStyle style = this.cardLayout.toData().getBorderStyle(); - return style.getTitle(); + TextFetcher style = this.cardLayout.toData().getBorderStyle(); + return WidgetTitle.as(style); } //删除tab布局 diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardLayout.java b/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardLayout.java index 107e31ed1..653416e12 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardLayout.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardLayout.java @@ -34,6 +34,7 @@ import com.fr.form.ui.container.cardlayout.WCardTagLayout; import com.fr.form.ui.container.cardlayout.WCardTitleLayout; import com.fr.form.ui.container.cardlayout.WTabFitLayout; import com.fr.general.ComparatorUtils; +import com.fr.general.TextFetcher; import com.fr.general.cardtag.DefaultTemplateStyle; import com.fr.general.cardtag.TemplateStyle; import com.fr.stable.ArrayUtils; @@ -165,7 +166,7 @@ public class XWCardLayout extends XLayoutContainer { WCardMainBorderLayout border = new WCardMainBorderLayout(); XWCardMainBorderLayout xMainBorder = new XWCardMainBorderLayout(border, dimension); //将子WCardBorder的style设置到父容器上 - LayoutBorderStyle style = (this.toData()).getBorderStyle(); + TextFetcher style = (this.toData()).getBorderStyle(); border.setBorderStyle(style); this.setBackupParent(xMainBorder); XWCardTitleLayout titlePart = this.initTitlePart(widgetName, xMainBorder); @@ -397,13 +398,13 @@ public class XWCardLayout extends XLayoutContainer { //初始化样式 @Override protected void initStyle() { - LayoutBorderStyle style = toData().getBorderStyle(); + TextFetcher style = toData().getBorderStyle(); initBorderTitleStyle(style); initBorderStyle(); clearOrShowTitleLayout(ComparatorUtils.equals(style.getType(), LayoutBorderStyle.TITLE)); } - private void initBorderTitleStyle(LayoutBorderStyle style) { + private void initBorderTitleStyle(TextFetcher style) { //初始化默认标题样式 if (!initFlag) { return; @@ -411,7 +412,7 @@ public class XWCardLayout extends XLayoutContainer { style.setType(LayoutBorderStyle.TITLE); style.setBorder(Constants.LINE_THIN); - WidgetTitle widgetTitle = style.getTitle(); + WidgetTitle widgetTitle = WidgetTitle.as(style); widgetTitle.setBackground(ColorBackground.getInstance(TITLE_COLOR)); initFlag = false; } diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardMainBorderLayout.java b/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardMainBorderLayout.java index c7f235154..b0731e152 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardMainBorderLayout.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardMainBorderLayout.java @@ -38,6 +38,7 @@ import com.fr.form.ui.container.cardlayout.WCardTitleLayout; import com.fr.general.ComparatorUtils; import com.fr.general.IOUtils; +import com.fr.general.TextFetcher; import com.fr.share.ShareConstants; import com.fr.stable.Constants; @@ -164,7 +165,7 @@ public class XWCardMainBorderLayout extends XWBorderLayout { String tabpaneName = cardLayout.getWidgetName(); if (!wCardTagLayout.isNewTab()) { wCardTagLayout.setWidgetName(tabpaneName); - LayoutBorderStyle borderStyle = cardLayout.getBorderStyle(); + TextFetcher borderStyle = cardLayout.getBorderStyle(); if(borderStyle != null){ //新tab默认都有标题 borderStyle.setType(LayoutBorderStyle.TITLE); diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardTagLayout.java b/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardTagLayout.java index 1b9d2690e..cc118001f 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardTagLayout.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardTagLayout.java @@ -27,21 +27,18 @@ import com.fr.design.mainframe.EditingMouseListener; import com.fr.design.mainframe.FormDesigner; import com.fr.design.mainframe.WidgetPropertyPane; import com.fr.form.ui.CardSwitchButton; -import com.fr.form.ui.LayoutBorderStyle; import com.fr.form.ui.Widget; -import com.fr.form.ui.WidgetTitle; import com.fr.form.ui.container.WCardLayout; import com.fr.form.ui.container.WTabDisplayPosition; import com.fr.form.ui.container.cardlayout.WCardTagLayout; import com.fr.form.ui.container.cardlayout.WTabFitLayout; import com.fr.general.ComparatorUtils; import com.fr.general.FRFont; +import com.fr.general.TextFetcher; import com.fr.general.cardtag.DefaultTemplateStyle; import javax.swing.border.Border; -import java.awt.Dimension; -import java.awt.FontMetrics; -import java.awt.Rectangle; +import java.awt.*; import java.awt.event.ContainerEvent; import java.awt.event.MouseEvent; import java.util.HashMap; @@ -363,9 +360,8 @@ public class XWCardTagLayout extends XWHorizontalBoxLayout { if (this.cardLayout == null) { initCardLayout(); } - LayoutBorderStyle borderStyle = this.cardLayout.toData().getBorderStyle(); - WidgetTitle title = borderStyle.getTitle(); - FRFont f = title.getFrFont(); + TextFetcher borderStyle = this.cardLayout.toData().getBorderStyle(); + FRFont f = borderStyle.getFrFont(); FontMetrics fm = GraphHelper.getFontMetrics(f); switch (wCardTagLayout.getTextDirection()) { diff --git a/designer-form/src/main/java/com/fr/design/widget/ui/designer/layout/WCardTagLayoutDefinePane.java b/designer-form/src/main/java/com/fr/design/widget/ui/designer/layout/WCardTagLayoutDefinePane.java index 41ea1c1c7..06a14c25a 100644 --- a/designer-form/src/main/java/com/fr/design/widget/ui/designer/layout/WCardTagLayoutDefinePane.java +++ b/designer-form/src/main/java/com/fr/design/widget/ui/designer/layout/WCardTagLayoutDefinePane.java @@ -107,7 +107,7 @@ public class WCardTagLayoutDefinePane extends AbstractDataModify public void populateBean(WCardTagLayout ob) { //标题背景和字体属性设置在WCardLayout上做兼容 XLayoutContainer topLayout = creator.getTopLayout(); - LayoutBorderStyle layoutBorderStyle = ((XWCardMainBorderLayout) topLayout).getCardPart().toData().getBorderStyle(); + LayoutBorderStyle layoutBorderStyle = (LayoutBorderStyle) ((XWCardMainBorderLayout) topLayout).getCardPart().toData().getBorderStyle(); displayPositionGroup.setSelectedIndex(ob.getDisplayPosition().getType()); textDirectionGroup.setSelectedIndex(ob.getTextDirection().getType()); @@ -125,7 +125,7 @@ public class WCardTagLayoutDefinePane extends AbstractDataModify //标题背景和字体属性设置在WCardLayout上做兼容 XLayoutContainer topLayout = creator.getTopLayout(); XWCardLayout xCardLayout = ((XWCardMainBorderLayout) topLayout).getCardPart(); - LayoutBorderStyle layoutBorderStyle = xCardLayout.toData().getBorderStyle(); + LayoutBorderStyle layoutBorderStyle = (LayoutBorderStyle) xCardLayout.toData().getBorderStyle(); FRFont frFont = layoutBorderStyle.getTitle().getFrFont() == null ? FRFont.getInstance() : layoutBorderStyle.getTitle().getFrFont(); FRFont titleFont = frFontPane.update(frFont); layoutBorderStyle.getTitle().setFrFont(titleFont); From 84c585ed51c268305085275e08aaf15e95a3fb47 Mon Sep 17 00:00:00 2001 From: richie Date: Mon, 19 Aug 2019 16:32:01 +0800 Subject: [PATCH 060/217] =?UTF-8?q?=E6=97=A0JIRA=E4=BB=BB=E5=8A=A1=20?= =?UTF-8?q?=E6=8A=BD=E8=B1=A1=E5=AE=9E=E4=BD=93=E7=B1=BB=EF=BC=8C=E7=BB=99?= =?UTF-8?q?SDK=E5=81=9A=E5=87=86=E5=A4=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../adapters/layout/FRFitLayoutAdapter.java | 4 +-- .../layout/FRTabFitLayoutAdapter.java | 7 ++--- .../creator/XBorderStyleWidgetCreator.java | 23 +++++++------- .../creator/cardlayout/XCardSwitchButton.java | 18 +++++------ .../creator/cardlayout/XWCardLayout.java | 12 +++---- .../cardlayout/XWCardMainBorderLayout.java | 4 +-- .../creator/cardlayout/XWCardTagLayout.java | 6 ++-- .../fr/design/gui/xpane/LayoutBorderPane.java | 31 +++++-------------- .../gui/xpane/LayoutBorderPreviewPane.java | 6 ++-- 9 files changed, 47 insertions(+), 64 deletions(-) diff --git a/designer-form/src/main/java/com/fr/design/designer/beans/adapters/layout/FRFitLayoutAdapter.java b/designer-form/src/main/java/com/fr/design/designer/beans/adapters/layout/FRFitLayoutAdapter.java index f38e44f75..f2fc29ad5 100644 --- a/designer-form/src/main/java/com/fr/design/designer/beans/adapters/layout/FRFitLayoutAdapter.java +++ b/designer-form/src/main/java/com/fr/design/designer/beans/adapters/layout/FRFitLayoutAdapter.java @@ -24,7 +24,7 @@ import com.fr.form.ui.container.WLayout; import com.fr.form.ui.container.WTabDisplayPosition; import com.fr.form.ui.container.cardlayout.WCardMainBorderLayout; import com.fr.general.ComparatorUtils; -import com.fr.general.TextFetcher; +import com.fr.general.act.BorderPacker; import java.awt.Component; import java.awt.Dimension; @@ -285,7 +285,7 @@ public class FRFitLayoutAdapter extends FRBodyLayoutAdapter { backupBound.x -= rec.x; backupBound.y -= rec.y; XWCardLayout cardLayout = mainLayout.getCardPart(); - TextFetcher style = cardLayout.toData().getBorderStyle(); + BorderPacker style = cardLayout.toData().getBorderStyle(); XWCardTitleLayout xwCardTitleLayout = mainLayout.getTitlePart(); Dimension titleDimension = xwCardTitleLayout.getSize(); diff --git a/designer-form/src/main/java/com/fr/design/designer/beans/adapters/layout/FRTabFitLayoutAdapter.java b/designer-form/src/main/java/com/fr/design/designer/beans/adapters/layout/FRTabFitLayoutAdapter.java index b280cb71a..9b8effd0a 100644 --- a/designer-form/src/main/java/com/fr/design/designer/beans/adapters/layout/FRTabFitLayoutAdapter.java +++ b/designer-form/src/main/java/com/fr/design/designer/beans/adapters/layout/FRTabFitLayoutAdapter.java @@ -7,19 +7,16 @@ package com.fr.design.designer.beans.adapters.layout; import com.fr.design.beans.GroupModel; import com.fr.design.designer.creator.XCreator; import com.fr.design.designer.creator.XLayoutContainer; -import com.fr.design.designer.creator.XWParameterLayout; import com.fr.design.designer.creator.XWidgetCreator; import com.fr.design.designer.creator.cardlayout.XWCardLayout; import com.fr.design.designer.creator.cardlayout.XWCardMainBorderLayout; import com.fr.design.designer.creator.cardlayout.XWTabFitLayout; import com.fr.design.designer.properties.FRTabFitLayoutPropertiesGroupModel; -import com.fr.design.mainframe.widget.editors.ParameterEditor; import com.fr.design.utils.ComponentUtils; import com.fr.form.ui.LayoutBorderStyle; -import com.fr.form.ui.container.WBorderLayout; import com.fr.form.ui.container.cardlayout.WCardMainBorderLayout; import com.fr.general.ComparatorUtils; -import com.fr.general.TextFetcher; +import com.fr.general.act.BorderPacker; import java.awt.*; @@ -91,7 +88,7 @@ public class FRTabFitLayoutAdapter extends FRFitLayoutAdapter { // TODO 可以直接在这边将x,y都变成相对坐标,这样在后面判断拖进来的新控件放置方式的时候就不用再判断了 private int adjustY(int y, XWTabFitLayout tabLayout) { XWCardLayout cardLayout = (XWCardLayout) tabLayout.getBackupParent(); - TextFetcher style = cardLayout.toData().getBorderStyle(); + BorderPacker style = cardLayout.toData().getBorderStyle(); y = y - this.getParaEditorYOffset(); if (ComparatorUtils.equals(style.getType(), LayoutBorderStyle.TITLE)) { y = y - WCardMainBorderLayout.TAB_HEIGHT; diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/XBorderStyleWidgetCreator.java b/designer-form/src/main/java/com/fr/design/designer/creator/XBorderStyleWidgetCreator.java index 05d35c821..fdefc019a 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/XBorderStyleWidgetCreator.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/XBorderStyleWidgetCreator.java @@ -11,7 +11,8 @@ import com.fr.form.ui.WidgetTitle; import com.fr.form.ui.WidgetValue; import com.fr.form.ui.container.WTitleLayout; import com.fr.general.ComparatorUtils; -import com.fr.general.TextFetcher; +import com.fr.general.act.BorderPacker; +import com.fr.general.act.TitlePacker; import com.fr.stable.Constants; import com.fr.stable.StringUtils; @@ -42,7 +43,7 @@ public class XBorderStyleWidgetCreator extends XWidgetCreator{ } protected void initStyle() { - TextFetcher style = toData().getBorderStyle(); + BorderPacker style = toData().getBorderStyle(); initBorderStyle(); if (ComparatorUtils.equals(style.getType(), LayoutBorderStyle.TITLE)) { initTitleStyle(style); @@ -53,7 +54,7 @@ public class XBorderStyleWidgetCreator extends XWidgetCreator{ // 边框默认值设为NONE,不然像scalelayout这种只用默认边框的会不显示边框 protected void initBorderStyle() { - TextFetcher style = toData().getBorderStyle(); + BorderPacker style = toData().getBorderStyle(); if (style != null && style.getBorder() != Constants.LINE_NONE) { this.setBorder(new UIRoundedBorder(style.getBorder(), style.getColor(), style.getBorderRadius())); } else { @@ -75,8 +76,8 @@ public class XBorderStyleWidgetCreator extends XWidgetCreator{ * 设置样式为标题样式时,对应组件加上标题 * @param style 样式 */ - protected void initTitleStyle(TextFetcher style){ - if (style.getTextObject() == null) { + protected void initTitleStyle(BorderPacker style){ + if (style.getTitle() == null || style.getTitle().getTextObject() == null) { return; } XWTitleLayout parent = (XWTitleLayout) this.getParent(); @@ -101,25 +102,25 @@ public class XBorderStyleWidgetCreator extends XWidgetCreator{ /** * 更新标题控件所有的样式 */ - private void updateTitleWidgetStyle(Label title, TextFetcher style) { + private void updateTitleWidgetStyle(Label title, BorderPacker style) { //标题的边框样式目前是取对应的控件的边框样式 title.setBorder(style.getBorder()); title.setColor(style.getColor()); // title.setCorner(style.isCorner()); - WidgetTitle wTitle = WidgetTitle.as(style); + TitlePacker wTitle = style.getTitle(); //设置成随机不重复的, 不然都用一个名字的话, 联动只能联动一个 - title.setWidgetName(wTitle.TITLE_NAME_INDEX + this.toData().getWidgetName()); + title.setWidgetName(WidgetTitle.TITLE_NAME_INDEX + this.toData().getWidgetName()); title.setWidgetValue(getTitleValue(wTitle)); title.setFont(wTitle.getFrFont()); title.setTextalign(wTitle.getPosition()); title.setBackground(wTitle.getBackground()); } - private WidgetValue getTitleValue(WidgetTitle wTitle){ + private WidgetValue getTitleValue(TitlePacker wTitle){ String content = String.valueOf(wTitle.getTextObject()); - Object vlaue = content.startsWith("=") ? BaseFormula.createFormulaBuilder().build(content) : content; - return new WidgetValue(vlaue); + Object value = content.startsWith("=") ? BaseFormula.createFormulaBuilder().build(content) : content; + return new WidgetValue(value); } @Override diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XCardSwitchButton.java b/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XCardSwitchButton.java index 615c328aa..dc555e5d1 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XCardSwitchButton.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XCardSwitchButton.java @@ -22,14 +22,14 @@ import com.fr.design.mainframe.JForm; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.design.utils.gui.LayoutUtils; import com.fr.form.ui.CardSwitchButton; -import com.fr.form.ui.WidgetTitle; import com.fr.form.ui.container.WTabTextDirection; import com.fr.form.ui.container.cardlayout.WCardTagLayout; import com.fr.form.ui.container.cardlayout.WTabFitLayout; import com.fr.general.Background; +import com.fr.general.act.BorderPacker; import com.fr.general.ComparatorUtils; import com.fr.general.FRFont; -import com.fr.general.TextFetcher; +import com.fr.general.act.TitlePacker; import com.fr.general.cardtag.TemplateStyle; import com.fr.stable.unit.PT; @@ -297,7 +297,7 @@ public class XCardSwitchButton extends XButton { super.paintComponent(g); Graphics2D g2d = (Graphics2D) g; CardSwitchButton button = (CardSwitchButton) this.toData(); - WidgetTitle widgetTitle = getWidgetTitle(); + TitlePacker widgetTitle = getWidgetTitle(); drawBackground(button, widgetTitle); drawTitle(button, widgetTitle); Dimension panelSize = this.getContentLabel().getSize(); @@ -311,7 +311,7 @@ public class XCardSwitchButton extends XButton { } //画背景 - private void drawBackground(CardSwitchButton button, WidgetTitle widgetTitle){ + private void drawBackground(CardSwitchButton button, TitlePacker widgetTitle){ Background background = widgetTitle.getBackground() == null ? ColorBackground.getInstance(NORMAL_GRAL) : widgetTitle.getBackground(); TemplateStyle templateStyle = ((WCardTagLayout) tagLayout.toData()).getTemplateStyle(); //获取当前tab的index @@ -329,7 +329,7 @@ public class XCardSwitchButton extends XButton { } //画标题 - private void drawTitle(CardSwitchButton button, WidgetTitle widgetTitle) { + private void drawTitle(CardSwitchButton button, TitlePacker widgetTitle) { String titleText = button.getText(); this.setButtonText(titleText); FRFont font = widgetTitle.getFrFont(); @@ -340,12 +340,12 @@ public class XCardSwitchButton extends XButton { } - private WidgetTitle getWidgetTitle() { + private TitlePacker getWidgetTitle() { if (this.cardLayout == null) { initRelateLayout(); } - TextFetcher style = this.cardLayout.toData().getBorderStyle(); - return WidgetTitle.as(style); + BorderPacker style = this.cardLayout.toData().getBorderStyle(); + return style.getTitle(); } //删除tab布局 @@ -452,7 +452,7 @@ public class XCardSwitchButton extends XButton { String titleText = button.getText(); java.util.List verticalTextList = new ArrayList(); StringBuilder titleStringBuf = new StringBuilder(); - WidgetTitle title = getWidgetTitle(); + TitlePacker title = getWidgetTitle(); FRFont font = title.getFrFont(); FRFont newFont = FRFont.getInstance(font.getName(), font.getStyle(), font.getSize() + FONT_SIZE_ADJUST); FontMetrics fm = GraphHelper.getFontMetrics(newFont); diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardLayout.java b/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardLayout.java index 653416e12..c91d34654 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardLayout.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardLayout.java @@ -25,7 +25,6 @@ import com.fr.form.ui.CardAddButton; import com.fr.form.ui.CardSwitchButton; import com.fr.form.ui.LayoutBorderStyle; import com.fr.form.ui.Widget; -import com.fr.form.ui.WidgetTitle; import com.fr.form.ui.container.WBorderLayout; import com.fr.form.ui.container.WCardLayout; import com.fr.form.ui.container.WLayout; @@ -33,8 +32,9 @@ import com.fr.form.ui.container.cardlayout.WCardMainBorderLayout; import com.fr.form.ui.container.cardlayout.WCardTagLayout; import com.fr.form.ui.container.cardlayout.WCardTitleLayout; import com.fr.form.ui.container.cardlayout.WTabFitLayout; +import com.fr.general.act.BorderPacker; import com.fr.general.ComparatorUtils; -import com.fr.general.TextFetcher; +import com.fr.general.act.TitlePacker; import com.fr.general.cardtag.DefaultTemplateStyle; import com.fr.general.cardtag.TemplateStyle; import com.fr.stable.ArrayUtils; @@ -166,7 +166,7 @@ public class XWCardLayout extends XLayoutContainer { WCardMainBorderLayout border = new WCardMainBorderLayout(); XWCardMainBorderLayout xMainBorder = new XWCardMainBorderLayout(border, dimension); //将子WCardBorder的style设置到父容器上 - TextFetcher style = (this.toData()).getBorderStyle(); + BorderPacker style = (this.toData()).getBorderStyle(); border.setBorderStyle(style); this.setBackupParent(xMainBorder); XWCardTitleLayout titlePart = this.initTitlePart(widgetName, xMainBorder); @@ -398,13 +398,13 @@ public class XWCardLayout extends XLayoutContainer { //初始化样式 @Override protected void initStyle() { - TextFetcher style = toData().getBorderStyle(); + BorderPacker style = toData().getBorderStyle(); initBorderTitleStyle(style); initBorderStyle(); clearOrShowTitleLayout(ComparatorUtils.equals(style.getType(), LayoutBorderStyle.TITLE)); } - private void initBorderTitleStyle(TextFetcher style) { + private void initBorderTitleStyle(BorderPacker style) { //初始化默认标题样式 if (!initFlag) { return; @@ -412,7 +412,7 @@ public class XWCardLayout extends XLayoutContainer { style.setType(LayoutBorderStyle.TITLE); style.setBorder(Constants.LINE_THIN); - WidgetTitle widgetTitle = WidgetTitle.as(style); + TitlePacker widgetTitle = style.getTitle(); widgetTitle.setBackground(ColorBackground.getInstance(TITLE_COLOR)); initFlag = false; } diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardMainBorderLayout.java b/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardMainBorderLayout.java index b0731e152..edbabeadf 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardMainBorderLayout.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardMainBorderLayout.java @@ -38,7 +38,7 @@ import com.fr.form.ui.container.cardlayout.WCardTitleLayout; import com.fr.general.ComparatorUtils; import com.fr.general.IOUtils; -import com.fr.general.TextFetcher; +import com.fr.general.act.BorderPacker; import com.fr.share.ShareConstants; import com.fr.stable.Constants; @@ -165,7 +165,7 @@ public class XWCardMainBorderLayout extends XWBorderLayout { String tabpaneName = cardLayout.getWidgetName(); if (!wCardTagLayout.isNewTab()) { wCardTagLayout.setWidgetName(tabpaneName); - TextFetcher borderStyle = cardLayout.getBorderStyle(); + BorderPacker borderStyle = cardLayout.getBorderStyle(); if(borderStyle != null){ //新tab默认都有标题 borderStyle.setType(LayoutBorderStyle.TITLE); diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardTagLayout.java b/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardTagLayout.java index cc118001f..77282f63f 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardTagLayout.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardTagLayout.java @@ -32,9 +32,9 @@ import com.fr.form.ui.container.WCardLayout; import com.fr.form.ui.container.WTabDisplayPosition; import com.fr.form.ui.container.cardlayout.WCardTagLayout; import com.fr.form.ui.container.cardlayout.WTabFitLayout; +import com.fr.general.act.BorderPacker; import com.fr.general.ComparatorUtils; import com.fr.general.FRFont; -import com.fr.general.TextFetcher; import com.fr.general.cardtag.DefaultTemplateStyle; import javax.swing.border.Border; @@ -360,8 +360,8 @@ public class XWCardTagLayout extends XWHorizontalBoxLayout { if (this.cardLayout == null) { initCardLayout(); } - TextFetcher borderStyle = this.cardLayout.toData().getBorderStyle(); - FRFont f = borderStyle.getFrFont(); + BorderPacker borderStyle = this.cardLayout.toData().getBorderStyle(); + FRFont f = borderStyle.getTitle().getFrFont(); FontMetrics fm = GraphHelper.getFontMetrics(f); switch (wCardTagLayout.getTextDirection()) { diff --git a/designer-form/src/main/java/com/fr/design/gui/xpane/LayoutBorderPane.java b/designer-form/src/main/java/com/fr/design/gui/xpane/LayoutBorderPane.java index a70431700..cf460f9ce 100644 --- a/designer-form/src/main/java/com/fr/design/gui/xpane/LayoutBorderPane.java +++ b/designer-form/src/main/java/com/fr/design/gui/xpane/LayoutBorderPane.java @@ -38,32 +38,17 @@ import com.fr.form.ui.LayoutBorderStyle; import com.fr.form.ui.WidgetTitle; import com.fr.general.Background; import com.fr.general.FRFont; - +import com.fr.general.act.TitlePacker; import com.fr.stable.Constants; -import javax.swing.AbstractButton; -import javax.swing.BorderFactory; -import javax.swing.ButtonGroup; -import javax.swing.ButtonModel; -import javax.swing.Icon; -import javax.swing.JComponent; -import javax.swing.JPanel; -import javax.swing.JToggleButton; +import javax.swing.*; import javax.swing.border.Border; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import javax.swing.plaf.basic.BasicToggleButtonUI; -import java.awt.BorderLayout; -import java.awt.Color; -import java.awt.Component; -import java.awt.Dimension; -import java.awt.FlowLayout; -import java.awt.Font; -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.RenderingHints; +import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; @@ -546,7 +531,7 @@ public class LayoutBorderPane extends BasicPane { style.setColor(currentLineColorPane.getColor()); style.setBackground(backgroundPane.update()); style.setAlpha((float)(numberDragPane.updateBean()/maxNumber)); - WidgetTitle title = style.getTitle() == null ? new WidgetTitle() : style.getTitle(); + TitlePacker title = style.getTitle() == null ? new WidgetTitle() : style.getTitle(); title.setTextObject(formulaPane.updateBean()); FRFont frFont = title.getFrFont(); frFont = frFont.applySize((Integer)fontSizeComboBox.getSelectedItem()); @@ -644,10 +629,10 @@ public class LayoutBorderPane extends BasicPane { } protected void populateTitle(){ - WidgetTitle widgetTitle = borderStyle == null ? new WidgetTitle() : borderStyle.getTitle(); + TitlePacker widgetTitle = borderStyle == null ? new WidgetTitle() : borderStyle.getTitle(); widgetTitle = widgetTitle == null ? new WidgetTitle() : widgetTitle; - populateFourmula(widgetTitle); + populateFormula(widgetTitle); populateFont(widgetTitle); underline.addMouseListener(new MouseAdapter() { @@ -683,7 +668,7 @@ public class LayoutBorderPane extends BasicPane { paintPreviewPane(); } - protected void populateFont(WidgetTitle widgetTitle){ + protected void populateFont(TitlePacker widgetTitle){ FRFont frFont = widgetTitle.getFrFont(); this.fontSizeComboBox.setSelectedItem(frFont.getSize()); this.fontSizeComboBox.addItemListener(new ItemListener() { @@ -756,7 +741,7 @@ public class LayoutBorderPane extends BasicPane { } - private void populateFourmula(WidgetTitle widgetTitle) { + private void populateFormula(TitlePacker widgetTitle) { this.formulaPane.populateBean(widgetTitle.getTextObject().toString()); this.formulaPane.getUITextField().getDocument() .addDocumentListener(new DocumentListener() { diff --git a/designer-form/src/main/java/com/fr/design/gui/xpane/LayoutBorderPreviewPane.java b/designer-form/src/main/java/com/fr/design/gui/xpane/LayoutBorderPreviewPane.java index 3d649f3b9..33470a33b 100644 --- a/designer-form/src/main/java/com/fr/design/gui/xpane/LayoutBorderPreviewPane.java +++ b/designer-form/src/main/java/com/fr/design/gui/xpane/LayoutBorderPreviewPane.java @@ -7,10 +7,10 @@ import com.fr.base.background.ColorBackground; import com.fr.design.designer.creator.cardlayout.XCardSwitchButton; import com.fr.design.gui.itextarea.UITextArea; import com.fr.form.ui.LayoutBorderStyle; -import com.fr.form.ui.WidgetTitle; import com.fr.general.Background; import com.fr.general.FRFont; +import com.fr.general.act.TitlePacker; import com.fr.stable.Constants; import javax.swing.JPanel; @@ -126,7 +126,7 @@ public class LayoutBorderPreviewPane extends JPanel{ g2d.setColor(new Color(237, 237, 237)); } g2d.setFont(frFont.applyResolutionNP(resolution)); - WidgetTitle title = borderStyle.getTitle(); + TitlePacker title = borderStyle.getTitle(); String paintText = title.getTextObject().toString(); int startX1 = 0; int startY = 0; @@ -158,7 +158,7 @@ public class LayoutBorderPreviewPane extends JPanel{ GraphHelper.draw(g,double2, borderStyle.getBorder()); } - private void drawTabBack(Graphics2D g2d, Graphics g, WidgetTitle title, FontMetrics fm, int startX1, int startY){ + private void drawTabBack(Graphics2D g2d, Graphics g, TitlePacker title, FontMetrics fm, int startX1, int startY){ Dimension d = getSize(); String paintText = com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Title")+TAB_ZERO; From 7574a965388df153045fd737a230dd9d2867acf4 Mon Sep 17 00:00:00 2001 From: "Hugh.C" Date: Tue, 20 Aug 2019 09:37:07 +0800 Subject: [PATCH 061/217] =?UTF-8?q?REPORT-20329=20sonar=E9=97=AE=E9=A2=98?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/fr/design/gui/frpane/UINumberSlidePane.java | 3 ++- .../src/main/java/com/fr/design/gui/frpane/UnitInputPane.java | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/gui/frpane/UINumberSlidePane.java b/designer-base/src/main/java/com/fr/design/gui/frpane/UINumberSlidePane.java index 7585c0949..5faa21b3c 100644 --- a/designer-base/src/main/java/com/fr/design/gui/frpane/UINumberSlidePane.java +++ b/designer-base/src/main/java/com/fr/design/gui/frpane/UINumberSlidePane.java @@ -14,6 +14,7 @@ import javax.swing.event.ChangeListener; import com.fr.design.beans.BasicBeanPane; import com.fr.design.gui.itextfield.UINumberField; import com.fr.design.gui.style.NumberDragBar; +import com.fr.stable.AssistUtils; /** * 拖拽的滑条和对应滑条值的数字 @@ -65,7 +66,7 @@ public class UINumberSlidePane extends BasicBeanPane { public void checkValue(double value) { value = Math.max(value, minValue); value = Math.min(value, maxValue); - if (this.value == value) { + if (AssistUtils.equals(this.value, value)) { return; } double diff = Math.abs(value - this.value); diff --git a/designer-base/src/main/java/com/fr/design/gui/frpane/UnitInputPane.java b/designer-base/src/main/java/com/fr/design/gui/frpane/UnitInputPane.java index ca44c8a22..798b79af0 100644 --- a/designer-base/src/main/java/com/fr/design/gui/frpane/UnitInputPane.java +++ b/designer-base/src/main/java/com/fr/design/gui/frpane/UnitInputPane.java @@ -10,6 +10,7 @@ import com.fr.design.gui.ispinner.UIBasicSpinner; import com.fr.design.gui.itextfield.UINumberField; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.utils.gui.GUICoreUtils; +import com.fr.stable.AssistUtils; import com.fr.stable.StringUtils; import javax.swing.*; @@ -81,7 +82,7 @@ public abstract class UnitInputPane extends BasicPane { floatValue = de.floatValue(); } //选中多列, 并且列宽不完全一致的话, 就不显示值了. - temp.setText(floatValue == 0 ? StringUtils.EMPTY : Utils.convertNumberStringToString(new Float(floatValue))); + temp.setText(AssistUtils.equals(floatValue, 0) ? StringUtils.EMPTY : Utils.convertNumberStringToString(new Float(floatValue))); // denny:默认应该为选中,方便用户修改 temp.selectAll(); From 61cd191cb10de001c0e1d61e3b60314b003b65c9 Mon Sep 17 00:00:00 2001 From: Bryant Date: Tue, 20 Aug 2019 09:43:37 +0800 Subject: [PATCH 062/217] =?UTF-8?q?REPORT-20868=20sonar=E9=97=AE=E9=A2=98?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/gui/columnrow/ColumnRowPane.java | 2 ++ .../fr/design/gui/controlpane/ObjectUIControlPane.java | 4 ++-- .../main/java/com/fr/design/gui/date/UIDatePicker.java | 10 ++++++++-- .../java/com/fr/design/gui/demo/LoadingPaneDemo.java | 1 + .../com/fr/design/gui/frpane/LoadingBasicPaneTest.java | 1 + 5 files changed, 14 insertions(+), 4 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/gui/columnrow/ColumnRowPane.java b/designer-base/src/main/java/com/fr/design/gui/columnrow/ColumnRowPane.java index 615a17bce..e94b18269 100644 --- a/designer-base/src/main/java/com/fr/design/gui/columnrow/ColumnRowPane.java +++ b/designer-base/src/main/java/com/fr/design/gui/columnrow/ColumnRowPane.java @@ -146,6 +146,8 @@ public class ColumnRowPane extends JPanel implements UIObserver { if (cftf != null) { cftf.setColumns(3); // specify more width than we need cftf.setHorizontalAlignment(UITextField.LEFT); + }else { + throw new IllegalArgumentException("Spinner'Editor can not be null!"); } ((AbstractDocument) cftf.getDocument()).setDocumentFilter(new DocumentFilter() { diff --git a/designer-base/src/main/java/com/fr/design/gui/controlpane/ObjectUIControlPane.java b/designer-base/src/main/java/com/fr/design/gui/controlpane/ObjectUIControlPane.java index c5786b4c6..be169a744 100644 --- a/designer-base/src/main/java/com/fr/design/gui/controlpane/ObjectUIControlPane.java +++ b/designer-base/src/main/java/com/fr/design/gui/controlpane/ObjectUIControlPane.java @@ -1,8 +1,8 @@ package com.fr.design.gui.controlpane; import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationTargetException; import com.fr.design.beans.BasicBeanPane; +import com.fr.stable.AssistUtils; /** * Created by plough on 2017/8/1. @@ -48,7 +48,7 @@ public abstract class ObjectUIControlPane extends UIListControlPane { if (constructor != null) { return constructor; } else { - if (cls.getName() == Object.class.getName()) { + if (AssistUtils.equals(cls.getName(),Object.class.getName())) { return null; } return getConstructor(clazz, cls.getSuperclass()); diff --git a/designer-base/src/main/java/com/fr/design/gui/date/UIDatePicker.java b/designer-base/src/main/java/com/fr/design/gui/date/UIDatePicker.java index fb44f618f..be3ef20a3 100644 --- a/designer-base/src/main/java/com/fr/design/gui/date/UIDatePicker.java +++ b/designer-base/src/main/java/com/fr/design/gui/date/UIDatePicker.java @@ -157,7 +157,7 @@ public class UIDatePicker extends UIComboBox implements Serializable { /** * 设置当前选择的日期 */ - public void setSelectedDate(Date date) throws ParseException { + public synchronized void setSelectedDate(Date date) throws ParseException { if (date == null) { this.setSelectedItem(null); } else { @@ -165,6 +165,7 @@ public class UIDatePicker extends UIComboBox implements Serializable { } } + @Override public void setSelectedItem(Object anObject) { model.setSelectedItem(anObject); super.setSelectedItem(anObject); @@ -192,12 +193,14 @@ public class UIDatePicker extends UIComboBox implements Serializable { setBorder(BorderFactory.createEmptyBorder()); } + @Override public void hide() { if (isWillHide) { super.hide(); } } + @Override public void show() { if (isWillHide || UIDatePicker.this.isEnabled() == false) { return; @@ -211,6 +214,7 @@ public class UIDatePicker extends UIComboBox implements Serializable { /** * 显示弹出面板 */ + @Override protected void firePropertyChange(String propertyName, Object oldValue, Object newValue) { @@ -250,12 +254,14 @@ public class UIDatePicker extends UIComboBox implements Serializable { } } + @Override protected ComboBoxUI getUIComboBoxUI() { return new UIComboBoxUI() { + @Override protected ComboPopup createPopup() { return new DatePopup(comboBox); } - + @Override public void mousePressed(MouseEvent e) { if (UIDatePicker.this.isPopupVisible()) { isWillHide = true; diff --git a/designer-base/src/main/java/com/fr/design/gui/demo/LoadingPaneDemo.java b/designer-base/src/main/java/com/fr/design/gui/demo/LoadingPaneDemo.java index 2eb93ad3e..b17323774 100644 --- a/designer-base/src/main/java/com/fr/design/gui/demo/LoadingPaneDemo.java +++ b/designer-base/src/main/java/com/fr/design/gui/demo/LoadingPaneDemo.java @@ -35,6 +35,7 @@ public class LoadingPaneDemo extends JPanel { Thread.sleep(500); } catch (InterruptedException e) { FineLoggerFactory.getLogger().error(e.getMessage(), e); + Thread.currentThread().interrupt(); } container.add(new UIButton(i + "adfadwdadawdwad")); } diff --git a/designer-base/src/main/java/com/fr/design/gui/frpane/LoadingBasicPaneTest.java b/designer-base/src/main/java/com/fr/design/gui/frpane/LoadingBasicPaneTest.java index 7c454ad71..e3a1ae7d7 100644 --- a/designer-base/src/main/java/com/fr/design/gui/frpane/LoadingBasicPaneTest.java +++ b/designer-base/src/main/java/com/fr/design/gui/frpane/LoadingBasicPaneTest.java @@ -24,6 +24,7 @@ public class LoadingBasicPaneTest { Thread.sleep(500); } catch (InterruptedException e) { FineLoggerFactory.getLogger().error(e.getMessage(), e); + Thread.currentThread().interrupt(); } container.add(new UIButton(i + "adfadwdadawdwad")); } From dc0b27d09d4bc5a45fb276c8a27dbe2949b752a6 Mon Sep 17 00:00:00 2001 From: "Bruce.Deng" Date: Tue, 20 Aug 2019 11:25:49 +0800 Subject: [PATCH 063/217] =?UTF-8?q?=E6=97=A0jira=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=EF=BC=8Csonar=E9=97=AE=E9=A2=98=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fr/design/gui/UIDefaultTheme.java | 3 --- .../gui/autocomplete/LanguageAwareCompletionProvider.java | 3 +++ .../gui/autocomplete/ParameterizedCompletionContext.java | 4 ++++ 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/gui/UIDefaultTheme.java b/designer-base/src/main/java/com/fr/design/gui/UIDefaultTheme.java index 26030c47c..78750e389 100644 --- a/designer-base/src/main/java/com/fr/design/gui/UIDefaultTheme.java +++ b/designer-base/src/main/java/com/fr/design/gui/UIDefaultTheme.java @@ -76,7 +76,6 @@ public class UIDefaultTheme extends DefaultMetalTheme { table.put("Table.background", ThemeUtils.TEXT_BG_COLOR); table.put("Table.selectionForeground", ThemeUtils.NORMAL_FOREGROUND); table.put("Table.selectionBackground", new ColorUIResource(200, 221, 233)); - table.put("Table.gridColor", new ColorUIResource(200, 221, 233)); table.put("TableHeader.background", new ColorUIResource(229, 229, 229)); table.put("ProgressBar.foreground", ThemeUtils.PROCESS_COLOR); table.put("ProgressBar.background", ThemeUtils.TEXT_BG_COLOR); @@ -85,7 +84,6 @@ public class UIDefaultTheme extends DefaultMetalTheme { table.put("ProgressBar.selectionForeground", ThemeUtils.NORMAL_FOREGROUND); table.put("ProgressBar.selectionBackground", ThemeUtils.NORMAL_FOREGROUND); table.put("PopupMenu.background", ThemeUtils.NORMAL_BG); - table.put("TabbedPane.background", ThemeUtils.TEXT_BG_COLOR); table.put("TabbedPane.background", ThemeUtils.NORMAL_BG); table.put("TabbedPane.tabAreaInsets", new InsetsUIResource(4, 2, 0, 0)); table.put("TabbedPane.tabInsets", new InsetsUIResource(1, 6, 4, 6)); @@ -108,7 +106,6 @@ public class UIDefaultTheme extends DefaultMetalTheme { table.put("ComboBox.foreground", ThemeUtils.NORMAL_FOREGROUND); table.put("ComboBox.background", ThemeUtils.TEXT_BG_COLOR); table.put("ComboBox.disabledBackground", ThemeUtils.TEXT_DISABLED_BG_COLOR); - table.put("EditorPane.background", ThemeUtils.TEXT_BG_COLOR); table.put("EditorPane.foreground", ThemeUtils.NORMAL_FOREGROUND); table.put("PasswordField.background", ThemeUtils.TEXT_BG_COLOR); table.put("PasswordField.foreground", ThemeUtils.NORMAL_FOREGROUND); diff --git a/designer-base/src/main/java/com/fr/design/gui/autocomplete/LanguageAwareCompletionProvider.java b/designer-base/src/main/java/com/fr/design/gui/autocomplete/LanguageAwareCompletionProvider.java index b9d9afcc0..8bc805f46 100644 --- a/designer-base/src/main/java/com/fr/design/gui/autocomplete/LanguageAwareCompletionProvider.java +++ b/designer-base/src/main/java/com/fr/design/gui/autocomplete/LanguageAwareCompletionProvider.java @@ -195,6 +195,9 @@ public class LanguageAwareCompletionProvider extends CompletionProviderBase // provider. We do not do function/method completions while editing // strings or comments. CompletionProvider provider = getProviderFor(tc); + if (provider == null) { + return null; + } return provider==defaultProvider ? provider.getParameterizedCompletions(tc) : null; } diff --git a/designer-base/src/main/java/com/fr/design/gui/autocomplete/ParameterizedCompletionContext.java b/designer-base/src/main/java/com/fr/design/gui/autocomplete/ParameterizedCompletionContext.java index a9dd305b0..78d5e74a4 100644 --- a/designer-base/src/main/java/com/fr/design/gui/autocomplete/ParameterizedCompletionContext.java +++ b/designer-base/src/main/java/com/fr/design/gui/autocomplete/ParameterizedCompletionContext.java @@ -517,6 +517,10 @@ class ParameterizedCompletionContext { } } + if (currentNext == null) { + return; + } + // No params after caret - go to first one if (currentNext.getStartOffset() + 1 <= dot) { int nextIndex = getFirstHighlight(highlights); From ec9f79560fed24c0e1a8b0a5e31b8819718520a7 Mon Sep 17 00:00:00 2001 From: "Bruce.Deng" Date: Wed, 21 Aug 2019 10:07:11 +0800 Subject: [PATCH 064/217] =?UTF-8?q?REPORT-19464=20=E3=80=90=E5=8C=B9?= =?UTF-8?q?=E9=85=8D=E7=A7=BB=E5=8A=A8=E7=AB=AF=E3=80=91TAB=E4=B8=8B?= =?UTF-8?q?=E8=8F=9C=E5=8D=95=E5=BC=8F=E5=9B=BE=E6=A0=87=E4=BC=98=E5=8C=96?= =?UTF-8?q?2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/layout/FRGUIPaneFactory.java | 2 +- .../mobile/ui/TabIconConfigPane.java | 26 ++++++++++++++++++- .../com/fr/design/web/CustomIconPane.java | 10 +++---- 3 files changed, 31 insertions(+), 7 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/layout/FRGUIPaneFactory.java b/designer-base/src/main/java/com/fr/design/layout/FRGUIPaneFactory.java index d906cc39e..4f514477f 100644 --- a/designer-base/src/main/java/com/fr/design/layout/FRGUIPaneFactory.java +++ b/designer-base/src/main/java/com/fr/design/layout/FRGUIPaneFactory.java @@ -213,7 +213,7 @@ public class FRGUIPaneFactory { public static JPanel createMediumHGapFlowInnerContainer_M_Pane_First0() { JPanel jp = new JPanel(); jp.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); - jp.setLayout(new FRLeftFlowLayout(0, 20, 5)); + jp.setLayout(new FRLeftFlowLayout(0, 5, 0)); return jp; } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/TabIconConfigPane.java b/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/TabIconConfigPane.java index 724a9c949..9fa9182d7 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/TabIconConfigPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/TabIconConfigPane.java @@ -11,6 +11,8 @@ import com.fr.design.web.CustomIconPane; import com.fr.form.ui.WidgetInfoConfig; import com.fr.general.ComparatorUtils; import com.fr.general.FRFont; +import com.fr.stable.StringUtils; + import javax.swing.BorderFactory; import javax.swing.JComponent; import javax.swing.JPanel; @@ -33,6 +35,7 @@ import java.util.ArrayList; public class TabIconConfigPane extends JPanel { private UIButton editIconButton; + private UIButton deleteIconButton; private String curIconName; private IconButton selectIconButton; private ArrayList iconButtons = new ArrayList(); @@ -43,7 +46,7 @@ public class TabIconConfigPane extends JPanel { public void initComp(int count) { this.setLayout(FRGUIPaneFactory.createBorderLayout()); - JPanel panel = FRGUIPaneFactory.createLeftFlowZeroGapBorderPane(); + JPanel panel = FRGUIPaneFactory.createMediumHGapFlowInnerContainer_M_Pane_First0(); panel.setBorder(BorderFactory.createEmptyBorder(5, 0, 5, 0)); editIconButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Edit")); editIconButton.setFont(FRFont.getInstance("Helvetica", Font.PLAIN, 12, Color.decode("#3A383A"))); @@ -63,12 +66,28 @@ public class TabIconConfigPane extends JPanel { curIconName = cip.update(); setShowIconImage(); TabIconConfigPane.this.repaint(); + deleteIconButton.setEnabled(true); } }); editDialog.setVisible(true); } }); editIconButton.setEnabled(false); + + deleteIconButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Delete")); + deleteIconButton.setFont(FRFont.getInstance("Helvetica", Font.PLAIN, 12, Color.decode("#3A383A"))); + deleteIconButton.setPreferredSize(new Dimension(62, 20)); + panel.add(deleteIconButton); + deleteIconButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + curIconName = ""; + setShowIconImage(); + TabIconConfigPane.this.repaint(); + deleteIconButton.setEnabled(false); + } + }); + deleteIconButton.setEnabled(false); + this.add(panel, BorderLayout.CENTER); JPanel northPane = new JPanel(); @@ -163,6 +182,11 @@ public class TabIconConfigPane extends JPanel { public void actionPerformed(ActionEvent evt) { selectIconButton = this; editIconButton.setEnabled(true); + if (StringUtils.equals("", this.getIconName())) { + deleteIconButton.setEnabled(false); + } else { + deleteIconButton.setEnabled(true); + } TabIconConfigPane.this.repaint();// repaint } diff --git a/designer-base/src/main/java/com/fr/design/web/CustomIconPane.java b/designer-base/src/main/java/com/fr/design/web/CustomIconPane.java index 74a499030..35ff2afba 100644 --- a/designer-base/src/main/java/com/fr/design/web/CustomIconPane.java +++ b/designer-base/src/main/java/com/fr/design/web/CustomIconPane.java @@ -433,7 +433,7 @@ public class CustomIconPane extends BasicPane { JPanel imagePane = new JPanel(); imagePane.setLayout(new FlowLayout(FlowLayout.LEFT, 30, 0)); showImageLabel = new UILabel(); - showImageLabel.setPreferredSize(new Dimension(20, 20)); + showImageLabel.setPreferredSize(new Dimension(50, 50)); imagePane.add(showImageLabel); imagePane.add(browseButton); Component[][] components = {{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Name") + ":"), nameTextField}, {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Icon") + ":"), imagePane}}; @@ -450,12 +450,12 @@ public class CustomIconPane extends BasicPane { if (JFileChooser.APPROVE_OPTION == jf.showOpenDialog(DesignerContext.getDesignerFrame())) { String path = jf.getSelectedFile().getAbsolutePath(); - // 将图片转化到16 × 16大小 + // 图片存储有最大值48*48限制,没有超过最大值时,按原图大小存储,超过最大值后,压缩至最大值存储 Image image = BaseUtils.readImage(path); - BufferedImage bufferedImage = CoreGraphHelper.createBufferedImage(IconManager.DEFAULT_ICONWIDTH, - IconManager.DEFAULT_ICONHEIGHT, BufferedImage.TYPE_INT_ARGB); + BufferedImage bufferedImage = CoreGraphHelper.createBufferedImage(image.getWidth(null) >= 48 ? IconManager.DEFAULT_ICONWIDTH + 32 : image.getWidth(null), + image.getHeight(null) >= 48 ? IconManager.DEFAULT_ICONHEIGHT + 32 : image.getHeight(null), BufferedImage.TYPE_INT_ARGB); Graphics2D g2d = bufferedImage.createGraphics(); - g2d.drawImage(image, 0, 0, IconManager.DEFAULT_ICONWIDTH, IconManager.DEFAULT_ICONHEIGHT, null); + g2d.drawImage(image, 0, 0, image.getWidth(null) >= 48 ? IconManager.DEFAULT_ICONWIDTH + 32 : image.getWidth(null), image.getHeight(null) >= 48 ? IconManager.DEFAULT_ICONHEIGHT + 32 : image.getHeight(null), null); bufferedImage.flush(); g2d.dispose(); iconImage = bufferedImage; From 7800cc8235b3c13019146c32403b2b5581ac2837 Mon Sep 17 00:00:00 2001 From: "Bruce.Deng" Date: Wed, 21 Aug 2019 10:51:21 +0800 Subject: [PATCH 065/217] =?UTF-8?q?REPORT-19464=20=E3=80=90=E5=8C=B9?= =?UTF-8?q?=E9=85=8D=E7=A7=BB=E5=8A=A8=E7=AB=AF=E3=80=91TAB=E4=B8=8B?= =?UTF-8?q?=E8=8F=9C=E5=8D=95=E5=BC=8F=E5=9B=BE=E6=A0=87=E4=BC=98=E5=8C=96?= =?UTF-8?q?2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/layout/FRGUIPaneFactory.java | 12 ++++++++++++ .../mainframe/mobile/ui/TabIconConfigPane.java | 8 ++------ 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/layout/FRGUIPaneFactory.java b/designer-base/src/main/java/com/fr/design/layout/FRGUIPaneFactory.java index 4f514477f..38097c2d9 100644 --- a/designer-base/src/main/java/com/fr/design/layout/FRGUIPaneFactory.java +++ b/designer-base/src/main/java/com/fr/design/layout/FRGUIPaneFactory.java @@ -211,6 +211,18 @@ public class FRGUIPaneFactory { * @return JPanel对象 */ public static JPanel createMediumHGapFlowInnerContainer_M_Pane_First0() { + JPanel jp = new JPanel(); + jp.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); + jp.setLayout(new FRLeftFlowLayout(0, 20, 5)); + return jp; + } + + /** + * 创建一个靠左空边框面板,间隔小,firsthgap 为0 + * + * @return JPanel对象 + */ + public static JPanel createTinyHGapFlowInnerContainer_M_Pane_First0() { JPanel jp = new JPanel(); jp.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); jp.setLayout(new FRLeftFlowLayout(0, 5, 0)); diff --git a/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/TabIconConfigPane.java b/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/TabIconConfigPane.java index 9fa9182d7..214156ef3 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/TabIconConfigPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/TabIconConfigPane.java @@ -46,7 +46,7 @@ public class TabIconConfigPane extends JPanel { public void initComp(int count) { this.setLayout(FRGUIPaneFactory.createBorderLayout()); - JPanel panel = FRGUIPaneFactory.createMediumHGapFlowInnerContainer_M_Pane_First0(); + JPanel panel = FRGUIPaneFactory.createTinyHGapFlowInnerContainer_M_Pane_First0(); panel.setBorder(BorderFactory.createEmptyBorder(5, 0, 5, 0)); editIconButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Edit")); editIconButton.setFont(FRFont.getInstance("Helvetica", Font.PLAIN, 12, Color.decode("#3A383A"))); @@ -182,11 +182,7 @@ public class TabIconConfigPane extends JPanel { public void actionPerformed(ActionEvent evt) { selectIconButton = this; editIconButton.setEnabled(true); - if (StringUtils.equals("", this.getIconName())) { - deleteIconButton.setEnabled(false); - } else { - deleteIconButton.setEnabled(true); - } + deleteIconButton.setEnabled(StringUtils.isNotEmpty(this.getIconName())); TabIconConfigPane.this.repaint();// repaint } From d259b596fffa5d74ba3c3b6788b599fbf7b97942 Mon Sep 17 00:00:00 2001 From: jinbokai Date: Wed, 21 Aug 2019 10:52:41 +0800 Subject: [PATCH 066/217] REPORT-20328 sonar --- .../design/gui/iscrollbar/UIScrollBarUI.java | 16 ++++++++++----- .../com/fr/design/mainframe/JWorkBook.java | 12 +++++------ .../design/mainframe/errorinfo/ErrorInfo.java | 18 ++++++++++------- .../entity/FileEntityBuilder.java | 20 +++++++++++-------- 4 files changed, 39 insertions(+), 27 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/gui/iscrollbar/UIScrollBarUI.java b/designer-base/src/main/java/com/fr/design/gui/iscrollbar/UIScrollBarUI.java index da9aec981..8054a29ea 100644 --- a/designer-base/src/main/java/com/fr/design/gui/iscrollbar/UIScrollBarUI.java +++ b/designer-base/src/main/java/com/fr/design/gui/iscrollbar/UIScrollBarUI.java @@ -1,5 +1,7 @@ package com.fr.design.gui.iscrollbar; +import com.fr.design.constants.UIConstants; +import com.fr.stable.StringUtils; import java.awt.Color; import java.awt.Component; import java.awt.Container; @@ -20,7 +22,6 @@ import java.awt.event.MouseEvent; import java.awt.event.MouseMotionListener; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; - import javax.swing.BoundedRangeModel; import javax.swing.InputMap; import javax.swing.JComponent; @@ -38,8 +39,6 @@ import javax.swing.event.ChangeListener; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.ScrollBarUI; import javax.swing.plaf.UIResource; - -import com.fr.design.constants.UIConstants; import sun.swing.DefaultLookup; /** @@ -148,6 +147,7 @@ public class UIScrollBarUI extends ScrollBarUI implements LayoutManager, SwingCo * * @param c */ + @Override public void installUI(JComponent c) { scrollbar = (JScrollBar) c; thumbRect = new Rectangle(0, 0, 0, 0); @@ -163,6 +163,7 @@ public class UIScrollBarUI extends ScrollBarUI implements LayoutManager, SwingCo * * @param c */ + @Override public void uninstallUI(JComponent c) { scrollbar = (JScrollBar) c; uninstallListeners(); @@ -357,6 +358,7 @@ public class UIScrollBarUI extends ScrollBarUI implements LayoutManager, SwingCo /** * 只画Thumb */ + @Override public void paint(Graphics g, JComponent c) { Rectangle thumbBounds = getThumbBounds(); if (thumbBounds.intersects(g.getClipBounds())) { @@ -380,6 +382,7 @@ public class UIScrollBarUI extends ScrollBarUI implements LayoutManager, SwingCo * @see #getMaximumSize * @see #getMinimumSize */ + @Override public Dimension getPreferredSize(JComponent c) { return (scrollbar.getOrientation() == JScrollBar.VERTICAL) ? new Dimension(scrollBarWidth, 48) : new Dimension(48, scrollBarWidth); } @@ -390,6 +393,7 @@ public class UIScrollBarUI extends ScrollBarUI implements LayoutManager, SwingCo * @see #getMinimumSize * @see #getPreferredSize */ + @Override public Dimension getMaximumSize(JComponent c) { return new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE); } @@ -937,6 +941,7 @@ public class UIScrollBarUI extends ScrollBarUI implements LayoutManager, SwingCo private transient int direction = +1; + @Override public void mouseReleased(MouseEvent e) { isPressing = false; if (isDragging) { @@ -968,6 +973,7 @@ public class UIScrollBarUI extends ScrollBarUI implements LayoutManager, SwingCo * one page. If there is no thumb then page up if the mouse is in the * upper half of the track. */ + @Override public void mousePressed(MouseEvent e) { boolean isMiddle = !isSupportsAbsolutePositioning() && SwingUtilities.isMiddleMouseButton(e); if (SwingUtilities.isRightMouseButton(e) || isMiddle) { @@ -1313,7 +1319,7 @@ public class UIScrollBarUI extends ScrollBarUI implements LayoutManager, SwingCo public void propertyChange(PropertyChangeEvent e) { String propertyName = e.getPropertyName(); - if ("model" == propertyName) { + if (StringUtils.equals("model", propertyName)) { BoundedRangeModel oldModel = (BoundedRangeModel) e.getOldValue(); BoundedRangeModel newModel = (BoundedRangeModel) e.getNewValue(); oldModel.removeChangeListener(modelListener); @@ -1329,4 +1335,4 @@ public class UIScrollBarUI extends ScrollBarUI implements LayoutManager, SwingCo } } } -} \ No newline at end of file +} diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/JWorkBook.java b/designer-realize/src/main/java/com/fr/design/mainframe/JWorkBook.java index 07136bc1e..e5cb04b0f 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/JWorkBook.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/JWorkBook.java @@ -95,10 +95,6 @@ import com.fr.stable.module.Module; import com.fr.stable.project.ProjectConstants; import com.fr.web.controller.ViewRequestConstants; import com.fr.workspace.WorkContext; - -import javax.swing.Icon; -import javax.swing.JComponent; -import javax.swing.JPanel; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.FileOutputStream; @@ -106,6 +102,9 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Set; +import javax.swing.Icon; +import javax.swing.JComponent; +import javax.swing.JPanel; /** * JWorkBook used to edit WorkBook. @@ -1103,9 +1102,8 @@ public class JWorkBook extends JTemplate { // 弹出输入参数 java.util.Map parameterMap = inputParameters(tpl); - try { - String fullPath = StableUtils.pathJoin(WorkContext.getCurrent().getPath(), newFile.getPath()); - FileOutputStream fileOutputStream = new FileOutputStream(fullPath); + String fullPath = StableUtils.pathJoin(WorkContext.getCurrent().getPath(), newFile.getPath()); + try (FileOutputStream fileOutputStream = new FileOutputStream(fullPath)) { EmbeddedTableDataExporter exporter = new EmbeddedTableDataExporter(); exporter.export(fileOutputStream, tpl, parameterMap); } catch (Exception e1) { diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/errorinfo/ErrorInfo.java b/designer-realize/src/main/java/com/fr/design/mainframe/errorinfo/ErrorInfo.java index d22bcf75b..4e733c7b1 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/errorinfo/ErrorInfo.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/errorinfo/ErrorInfo.java @@ -2,14 +2,17 @@ package com.fr.design.mainframe.errorinfo; import com.fr.base.FRContext; import com.fr.general.IOUtils; -import com.fr.json.JSONException; import com.fr.json.JSONObject; import com.fr.stable.EncodeConstants; import com.fr.stable.ProductConstants; import com.fr.stable.StableUtils; import com.fr.stable.core.UUID; - -import java.io.*; +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; import java.text.DateFormat; import java.util.Date; @@ -124,13 +127,14 @@ public class ErrorInfo { String content = jo.toString(); String fileName = UUID.randomUUID() + ErrorInfoUploader.SUFFIX; File file = new File(StableUtils.pathJoin(ProductConstants.getEnvHome(), ErrorInfoUploader.FOLDER_NAME, fileName)); - try { + FileOutputStream out = null; + try (InputStream in = new ByteArrayInputStream(content.getBytes(StandardCharsets.UTF_8))) { StableUtils.makesureFileExist(file); - FileOutputStream out = new FileOutputStream(file); - InputStream in = new ByteArrayInputStream(content.getBytes(EncodeConstants.ENCODING_UTF_8)); + out = new FileOutputStream(file); IOUtils.copyBinaryTo(in, out); - out.close(); } catch (IOException ignore) { + } finally { + IOUtils.close(out); } } } diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/messagecollect/entity/FileEntityBuilder.java b/designer-realize/src/main/java/com/fr/design/mainframe/messagecollect/entity/FileEntityBuilder.java index 4497a0b28..358672d23 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/messagecollect/entity/FileEntityBuilder.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/messagecollect/entity/FileEntityBuilder.java @@ -19,7 +19,9 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; import java.util.UUID; +import java.util.zip.ZipOutputStream; /** * @author alex sung @@ -52,13 +54,15 @@ public class FileEntityBuilder { return null; } File zipFile = null; + ZipOutputStream zipOut = null; try { zipFile = new File(pathName + ".zip"); - java.util.zip.ZipOutputStream zipOut = new java.util.zip.ZipOutputStream(new FileOutputStream(zipFile)); + zipOut = new ZipOutputStream(new FileOutputStream(zipFile)); IOUtils.zip(zipOut, new File(pathName)); - zipOut.close(); } catch (Exception e) { FineLoggerFactory.getLogger().error(e.getMessage(), e); + } finally { + IOUtils.close(zipOut); } return zipFile; } @@ -67,18 +71,18 @@ public class FileEntityBuilder { if (jsonArray.size() == 0) { return; } - try { - String content = jsonArray.toString(); + FileOutputStream out = null; + String content = jsonArray.toString(); + try (InputStream in = new ByteArrayInputStream(content.getBytes(StandardCharsets.UTF_8))) { String fileName = String.valueOf(UUID.randomUUID()); File file = new File(folderName + File.separator + fileName + ".json"); StableUtils.makesureFileExist(file); - FileOutputStream out = new FileOutputStream(file); - InputStream in = new ByteArrayInputStream(content.getBytes(EncodeConstants.ENCODING_UTF_8)); + out = new FileOutputStream(file); IOUtils.copyBinaryTo(in, out); - in.close(); - out.close(); } catch (Exception e) { FineLoggerFactory.getLogger().error(e.getMessage(), e); + } finally { + IOUtils.close(out); } } From c5e72eceb201dd3bbd99a850ea62a7ee6d5e467d Mon Sep 17 00:00:00 2001 From: Maksim Date: Wed, 21 Aug 2019 11:06:59 +0800 Subject: [PATCH 067/217] =?UTF-8?q?REPORT-20323=20sonar=E9=97=AE=E9=A2=98?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/gui/icombobox/UIComboBoxButton.java | 12 ------------ .../design/gui/icontainer/UIResizableContainer.java | 5 ----- .../com/fr/design/gui/ilable/MultilineLabel.java | 6 +++--- .../com/fr/design/gui/imenu/UIBasicMenuItemUI.java | 2 +- 4 files changed, 4 insertions(+), 21 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/gui/icombobox/UIComboBoxButton.java b/designer-base/src/main/java/com/fr/design/gui/icombobox/UIComboBoxButton.java index a5ebf7b56..9f96f655e 100644 --- a/designer-base/src/main/java/com/fr/design/gui/icombobox/UIComboBoxButton.java +++ b/designer-base/src/main/java/com/fr/design/gui/icombobox/UIComboBoxButton.java @@ -127,10 +127,6 @@ public class UIComboBoxButton extends JButton { boolean savedOpaque = false; paintRender(g, c, mustResetOpaque, savedOpaque, leftToRight, width, insets, iconWidth, left, top, height); - if (mustResetOpaque) { - JComponent jc = (JComponent) c; - jc.setOpaque(savedOpaque); - } } private void paintRender(Graphics g, Component c, boolean mustResetOpaque, boolean savedOpaque, boolean leftToRight, @@ -152,14 +148,6 @@ public class UIComboBoxButton extends JButton { } else { rendererPane.paintComponent(g, c, this, left + iconWidth, top, cWidth, height, shouldValidate); } - if (paintFocus && ThemeUtils.COMBO_FOCUS) { - g.setColor(Color.black); - Graphics2D g2d = (Graphics2D) g; - Rectangle r = new Rectangle(left, top, 2, 2); - TexturePaint tp = new TexturePaint(focusImg, r); - g2d.setPaint(tp); - g2d.draw(new Rectangle(left, top, cWidth, height)); - } } } diff --git a/designer-base/src/main/java/com/fr/design/gui/icontainer/UIResizableContainer.java b/designer-base/src/main/java/com/fr/design/gui/icontainer/UIResizableContainer.java index 73199d2ab..0a8529abf 100644 --- a/designer-base/src/main/java/com/fr/design/gui/icontainer/UIResizableContainer.java +++ b/designer-base/src/main/java/com/fr/design/gui/icontainer/UIResizableContainer.java @@ -438,11 +438,6 @@ public class UIResizableContainer extends JPanel { containerWidth = containerWidth > MAX_WIDTH ? MAX_WIDTH : containerWidth; containerWidth = containerWidth < MIN_WIDTH ? MIN_WIDTH : containerWidth; - if (containerWidth < MIN_WIDTH) { - upPane.setVisible(false); - downPane.setVisible(false); - containerWidth = toolPaneHeight; - } refreshContainer(); if (DesignerMode.isAuthorityEditing()) { DesignerContext.getDesignerFrame().doResize(); diff --git a/designer-base/src/main/java/com/fr/design/gui/ilable/MultilineLabel.java b/designer-base/src/main/java/com/fr/design/gui/ilable/MultilineLabel.java index bb890447f..8934e862a 100644 --- a/designer-base/src/main/java/com/fr/design/gui/ilable/MultilineLabel.java +++ b/designer-base/src/main/java/com/fr/design/gui/ilable/MultilineLabel.java @@ -19,15 +19,15 @@ import com.fr.design.gui.itextarea.UITextArea; */ public class MultilineLabel extends UITextArea { public MultilineLabel() { - initComponents(); + initCurrentComponents(); } public MultilineLabel(String s) { super(s); - initComponents(); + initCurrentComponents(); } - private void initComponents() { + private void initCurrentComponents() { adjustUI(); } diff --git a/designer-base/src/main/java/com/fr/design/gui/imenu/UIBasicMenuItemUI.java b/designer-base/src/main/java/com/fr/design/gui/imenu/UIBasicMenuItemUI.java index 61587beef..1c07c8260 100644 --- a/designer-base/src/main/java/com/fr/design/gui/imenu/UIBasicMenuItemUI.java +++ b/designer-base/src/main/java/com/fr/design/gui/imenu/UIBasicMenuItemUI.java @@ -579,7 +579,7 @@ public class UIBasicMenuItemUI extends MenuItemUI { */ private boolean isInternalFrameSystemMenu() { String actionCommand = menuItem.getActionCommand(); - return (actionCommand == "Close") || (actionCommand == "Minimize") || (actionCommand == "Restore") || (actionCommand == "Maximize"); + return (actionCommand.equals("Close")) || (actionCommand.equals("Minimize")) || (actionCommand.equals("Restore")) || (actionCommand.equals("Maximize")); } ////////////////////////////////////////////////////////// From 3d5a891ae6d3de7bac290b70b8f9992a636504aa Mon Sep 17 00:00:00 2001 From: "Bruce.Deng" Date: Wed, 21 Aug 2019 15:23:24 +0800 Subject: [PATCH 068/217] =?UTF-8?q?REPORT-19464=20=E3=80=90=E5=8C=B9?= =?UTF-8?q?=E9=85=8D=E7=A7=BB=E5=8A=A8=E7=AB=AF=E3=80=91TAB=E4=B8=8B?= =?UTF-8?q?=E8=8F=9C=E5=8D=95=E5=BC=8F=E5=9B=BE=E6=A0=87=E4=BC=98=E5=8C=96?= =?UTF-8?q?2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fr/design/web/CustomIconPane.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/web/CustomIconPane.java b/designer-base/src/main/java/com/fr/design/web/CustomIconPane.java index 35ff2afba..bc21d4c73 100644 --- a/designer-base/src/main/java/com/fr/design/web/CustomIconPane.java +++ b/designer-base/src/main/java/com/fr/design/web/CustomIconPane.java @@ -452,10 +452,10 @@ public class CustomIconPane extends BasicPane { String path = jf.getSelectedFile().getAbsolutePath(); // 图片存储有最大值48*48限制,没有超过最大值时,按原图大小存储,超过最大值后,压缩至最大值存储 Image image = BaseUtils.readImage(path); - BufferedImage bufferedImage = CoreGraphHelper.createBufferedImage(image.getWidth(null) >= 48 ? IconManager.DEFAULT_ICONWIDTH + 32 : image.getWidth(null), - image.getHeight(null) >= 48 ? IconManager.DEFAULT_ICONHEIGHT + 32 : image.getHeight(null), BufferedImage.TYPE_INT_ARGB); + BufferedImage bufferedImage = CoreGraphHelper.createBufferedImage(image.getWidth(null) >= 48 ? IconManager.MAXSTORAGE_ICONWIDTH : image.getWidth(null), + image.getHeight(null) >= 48 ? IconManager.MAXSTORAGE_ICONHEIGHT : image.getHeight(null), BufferedImage.TYPE_INT_ARGB); Graphics2D g2d = bufferedImage.createGraphics(); - g2d.drawImage(image, 0, 0, image.getWidth(null) >= 48 ? IconManager.DEFAULT_ICONWIDTH + 32 : image.getWidth(null), image.getHeight(null) >= 48 ? IconManager.DEFAULT_ICONHEIGHT + 32 : image.getHeight(null), null); + g2d.drawImage(image, 0, 0, image.getWidth(null) >= 48 ? IconManager.MAXSTORAGE_ICONWIDTH : image.getWidth(null), image.getHeight(null) >= 48 ? IconManager.MAXSTORAGE_ICONHEIGHT : image.getHeight(null), null); bufferedImage.flush(); g2d.dispose(); iconImage = bufferedImage; From d1b2e791e487dc66577fa19883dc9e27daaf0ea0 Mon Sep 17 00:00:00 2001 From: Hades Date: Wed, 21 Aug 2019 15:37:54 +0800 Subject: [PATCH 069/217] REPORT-19462 --- .../gui/icombocheckbox/UICheckListPopup.java | 51 +++++++--- .../gui/icombocheckbox/UIComboCheckBox.java | 27 +++++- .../designer/mobile/BodyMobileDefinePane.java | 40 +++++--- .../mobile/TabMobileWidgetDefinePane.java | 19 ++-- .../component/MobileComponentFrozenPane.java | 92 +++++++++++++++++++ .../MobileComponentLayoutIntervalPane.java | 18 +--- ...ne.java => MobileComponentMarginPane.java} | 10 +- 7 files changed, 200 insertions(+), 57 deletions(-) create mode 100644 designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/MobileComponentFrozenPane.java rename designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/{MobileComponentAdvancePane.java => MobileComponentMarginPane.java} (77%) diff --git a/designer-base/src/main/java/com/fr/design/gui/icombocheckbox/UICheckListPopup.java b/designer-base/src/main/java/com/fr/design/gui/icombocheckbox/UICheckListPopup.java index a0f442074..b0b57f29c 100644 --- a/designer-base/src/main/java/com/fr/design/gui/icombocheckbox/UICheckListPopup.java +++ b/designer-base/src/main/java/com/fr/design/gui/icombocheckbox/UICheckListPopup.java @@ -7,12 +7,25 @@ import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.imenu.UIPopupMenu; import com.fr.design.icon.IconPathConstants; import com.fr.design.layout.FRGUIPaneFactory; - -import javax.swing.*; -import java.awt.*; -import java.awt.event.*; +import com.fr.general.IOUtils; + +import javax.swing.JCheckBox; +import javax.swing.JPanel; +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.GridLayout; +import java.awt.Insets; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.ItemEvent; +import java.awt.event.ItemListener; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; +import java.util.Map; public class UICheckListPopup extends UIPopupMenu { private List listeners = new ArrayList(); @@ -66,10 +79,10 @@ public class UICheckListPopup extends UIPopupMenu { } addSelectListener(); - jScrollPane.setPreferredSize(new Dimension(200, checkBoxList.size() * CHECKBOX_HEIGHT + 10)); + jScrollPane.setPreferredSize(new Dimension(130, checkBoxList.size() * CHECKBOX_HEIGHT + 10)); //超过1页的数量时显示滚动条 if (checkBoxList.size() > maxDisplayNumber) { - jScrollPane.setPreferredSize(new Dimension(200, maxDisplayNumber * CHECKBOX_HEIGHT)); + jScrollPane.setPreferredSize(new Dimension(130, maxDisplayNumber * CHECKBOX_HEIGHT)); } checkboxPane.repaint(); jScrollPane.repaint(); @@ -77,11 +90,11 @@ public class UICheckListPopup extends UIPopupMenu { private void addOneCheckValue(Object checkValue) { JPanel checkPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); - checkPane.setPreferredSize(new Dimension(185, CHECKBOX_HEIGHT)); + checkPane.setPreferredSize(new Dimension(120, CHECKBOX_HEIGHT)); final JCheckBox temp = createCheckbox(); final UILabel label = new UILabel(checkValue.toString()); label.setBackground(Color.WHITE); - label.setPreferredSize(new Dimension(156, 20)); + label.setPreferredSize(new Dimension(80, 20)); checkPane.setBackground(Color.WHITE); checkPane.add(temp); checkPane.add(label); @@ -95,8 +108,8 @@ public class UICheckListPopup extends UIPopupMenu { JCheckBox checkBox = new JCheckBox(); checkBox.setPreferredSize(new Dimension(20, 20)); checkBox.setBackground(Color.WHITE); - checkBox.setIcon(BaseUtils.readIcon(IconPathConstants.CHECKBOX_NORMAL)); - checkBox.setSelectedIcon(BaseUtils.readIcon(IconPathConstants.CHECKBOX_SELECTED)); + checkBox.setIcon(IOUtils.readIcon(IconPathConstants.CHECKBOX_NORMAL)); + checkBox.setSelectedIcon(IOUtils.readIcon(IconPathConstants.CHECKBOX_SELECTED)); return checkBox; } @@ -109,10 +122,12 @@ public class UICheckListPopup extends UIPopupMenu { */ private void addMouseListener(final JCheckBox checkBox, final UILabel label) { label.addMouseListener(new MouseAdapter() { + @Override public void mouseExited(MouseEvent e) { label.setBackground(Color.WHITE); } + @Override public void mouseEntered(MouseEvent e) { label.setOpaque(true); label.setBackground(mouseEnteredColor); @@ -133,6 +148,7 @@ public class UICheckListPopup extends UIPopupMenu { JCheckBox checkBox = checkBoxList.get(i); if (i == 0) { checkBox.addItemListener(new ItemListener() { + @Override public void itemStateChanged(ItemEvent e) { //全选checkbox事件 doSelectAll(checkBoxList.get(0).isSelected()); @@ -140,6 +156,7 @@ public class UICheckListPopup extends UIPopupMenu { }); } else { checkBox.addItemListener(new ItemListener() { + @Override public void itemStateChanged(ItemEvent e) { //do半选判断放在commit事件里 commit(); @@ -157,8 +174,17 @@ public class UICheckListPopup extends UIPopupMenu { private void doSelectAll(boolean isSelected) { for (int i = 1; i < checkBoxList.size(); i++) { //全选和反全选都不考虑全选按钮本身 - if (!SELECT_ALL.equals(checkBoxList.get(i).getText())) + if (!SELECT_ALL.equals(checkBoxList.get(i).getText())) { checkBoxList.get(i).setSelected(isSelected); + } + } + } + + public void setSelectedValue(Map selectedValues) { + List allValue = Arrays.asList(values); + for (Object value : selectedValues.keySet()) { + int index = allValue.indexOf(value); + checkBoxList.get(index + 1).setSelected(selectedValues.get(value)); } } @@ -214,8 +240,9 @@ public class UICheckListPopup extends UIPopupMenu { } public void addActionListener(ActionListener listener) { - if (!listeners.contains(listener)) + if (!listeners.contains(listener)) { listeners.add(listener); + } } public void removeActionListener(ActionListener listener) { diff --git a/designer-base/src/main/java/com/fr/design/gui/icombocheckbox/UIComboCheckBox.java b/designer-base/src/main/java/com/fr/design/gui/icombocheckbox/UIComboCheckBox.java index 11cfeb6fe..e570ee515 100644 --- a/designer-base/src/main/java/com/fr/design/gui/icombocheckbox/UIComboCheckBox.java +++ b/designer-base/src/main/java/com/fr/design/gui/icombocheckbox/UIComboCheckBox.java @@ -11,14 +11,23 @@ import com.fr.design.icon.IconPathConstants; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.stable.StringUtils; -import javax.swing.*; -import java.awt.*; +import javax.swing.Icon; +import javax.swing.JComponent; +import javax.swing.JFrame; +import javax.swing.JPanel; +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Component; +import java.awt.Dimension; +import java.awt.FlowLayout; +import java.awt.FontMetrics; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.ArrayList; import java.util.List; +import java.util.Map; /** * 设计器下拉复选框组件 @@ -125,7 +134,7 @@ public class UIComboCheckBox extends JComponent implements UIObserver, GlobalNam private UITextField createEditor() { UITextField editor = new UITextField(); editor.setEditable(false); - editor.setPreferredSize(new Dimension(180, 20)); + editor.setPreferredSize(new Dimension(110, 20)); addPopupListener(editor); return editor; @@ -138,6 +147,7 @@ public class UIComboCheckBox extends JComponent implements UIObserver, GlobalNam */ private void addPopupListener(Component component) { component.addMouseListener(new MouseAdapter() { + @Override public void mouseClicked(MouseEvent e) { togglePopup(); } @@ -166,6 +176,7 @@ public class UIComboCheckBox extends JComponent implements UIObserver, GlobalNam private class PopupAction implements ActionListener { + @Override public void actionPerformed(ActionEvent e) { if (e.getActionCommand().equals(UICheckListPopup.COMMIT_EVENT)) { selectedValues = popup.getSelectedValues(); @@ -292,13 +303,15 @@ public class UIComboCheckBox extends JComponent implements UIObserver, GlobalNam } public void addActionListener(ActionListener listener) { - if (!listeners.contains(listener)) + if (!listeners.contains(listener)) { listeners.add(listener); + } } public void removeActionListener(ActionListener listener) { - if (listeners.contains(listener)) + if (listeners.contains(listener)) { listeners.remove(listener); + } } protected void fireActionPerformed(ActionEvent e) { @@ -307,6 +320,10 @@ public class UIComboCheckBox extends JComponent implements UIObserver, GlobalNam } } + public void setSelectedValues(Map map) { + popup.setSelectedValue(map); + } + /** * 简单的测试demo * @param args diff --git a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/BodyMobileDefinePane.java b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/BodyMobileDefinePane.java index b91e1d7b6..bfd0ea7ea 100644 --- a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/BodyMobileDefinePane.java +++ b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/BodyMobileDefinePane.java @@ -11,7 +11,8 @@ import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.mainframe.FormDesigner; import com.fr.design.mainframe.MobileWidgetListPane; import com.fr.design.mainframe.WidgetPropertyPane; -import com.fr.design.widget.ui.designer.mobile.component.MobileComponentAdvancePane; +import com.fr.design.widget.ui.designer.mobile.component.MobileComponentFrozenPane; +import com.fr.design.widget.ui.designer.mobile.component.MobileComponentMarginPane; import com.fr.design.widget.ui.designer.mobile.component.MobileComponentLayoutIntervalPane; import com.fr.form.ui.RichStyleWidgetProvider; import com.fr.form.ui.container.WFitLayout; @@ -30,8 +31,11 @@ public class BodyMobileDefinePane extends MobileWidgetDefinePane { private AttributeChangeListener changeListener; private UICheckBox appRelayoutCheck; private MobileWidgetListPane mobileWidgetListPane; - private MobileComponentAdvancePane advancePane; + private MobileComponentMarginPane marginPane; private MobileComponentLayoutIntervalPane intervalPane; + private MobileComponentFrozenPane frozenPane; + private UIExpandablePane advancePane; + private UIExpandablePane layoutPane; public BodyMobileDefinePane(XCreator xCreator) { this.bodyCreator = xCreator; @@ -89,16 +93,23 @@ public class BodyMobileDefinePane extends MobileWidgetDefinePane { private JPanel createNorthPane() { JPanel holder = FRGUIPaneFactory.createBorderLayout_S_Pane(); holder.add(getMobilePropertyPane(), BorderLayout.NORTH); - - advancePane = new MobileComponentAdvancePane(FormBodyPaddingAttrMark.XML_TAG); + marginPane = new MobileComponentMarginPane(FormBodyPaddingAttrMark.XML_TAG); intervalPane = new MobileComponentLayoutIntervalPane(FormBodyPaddingAttrMark.XML_TAG); + frozenPane = new MobileComponentFrozenPane(); + JPanel wrapLayoutPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); + wrapLayoutPane.add(intervalPane, BorderLayout.NORTH); + wrapLayoutPane.add(frozenPane, BorderLayout.CENTER); + advancePane = new UIExpandablePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Advanced"), 280, 20, marginPane); + layoutPane = new UIExpandablePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Layout"), 280, 20, wrapLayoutPane); //高级 holder.add(advancePane, BorderLayout.CENTER); //布局 - holder.add(intervalPane, BorderLayout.SOUTH); + holder.add(layoutPane, BorderLayout.SOUTH); - advancePane.setVisible(!shouldHidePadding(designer)); - intervalPane.setVisible(!shouldHidePadding(designer)); + boolean flag = !shouldHidePadding(designer); + advancePane.setVisible(flag); + layoutPane.setVisible(flag); + frozenPane.setVisible(appRelayoutCheck.isSelected()); return holder; } @@ -137,13 +148,12 @@ public class BodyMobileDefinePane extends MobileWidgetDefinePane { public void populate(FormDesigner designer) { this.designer = designer; appRelayoutCheck.setSelected(FormDesignerUtils.isAppRelayout(designer)); - // 数据 populate 完成后,再设置监听 this.bindListeners2Widgets(); this.addAttributeChangeListener(changeListener); - - advancePane.populate((RichStyleWidgetProvider) getBodyCreator().toData()); + marginPane.populate((RichStyleWidgetProvider) getBodyCreator().toData()); intervalPane.populate((RichStyleWidgetProvider) getBodyCreator().toData()); + frozenPane.populate(designer.getSelectionModel().getSelection().getSelectedCreator()); } @Override @@ -152,15 +162,19 @@ public class BodyMobileDefinePane extends MobileWidgetDefinePane { setAppRelayout(appRelayoutCheck.isSelected()); boolean appPaddingVisible = appRelayout || !FormDesignerUtils.isBodyAbsolute(designer); advancePane.setVisible(appPaddingVisible); - intervalPane.setVisible(appPaddingVisible); + layoutPane.setVisible(appPaddingVisible); + frozenPane.setVisible(appRelayout); mobileWidgetListPane.updateToDesigner(); designer.getEditListenerTable().fireCreatorModified(DesignerEvent.CREATOR_EDITED); if (advancePane.isVisible()) { - advancePane.update((RichStyleWidgetProvider) getBodyCreator().toData()); + marginPane.update((RichStyleWidgetProvider) getBodyCreator().toData()); } - if (intervalPane.isVisible()) { + if (layoutPane.isVisible()) { intervalPane.update((RichStyleWidgetProvider) getBodyCreator().toData()); } + if (appRelayout) { + frozenPane.update(designer.getSelectionModel().getSelection().getSelectedCreator()); + } } } diff --git a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/TabMobileWidgetDefinePane.java b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/TabMobileWidgetDefinePane.java index 8a795b887..5cf7f74f7 100644 --- a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/TabMobileWidgetDefinePane.java +++ b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/TabMobileWidgetDefinePane.java @@ -4,6 +4,7 @@ import com.fr.base.iofile.attr.FormTabPaddingAttrMark; import com.fr.design.constants.LayoutConstants; import com.fr.design.designer.IntervalConstants; import com.fr.design.designer.creator.XCreator; +import com.fr.design.foldablepane.UIExpandablePane; import com.fr.design.gui.frpane.AttributeChangeListener; import com.fr.design.gui.ilable.UILabel; import com.fr.design.layout.FRGUIPaneFactory; @@ -13,7 +14,7 @@ import com.fr.design.mainframe.FormDesigner; import com.fr.design.mainframe.WidgetPropertyPane; import com.fr.design.mainframe.widget.accessibles.AccessibleTemplateStyleEditor; import com.fr.design.mainframe.widget.accessibles.MobileTemplateStylePane; -import com.fr.design.widget.ui.designer.mobile.component.MobileComponentAdvancePane; +import com.fr.design.widget.ui.designer.mobile.component.MobileComponentMarginPane; import com.fr.design.widget.ui.designer.mobile.component.MobileComponentLayoutIntervalPane; import com.fr.form.ui.container.cardlayout.WCardTagLayout; import com.fr.general.cardtag.mobile.MobileTemplateStyle; @@ -27,7 +28,7 @@ public class TabMobileWidgetDefinePane extends MobileWidgetDefinePane { private FormDesigner designer; // 当前设计器 private AccessibleTemplateStyleEditor templateStyleEditor; private AttributeChangeListener changeListener; - private MobileComponentAdvancePane advancePane; + private MobileComponentMarginPane marginPane; private MobileComponentLayoutIntervalPane intervalPane; public TabMobileWidgetDefinePane(XCreator xCreator) { @@ -61,12 +62,14 @@ public class TabMobileWidgetDefinePane extends MobileWidgetDefinePane { JPanel holder = FRGUIPaneFactory.createBorderLayout_S_Pane(); holder.add(jPanel, BorderLayout.NORTH); if (!shouldHidePadding(designer)) { - advancePane = new MobileComponentAdvancePane(FormTabPaddingAttrMark.XML_TAG); + marginPane = new MobileComponentMarginPane(FormTabPaddingAttrMark.XML_TAG); intervalPane = new MobileComponentLayoutIntervalPane(FormTabPaddingAttrMark.XML_TAG); + UIExpandablePane advancePane = new UIExpandablePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Advanced"), 280, 20, marginPane); + UIExpandablePane layoutPane = new UIExpandablePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Layout"), 280, 20, intervalPane); //高级 holder.add(advancePane, BorderLayout.CENTER); //布局 - holder.add(intervalPane, BorderLayout.SOUTH); + holder.add(layoutPane, BorderLayout.SOUTH); } this.add(holder, BorderLayout.NORTH); @@ -78,8 +81,8 @@ public class TabMobileWidgetDefinePane extends MobileWidgetDefinePane { // 数据 populate 完成后,再设置监听 this.bindListeners2Widgets(); this.addAttributeChangeListener(changeListener); - if (advancePane != null) {//业务层面可以写成shouldHidePadding但是这样写应该性能差点 - advancePane.populate((WCardTagLayout) xCreator.toData()); + if (marginPane != null) {//业务层面可以写成shouldHidePadding但是这样写应该性能差点 + marginPane.populate((WCardTagLayout) xCreator.toData()); } if (intervalPane != null) { intervalPane.populate((WCardTagLayout) xCreator.toData()); @@ -90,8 +93,8 @@ public class TabMobileWidgetDefinePane extends MobileWidgetDefinePane { public void update() { ((WCardTagLayout) xCreator.toData()).setMobileTemplateStyle((MobileTemplateStyle) templateStyleEditor.getValue()); DesignerContext.getDesignerFrame().getSelectedJTemplate().fireTargetModified(); // 触发设计器保存按钮亮起来 - if (advancePane != null) { - advancePane.update((WCardTagLayout) xCreator.toData()); + if (marginPane != null) { + marginPane.update((WCardTagLayout) xCreator.toData()); } if (intervalPane != null) { intervalPane.update((WCardTagLayout) xCreator.toData()); diff --git a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/MobileComponentFrozenPane.java b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/MobileComponentFrozenPane.java new file mode 100644 index 000000000..0d5ce4b71 --- /dev/null +++ b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/MobileComponentFrozenPane.java @@ -0,0 +1,92 @@ +package com.fr.design.widget.ui.designer.mobile.component; + +import com.fr.design.designer.IntervalConstants; +import com.fr.design.designer.creator.XCreator; +import com.fr.design.dialog.BasicPane; +import com.fr.design.gui.icombocheckbox.UIComboCheckBox; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.layout.TableLayoutHelper; +import com.fr.design.mainframe.FormDesigner; +import com.fr.design.mainframe.WidgetPropertyPane; +import com.fr.design.utils.gui.UIComponentUtils; +import com.fr.design.widget.FRWidgetFactory; +import com.fr.form.ui.Widget; +import com.fr.form.ui.container.WSortLayout; +import com.fr.stable.ArrayUtils; + +import javax.swing.BorderFactory; +import javax.swing.JPanel; +import java.awt.BorderLayout; +import java.awt.Component; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +/** + * @author Hades + * @date 2019/8/14 + */ +public class MobileComponentFrozenPane extends BasicPane { + + private UIComboCheckBox uiComboCheckBox; + + public MobileComponentFrozenPane() { + this.setLayout(FRGUIPaneFactory.createBorderLayout()); + UILabel frozenLabel = FRWidgetFactory.createLineWrapLabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Component_Frozen")); + uiComboCheckBox = new UIComboCheckBox(initData()); + JPanel wrapJPanel = UIComponentUtils.wrapWithBorderLayoutPane(uiComboCheckBox); + Component[][] components = new Component[][]{ + new Component[]{frozenLabel, wrapJPanel} + }; + JPanel centerPane = TableLayoutHelper.createGapTableLayoutPane(components, TableLayoutHelper.FILL_LASTCOLUMN, IntervalConstants.INTERVAL_W1, IntervalConstants.INTERVAL_L1); + centerPane.setBorder(BorderFactory.createEmptyBorder(IntervalConstants.INTERVAL_L1, IntervalConstants.INTERVAL_L5, 10, 0)); + JPanel holder = FRGUIPaneFactory.createBorderLayout_S_Pane(); + holder.add(centerPane, BorderLayout.NORTH); + this.add(holder, BorderLayout.NORTH); + } + + private String[] initData() { + FormDesigner designer = WidgetPropertyPane.getInstance().getEditingFormDesigner(); + XCreator selectedCreator = designer.getSelectionModel().getSelection().getSelectedCreator(); + Widget selectedModel = selectedCreator != null ? selectedCreator.toData() : null; + + if (selectedModel == null || !selectedModel.acceptType(WSortLayout.class)) { + return ArrayUtils.EMPTY_STRING_ARRAY; + } + + List widgetList = ((WSortLayout) selectedModel).getNonContainerWidgetList(); + return widgetList.toArray(new String[0]); + } + + public void update(XCreator xCreator) { + List selected = new ArrayList<>(); + WSortLayout wSortLayout = ((WSortLayout) xCreator.toData()); + Object[] values = uiComboCheckBox.getSelectedValues(); + for (Object widgetName : values) { + selected.add((String) widgetName); + } + wSortLayout.updateFrozenWidgets(selected); + } + + public void populate(XCreator xCreator) { + WSortLayout wSortLayout = ((WSortLayout) xCreator.toData()); + List all = wSortLayout.getNonContainerWidgetList(); + List selected = wSortLayout.getFrozenWidgets(); + Map map = new LinkedHashMap<>(); + for (String value : selected) { + map.put(value, true); + } + all.removeAll(selected); + for (String value : all) { + map.put(value, false); + } + uiComboCheckBox.setSelectedValues(map); + } + + @Override + protected String title4PopupWindow() { + return "ComponentFrozenPane"; + } +} diff --git a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/MobileComponentLayoutIntervalPane.java b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/MobileComponentLayoutIntervalPane.java index 5a565373d..169b014a0 100644 --- a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/MobileComponentLayoutIntervalPane.java +++ b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/MobileComponentLayoutIntervalPane.java @@ -3,7 +3,6 @@ package com.fr.design.widget.ui.designer.mobile.component; import com.fr.base.iofile.attr.AttrMarkFactory; import com.fr.base.iofile.attr.FormBodyPaddingAttrMark; import com.fr.design.designer.IntervalConstants; -import com.fr.design.foldablepane.UIExpandablePane; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.ispinner.UISpinner; import com.fr.design.layout.FRGUIPaneFactory; @@ -29,24 +28,17 @@ public class MobileComponentLayoutIntervalPane extends XmlRelationedBasicPane { super(xmlTag); this.setLayout(FRGUIPaneFactory.createBorderLayout()); UILabel intervalLabel = FRWidgetFactory.createLineWrapLabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Component_Interval")); - - double f = TableLayout.FILL; - double p = TableLayout.PREFERRED; - double[] rowSize = {p, p}; - double[] columnSize = {p, f}; - int[][] rowCount = {{1, 1}, {1, 1}}; componentIntervel = new UISpinner(0, Integer.MAX_VALUE, 1, FormBodyPaddingAttrMark.DEFAULT_SIZE); - JPanel componentIntervelPane = UIComponentUtils.wrapWithBorderLayoutPane(componentIntervel); + JPanel componentIntervalPane = UIComponentUtils.wrapWithBorderLayoutPane(componentIntervel); Component[][] components = new Component[][]{ - new Component[]{intervalLabel, componentIntervelPane} + new Component[]{intervalLabel, componentIntervalPane} }; - JPanel centerPane = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, rowCount, IntervalConstants.INTERVAL_W1, IntervalConstants.INTERVAL_L1); - centerPane.setBorder(BorderFactory.createEmptyBorder(IntervalConstants.INTERVAL_L1, IntervalConstants.INTERVAL_L5, 0, 0)); + JPanel centerPane = TableLayoutHelper.createGapTableLayoutPane(components, TableLayoutHelper.FILL_LASTCOLUMN, IntervalConstants.INTERVAL_W1, IntervalConstants.INTERVAL_L1); + centerPane.setBorder(BorderFactory.createEmptyBorder(IntervalConstants.INTERVAL_L1, IntervalConstants.INTERVAL_L5, 10, 0)); JPanel holder = FRGUIPaneFactory.createBorderLayout_S_Pane(); holder.add(centerPane, BorderLayout.NORTH); - UIExpandablePane layoutExpandablePane = new UIExpandablePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Layout"), 280, 20, holder); - this.add(layoutExpandablePane, BorderLayout.NORTH); + this.add(holder, BorderLayout.NORTH); } @Override diff --git a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/MobileComponentAdvancePane.java b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/MobileComponentMarginPane.java similarity index 77% rename from designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/MobileComponentAdvancePane.java rename to designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/MobileComponentMarginPane.java index f94d57907..7a1bb34ee 100644 --- a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/MobileComponentAdvancePane.java +++ b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/MobileComponentMarginPane.java @@ -2,7 +2,6 @@ package com.fr.design.widget.ui.designer.mobile.component; import com.fr.base.iofile.attr.AttrMarkFactory; import com.fr.base.iofile.attr.FormBodyPaddingAttrMark; -import com.fr.design.foldablepane.UIExpandablePane; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.widget.ui.designer.XmlRelationedBasicPane; import com.fr.design.widget.ui.designer.component.PaddingBoundPane; @@ -13,20 +12,19 @@ import java.awt.BorderLayout; /** * 只有内边距设置的高级设置 */ -public class MobileComponentAdvancePane extends XmlRelationedBasicPane { +public class MobileComponentMarginPane extends XmlRelationedBasicPane { private PaddingBoundPane paddingBound; - public MobileComponentAdvancePane(String xmlTag) { + public MobileComponentMarginPane(String xmlTag) { super(xmlTag); this.setLayout(FRGUIPaneFactory.createBorderLayout()); paddingBound = new PaddingBoundPane(FormBodyPaddingAttrMark.DEFAULT_SIZE, FormBodyPaddingAttrMark.DEFAULT_SIZE, FormBodyPaddingAttrMark.DEFAULT_SIZE, FormBodyPaddingAttrMark.DEFAULT_SIZE); - UIExpandablePane advanceExpandablePane = new UIExpandablePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Advanced"), 280, 20, paddingBound); - this.add(advanceExpandablePane, BorderLayout.NORTH); + this.add(paddingBound, BorderLayout.NORTH); } @Override protected String title4PopupWindow() { - return "ComponentAdvancePane"; + return "ComponentMarginPane"; } public void update(RichStyleWidgetProvider marginWidget) { From 6e65fd6e0a9ee8190fad98dfbe6d35ff4d1baf2f Mon Sep 17 00:00:00 2001 From: "Bruce.Deng" Date: Wed, 21 Aug 2019 18:28:07 +0800 Subject: [PATCH 070/217] =?UTF-8?q?REPORT-19464=20=E3=80=90=E5=8C=B9?= =?UTF-8?q?=E9=85=8D=E7=A7=BB=E5=8A=A8=E7=AB=AF=E3=80=91TAB=E4=B8=8B?= =?UTF-8?q?=E8=8F=9C=E5=8D=95=E5=BC=8F=E5=9B=BE=E6=A0=87=E4=BC=98=E5=8C=96?= =?UTF-8?q?2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fr/design/web/CustomIconPane.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/web/CustomIconPane.java b/designer-base/src/main/java/com/fr/design/web/CustomIconPane.java index bc21d4c73..0231963b9 100644 --- a/designer-base/src/main/java/com/fr/design/web/CustomIconPane.java +++ b/designer-base/src/main/java/com/fr/design/web/CustomIconPane.java @@ -452,10 +452,10 @@ public class CustomIconPane extends BasicPane { String path = jf.getSelectedFile().getAbsolutePath(); // 图片存储有最大值48*48限制,没有超过最大值时,按原图大小存储,超过最大值后,压缩至最大值存储 Image image = BaseUtils.readImage(path); - BufferedImage bufferedImage = CoreGraphHelper.createBufferedImage(image.getWidth(null) >= 48 ? IconManager.MAXSTORAGE_ICONWIDTH : image.getWidth(null), - image.getHeight(null) >= 48 ? IconManager.MAXSTORAGE_ICONHEIGHT : image.getHeight(null), BufferedImage.TYPE_INT_ARGB); + BufferedImage bufferedImage = CoreGraphHelper.createBufferedImage(Math.min(image.getWidth(null), IconManager.MAXSTORAGE_ICONWIDTH), + Math.min(image.getHeight(null), IconManager.MAXSTORAGE_ICONHEIGHT), BufferedImage.TYPE_INT_ARGB); Graphics2D g2d = bufferedImage.createGraphics(); - g2d.drawImage(image, 0, 0, image.getWidth(null) >= 48 ? IconManager.MAXSTORAGE_ICONWIDTH : image.getWidth(null), image.getHeight(null) >= 48 ? IconManager.MAXSTORAGE_ICONHEIGHT : image.getHeight(null), null); + g2d.drawImage(image, 0, 0, Math.min(image.getWidth(null), IconManager.MAXSTORAGE_ICONWIDTH), Math.min(image.getHeight(null), IconManager.MAXSTORAGE_ICONHEIGHT), null); bufferedImage.flush(); g2d.dispose(); iconImage = bufferedImage; From ff6238a50f9d5717b2c789126a71232bcdb93b91 Mon Sep 17 00:00:00 2001 From: author Date: Thu, 22 Aug 2019 18:15:06 +0800 Subject: [PATCH 071/217] =?UTF-8?q?=E6=97=A0jira=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=EF=BC=8Csonar=E9=97=AE=E9=A2=98=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/gui/icheckbox/UICheckBox.java | 100 +++++++++--------- .../fr/design/gui/icheckbox/UICheckBoxUI.java | 2 +- .../fr/design/gui/icombobox/LazyComboBox.java | 1 + .../gui/icombobox/LazyComboBoxTest.java | 1 + 4 files changed, 52 insertions(+), 52 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/gui/icheckbox/UICheckBox.java b/designer-base/src/main/java/com/fr/design/gui/icheckbox/UICheckBox.java index 7489b4f59..10ea06a8c 100644 --- a/designer-base/src/main/java/com/fr/design/gui/icheckbox/UICheckBox.java +++ b/designer-base/src/main/java/com/fr/design/gui/icheckbox/UICheckBox.java @@ -125,60 +125,58 @@ public class UICheckBox extends JCheckBox implements UIObserver, GlobalNameObser private class UICheckBoxUI extends MetalCheckBoxUI { @Override - public void paint(Graphics g, JComponent c) { - synchronized (this) { - AbstractButton b = (AbstractButton) c; - ButtonModel model = b.getModel(); - Dimension size = c.getSize(); - Font f = c.getFont(); - g.setFont(f); - FontMetrics fm = SwingUtilities2.getFontMetrics(c, g, f); - - Rectangle viewRect = new Rectangle(size); - Rectangle iconRect = new Rectangle(); - Rectangle textRect = new Rectangle(); - - Insets i = c.getInsets(); - viewRect.x += i.left; - viewRect.y += i.top; - viewRect.width -= (i.right + viewRect.x); - viewRect.height -= (i.bottom + viewRect.y); - - Icon altIcon = b.getIcon(); - - String text = SwingUtilities.layoutCompoundLabel( - c, fm, b.getText(), altIcon != null ? altIcon : getDefaultIcon(), - b.getVerticalAlignment(), b.getHorizontalAlignment(), - b.getVerticalTextPosition(), b.getHorizontalTextPosition(), - viewRect, iconRect, textRect, b.getIconTextGap()); - - // fill background - if (c.isOpaque()) { - g.setColor(b.getBackground()); - g.fillRect(0, 0, size.width, size.height); - } - - Graphics2D g2d = (Graphics2D) g; - g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); - if (model.isSelected()) { - GUIPaintUtils.fillPaint(g2d, iconRect.x, iconRect.y, iconRect.width, iconRect.height, false, Constants.NULL, - model.isEnabled() ? UIConstants.CHECKBOX_HOVER_SELECTED : UIConstants.DISABLED_ICON_COLOR, 0); - } else if (model.isRollover() && !model.isSelected()) { - g.setColor(UIConstants.CHECKBOX_HOVER_SELECTED); - g2d.drawRoundRect(iconRect.x, iconRect.y, iconRect.width - 1, iconRect.height - 1, UIConstants.ARC, UIConstants.ARC); - } else { - g.setColor(UIConstants.LINE_COLOR); - g2d.drawRoundRect(iconRect.x, iconRect.y, iconRect.width - 1, iconRect.height - 1, UIConstants.ARC, UIConstants.ARC); - } + public synchronized void paint(Graphics g, JComponent c) { + AbstractButton b = (AbstractButton) c; + ButtonModel model = b.getModel(); + Dimension size = c.getSize(); + Font f = c.getFont(); + g.setFont(f); + FontMetrics fm = SwingUtilities2.getFontMetrics(c, g, f); + + Rectangle viewRect = new Rectangle(size); + Rectangle iconRect = new Rectangle(); + Rectangle textRect = new Rectangle(); + + Insets i = c.getInsets(); + viewRect.x += i.left; + viewRect.y += i.top; + viewRect.width -= (i.right + viewRect.x); + viewRect.height -= (i.bottom + viewRect.y); + + Icon altIcon = b.getIcon(); + + String text = SwingUtilities.layoutCompoundLabel( + c, fm, b.getText(), altIcon != null ? altIcon : getDefaultIcon(), + b.getVerticalAlignment(), b.getHorizontalAlignment(), + b.getVerticalTextPosition(), b.getHorizontalTextPosition(), + viewRect, iconRect, textRect, b.getIconTextGap()); + + // fill background + if (c.isOpaque()) { + g.setColor(b.getBackground()); + g.fillRect(0, 0, size.width, size.height); + } - if (model.isSelected()) { - UIConstants.YES_ICON.paintIcon(c, g, iconRect.x + 2, iconRect.y + 2); - } - g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF); + Graphics2D g2d = (Graphics2D) g; + g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + if (model.isSelected()) { + GUIPaintUtils.fillPaint(g2d, iconRect.x, iconRect.y, iconRect.width, iconRect.height, false, Constants.NULL, + model.isEnabled() ? UIConstants.CHECKBOX_HOVER_SELECTED : UIConstants.DISABLED_ICON_COLOR, 0); + } else if (model.isRollover() && !model.isSelected()) { + g.setColor(UIConstants.CHECKBOX_HOVER_SELECTED); + g2d.drawRoundRect(iconRect.x, iconRect.y, iconRect.width - 1, iconRect.height - 1, UIConstants.ARC, UIConstants.ARC); + } else { + g.setColor(UIConstants.LINE_COLOR); + g2d.drawRoundRect(iconRect.x, iconRect.y, iconRect.width - 1, iconRect.height - 1, UIConstants.ARC, UIConstants.ARC); + } - // Draw the Text - drawLine(text, g, b, c, textRect, fm); + if (model.isSelected()) { + UIConstants.YES_ICON.paintIcon(c, g, iconRect.x + 2, iconRect.y + 2); } + g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF); + + // Draw the Text + drawLine(text, g, b, c, textRect, fm); } private void drawLine(String text, Graphics g, AbstractButton b, JComponent c, Rectangle textRect, FontMetrics fm) { diff --git a/designer-base/src/main/java/com/fr/design/gui/icheckbox/UICheckBoxUI.java b/designer-base/src/main/java/com/fr/design/gui/icheckbox/UICheckBoxUI.java index 1a7bbb661..9076d355d 100644 --- a/designer-base/src/main/java/com/fr/design/gui/icheckbox/UICheckBoxUI.java +++ b/designer-base/src/main/java/com/fr/design/gui/icheckbox/UICheckBoxUI.java @@ -64,7 +64,7 @@ public class UICheckBoxUI extends MetalCheckBoxUI { } } - static BasicStroke focusStroke = new BasicStroke(1.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL, 1.0f, new float[]{1.0f / 1.0f}, 1.0f); + static BasicStroke focusStroke = new BasicStroke(1.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL, 1.0f, new float[]{1.0f}, 1.0f); protected void paintFocus(Graphics g, Rectangle t, Dimension arg2) { if (!ThemeUtils.BUTTON_FOCUS) { diff --git a/designer-base/src/main/java/com/fr/design/gui/icombobox/LazyComboBox.java b/designer-base/src/main/java/com/fr/design/gui/icombobox/LazyComboBox.java index be83cf5b1..300790457 100644 --- a/designer-base/src/main/java/com/fr/design/gui/icombobox/LazyComboBox.java +++ b/designer-base/src/main/java/com/fr/design/gui/icombobox/LazyComboBox.java @@ -84,6 +84,7 @@ public abstract class LazyComboBox extends UIComboBox implements PopupMenuListen LazyComboBox.this.loadList(get()); } catch (InterruptedException | ExecutionException exception) { FineLoggerFactory.getLogger().debug(exception.getMessage()); + Thread.currentThread().interrupt(); } LazyComboBox.this.showPopup(); } diff --git a/designer-base/src/main/java/com/fr/design/gui/icombobox/LazyComboBoxTest.java b/designer-base/src/main/java/com/fr/design/gui/icombobox/LazyComboBoxTest.java index 4016a263c..37e9db154 100644 --- a/designer-base/src/main/java/com/fr/design/gui/icombobox/LazyComboBoxTest.java +++ b/designer-base/src/main/java/com/fr/design/gui/icombobox/LazyComboBoxTest.java @@ -40,6 +40,7 @@ public class LazyComboBoxTest { Thread.sleep(3000); } catch (InterruptedException e) { FineLoggerFactory.getLogger().error(e.getMessage(), e); + Thread.currentThread().interrupt(); } return m; } From d5926c4328bf6335b4f32993e28373e41057f212 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E5=B2=B3?= <445798420@qq.com> Date: Fri, 23 Aug 2019 10:27:04 +0800 Subject: [PATCH 072/217] =?UTF-8?q?CHART-10247=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=E5=9B=BE=E8=A1=A8=E9=80=89=E6=8B=A9=E7=95=8C=E9=9D=A2?= =?UTF-8?q?=E5=9B=BE=E7=89=87=E9=A2=84=E8=A7=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/fr/design/chart/ChartTypePane.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/designer-chart/src/main/java/com/fr/design/chart/ChartTypePane.java b/designer-chart/src/main/java/com/fr/design/chart/ChartTypePane.java index 257fb8826..046cd1960 100644 --- a/designer-chart/src/main/java/com/fr/design/chart/ChartTypePane.java +++ b/designer-chart/src/main/java/com/fr/design/chart/ChartTypePane.java @@ -1,7 +1,6 @@ package com.fr.design.chart; /** * the Pane of the Chart - * */ import com.fr.chart.base.ChartInternationalNameContentBean; @@ -120,15 +119,16 @@ public class ChartTypePane extends ChartCommonWizardPane { ChartProvider[] sub_charts = ChartTypePane.this.charts4Icon[main_index]; ChartTypePane.this.iconListModel.clear(); for (int i = 0; i < sub_charts.length; i++) { - ChartTypePane.this.iconListModel.addElement(new ChartIcon(sub_charts[i])); + String ImagePath = sub_charts[i].demoImagePath(); + String chartName = sub_charts[i].getChartName(); + ChartTypePane.this.iconListModel.addElement(new ChartIcon(ImagePath, chartName)); } iconViewList.setSelectedIndex(0); } }; public String getChartName(ChartIcon chartIcon) { - ChartProvider chart = chartIcon.getChart(); - return ChartTypeManager.getInstanceWithCheck().getChartName(chart.getID()); + return chartIcon.getChartName(); } public void populate(ChartProvider chart) { @@ -146,10 +146,10 @@ public class ChartTypePane extends ChartCommonWizardPane { if (chart4Update == null) { String plotID = typeName[mainTypeList.getSelectedIndex()].getChartID(); ChartProvider chart = ChartTypeManager.getInstance().getChartTypes(plotID)[iconViewList.getSelectedIndex()]; - try{ + try { chart4Update = (ChartProvider) chart.clone(); cc.addChart(chart4Update); - }catch (CloneNotSupportedException ex){ + } catch (CloneNotSupportedException ex) { FineLoggerFactory.getLogger().error(ex.getMessage(), ex); } } From 924a8db115552f1aec84751c52515aa72f979c45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E5=B2=B3?= <445798420@qq.com> Date: Fri, 23 Aug 2019 11:14:37 +0800 Subject: [PATCH 073/217] =?UTF-8?q?CHART-10247=20ChartIcon=E7=A7=BB?= =?UTF-8?q?=E5=8A=A8=E5=88=B0design?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/chart/ChartIcon.java | 116 ++++++++++++++++++ .../com/fr/design/chart/ChartTypePane.java | 1 - 2 files changed, 116 insertions(+), 1 deletion(-) create mode 100644 designer-chart/src/main/java/com/fr/design/chart/ChartIcon.java diff --git a/designer-chart/src/main/java/com/fr/design/chart/ChartIcon.java b/designer-chart/src/main/java/com/fr/design/chart/ChartIcon.java new file mode 100644 index 000000000..7485d5797 --- /dev/null +++ b/designer-chart/src/main/java/com/fr/design/chart/ChartIcon.java @@ -0,0 +1,116 @@ +package com.fr.design.chart; + +import com.fr.base.GraphHelper; +import com.fr.general.IOUtils; +import com.fr.stable.Constants; +import com.fr.stable.xml.XMLPrintWriter; +import com.fr.stable.xml.XMLable; +import com.fr.stable.xml.XMLableReader; + +import javax.swing.Icon; +import java.awt.Color; +import java.awt.Component; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Paint; +import java.awt.image.BufferedImage; + +/** + * 图表的缩略图Icon, 在选择图表类型界面 用到. + */ +public class ChartIcon implements Icon, XMLable { + private static final int WIDTH = 400; + private static final int HEIGHT = 225; + /** + * 缩略图中的图片路径 + */ + private String imagePath; + + private String chartName; + + /** + * 构造Chart的缩略图Icon + */ + public ChartIcon(String imagePath, String chartName) { + this.imagePath = imagePath; + this.chartName = chartName; + } + + /** + * 画出缩略图Icon + * + * @param g 图形的上下文 + * @param c 所在的Component + * @param x 缩略图的起始坐标x + * @param y 缩略图的起始坐标y + */ + public void paintIcon(Component c, Graphics g, int x, int y) { + + Graphics2D g2d = (Graphics2D) g; + + Paint oldPaint = g2d.getPaint(); + + g.translate(x, y); + g2d.setPaint(Color.white); + + g2d.fillRect(0, 0, getIconWidth(), getIconHeight()); + BufferedImage demoImage = IOUtils.readImageWithCache(imagePath); + GraphHelper.paintImage(g, getIconWidth(), getIconHeight(), demoImage, Constants.IMAGE_ADJUST, Constants.NULL, Constants.NULL, -1, -1); + + g.translate(-x, -y); + g2d.setPaint(oldPaint); + } + + /** + * 返回缩略图的宽度 + * + * @return int 缩略图宽度 + */ + public int getIconWidth() { + return WIDTH; + } + + /** + * 返回缩略图的高度 + * + * @return int 缩略图高度 + */ + public int getIconHeight() { + return HEIGHT; + } + + + /** + * 返回缩略图中的图片路径 + * + * @return 缩略图中的图片路径 + */ + public String getImagePath() { + return imagePath; + } + + public String getChartName() { + return chartName; + } + + + public void readXML(XMLableReader reader) { + + } + + public void writeXML(XMLPrintWriter writer) { + + } + + /** + * @return 克隆后的对象 + * @throws CloneNotSupportedException 如果克隆失败则抛出此异常 + */ + public Object clone() throws CloneNotSupportedException { + ChartIcon cloned = (ChartIcon) super.clone(); + cloned.imagePath = this.imagePath; + cloned.chartName = this.chartName; + return cloned; + } + +} \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/design/chart/ChartTypePane.java b/designer-chart/src/main/java/com/fr/design/chart/ChartTypePane.java index 046cd1960..599a70915 100644 --- a/designer-chart/src/main/java/com/fr/design/chart/ChartTypePane.java +++ b/designer-chart/src/main/java/com/fr/design/chart/ChartTypePane.java @@ -5,7 +5,6 @@ package com.fr.design.chart; import com.fr.chart.base.ChartInternationalNameContentBean; import com.fr.chart.chartattr.ChartCollection; -import com.fr.chart.chartattr.ChartIcon; import com.fr.chart.charttypes.ChartTypeManager; import com.fr.chartx.attr.ChartProvider; import com.fr.design.gui.ilable.UILabel; From b38d273f33994b8682526043c3cd2b02bb05229b Mon Sep 17 00:00:00 2001 From: Lanlan Date: Fri, 23 Aug 2019 16:32:03 +0800 Subject: [PATCH 074/217] =?UTF-8?q?=E6=97=A0JIRA=E4=BB=BB=E5=8A=A1=20sonar?= =?UTF-8?q?=E9=97=AE=E9=A2=98=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fr/design/DesignerEnvManager.java | 4 +--- .../src/main/java/com/fr/design/layout/TableLayout.java | 6 +++--- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/DesignerEnvManager.java b/designer-base/src/main/java/com/fr/design/DesignerEnvManager.java index ae06d6fa1..1f8ef8541 100644 --- a/designer-base/src/main/java/com/fr/design/DesignerEnvManager.java +++ b/designer-base/src/main/java/com/fr/design/DesignerEnvManager.java @@ -263,6 +263,7 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter { Thread.sleep(5000); } catch (InterruptedException e) { FineLoggerFactory.getLogger().error("Map Save Error"); + Thread.currentThread().interrupt(); } } } @@ -658,9 +659,6 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter { */ public void saveXMLFile() { File xmlFile = this.getDesignerEnvFile(); - if (xmlFile == null) { - return; - } if (!xmlFile.getParentFile().exists()) {//建立目录. StableUtils.mkdirs(xmlFile.getParentFile()); } diff --git a/designer-base/src/main/java/com/fr/design/layout/TableLayout.java b/designer-base/src/main/java/com/fr/design/layout/TableLayout.java index 77696e553..b812263c6 100644 --- a/designer-base/src/main/java/com/fr/design/layout/TableLayout.java +++ b/designer-base/src/main/java/com/fr/design/layout/TableLayout.java @@ -1218,7 +1218,7 @@ public class TableLayout implements LayoutManager2, Serializable { * @param z indicates row or column * @param availableSize amount of space available in the container */ - + @SuppressWarnings("squid:S3518") protected void assignFillSize(int z, int availableSize) { // Skip if there is no more space to allocate if (availableSize <= 0) @@ -1290,7 +1290,7 @@ public class TableLayout implements LayoutManager2, Serializable { * @return the amount of space available after absolute crs have been assigned * sizes */ - + @SuppressWarnings("squid:S3518") protected int assignPrefMinSize (int z, int availableSize, double typeOfSize) { // Get variables referring to columns or rows (crs) @@ -1727,7 +1727,7 @@ public class TableLayout implements LayoutManager2, Serializable { * * @return a dimension indicating the container's preferred or minimum size */ - + @SuppressWarnings("squid:S3518") protected int calculateLayoutSize (Container container, int z, double typeOfSize, Entry entryList[], Dimension prefMinSize[]) { From d142338abffcc1e63221e5819032b97b9525ca75 Mon Sep 17 00:00:00 2001 From: zack Date: Sun, 25 Aug 2019 21:37:10 +0800 Subject: [PATCH 075/217] =?UTF-8?q?REPORT-20318=20sonar=E9=97=AE=E9=A2=98?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/extra/WebViewDlgHelper.java | 9 +++++---- .../java/com/fr/design/formula/JavaEditorPane.java | 1 + .../fr/design/formula/VariableResolverAdapter.java | 14 ++++++++++---- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/extra/WebViewDlgHelper.java b/designer-base/src/main/java/com/fr/design/extra/WebViewDlgHelper.java index fef7c5159..c6287bacf 100644 --- a/designer-base/src/main/java/com/fr/design/extra/WebViewDlgHelper.java +++ b/designer-base/src/main/java/com/fr/design/extra/WebViewDlgHelper.java @@ -5,17 +5,15 @@ import com.fr.design.dialog.BasicPane; import com.fr.design.dialog.UIDialog; import com.fr.design.gui.frpane.UITabbedPane; import com.fr.design.mainframe.DesignerContext; +import com.fr.general.CloudCenter; import com.fr.general.CommonIOUtils; import com.fr.general.ComparatorUtils; import com.fr.general.GeneralContext; import com.fr.general.IOUtils; - -import com.fr.general.CloudCenter; import com.fr.general.http.HttpClient; import com.fr.json.JSONObject; import com.fr.log.FineLoggerFactory; import com.fr.plugin.PluginStoreConstants; -import com.fr.plugin.PluginVerifyException; import com.fr.stable.CommonUtils; import com.fr.stable.EnvChangedListener; import com.fr.stable.ProductConstants; @@ -280,7 +278,10 @@ public class WebViewDlgHelper { PluginStoreConstants.refreshProps(); // 下载完刷新一下版本号等 JOptionPane.showMessageDialog(null, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Shop_Installed"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Tool_Tips"), JOptionPane.INFORMATION_MESSAGE); } - } catch (InterruptedException | ExecutionException e) { + } catch (InterruptedException e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + Thread.currentThread().interrupt(); + } catch (ExecutionException e) { FineLoggerFactory.getLogger().error(e.getMessage(), e); } diff --git a/designer-base/src/main/java/com/fr/design/formula/JavaEditorPane.java b/designer-base/src/main/java/com/fr/design/formula/JavaEditorPane.java index 597ddbfd6..a3bdbae21 100644 --- a/designer-base/src/main/java/com/fr/design/formula/JavaEditorPane.java +++ b/designer-base/src/main/java/com/fr/design/formula/JavaEditorPane.java @@ -194,6 +194,7 @@ public class JavaEditorPane extends BasicPane { JOptionPane.showMessageDialog(null, message); } catch (InterruptedException e1) { FineLoggerFactory.getLogger().error(e1.getMessage(), e1); + Thread.currentThread().interrupt(); } catch (ExecutionException e1) { FineLoggerFactory.getLogger().error(e1.getMessage(), e1); } diff --git a/designer-base/src/main/java/com/fr/design/formula/VariableResolverAdapter.java b/designer-base/src/main/java/com/fr/design/formula/VariableResolverAdapter.java index e03fa0e18..5fd384be8 100644 --- a/designer-base/src/main/java/com/fr/design/formula/VariableResolverAdapter.java +++ b/designer-base/src/main/java/com/fr/design/formula/VariableResolverAdapter.java @@ -23,6 +23,7 @@ public abstract class VariableResolverAdapter implements VariableResolver { * * @return 内置参数 */ + @Override public String[] resolveCurReportVariables() { String[] variables = new String[]{ ScriptConstants.SUMMARY_TAG + "page_number", @@ -38,10 +39,10 @@ public abstract class VariableResolverAdapter implements VariableResolver { CalculatorProvider.SERVER_PORT, CalculatorProvider.SERVER_URL, CalculatorProvider.CONTEXT_PATH, CalculatorProvider.SESSION_ID }; Set set = ExtraClassManager.getInstance().getArray(BuiltInParametersProvider.XML_TAG); - for (BuiltInParametersProvider provider : set) { - return (String[]) ArrayUtils.addAll(variables, new String[]{ - ScriptConstants.DETAIL_TAG + provider.getParametersName() - }); + for (BuiltInParametersProvider provider : set) { + ArrayUtils.addAll(variables, new String[]{ + ScriptConstants.DETAIL_TAG + provider.getParametersName() + }); } return variables; } @@ -65,6 +66,8 @@ public abstract class VariableResolverAdapter implements VariableResolver { * * @return 所有参数 */ + @Override + @SuppressWarnings("squid:S2259") public String[] resolveTableDataParameterVariables() { Parameter[] parameters = getCurrentModeParameters(TABLE_DATA_PARA); String[] parameterNames = new String[parameters.length]; @@ -79,6 +82,8 @@ public abstract class VariableResolverAdapter implements VariableResolver { * * @return 所有参数 */ + @Override + @SuppressWarnings("squid:S2259") public String[] resolveReportParameterVariables() { Parameter[] parameters = getCurrentModeParameters(REPORT_DATA_PARA); String[] parameterNames = new String[parameters.length]; @@ -93,6 +98,7 @@ public abstract class VariableResolverAdapter implements VariableResolver { * * @return 所有参数 */ + @Override public String[] resolveGlobalParameterVariables() { // 加上全局的参数 Parameter[] globalParameters = ParameterConfig.getInstance().getGlobalParameters(); From 99f8e654c0319d3969d877f13d84c46894b7a3d9 Mon Sep 17 00:00:00 2001 From: Maksim Date: Mon, 26 Aug 2019 09:46:49 +0800 Subject: [PATCH 076/217] =?UTF-8?q?REPORT-20323=20sonar=E9=97=AE=E9=A2=98?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/fr/design/gui/imenu/UIBasicMenuItemUI.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/designer-base/src/main/java/com/fr/design/gui/imenu/UIBasicMenuItemUI.java b/designer-base/src/main/java/com/fr/design/gui/imenu/UIBasicMenuItemUI.java index 1c07c8260..844120c51 100644 --- a/designer-base/src/main/java/com/fr/design/gui/imenu/UIBasicMenuItemUI.java +++ b/designer-base/src/main/java/com/fr/design/gui/imenu/UIBasicMenuItemUI.java @@ -7,6 +7,7 @@ package com.fr.design.gui.imenu; import com.fr.design.utils.ColorRoutines; import com.fr.design.utils.ThemeUtils; import com.fr.general.ComparatorUtils; +import com.fr.stable.StringUtils; import javax.swing.AbstractAction; import javax.swing.ActionMap; @@ -579,7 +580,8 @@ public class UIBasicMenuItemUI extends MenuItemUI { */ private boolean isInternalFrameSystemMenu() { String actionCommand = menuItem.getActionCommand(); - return (actionCommand.equals("Close")) || (actionCommand.equals("Minimize")) || (actionCommand.equals("Restore")) || (actionCommand.equals("Maximize")); + return (StringUtils.equals(actionCommand,"Close") || StringUtils.equals(actionCommand,"Minimize") + || StringUtils.equals(actionCommand,"Restore") || StringUtils.equals(actionCommand,"Maximize")); } ////////////////////////////////////////////////////////// From ac92a719bd60aa21b64b5d67ddde76ca20629ffc Mon Sep 17 00:00:00 2001 From: "Hugh.C" Date: Mon, 26 Aug 2019 10:47:54 +0800 Subject: [PATCH 077/217] =?UTF-8?q?REPORT-19008=20=E6=B0=B4=E5=8D=B0?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=AF=86=E5=BA=A6=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/report/WatermarkPane.java | 74 +++++++++++++++++-- 1 file changed, 66 insertions(+), 8 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/report/WatermarkPane.java b/designer-base/src/main/java/com/fr/design/report/WatermarkPane.java index 0caa7e8b6..ef396c4cb 100644 --- a/designer-base/src/main/java/com/fr/design/report/WatermarkPane.java +++ b/designer-base/src/main/java/com/fr/design/report/WatermarkPane.java @@ -6,6 +6,7 @@ import com.fr.design.formula.TinyFormulaPane; import com.fr.design.gui.icombobox.UIComboBox; import com.fr.design.gui.icontainer.UIScrollPane; import com.fr.design.gui.ilable.UILabel; +import com.fr.design.gui.ispinner.UISpinner; import com.fr.design.gui.style.FRFontPane; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.layout.TableLayout; @@ -13,15 +14,14 @@ import com.fr.design.layout.TableLayoutHelper; import com.fr.design.style.color.NewColorSelectPane; import com.fr.design.utils.gui.GUICoreUtils; -import javax.swing.BorderFactory; -import javax.swing.JComponent; -import javax.swing.JPanel; +import javax.swing.*; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; -import java.awt.BorderLayout; -import java.awt.Color; +import java.awt.*; +import java.awt.event.FocusEvent; +import java.awt.event.FocusListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; @@ -37,9 +37,15 @@ public class WatermarkPane extends BasicPane { private TinyFormulaPane formulaPane; // 字号 private UIComboBox fontSizeComboBox; + //横向间距 + private UISpinner horizontalGapSpinner; + //横向间距 + private UISpinner verticalGapSpinner; // 文字颜色 private NewColorSelectPane colorPane; + private static final Dimension SPINNER_DIMENSION = new Dimension(75, 20); + public WatermarkPane() { initComponents(); } @@ -73,6 +79,7 @@ public class WatermarkPane extends BasicPane { } populateFourmula(watermark.getText()); populateFontSize(watermark.getFontSize()); + populateWatermarkGap(watermark); populateColor(watermark.getColor()); paintPreviewPane(); } @@ -81,6 +88,8 @@ public class WatermarkPane extends BasicPane { WatermarkAttr watermark = new WatermarkAttr(); watermark.setText(formulaPane.getUITextField().getText()); watermark.setFontSize((int)fontSizeComboBox.getSelectedItem()); + watermark.setHorizontalGap((int) horizontalGapSpinner.getValue()); + watermark.setVerticalGap((int) verticalGapSpinner.getValue()); watermark.setColor(colorPane.getColor()); colorPane.updateUsedColor(); return watermark; @@ -98,20 +107,39 @@ public class WatermarkPane extends BasicPane { formulaPane = new TinyFormulaPane(); fontSizeComboBox = new UIComboBox(FRFontPane.FONT_SIZES); fontSizeComboBox.setEditable(true); + horizontalGapSpinner = new UISpinner(0, Integer.MAX_VALUE, 1, 200); + verticalGapSpinner = new UISpinner(0, Integer.MAX_VALUE, 1, 100); + horizontalGapSpinner.setPreferredSize(SPINNER_DIMENSION); + verticalGapSpinner.setPreferredSize(SPINNER_DIMENSION); JPanel fontSizeTypePane = new JPanel(new BorderLayout(10,0)); fontSizeTypePane.add(fontSizeComboBox, BorderLayout.CENTER); + //水印间距面板 + JPanel watermarkGapPane = new JPanel(new BorderLayout(10, 0)); + JPanel jp = FRGUIPaneFactory.createNColumnGridInnerContainer_Pane(2, 10, 0); + jp.add(horizontalGapSpinner); + jp.add(verticalGapSpinner); + watermarkGapPane.add(jp, BorderLayout.CENTER); + + JPanel watermarkGapTipsPane = new JPanel(new BorderLayout()); + JPanel tipsJp = FRGUIPaneFactory.createNColumnGridInnerContainer_Pane(2, 10, 0); + tipsJp.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Direction_Horizontal"), SwingConstants.CENTER)); + tipsJp.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Direction_Vertical"), SwingConstants.CENTER)); + watermarkGapTipsPane.add(tipsJp, BorderLayout.CENTER); + colorPane = new NewColorSelectPane(); JPanel colorLabelPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); colorLabelPane.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Text_Color")), BorderLayout.NORTH); double p = TableLayout.PREFERRED; - double[] rowSize = {p,p,p}; - double[] columnSize = { p, MAX_WIDTH}; + double[] rowSize = {p, p, p, p, p}; + double[] columnSize = {p, MAX_WIDTH}; - JPanel rightContentPane = TableLayoutHelper.createCommonTableLayoutPane( new JComponent[][]{ + JPanel rightContentPane = TableLayoutHelper.createCommonTableLayoutPane(new JComponent[][]{ {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Watermark_Text")), formulaPane}, {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Font_Size")), fontSizeTypePane}, + {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Watermark_Gap")),watermarkGapPane }, + {null,watermarkGapTipsPane }, {colorLabelPane, colorPane}, }, rowSize, columnSize, 10); rightContentPane.setBorder(BorderFactory.createEmptyBorder(15, 12, 10, 12)); @@ -131,6 +159,36 @@ public class WatermarkPane extends BasicPane { }); } + protected void populateWatermarkGap(WatermarkAttr watermark){ + this.horizontalGapSpinner.setValue(watermark.getHorizontalGap()); + this.horizontalGapSpinner.addUISpinnerFocusListenner(new FocusListener() { + + @Override + public void focusGained(FocusEvent e) { + paintPreviewPane(); + } + + @Override + public void focusLost(FocusEvent e) { + paintPreviewPane(); + } + }); + + this.verticalGapSpinner.setValue(watermark.getVerticalGap()); + this.verticalGapSpinner.addUISpinnerFocusListenner(new FocusListener() { + + @Override + public void focusGained(FocusEvent e) { + paintPreviewPane(); + } + + @Override + public void focusLost(FocusEvent e) { + paintPreviewPane(); + } + }); + } + protected void paintPreviewPane(){ watermarkPreviewPane.repaint(update()); } From 0d025f1e689829d4687b88de720459407197f585 Mon Sep 17 00:00:00 2001 From: "Hugh.C" Date: Mon, 26 Aug 2019 10:55:19 +0800 Subject: [PATCH 078/217] =?UTF-8?q?REPORT-19008=20=E6=B0=B4=E5=8D=B0?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=AF=86=E5=BA=A6=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/fr/design/report/WatermarkPane.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/report/WatermarkPane.java b/designer-base/src/main/java/com/fr/design/report/WatermarkPane.java index ef396c4cb..e190d4038 100644 --- a/designer-base/src/main/java/com/fr/design/report/WatermarkPane.java +++ b/designer-base/src/main/java/com/fr/design/report/WatermarkPane.java @@ -14,12 +14,17 @@ import com.fr.design.layout.TableLayoutHelper; import com.fr.design.style.color.NewColorSelectPane; import com.fr.design.utils.gui.GUICoreUtils; -import javax.swing.*; +import javax.swing.BorderFactory; +import javax.swing.SwingConstants; +import javax.swing.JComponent; +import javax.swing.JPanel; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; -import java.awt.*; +import java.awt.Dimension; +import java.awt.BorderLayout; +import java.awt.Color; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import java.awt.event.ItemEvent; From 518cd187764bd83d2b9786dc57ca172b0197c452 Mon Sep 17 00:00:00 2001 From: vito Date: Mon, 26 Aug 2019 11:54:42 +0800 Subject: [PATCH 079/217] =?UTF-8?q?REPORT-20320=20sonar=E9=97=AE=E9=A2=98?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../design/data/BasicTableDataTreePane.java | 8 +- .../data/datapane/TableDataSourceOP.java | 66 +++--- .../tabledatapane/FileTableDataPane.java | 201 ++++++++++-------- .../com/fr/design/extra/LoginWebBridge.java | 48 +---- .../fr/design/extra/PluginControlPane.java | 2 + .../fr/design/extra/PluginFromStorePane.java | 16 +- 6 files changed, 168 insertions(+), 173 deletions(-) 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 a18ae856e..313ca0e2f 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 @@ -46,6 +46,7 @@ import java.awt.event.KeyEvent; import java.util.EventObject; import java.util.HashMap; import java.util.Map; +import java.util.Objects; /** * Coder: zack @@ -70,6 +71,7 @@ public abstract class BasicTableDataTreePane extends DockingView implements Resp * * @return 返回位置 */ + @Override public Location preferredLocation() { return Location.WEST_ABOVE; } @@ -97,6 +99,7 @@ public abstract class BasicTableDataTreePane extends DockingView implements Resp /** * 响应数据集改变 */ + @Override public void fireDSChanged() { fireDSChanged(new HashMap()); } @@ -107,6 +110,7 @@ public abstract class BasicTableDataTreePane extends DockingView implements Resp * * @param map 数据集变化Map */ + @Override public void fireDSChanged(Map map) { DesignTableDataManager.fireDSChanged(map); } @@ -151,6 +155,7 @@ public abstract class BasicTableDataTreePane extends DockingView implements Resp public abstract TableDataTree getDataTree(); + @Override public abstract void refreshDockingView(); protected void checkButtonEnabled(UpdateAction editAction, UpdateAction previewTableDataAction, UpdateAction removeAction, TableDataSourceOP op, TableDataTree dataTree) { @@ -320,6 +325,7 @@ public abstract class BasicTableDataTreePane extends DockingView implements Resp this.setSmallIcon(this.getTDIcon()); } + @Override public void actionPerformed(ActionEvent e) { dgEdit(getTableDataInstance().creatTableDataPane(), createDsName(getNamePrefix()), false); } @@ -400,7 +406,7 @@ public abstract class BasicTableDataTreePane extends DockingView implements Resp data = selectedNO.getObject(); } try { - if (((TableDataWrapper) data).getTableData() instanceof StoreProcedure) { + if (((TableDataWrapper) Objects.requireNonNull(data)).getTableData() instanceof StoreProcedure) { ((StoreProcedure) (((TableDataWrapper) data).getTableData())).resetDataModelList(); if (data instanceof StoreProcedureDataWrapper) { StoreProcedureDataWrapper oldSdw = ((StoreProcedureDataWrapper) data); diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataSourceOP.java b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataSourceOP.java index 9c1901390..33e51100e 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataSourceOP.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataSourceOP.java @@ -56,14 +56,18 @@ public class TableDataSourceOP implements UserObjectOP { return DesignTableDataManager.getEditingDataSet(tc.getBook()); } List> empty = new ArrayList>(); - empty.add(Collections.emptyMap());//数据集 - empty.add(Collections.emptyMap());//服务器数据集 - empty.add(Collections.emptyMap());//存储过程 + //数据集 + empty.add(Collections.emptyMap()); + //服务器数据集 + empty.add(Collections.emptyMap()); + //存储过程 + empty.add(Collections.emptyMap()); return empty; } /** * ButtonEnabled intercept + * * @return interceptbuttonEnabled */ @Override @@ -73,8 +77,10 @@ public class TableDataSourceOP implements UserObjectOP { /** * 移除名字是name的TableData + * * @param name tabledata name */ + @Override public void removeAction(String name) { if (tc != null) { TableDataSource tds = tc.getBook(); @@ -85,7 +91,7 @@ public class TableDataSourceOP implements UserObjectOP { } protected ExpandMutableTreeNode[] getNodeArrayFromMap(Map map) { - List dataList = new ArrayList(); + List dataList = new ArrayList<>(); Iterator> entryIt = map.entrySet().iterator(); while (entryIt.hasNext()) { Entry entry = entryIt.next(); @@ -96,7 +102,7 @@ public class TableDataSourceOP implements UserObjectOP { dataList.add(newChildTreeNode); newChildTreeNode.add(new ExpandMutableTreeNode()); } - return dataList.toArray(new ExpandMutableTreeNode[dataList.size()]); + return dataList.toArray(new ExpandMutableTreeNode[0]); } private ExpandMutableTreeNode initTemplateDataNode(Map templateDataMap) { @@ -124,22 +130,20 @@ public class TableDataSourceOP implements UserObjectOP { */ @Override public ExpandMutableTreeNode[] load() { - Map templateDataMap = null; - Map serverDataMap = null; - Map storeProcedureMap = null; - - if (this != null) { - templateDataMap = this.init().get(0); - serverDataMap = this.init().get(1); - storeProcedureMap = this.init().get(2); - } else { - templateDataMap = Collections.emptyMap(); - serverDataMap = Collections.emptyMap(); - storeProcedureMap = Collections.emptyMap(); - } - List list = new ArrayList(); //所有的数据集 - List templist = new ArrayList(); //模板数据集 - List serverlist = new ArrayList(); //服务器数据集 + Map templateDataMap; + Map serverDataMap; + Map storeProcedureMap; + + templateDataMap = this.init().get(0); + serverDataMap = this.init().get(1); + storeProcedureMap = this.init().get(2); + + //所有的数据集 + List list = new ArrayList<>(); + //模板数据集 + List templist = new ArrayList<>(); + //服务器数据集 + List serverlist = new ArrayList<>(); list.add(initTemplateDataNode(templateDataMap)); addNodeToList(templateDataMap, templist); @@ -160,11 +164,11 @@ public class TableDataSourceOP implements UserObjectOP { } switch (dataMode) { case TEMPLATE_TABLE_DATA: - return templist.toArray(new ExpandMutableTreeNode[templist.size()]); + return templist.toArray(new ExpandMutableTreeNode[0]); case SERVER_TABLE_DATA: - return serverlist.toArray(new ExpandMutableTreeNode[serverlist.size()]); + return serverlist.toArray(new ExpandMutableTreeNode[0]); default: - return list.toArray(new ExpandMutableTreeNode[list.size()]); + return list.toArray(new ExpandMutableTreeNode[0]); } } @@ -182,7 +186,7 @@ public class TableDataSourceOP implements UserObjectOP { } protected void setStoreProcedureTree(TableData tableData, ExpandMutableTreeNode tmpNode) { - ArrayList nodeName = new ArrayList(); + ArrayList nodeName = new ArrayList<>(); StoreProcedure storeProcedure = (StoreProcedure) tableData; String name = ((NameObject) tmpNode.getUserObject()).getName(); StoreProcedureParameter[] parameters = StoreProcedure.getSortPara(storeProcedure.getParameters()); @@ -208,13 +212,13 @@ public class TableDataSourceOP implements UserObjectOP { } if (!resultNames.isEmpty()) { - for (int i = 0; i < resultNames.size(); i++) { - if (!nodeName.contains(resultNames.get(i))) { - nodeName.add(resultNames.get(i)); + for (String resultName : resultNames) { + if (!nodeName.contains(resultName)) { + nodeName.add(resultName); hasChild = true; - String parameterName = name + "_" + resultNames.get(i); + String parameterName = name + "_" + resultName; TableDataWrapper newTwd = new StoreProcedureDataWrapper(storeProcedure, name, parameterName, false); - ExpandMutableTreeNode newChildNode = new ExpandMutableTreeNode(new NameObject(resultNames.get(i), newTwd)); + ExpandMutableTreeNode newChildNode = new ExpandMutableTreeNode(new NameObject(resultName, newTwd)); newChildNode.add(new ExpandMutableTreeNode()); tmpNode.add(newChildNode); } @@ -230,7 +234,7 @@ public class TableDataSourceOP implements UserObjectOP { public void setDataMode(int i) { - this.dataMode = i; + dataMode = i; } public int getDataMode() { diff --git a/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/FileTableDataPane.java b/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/FileTableDataPane.java index 0d8b05c40..215ba7588 100644 --- a/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/FileTableDataPane.java +++ b/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/FileTableDataPane.java @@ -76,6 +76,7 @@ import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import java.util.List; +import java.util.Objects; public class FileTableDataPane extends AbstractTableDataPane { private static final int TEXT = 0; @@ -126,12 +127,12 @@ public class FileTableDataPane extends AbstractTableDataPane { private static final int GAP = 23; - public FileTableDataPane(){ - this(SETPANELWIDTH,WIDTH,HEIGHT,GAP); + public FileTableDataPane() { + this(SETPANELWIDTH, WIDTH, HEIGHT, GAP); } - public FileTableDataPane(int setPanelWidth,int width,int height,int gap) { - this.setLayout(new BorderLayout(gap,0)); + public FileTableDataPane(int setPanelWidth, int width, int height, int gap) { + this.setLayout(new BorderLayout(gap, 0)); JPanel northPanel = new JPanel(new BorderLayout()); JPanel type = new JPanel(); type.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Utils_File_Type") + ":")); @@ -163,16 +164,16 @@ public class FileTableDataPane extends AbstractTableDataPane { southPanel.add(setPanel, BorderLayout.CENTER); setPanel.setPreferredSize(new Dimension(setPanelWidth, 460)); setPanel.setBorder(BorderFactory.createTitledBorder(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Set"))); - JPanel controlPane = textSetPanel(width,height); + JPanel controlPane = textSetPanel(width, height); setPanel.add(controlPane, BorderLayout.NORTH); - fileTypeComboBox.addActionListener(getFileTypeListener(setPanel,width,height)); + fileTypeComboBox.addActionListener(getFileTypeListener(setPanel, width, height)); this.add(northPanel, BorderLayout.NORTH); this.add(centerPanel, BorderLayout.CENTER); this.add(southPanel, BorderLayout.EAST); } - private void addToCenterPanel(JPanel centerPanel){ + private void addToCenterPanel(JPanel centerPanel) { localFileRadioButton = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Local_File") + ":", true); urlFileRadioButton = new UIRadioButton("URL:", false); ButtonGroup bg = new ButtonGroup(); @@ -217,8 +218,9 @@ public class FileTableDataPane extends AbstractTableDataPane { } private ActionListener testConnectionListener = new ActionListener() { + @Override public void actionPerformed(ActionEvent arg0) { - String uri = ParameterHelper.analyze4Templatee( urlText.getText(), params); + String uri = ParameterHelper.analyze4Templatee(urlText.getText(), params); if (!checkURL(uri)) { JOptionPane.showMessageDialog(SwingUtilities.getWindowAncestor(FileTableDataPane.this), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Add_JS_warning")); return; @@ -245,10 +247,11 @@ public class FileTableDataPane extends AbstractTableDataPane { } }; - private void previewPanel(JPanel jPanel){ + private void previewPanel(JPanel jPanel) { JPanel previewPanel = new JPanel(new BorderLayout()); UIButton preview = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Preview")); preview.addActionListener(new ActionListener() { + @Override public void actionPerformed(ActionEvent e) { preview(); } @@ -257,48 +260,47 @@ public class FileTableDataPane extends AbstractTableDataPane { jPanel.add(previewPanel, BorderLayout.SOUTH); } - private JPanel xmlSetPanel(int width,int height) { + private JPanel xmlSetPanel(int width, int height) { // xml设置pane JPanel controlPane = new JPanel(); - JPanel northPane = new JPanel(new BorderLayout(8,8)); - JPanel northTopPane = new JPanel(new BorderLayout(8,8)); - JPanel southPane = new JPanel(new BorderLayout(8,8)); - JPanel southTopPane = new JPanel(new BorderLayout(8,8)); - JPanel westPane = new JPanel(new BorderLayout()); - controlPane.setLayout(new BorderLayout(8,8)); + JPanel northPane = new JPanel(new BorderLayout(8, 8)); + JPanel northTopPane = new JPanel(new BorderLayout(8, 8)); + JPanel southPane = new JPanel(new BorderLayout(8, 8)); + JPanel southTopPane = new JPanel(new BorderLayout(8, 8)); + controlPane.setLayout(new BorderLayout(8, 8)); controlPane.setPreferredSize(new Dimension(width, height)); - JPanel comboboxPanel = new JPanel(new BorderLayout(8,8)); + JPanel comboboxPanel = new JPanel(new BorderLayout(8, 8)); encodeLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Encoding_Type") + ":"); encodingComboBox = new UIComboBox(EncodeConstants.ALL_ENCODING_ARRAY); encodingComboBox.setSelectedIndex(4); encodingComboBox.setPreferredSize(new Dimension(90, 20)); JPanel treeContainerPane = new JPanel(); - treeContainerPane.setLayout(new BorderLayout(8,8)); + treeContainerPane.setLayout(new BorderLayout(8, 8)); nodeTreePane = new XMLNodeTreePane(); - treeContainerPane.add(nodeTreePane,BorderLayout.CENTER); + treeContainerPane.add(nodeTreePane, BorderLayout.CENTER); comboboxPanel.add(encodeLabel, BorderLayout.WEST); comboboxPanel.add(encodingComboBox, BorderLayout.CENTER); - northPane.add(comboboxPanel,BorderLayout.EAST); - northTopPane.add(northPane,BorderLayout.WEST); - southTopPane.add(southPane,BorderLayout.WEST); - southTopPane.add(treeContainerPane,BorderLayout.CENTER); + northPane.add(comboboxPanel, BorderLayout.EAST); + northTopPane.add(northPane, BorderLayout.WEST); + southTopPane.add(southPane, BorderLayout.WEST); + southTopPane.add(treeContainerPane, BorderLayout.CENTER); controlPane.add(northTopPane, BorderLayout.NORTH); - controlPane.add(southTopPane,BorderLayout.CENTER); + controlPane.add(southTopPane, BorderLayout.CENTER); previewPanel(controlPane); return controlPane; } - private JPanel excelSetPanel(int width,int height) { + private JPanel excelSetPanel(int width, int height) { // excel设置pane int checkBoxWidth = width - EIGHT; JPanel controlPane = new JPanel(); - JPanel northPane = new JPanel(new BorderLayout(8,8)); + JPanel northPane = new JPanel(new BorderLayout(8, 8)); controlPane.setLayout(new BorderLayout()); - controlPane.setPreferredSize(new Dimension(width,height)); + controlPane.setPreferredSize(new Dimension(width, height)); needColumnNameCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_FirstRow_IS_Column_Name"), false); needColumnNameCheckBox.setPreferredSize(new Dimension(checkBoxWidth, 20)); northPane.add(needColumnNameCheckBox, BorderLayout.EAST); @@ -321,6 +323,7 @@ public class FileTableDataPane extends AbstractTableDataPane { * * @throws Exception */ + @Override public void checkValid() throws Exception { if (urlFileRadioButton.isSelected()) { String url = urlText.getText().trim(); @@ -331,33 +334,33 @@ public class FileTableDataPane extends AbstractTableDataPane { } - private boolean checkURL(String uri){ + private boolean checkURL(String uri) { try { new URL(uri); return true; } catch (MalformedURLException e) { return false; } - // return (uri.matches("https*://.+|\\$\\{.+\\}.*")); + // return (uri.matches("https*://.+|\\$\\{.+\\}.*")); } - private JPanel textSetPanel(int width,int height) { + private JPanel textSetPanel(int width, int height) { // text设置pane JPanel controlPane = new JPanel(); controlPane.setLayout(new BorderLayout()); - controlPane.setPreferredSize(new Dimension(width,height)); - JPanel northPane = new JPanel(new BorderLayout(8,8)); + controlPane.setPreferredSize(new Dimension(width, height)); + JPanel northPane = new JPanel(new BorderLayout(8, 8)); addToNorthPane(northPane); - controlPane.add(northPane,BorderLayout.WEST); + controlPane.add(northPane, BorderLayout.WEST); previewPanel(controlPane); return controlPane; } - private void addToNorthPane(JPanel northPane){ + private void addToNorthPane(JPanel northPane) { double f = TableLayout.FILL; double p = TableLayout.PREFERRED; - double columnSize[] = {f, p, p}; - double rowSize[] = {B, B, B, B, B, B, B}; + double[] columnSize = {f, p, p}; + double[] rowSize = {B, B, B, B, B, B, B}; needColumnNameCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_FirstRow_IS_Column_Name"), true); dismenberLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Dismenber") + ":"); tableDismemberRadioButton = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Table_Dismember"), false); @@ -390,18 +393,19 @@ public class FileTableDataPane extends AbstractTableDataPane { encodeLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Encoding_Type") + ":"); charsetComboBox = new UIComboBox(EncodeConstants.ALL_ENCODING_ARRAY); Component[][] comps = { - {encodeLabel,charsetComboBox,null}, - {needColumnNameCheckBox,null,null}, - {dismenberLabel,tableDismemberRadioButton,null}, - {null,spaceDismenberRadioButton,null}, - {null,commaDismenberRadioButton,null}, - {null,otherDismenberRadioButton,otherDismenberTextField}, - {ignoreOneMoreDelimiterCheckBox,null,null} + {encodeLabel, charsetComboBox, null}, + {needColumnNameCheckBox, null, null}, + {dismenberLabel, tableDismemberRadioButton, null}, + {null, spaceDismenberRadioButton, null}, + {null, commaDismenberRadioButton, null}, + {null, otherDismenberRadioButton, otherDismenberTextField}, + {ignoreOneMoreDelimiterCheckBox, null, null} }; - northPane.add(TableLayoutHelper.createTableLayoutPane(comps, rowSize, columnSize),BorderLayout.EAST); + northPane.add(TableLayoutHelper.createTableLayoutPane(comps, rowSize, columnSize), BorderLayout.EAST); } private ActionListener radioActionListener = new ActionListener() { + @Override public void actionPerformed(ActionEvent e) { if (localFileRadioButton.isSelected()) { localRadioSelectAction(); @@ -456,8 +460,8 @@ public class FileTableDataPane extends AbstractTableDataPane { private String[] getFileSuffix() { List suffixList = new ArrayList(); - String suffix = fileTypeComboBox.getSelectedItem().toString().toLowerCase(); - if (suffix.equalsIgnoreCase("excel")) { + String suffix = Objects.requireNonNull(fileTypeComboBox.getSelectedItem()).toString().toLowerCase(); + if ("excel".equalsIgnoreCase(suffix)) { suffixList.add("xls"); suffixList.add("xlsx"); } else { @@ -467,8 +471,8 @@ public class FileTableDataPane extends AbstractTableDataPane { } private String getFileSuffixToString() { - String suffixToString = fileTypeComboBox.getSelectedItem().toString().toLowerCase(); - if (suffixToString.equalsIgnoreCase("excel")) { + String suffixToString = Objects.requireNonNull(fileTypeComboBox.getSelectedItem()).toString().toLowerCase(); + if ("excel".equalsIgnoreCase(suffixToString)) { suffixToString = "xls"; } return suffixToString; @@ -476,16 +480,17 @@ public class FileTableDataPane extends AbstractTableDataPane { private ActionListener getFileTypeListener(final JPanel setPanel, final int width, final int height) { ActionListener fileTypeListener = new ActionListener() { + @Override public void actionPerformed(ActionEvent e) { setPanel.removeAll(); localText.setText(""); urlText.setText(""); if (fileTypeComboBox.getSelectedIndex() == XML) { - setPanel.add(xmlSetPanel(width,height), BorderLayout.NORTH); + setPanel.add(xmlSetPanel(width, height), BorderLayout.NORTH); } else if (fileTypeComboBox.getSelectedIndex() == EXCEL) { - setPanel.add(excelSetPanel(width,height), BorderLayout.NORTH); + setPanel.add(excelSetPanel(width, height), BorderLayout.NORTH); } else { - setPanel.add(textSetPanel(width,height), BorderLayout.NORTH); + setPanel.add(textSetPanel(width, height), BorderLayout.NORTH); } String tipContent = com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Type_Parameter") + "reportlets/excel/FineReport${abc}." + getFileSuffixToString() + "
" + "http://192.168.100.120:8080/XXServer/Report/excel${abc}.jsp
" + "  "; @@ -503,6 +508,7 @@ public class FileTableDataPane extends AbstractTableDataPane { this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/control/refresh.png")); } + @Override public void actionPerformed(ActionEvent e) { String[] paramTexts = new String[1]; paramTexts[0] = getFilePathFromUrlOrLocal(); @@ -545,25 +551,25 @@ public class FileTableDataPane extends AbstractTableDataPane { setTextField(xtd); editorPane.populate(xtd.getParams()); encodingComboBox.setSelectedItem(xtd.getCharSet()); - if (!ComparatorUtils.equals(xtd,new XMLTableData())) { + if (!ComparatorUtils.equals(xtd, new XMLTableData())) { xmlNodeTree.initData(); String[] path = xtd.getXPath(); String[] paths; if (path != null && path.length > 0) { - DefaultTreeModel treeModel = (DefaultTreeModel)xmlNodeTree.getModel(); + DefaultTreeModel treeModel = (DefaultTreeModel) xmlNodeTree.getModel(); ExpandMutableTreeNode root = (ExpandMutableTreeNode) treeModel.getRoot(); if (treeModel != null) { - if(!ComparatorUtils.equals(treeModel.getRoot().toString(),"")){ - paths = new String[path.length - 1]; - for(int i = 1;i< path.length;i++){ - paths[i -1] = path[i]; - } - }else{ + if (!ComparatorUtils.equals(treeModel.getRoot().toString(), "")) { + paths = new String[path.length - 1]; + for (int i = 1; i < path.length; i++) { + paths[i - 1] = path[i]; + } + } else { paths = path; root.setUserObject(ROOTTAG); } if (treeModel.getRoot() instanceof ExpandMutableTreeNode) { - selectNode((ExpandMutableTreeNode)treeModel.getRoot(), 0, paths); + selectNode((ExpandMutableTreeNode) treeModel.getRoot(), 0, paths); if (selectedNode != null) { TreePath treepath = new TreePath(treeModel.getPathToRoot(selectedNode)); xmlNodeTree.setSelectionPath(treepath); @@ -571,8 +577,8 @@ public class FileTableDataPane extends AbstractTableDataPane { } } //防止某种操作导致添加的tag作为root出现。 - if(ComparatorUtils.equals(root.toString(),ROOTTAG)){ - root.setUserObject(StringUtils.EMPTY); + if (ComparatorUtils.equals(root.toString(), ROOTTAG)) { + root.setUserObject(StringUtils.EMPTY); } } } @@ -638,7 +644,7 @@ public class FileTableDataPane extends AbstractTableDataPane { ttd.setDelimiter(this.showDelimiter()); ttd.setIgnoreOneMoreDelimiter(ignoreOneMoreDelimiterCheckBox.isSelected()); ttd.setNeedColumnName(needColumnNameCheckBox.isSelected()); - ttd.setCharset((String)charsetComboBox.getSelectedItem()); + ttd.setCharset((String) charsetComboBox.getSelectedItem()); fileTableData = ttd; return ttd; } @@ -667,12 +673,12 @@ public class FileTableDataPane extends AbstractTableDataPane { xmlColumnsList.clear(); ExpandMutableTreeNode treeNode; boolean flag = true; - for(int i = 0;i < selectedNode.getChildCount();i++){ + for (int i = 0; i < selectedNode.getChildCount(); i++) { treeNode = (ExpandMutableTreeNode) selectedNode.getChildAt(i); - if(treeNode.isLeaf()){ + if (treeNode.isLeaf()) { xmlColumnsList.add(treeNode.toString()); - }else{ - if(flag){ + } else { + if (flag) { flag = false; finalSelectedNode = treeNode; leafNode(treeNode); @@ -692,34 +698,34 @@ public class FileTableDataPane extends AbstractTableDataPane { } //wikky:构建树时为了美观把添加的根节点值赋为空显示,现在还得该回去使得预览时能够顺利取到数据。 - private String[] getPaths(){ + private String[] getPaths() { TreePath treePath = GUICoreUtils.getTreePath(finalSelectedNode); String path = StringUtils.EMPTY; if (treePath != null) { Object[] paths = treePath.getPath(); for (int i = 0; i < paths.length; i++) { - path+="/" + paths[i]; + path += "/" + paths[i]; } } if (path.startsWith("/")) { path = path.substring(1); } String[] paths = path.split("/"); - if(ComparatorUtils.equals(paths[0],StringUtils.EMPTY)){ + if (ComparatorUtils.equals(paths[0], StringUtils.EMPTY)) { paths[0] = ROOTTAG; } return paths; } - private void leafNode(ExpandMutableTreeNode treeNode){ + private void leafNode(ExpandMutableTreeNode treeNode) { boolean flag = true; ExpandMutableTreeNode firstNode; - for(int i = 0;i < treeNode.getChildCount();i++){ + for (int i = 0; i < treeNode.getChildCount(); i++) { firstNode = (ExpandMutableTreeNode) treeNode.getChildAt(i); - if(firstNode.isLeaf()){ + if (firstNode.isLeaf()) { xmlColumnsList.add(firstNode.toString()); - }else{ - if(flag){ + } else { + if (flag) { flag = false; finalSelectedNode = treeNode; leafNode(firstNode); @@ -729,16 +735,16 @@ public class FileTableDataPane extends AbstractTableDataPane { } private void selectNode(ExpandMutableTreeNode node, int layer, String[] paths) { - if (selectedNode != null || node == null){ + if (selectedNode != null || node == null) { return; } - if (layer < paths.length && paths[layer] != null && ComparatorUtils.equals(paths[layer],node.getUserObject())) { - if (layer == paths.length -1) { + if (layer < paths.length && paths[layer] != null && ComparatorUtils.equals(paths[layer], node.getUserObject())) { + if (layer == paths.length - 1) { selectedNode = node; return; } for (int i = 0; i < node.getChildCount(); i++) { - selectNode((ExpandMutableTreeNode)node.getChildAt(i), layer + 1, paths); + selectNode((ExpandMutableTreeNode) node.getChildAt(i), layer + 1, paths); } } } @@ -800,8 +806,8 @@ public class FileTableDataPane extends AbstractTableDataPane { toolbarDef.addShortCut(refreshAction); UIToolbar toolBar = ToolBarDef.createJToolBar(); toolbarDef.updateToolBar(toolBar); - toolbarPanel.add(keyPointLaber,BorderLayout.WEST); - toolbarPanel.add(toolBar,BorderLayout.EAST); + toolbarPanel.add(keyPointLaber, BorderLayout.WEST); + toolbarPanel.add(toolBar, BorderLayout.EAST); this.add(toolbarPanel, BorderLayout.NORTH); } @@ -817,6 +823,7 @@ public class FileTableDataPane extends AbstractTableDataPane { this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/control/refresh.png")); } + @Override public void actionPerformed(ActionEvent e) { xmlNodeTree.waitRefresh(); xmlNodeTree.refreshData(); @@ -845,8 +852,9 @@ public class FileTableDataPane extends AbstractTableDataPane { } private MouseListener treeMouseListener = new MouseAdapter() { + @Override public void mousePressed(MouseEvent e) { - if (XMLNodeTree.this.getModel() != treeModel){ + if (XMLNodeTree.this.getModel() != treeModel) { return; } int selRow = XMLNodeTree.this.getRowForLocation(e.getX(), e.getY()); @@ -858,12 +866,12 @@ public class FileTableDataPane extends AbstractTableDataPane { return;//没有选中某个树节点,就直接返回啦 } Object selObject = selPath.getLastPathComponent(); - if (selObject instanceof ExpandMutableTreeNode ) { + if (selObject instanceof ExpandMutableTreeNode) { ExpandMutableTreeNode expandMutableTreeNode = (ExpandMutableTreeNode) selObject; if (!expandMutableTreeNode.isLeaf()) { selectedNode = expandMutableTreeNode; } else { - selectedNode = (ExpandMutableTreeNode)expandMutableTreeNode.getParent(); + selectedNode = (ExpandMutableTreeNode) expandMutableTreeNode.getParent(); } } } @@ -906,7 +914,7 @@ public class FileTableDataPane extends AbstractTableDataPane { DataSource dataSource = null; if (localFileRadioButton.isSelected()) { String localTextString = StringUtils.trimToNull(localText.getText()); - if(StringUtils.isEmpty(localTextString)){ + if (StringUtils.isEmpty(localTextString)) { FineLoggerFactory.getLogger().info("The file path is empty."); loadedTreeModel(); return; @@ -914,7 +922,7 @@ public class FileTableDataPane extends AbstractTableDataPane { dataSource = new FileDataSource(localTextString, params); } else { String urlTextString = StringUtils.trimToNull(urlText.getText()); - if (StringUtils.isEmpty(urlTextString)){ + if (StringUtils.isEmpty(urlTextString)) { FineLoggerFactory.getLogger().info("The url path is empty."); loadedTreeModel(); return; @@ -922,7 +930,7 @@ public class FileTableDataPane extends AbstractTableDataPane { dataSource = new URLDataSource(urlTextString, params); } try { - InputStream in,input; + InputStream in, input; if ((in = dataSource.getSourceStream(params)) != null) { String xmlString = Utils.inputStream2String(in, (String) encodingComboBox.getSelectedItem()); String stringXml = addTag(xmlString); @@ -941,16 +949,20 @@ public class FileTableDataPane extends AbstractTableDataPane { FineLoggerFactory.getLogger().error(e.getMessage(), e); loadedTreeModel(); } - if(treeModel.getChildCount(treeModel.getRoot()) == 1){ - treeModel = new DefaultTreeModel((ExpandMutableTreeNode) treeModel.getChild(treeModel.getRoot(),0)); - }else{ + if (treeModel == null) { + FineLoggerFactory.getLogger().info("The file is wrong or bad, can not create the XMLReader."); + return; + } + if (treeModel.getChildCount(treeModel.getRoot()) == 1) { + treeModel = new DefaultTreeModel((ExpandMutableTreeNode) treeModel.getChild(treeModel.getRoot(), 0)); + } else { ExpandMutableTreeNode root = (ExpandMutableTreeNode) treeModel.getRoot(); root.setUserObject(StringUtils.EMPTY); } this.setModel(treeModel); } - private void loadedTreeModel(){ + private void loadedTreeModel() { ExpandMutableTreeNode rootTreeNode = new ExpandMutableTreeNode(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Loaded_Tree_Model")); rootTreeNode.setExpanded(false); rootTreeNode.setAllowsChildren(false); @@ -958,14 +970,14 @@ public class FileTableDataPane extends AbstractTableDataPane { XMLNodeTree.this.setModel(loadedTreeModel); } - private String addTag(String string){ + private String addTag(String string) { String stringWithTag; int beginIndex = 0; int firstIndex = string.indexOf(">"); int endIndex = string.length(); - String firstPart = string.substring(beginIndex,firstIndex + 1); + String firstPart = string.substring(beginIndex, firstIndex + 1); String secondPart = STARTTAG; - String thirdPart = string.substring(firstIndex + 1,endIndex); + String thirdPart = string.substring(firstIndex + 1, endIndex); String lastPart = ENDTAG; stringWithTag = firstPart + secondPart + thirdPart + lastPart; return stringWithTag; @@ -986,6 +998,7 @@ public class FileTableDataPane extends AbstractTableDataPane { this.layer = layer; } + @Override public void readXML(XMLableReader reader) { String nodeName; if (this.layer < 0) { diff --git a/designer-base/src/main/java/com/fr/design/extra/LoginWebBridge.java b/designer-base/src/main/java/com/fr/design/extra/LoginWebBridge.java index 43bb8131a..50add423f 100644 --- a/designer-base/src/main/java/com/fr/design/extra/LoginWebBridge.java +++ b/designer-base/src/main/java/com/fr/design/extra/LoginWebBridge.java @@ -1,6 +1,7 @@ package com.fr.design.extra; import com.fr.base.passport.FinePassportManager; +import com.fr.concurrent.NamedThreadFactory; import com.fr.config.MarketConfig; import com.fr.design.dialog.UIDialog; import com.fr.design.extra.exe.PluginLoginExecutor; @@ -8,47 +9,30 @@ import com.fr.design.gui.ilable.UILabel; import com.fr.general.CloudCenter; import com.fr.general.http.HttpClient; import com.fr.log.FineLoggerFactory; -import com.fr.stable.EncodeConstants; import com.fr.stable.StringUtils; import javafx.concurrent.Task; import javafx.scene.web.WebEngine; import netscape.javascript.JSObject; + import javax.swing.JDialog; import javax.swing.SwingUtilities; import java.awt.Color; import java.awt.Desktop; -import java.io.UnsupportedEncodingException; import java.net.URI; -import java.net.URLEncoder; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; /** * @author vito */ public class LoginWebBridge { - //默认查询消息时间, 30s - private static final long CHECK_MESSAGE_TIME = 30 * 1000L; - //数据查询正常的标志 ok - private static final String SUCCESS_MESSAGE_STATUS = "ok"; - //数据通讯失败 - private static final String FAILED_MESSAGE_STATUS = "error"; //最低消息的条数 private static final int MIN_MESSAGE_COUNT = 0; - //登录成功 - private static final String LOGININ = "0"; - //用户名不存在 - private static final String USERNAME_NOT_EXSIT = "-1"; - //密码错误 - private static final String PASSWORD_ERROR = "-2"; - //未知错误 - private static final String UNKNOWN_ERROR = "-3"; //网络连接失败 private static final String NET_FAILED = "-4"; //用户名,密码为空 private static final String LOGIN_INFO_EMPTY = "-5"; - private static final int TIME_OUT = 10000; - private static final String LOGIN_SUCCESS = "ok"; - private static final String LOGIN_FAILED = "failed"; private static final Color LOGIN_BACKGROUND = new Color(184, 220, 242); private static LoginWebBridge helper; //消息条数 @@ -131,22 +115,6 @@ public class LoginWebBridge { return client.isServerAlive(); } - private String encode(String str) { - try { - return URLEncoder.encode(str, EncodeConstants.ENCODING_UTF_8); - } catch (UnsupportedEncodingException e) { - return str; - } - } - - private void sleep(long millis) { - try { - Thread.sleep(millis); - } catch (InterruptedException e) { - FineLoggerFactory.getLogger().error(e.getMessage(), e); - } - } - /** * 注册页面 */ @@ -178,7 +146,9 @@ public class LoginWebBridge { */ public void defaultLogin(String username, String password, final JSObject callback) { Task task = new PluginTask<>(webEngine, callback, new PluginLoginExecutor(username, password)); - new Thread(task).start(); + ExecutorService es = Executors.newSingleThreadExecutor(new NamedThreadFactory("bbsDefaultLogin")); + es.submit(task); + es.shutdown(); } /** @@ -250,10 +220,6 @@ public class LoginWebBridge { } } - public void openUrlAtLocalWebBrowser(WebEngine eng, String url) { - if (url.indexOf("qqLogin.html") > 0) { - return; - } } } \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/extra/PluginControlPane.java b/designer-base/src/main/java/com/fr/design/extra/PluginControlPane.java index 393626ce0..e5b4feba2 100644 --- a/designer-base/src/main/java/com/fr/design/extra/PluginControlPane.java +++ b/designer-base/src/main/java/com/fr/design/extra/PluginControlPane.java @@ -15,6 +15,7 @@ import com.fr.plugin.manage.control.PluginTaskCallback; import com.fr.plugin.manage.control.PluginTaskResult; import com.fr.plugin.view.PluginView; import com.fr.stable.StringUtils; +import org.jetbrains.annotations.Nullable; import javax.swing.*; import javax.swing.event.DocumentEvent; @@ -142,6 +143,7 @@ public class PluginControlPane extends BasicPane { } } + @Nullable public PluginView getSelectedPlugin() { return (PluginView) pluginList.getSelectedValue(); } diff --git a/designer-base/src/main/java/com/fr/design/extra/PluginFromStorePane.java b/designer-base/src/main/java/com/fr/design/extra/PluginFromStorePane.java index 0f78a562c..115cc87dc 100644 --- a/designer-base/src/main/java/com/fr/design/extra/PluginFromStorePane.java +++ b/designer-base/src/main/java/com/fr/design/extra/PluginFromStorePane.java @@ -28,8 +28,6 @@ import java.util.List; * @since 8.0 */ public class PluginFromStorePane extends PluginAbstractLoadingViewPane, Void> { - private static final int LISTNUM1 = 1; - private static final int LISTNUM100 = 100; private UILabel errorMsgLabel; private UITabbedPane tabbedPane; private PluginControlPane controlPane; @@ -45,6 +43,7 @@ public class PluginFromStorePane extends PluginAbstractLoadingViewPane loadData() throws Exception { - //Thread.sleep(3000); return PluginsReaderFromStore.readPlugins(); } @@ -140,6 +139,7 @@ public class PluginFromStorePane extends PluginAbstractLoadingViewPane plugins) { controlPane.loadPlugins(plugins); tabbedPane.setTitleAt(2, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_All_Plugins") + "(" + plugins.size() + ")"); @@ -150,10 +150,12 @@ public class PluginFromStorePane extends PluginAbstractLoadingViewPane Date: Mon, 26 Aug 2019 19:23:30 +0800 Subject: [PATCH 080/217] =?UTF-8?q?REPORT-19466=20=E3=80=90=E5=8C=B9?= =?UTF-8?q?=E9=85=8D=E7=A7=BB=E5=8A=A8=E7=AB=AF=E3=80=91=E7=BB=84=E4=BB=B6?= =?UTF-8?q?=E7=BA=A7=E6=8E=A7=E5=88=B6=E9=80=89=E4=B8=AD=E7=AD=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../design/widget/ui/designer/mobile/ElementCaseDefinePane.java | 1 + 1 file changed, 1 insertion(+) diff --git a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/ElementCaseDefinePane.java b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/ElementCaseDefinePane.java index 5f255bb60..88a8d3bff 100644 --- a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/ElementCaseDefinePane.java +++ b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/ElementCaseDefinePane.java @@ -168,6 +168,7 @@ public class ElementCaseDefinePane extends MobileWidgetDefinePane { break; case "allowFullCheckBox": ((ElementCaseEditor) xCreator.toData()).setAllowFullScreen(allowFullCheckBox.isSelected()); + break; case "functionalWhenUnactivatedCheckBox": ((ElementCaseEditor) xCreator.toData()).setFunctionalWhenUnactivated(functionalWhenUnactivatedCheckBox.isSelected()); } From 32b9a662e933b3e56942af836847d60860977af5 Mon Sep 17 00:00:00 2001 From: Bryant Date: Tue, 27 Aug 2019 09:11:57 +0800 Subject: [PATCH 081/217] =?UTF-8?q?=E6=97=A0jira=E4=BB=BB=E5=8A=A1=20sonar?= =?UTF-8?q?=E9=97=AE=E9=A2=98=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gui/syntax/ui/rtextarea/RTextAreaEditorKit.java | 2 ++ .../VolatileImageBackgroundPainterStrategy.java | 10 ++++++---- .../src/main/java/com/fr/design/icon/LockIcon.java | 6 ++++++ .../src/main/java/com/fr/design/icon/WarningIcon.java | 1 + 4 files changed, 15 insertions(+), 4 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rtextarea/RTextAreaEditorKit.java b/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rtextarea/RTextAreaEditorKit.java index f95aa1260..277064c2f 100644 --- a/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rtextarea/RTextAreaEditorKit.java +++ b/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rtextarea/RTextAreaEditorKit.java @@ -902,6 +902,8 @@ public class RTextAreaEditorKit extends DefaultEditorKit { } } catch (BadLocationException bl) { } + }else if (textArea == null) { + throw new IllegalArgumentException("RTextArea can not be null!"); } if (beep) diff --git a/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rtextarea/VolatileImageBackgroundPainterStrategy.java b/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rtextarea/VolatileImageBackgroundPainterStrategy.java index 11aaca364..c7be420de 100644 --- a/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rtextarea/VolatileImageBackgroundPainterStrategy.java +++ b/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rtextarea/VolatileImageBackgroundPainterStrategy.java @@ -9,6 +9,8 @@ */ package com.fr.design.gui.syntax.ui.rtextarea; +import com.fr.log.FineLoggerFactory; + import java.awt.Graphics; import java.awt.Image; import java.awt.image.VolatileImage; @@ -95,9 +97,9 @@ public class VolatileImageBackgroundPainterStrategy try { tracker.waitForID(1); } catch (InterruptedException e) { - e.printStackTrace(); + FineLoggerFactory.getLogger().error(e.getMessage(),e); bgImage = null; - return; + Thread.currentThread().interrupt(); } finally { tracker.removeImage(i, 1); } @@ -106,9 +108,9 @@ public class VolatileImageBackgroundPainterStrategy try { tracker.waitForID(0); } catch (InterruptedException e) { - e.printStackTrace(); + FineLoggerFactory.getLogger().error(e.getMessage(),e); bgImage = null; - return; + Thread.currentThread().interrupt(); } finally { tracker.removeImage(bgImage, 0); } diff --git a/designer-base/src/main/java/com/fr/design/icon/LockIcon.java b/designer-base/src/main/java/com/fr/design/icon/LockIcon.java index 934d53b08..ee54b6ea8 100644 --- a/designer-base/src/main/java/com/fr/design/icon/LockIcon.java +++ b/designer-base/src/main/java/com/fr/design/icon/LockIcon.java @@ -34,6 +34,7 @@ public class LockIcon extends ImageIcon { } } + @Override public void paintIcon(Component c, Graphics g, int x, int y) { if (mainImage != null) { g.drawImage(mainImage, x, y, c); @@ -48,6 +49,7 @@ public class LockIcon extends ImageIcon { * * @param image the image */ + @Override protected void loadImage(Image image) { synchronized (tracker) { tracker.addImage(image, 0); @@ -55,6 +57,7 @@ public class LockIcon extends ImageIcon { tracker.waitForID(0, 0); } catch (InterruptedException e) { FineLoggerFactory.getLogger().error(e.getMessage(), e); + Thread.currentThread().interrupt(); } loadStatus = tracker.statusID(0, false); @@ -70,6 +73,7 @@ public class LockIcon extends ImageIcon { * * @return the Image object for this ImageIcon */ + @Override public Image getImage() { return mainImage; } @@ -85,6 +89,7 @@ public class LockIcon extends ImageIcon { * * @return the width in pixels of this icon */ + @Override public int getIconWidth() { return width; } @@ -94,6 +99,7 @@ public class LockIcon extends ImageIcon { * * @return the height in pixels of this icon */ + @Override public int getIconHeight() { return height; } diff --git a/designer-base/src/main/java/com/fr/design/icon/WarningIcon.java b/designer-base/src/main/java/com/fr/design/icon/WarningIcon.java index 9b22b4035..d70d62225 100644 --- a/designer-base/src/main/java/com/fr/design/icon/WarningIcon.java +++ b/designer-base/src/main/java/com/fr/design/icon/WarningIcon.java @@ -59,6 +59,7 @@ public class WarningIcon extends ImageIcon { tracker.waitForID(0, 0); } catch (InterruptedException e) { FineLoggerFactory.getLogger().error(e.getMessage(), e); + Thread.currentThread().interrupt(); } tracker.statusID(0, false); From f48ab9ba6d5b6810494b8db3c2f4b38560475d02 Mon Sep 17 00:00:00 2001 From: "Bruce.Deng" Date: Tue, 27 Aug 2019 09:33:48 +0800 Subject: [PATCH 082/217] =?UTF-8?q?=E6=97=A0jira=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=EF=BC=8Csonar=E9=97=AE=E9=A2=98=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../syntax/ui/rsyntaxtextarea/WrappedSyntaxView.java | 5 +++++ .../ui/rsyntaxtextarea/parser/TaskTagParser.java | 5 +++++ .../design/gui/syntax/ui/rtextarea/LineNumberList.java | 10 +++++++++- .../fr/design/gui/syntax/ui/rtextarea/RTextArea.java | 3 +++ 4 files changed, 22 insertions(+), 1 deletion(-) diff --git a/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rsyntaxtextarea/WrappedSyntaxView.java b/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rsyntaxtextarea/WrappedSyntaxView.java index 5f2f83337..b08b0caf7 100644 --- a/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rsyntaxtextarea/WrappedSyntaxView.java +++ b/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rsyntaxtextarea/WrappedSyntaxView.java @@ -1351,6 +1351,11 @@ System.err.println(">>> >>> calculated number of lines for this view (line " + l // Start at alloc.x since this chunk starts // at the beginning of a physical line. + if (tlist == null) { + p0 = (p == p0) ? p1 : p; + alloc.y += alloc.height; + continue; + } int n = tlist.getListOffset(textArea, WrappedSyntaxView.this, alloc.x, x); diff --git a/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rsyntaxtextarea/parser/TaskTagParser.java b/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rsyntaxtextarea/parser/TaskTagParser.java index 126193e82..7366c1d63 100644 --- a/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rsyntaxtextarea/parser/TaskTagParser.java +++ b/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rsyntaxtextarea/parser/TaskTagParser.java @@ -18,6 +18,7 @@ import com.fr.design.gui.syntax.ui.rsyntaxtextarea.ErrorStrip; import com.fr.design.gui.syntax.ui.rsyntaxtextarea.RSyntaxDocument; import com.fr.design.gui.syntax.ui.rsyntaxtextarea.SyntaxConstants; import com.fr.design.gui.syntax.ui.rsyntaxtextarea.Token; +import com.fr.stable.StringUtils; /** @@ -60,6 +61,7 @@ public class TaskTagParser extends AbstractParser { } + @SuppressWarnings("squid:S2259") public ParseResult parse(RSyntaxDocument doc, String style) { Element root = doc.getDefaultRootElement(); @@ -101,6 +103,9 @@ public class TaskTagParser extends AbstractParser { } if (start>-1) { + if (StringUtils.isEmpty(text)) { + continue; + } text = text.substring(start); // TODO: Strip off end of MLC's if they're there. int len = text.length(); diff --git a/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rtextarea/LineNumberList.java b/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rtextarea/LineNumberList.java index b6cf8edd5..3fd4c7504 100644 --- a/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rtextarea/LineNumberList.java +++ b/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rtextarea/LineNumberList.java @@ -2,7 +2,7 @@ * 02/11/2009 * * LineNumberList.java - Renders line numbers in an RTextScrollPane. - * + * * This library is distributed under a modified BSD license. See the included * RSyntaxTextArea.License.txt file for details. */ @@ -349,6 +349,10 @@ public class LineNumberList extends AbstractGutterComponent int width = metrics.stringWidth(number); g.drawString(number, rhs-width,y); y += cellHeight; + if (fm == null) { + line++; + continue; + } Fold fold = fm.getFoldForLine(line-1); // Skip to next line to paint, taking extra care for lines with // block ends and begins together, e.g. "} else {" @@ -371,6 +375,10 @@ public class LineNumberList extends AbstractGutterComponent String number = Integer.toString(line + getLineNumberingStartIndex() - 1); g.drawString(number, RHS_BORDER_WIDTH, y); y += cellHeight; + if (fm == null) { + line++; + continue; + } Fold fold = fm.getFoldForLine(line-1); // Skip to next line to paint, taking extra care for lines with // block ends and begins together, e.g. "} else {" diff --git a/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rtextarea/RTextArea.java b/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rtextarea/RTextArea.java index 9ea11b64d..d2e3284d7 100644 --- a/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rtextarea/RTextArea.java +++ b/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rtextarea/RTextArea.java @@ -635,6 +635,9 @@ public class RTextArea extends RTextAreaBase implements Printable { parent = parent.getParent(); } KeyStroke backspace = KeyStroke.getKeyStroke("BACK_SPACE"); + if (inputMap == null) { + return; + } inputMap.put(backspace, DefaultEditorKit.deletePrevCharAction); } From 0b870a726d5a6d18f06194f06b8d8909bb10ddb1 Mon Sep 17 00:00:00 2001 From: Maksim Date: Tue, 27 Aug 2019 10:28:34 +0800 Subject: [PATCH 083/217] =?UTF-8?q?REPORT-20323=20sonar=E9=97=AE=E9=A2=98?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../design/mainframe/chart/gui/type/AreaPlotPane.java | 4 +++- .../design/mainframe/chart/gui/type/BarPlotPane.java | 10 ++++++---- .../mainframe/chart/gui/type/ColumnPlotPane.java | 10 ++++++---- .../design/mainframe/chart/gui/type/MeterPlotPane.java | 10 ++++++---- .../com/fr/van/chart/area/VanChartAreaPlotPane.java | 10 ++++++---- 5 files changed, 27 insertions(+), 17 deletions(-) diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/AreaPlotPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/AreaPlotPane.java index a50bc52b5..483a4f09f 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/AreaPlotPane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/AreaPlotPane.java @@ -114,7 +114,9 @@ public class AreaPlotPane extends AbstractDeprecatedChartTypePane { ((Area3DPlot)plot).setStacked(true); ((Area3DPlot)plot).getyAxis().setPercentage(true); } - createAreaCondition(plot); + if(plot != null) { + createAreaCondition(plot); + } return plot; } diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/BarPlotPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/BarPlotPane.java index cd5e1b4d6..1a3808a6a 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/BarPlotPane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/BarPlotPane.java @@ -97,10 +97,12 @@ public class BarPlotPane extends AbstractBarPane{ } Plot cloned = null; - try { - cloned = (Plot)newPlot.clone(); - } catch (CloneNotSupportedException e) { - FineLoggerFactory.getLogger().error("Error In ColumnChart"); + if(newPlot != null) { + try { + cloned = (Plot) newPlot.clone(); + } catch (CloneNotSupportedException e) { + FineLoggerFactory.getLogger().error("Error In ColumnChart"); + } } return cloned; } diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/ColumnPlotPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/ColumnPlotPane.java index 55de24714..e421bdeba 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/ColumnPlotPane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/ColumnPlotPane.java @@ -94,10 +94,12 @@ public class ColumnPlotPane extends AbstractBarPane{ } Plot cloned = null; - try { - cloned = (Plot)newPlot.clone(); - } catch (CloneNotSupportedException e) { - FineLoggerFactory.getLogger().error("Error In ColumnChart"); + if(newPlot != null) { + try { + cloned = (Plot) newPlot.clone(); + } catch (CloneNotSupportedException e) { + FineLoggerFactory.getLogger().error("Error In ColumnChart"); + } } return cloned; } diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/MeterPlotPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/MeterPlotPane.java index a02bcf5d1..94527c04b 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/MeterPlotPane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/MeterPlotPane.java @@ -66,10 +66,12 @@ public class MeterPlotPane extends AbstractDeprecatedChartTypePane { } Plot cloned = null; - try { - cloned = (Plot)newPlot.clone(); - } catch (CloneNotSupportedException e) { - FineLoggerFactory.getLogger().error("Error In ColumnChart"); + if(newPlot != null) { + try { + cloned = (Plot) newPlot.clone(); + } catch (CloneNotSupportedException e) { + FineLoggerFactory.getLogger().error("Error In ColumnChart"); + } } return cloned; } diff --git a/designer-chart/src/main/java/com/fr/van/chart/area/VanChartAreaPlotPane.java b/designer-chart/src/main/java/com/fr/van/chart/area/VanChartAreaPlotPane.java index 2642daa28..3d655d005 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/area/VanChartAreaPlotPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/area/VanChartAreaPlotPane.java @@ -68,10 +68,12 @@ public class VanChartAreaPlotPane extends AbstractVanChartTypePane { } } Plot cloned = null; - try { - cloned = (Plot) newPlot.clone(); - } catch (CloneNotSupportedException e) { - FineLoggerFactory.getLogger().error("Error In AreaChart"); + if(newPlot != null) { + try { + cloned = (Plot) newPlot.clone(); + } catch (CloneNotSupportedException e) { + FineLoggerFactory.getLogger().error("Error In AreaChart"); + } } return cloned; } From a6c1ce1a6facac2e9d22bbd8f86cf49739d2bd70 Mon Sep 17 00:00:00 2001 From: jinbokai Date: Tue, 27 Aug 2019 10:33:28 +0800 Subject: [PATCH 084/217] REPORT-20328 sonar --- .../gui/itable/AbstractPropertyTable.java | 37 +++++++++---------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/gui/itable/AbstractPropertyTable.java b/designer-base/src/main/java/com/fr/design/gui/itable/AbstractPropertyTable.java index 4367d8f6b..ccdd8eb64 100644 --- a/designer-base/src/main/java/com/fr/design/gui/itable/AbstractPropertyTable.java +++ b/designer-base/src/main/java/com/fr/design/gui/itable/AbstractPropertyTable.java @@ -3,11 +3,15 @@ */ package com.fr.design.gui.itable; -import java.awt.*; +import com.fr.general.ComparatorUtils; +import java.awt.Color; +import java.awt.Component; +import java.awt.Container; +import java.awt.Dimension; +import java.awt.Point; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.ArrayList; - import javax.swing.JTable; import javax.swing.ListSelectionModel; import javax.swing.table.AbstractTableModel; @@ -16,9 +20,6 @@ import javax.swing.table.JTableHeader; import javax.swing.table.TableCellEditor; import javax.swing.table.TableCellRenderer; -import com.fr.general.ComparatorUtils; - - /** * @author richer * @since 6.5.3 @@ -109,8 +110,8 @@ public abstract class AbstractPropertyTable extends JTable { @Override public TableCellEditor getCellEditor(int row, int column) { - if (groups != null) { - Point pIndex = getGroupIndex(row); + Point pIndex = getGroupIndex(row); + if (groups != null && pIndex != null) { PropertyGroup group = groups.get(pIndex.x); if (pIndex.y == 0) { return super.getCellEditor(row, column); @@ -162,7 +163,7 @@ public abstract class AbstractPropertyTable extends JTable { int row = AbstractPropertyTable.super.rowAtPoint(e.getPoint()); if (row != -1) { Point pIndex = getGroupIndex(row); - if (pIndex.y == 0 && e.getClickCount() > 1) { + if (pIndex != null && pIndex.y == 0 && e.getClickCount() > 1) { toggleCollapse(pIndex.x); } } @@ -180,7 +181,7 @@ public abstract class AbstractPropertyTable extends JTable { int row = AbstractPropertyTable.super.rowAtPoint(e.getPoint()); if (row != -1) { Point pIndex = getGroupIndex(row); - if (pIndex.y == 0 && e.getClickCount() == 1 && e.getX() < PROPERTY_ICON_WIDTH) { + if (pIndex != null && pIndex.y == 0 && e.getClickCount() == 1 && e.getX() < PROPERTY_ICON_WIDTH) { toggleCollapse(pIndex.x); } } @@ -263,6 +264,9 @@ public abstract class AbstractPropertyTable extends JTable { @Override public void setValueAt(Object aValue, int row, int column) { Point pIndex = getGroupIndex(row); + if (pIndex == null) { + return; + } PropertyGroup group = groups.get(pIndex.x); if (pIndex.y != 0) { Object old_value = getValueAt(row, column); @@ -276,16 +280,11 @@ public abstract class AbstractPropertyTable extends JTable { @Override public boolean isCellEditable(int row, int column) { Point pIndex = getGroupIndex(row); - PropertyGroup group = groups.get(pIndex.x); - if (pIndex.y == 0) { - if (column == 0) { - return false; - } else { - return false; - } - } else { - return column == 1 && group.getModel().isEditable(pIndex.y - 1); + if (pIndex == null) { + return false; } + PropertyGroup group = groups.get(pIndex.x); + return pIndex.y != 0 && (column == 1 && group.getModel().isEditable(pIndex.y - 1)); } } -} \ No newline at end of file +} From 7937140272a46da879b05a99677b269c487f330e Mon Sep 17 00:00:00 2001 From: vito Date: Tue, 27 Aug 2019 11:34:00 +0800 Subject: [PATCH 085/217] =?UTF-8?q?=E6=8A=A5=E8=A1=A8REPORT-20320=20sonar?= =?UTF-8?q?=E9=97=AE=E9=A2=98=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../RSyntaxTextAreaEditorKit.java | 3808 ++++++++--------- .../ui/rsyntaxtextarea/RSyntaxUtilities.java | 2565 +++++------ 2 files changed, 3192 insertions(+), 3181 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSyntaxTextAreaEditorKit.java b/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSyntaxTextAreaEditorKit.java index c431e329c..6aa0cd8e4 100644 --- a/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSyntaxTextAreaEditorKit.java +++ b/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSyntaxTextAreaEditorKit.java @@ -2,29 +2,39 @@ * 08/29/2004 * * RSyntaxTextAreaEditorKit.java - The editor kit used by RSyntaxTextArea. - * + * * This library is distributed under a modified BSD license. See the included * RSyntaxTextArea.License.txt file for details. */ package com.fr.design.gui.syntax.ui.rsyntaxtextarea; -import java.awt.*; -import java.awt.event.*; -import java.util.ResourceBundle; -import java.util.Stack; -import javax.swing.*; -import javax.swing.text.*; - import com.fr.design.gui.syntax.ui.rsyntaxtextarea.folding.Fold; import com.fr.design.gui.syntax.ui.rsyntaxtextarea.folding.FoldCollapser; import com.fr.design.gui.syntax.ui.rsyntaxtextarea.folding.FoldManager; import com.fr.design.gui.syntax.ui.rsyntaxtextarea.templates.CodeTemplate; import com.fr.design.gui.syntax.ui.rtextarea.Gutter; import com.fr.design.gui.syntax.ui.rtextarea.IconRowHeader; -import com.fr.design.gui.syntax.ui.rtextarea.RecordableTextAction; import com.fr.design.gui.syntax.ui.rtextarea.RTextArea; import com.fr.design.gui.syntax.ui.rtextarea.RTextAreaEditorKit; +import com.fr.design.gui.syntax.ui.rtextarea.RecordableTextAction; +import javax.swing.Action; +import javax.swing.Icon; +import javax.swing.JScrollPane; +import javax.swing.KeyStroke; +import javax.swing.UIManager; +import javax.swing.text.BadLocationException; +import javax.swing.text.Caret; +import javax.swing.text.Document; +import javax.swing.text.Element; +import javax.swing.text.Segment; +import javax.swing.text.TextAction; +import java.awt.Component; +import java.awt.Font; +import java.awt.Point; +import java.awt.event.ActionEvent; +import java.util.Objects; +import java.util.Stack; /** @@ -32,24 +42,24 @@ import com.fr.design.gui.syntax.ui.rtextarea.RTextAreaEditorKit; * programming-specific stuff. There are currently subclasses to handle: * *
    - *
  • Toggling code folds.
  • - *
  • Aligning "closing" curly braces with their matches, if the current - * programming language uses curly braces to identify code blocks.
  • - *
  • Copying the current selection as RTF.
  • - *
  • Block indentation (increasing the indent of one or multiple lines)
  • - *
  • Block un-indentation (decreasing the indent of one or multiple lines) - *
  • - *
  • Inserting a "code template" when a configurable key (e.g. a space) is - * pressed
  • - *
  • Decreasing the point size of all fonts in the text area
  • - *
  • Increasing the point size of all fonts in the text area
  • - *
  • Moving the caret to the "matching bracket" of the one at the current - * caret position
  • - *
  • Toggling whether the currently selected lines are commented out.
  • - *
  • Better selection of "words" on mouse double-clicks for programming - * languages.
  • - *
  • Better keyboard navigation via Ctrl+arrow keys for programming - * languages.
  • + *
  • Toggling code folds.
  • + *
  • Aligning "closing" curly braces with their matches, if the current + * programming language uses curly braces to identify code blocks.
  • + *
  • Copying the current selection as RTF.
  • + *
  • Block indentation (increasing the indent of one or multiple lines)
  • + *
  • Block un-indentation (decreasing the indent of one or multiple lines) + *
  • + *
  • Inserting a "code template" when a configurable key (e.g. a space) is + * pressed
  • + *
  • Decreasing the point size of all fonts in the text area
  • + *
  • Increasing the point size of all fonts in the text area
  • + *
  • Moving the caret to the "matching bracket" of the one at the current + * caret position
  • + *
  • Toggling whether the currently selected lines are commented out.
  • + *
  • Better selection of "words" on mouse double-clicks for programming + * languages.
  • + *
  • Better keyboard navigation via Ctrl+arrow keys for programming + * languages.
  • *
* * @author Robert Futrell @@ -57,1884 +67,1872 @@ import com.fr.design.gui.syntax.ui.rtextarea.RTextAreaEditorKit; */ public class RSyntaxTextAreaEditorKit extends RTextAreaEditorKit { - private static final long serialVersionUID = 1L; - - public static final String rstaCloseCurlyBraceAction = "RSTA.CloseCurlyBraceAction"; - public static final String rstaCloseMarkupTagAction = "RSTA.CloseMarkupTagAction"; - public static final String rstaCollapseAllFoldsAction = "RSTA.CollapseAllFoldsAction"; - public static final String rstaCollapseAllCommentFoldsAction = "RSTA.CollapseAllCommentFoldsAction"; - public static final String rstaCollapseFoldAction = "RSTA.CollapseFoldAction"; - public static final String rstaCopyAsRtfAction = "RSTA.CopyAsRtfAction"; - public static final String rstaDecreaseIndentAction = "RSTA.DecreaseIndentAction"; - public static final String rstaExpandAllFoldsAction = "RSTA.ExpandAllFoldsAction"; - public static final String rstaExpandFoldAction = "RSTA.ExpandFoldAction"; - public static final String rstaGoToMatchingBracketAction = "RSTA.GoToMatchingBracketAction"; - public static final String rstaPossiblyInsertTemplateAction = "RSTA.TemplateAction"; - public static final String rstaToggleCommentAction = "RSTA.ToggleCommentAction"; - public static final String rstaToggleCurrentFoldAction = "RSTA.ToggleCurrentFoldAction"; - - /** - * The actions that RSyntaxTextAreaEditorKit adds to those of - * RTextAreaEditorKit. - */ - private static final Action[] defaultActions = { - new CloseCurlyBraceAction(), - new CloseMarkupTagAction(), - new BeginWordAction(beginWordAction, false), - new BeginWordAction(selectionBeginWordAction, true), - new ChangeFoldStateAction(rstaCollapseFoldAction, true), - new ChangeFoldStateAction(rstaExpandFoldAction, false), - new CollapseAllFoldsAction(), - new CopyAsRtfAction(), - //new DecreaseFontSizeAction(), - new DecreaseIndentAction(), - new DeletePrevWordAction(), - new EndAction(endAction, false), - new EndAction(selectionEndAction, true), - new EndWordAction(endWordAction, false), - new EndWordAction(endWordAction, true), - new ExpandAllFoldsAction(), - new GoToMatchingBracketAction(), - new InsertBreakAction(), - //new IncreaseFontSizeAction(), - new InsertTabAction(), - new NextWordAction(nextWordAction, false), - new NextWordAction(selectionNextWordAction, true), - new PossiblyInsertTemplateAction(), - new PreviousWordAction(previousWordAction, false), - new PreviousWordAction(selectionPreviousWordAction, true), - new SelectWordAction(), - new ToggleCommentAction(), - }; - - - /** - * Constructor. - */ - public RSyntaxTextAreaEditorKit() { - } - - - /** - * Returns the default document used by RSyntaxTextAreas. - * - * @return The document. - */ - @Override - public Document createDefaultDocument() { - return new RSyntaxDocument(SyntaxConstants.SYNTAX_STYLE_NONE); - } - - - /** - * Overridden to return a row header that is aware of folding. - * - * @param textArea The text area. - * @return The icon row header. - */ - @Override - public IconRowHeader createIconRowHeader(RTextArea textArea) { - return new FoldingAwareIconRowHeader((RSyntaxTextArea)textArea); - } - - - /** - * Fetches the set of commands that can be used - * on a text component that is using a model and - * view produced by this kit. - * - * @return the command list - */ - @Override - public Action[] getActions() { - return TextAction.augmentList(super.getActions(), - RSyntaxTextAreaEditorKit.defaultActions); - } - - - /** - * Returns localized text for an action. There's definitely a better place - * for this functionality. - * - * @param key The key into the action resource bundle. - * @return The localized text. - */ - public static String getString(String key) { - return com.fr.design.i18n.Toolkit.i18nText(key); - } - - - /** - * Positions the caret at the beginning of the word. This class is here - * to better handle finding the "beginning of the word" for programming - * languages. - */ - protected static class BeginWordAction - extends RTextAreaEditorKit.BeginWordAction { - - private Segment seg; - - protected BeginWordAction(String name, boolean select) { - super(name, select); - seg = new Segment(); - } - - @Override - protected int getWordStart(RTextArea textArea, int offs) - throws BadLocationException { - - if (offs==0) { - return offs; - } - - RSyntaxDocument doc = (RSyntaxDocument)textArea.getDocument(); - int line = textArea.getLineOfOffset(offs); - int start = textArea.getLineStartOffset(line); - if (offs==start) { - return start; - } - int end = textArea.getLineEndOffset(line); - if (line!=textArea.getLineCount()-1) { - end--; - } - doc.getText(start, end-start, seg); - - // Determine the "type" of char at offs - lower case, upper case, - // whitespace or other. We take special care here as we're starting - // in the middle of the Segment to check whether we're already at - // the "beginning" of a word. - int firstIndex = seg.getBeginIndex() + (offs-start) - 1; - seg.setIndex(firstIndex); - char ch = seg.current(); - char nextCh = offs==end ? 0 : seg.array[seg.getIndex() + 1]; - - // The "word" is a group of letters and/or digits - if (Character.isLetterOrDigit(ch)) { - if (offs!=end && !Character.isLetterOrDigit(nextCh)) { - return offs; - } - do { - ch = seg.previous(); - } while (Character.isLetterOrDigit(ch)); - } - - // The "word" is whitespace - else if (Character.isWhitespace(ch)) { - if (offs!=end && !Character.isWhitespace(nextCh)) { - return offs; - } - do { - ch = seg.previous(); - } while (Character.isWhitespace(ch)); - } - - // Otherwise, the "word" a single "something else" char (operator, - // etc.). - - offs -= firstIndex - seg.getIndex() + 1;//seg.getEndIndex() - seg.getIndex(); - if (ch!=Segment.DONE && nextCh!='\n') { - offs++; - } - - return offs; - - } - - } - - - /** - * Expands or collapses the nearest fold. - */ - public static class ChangeFoldStateAction extends FoldRelatedAction { - - private boolean collapse; - - public ChangeFoldStateAction(String name, boolean collapse) { - super(name); - this.collapse = collapse; - } - - public ChangeFoldStateAction(String name, Icon icon, - String desc, Integer mnemonic, KeyStroke accelerator) { - super(name, icon, desc, mnemonic, accelerator); - } - - @Override - public void actionPerformedImpl(ActionEvent e, RTextArea textArea) { - RSyntaxTextArea rsta = (RSyntaxTextArea)textArea; - if (rsta.isCodeFoldingEnabled()) { - Fold fold = getClosestFold(rsta); - if (fold!=null) { - fold.setCollapsed(collapse); - } - possiblyRepaintGutter(textArea); - } - else { - UIManager.getLookAndFeel().provideErrorFeedback(rsta); - } - } - - @Override - public final String getMacroID() { - return getName(); - } - - } - - - /** - * Action that (optionally) aligns a closing curly brace with the line - * containing its matching opening curly brace. - */ - public static class CloseCurlyBraceAction extends RecordableTextAction { - - private static final long serialVersionUID = 1L; - - private Point bracketInfo; - private Segment seg; - - public CloseCurlyBraceAction() { - super(rstaCloseCurlyBraceAction); - seg = new Segment(); - } - - @Override - public void actionPerformedImpl(ActionEvent e, RTextArea textArea) { - - RSyntaxTextArea rsta = (RSyntaxTextArea)textArea; - RSyntaxDocument doc = (RSyntaxDocument)rsta.getDocument(); - boolean alignCurlyBraces = rsta.isAutoIndentEnabled() && - doc.getCurlyBracesDenoteCodeBlocks(); - - if (alignCurlyBraces) { - textArea.beginAtomicEdit(); - } - - try { - - textArea.replaceSelection("}"); - - // If the user wants to align curly braces... - if (alignCurlyBraces) { - - Element root = doc.getDefaultRootElement(); - int dot = rsta.getCaretPosition() - 1; // Start before '{' - int line = root.getElementIndex(dot); - Element elem = root.getElement(line); - int start = elem.getStartOffset(); - - // Get the current line's text up to the '}' entered. - try { - doc.getText(start, dot-start, seg); - } catch (BadLocationException ble) { // Never happens - ble.printStackTrace(); - return; - } - - // Only attempt to align if there's only whitespace up to - // the '}' entered. - for (int i=0; i-1) { - try { - String ws = RSyntaxUtilities.getLeadingWhitespace( - doc, bracketInfo.y); - rsta.replaceRange(ws, start, dot); - } catch (BadLocationException ble) { - ble.printStackTrace(); - return; - } - } - - } - - } finally { - if (alignCurlyBraces) { - textArea.endAtomicEdit(); - } - } - - } - - @Override - public final String getMacroID() { - return rstaCloseCurlyBraceAction; - } - - } - - - /** - * (Optionally) completes a closing markup tag. - */ - public static class CloseMarkupTagAction extends RecordableTextAction { - - private static final long serialVersionUID = 1L; - - public CloseMarkupTagAction() { - super(rstaCloseMarkupTagAction); - } - - @Override - public void actionPerformedImpl(ActionEvent e, RTextArea textArea) { - - if (!textArea.isEditable() || !textArea.isEnabled()) { - UIManager.getLookAndFeel().provideErrorFeedback(textArea); - return; - } - - RSyntaxTextArea rsta = (RSyntaxTextArea)textArea; - RSyntaxDocument doc = (RSyntaxDocument)rsta.getDocument(); - - Caret c = rsta.getCaret(); - boolean selection = c.getDot()!=c.getMark(); - rsta.replaceSelection("/"); - - // Don't automatically complete a tag if there was a selection - int dot = c.getDot(); - - if (doc.getLanguageIsMarkup() && - doc.getCompleteMarkupCloseTags() && - !selection && rsta.getCloseMarkupTags() && dot>1) { - - try { - - // Check actual char before token type, since it's quicker - char ch = doc.charAt(dot-2); - if (ch=='<' || ch=='[') { - - Token t = doc.getTokenListForLine( - rsta.getCaretLineNumber()); - t = RSyntaxUtilities.getTokenAtOffset(t, dot-1); - if (t!=null && t.getType()==Token.MARKUP_TAG_DELIMITER) { - //System.out.println("Huzzah - closing tag!"); - String tagName = discoverTagName(doc, dot); - if (tagName!=null) { - rsta.replaceSelection(tagName + (char)(ch+2)); - } - } - - } - - } catch (BadLocationException ble) { // Never happens - UIManager.getLookAndFeel().provideErrorFeedback(rsta); - ble.printStackTrace(); - } - - } - - } - - /** - * Discovers the name of the tag being closed. Assumes standard - * SGML-style markup tags. - * - * @param doc The document to parse. - * @param dot The location of the caret. This should be right after - * the start of a closing tag token (e.g. "</" - * or "[" in the case of BBCode). - * @return The name of the tag to close, or null if it - * could not be determined. - */ - private String discoverTagName(RSyntaxDocument doc, int dot) { - - Stack stack = new Stack(); - - Element root = doc.getDefaultRootElement(); - int curLine = root.getElementIndex(dot); - - for (int i=0; i<=curLine; i++) { - - Token t = doc.getTokenListForLine(i); - while (t!=null && t.isPaintable()) { - - if (t.getType()==Token.MARKUP_TAG_DELIMITER) { - if (t.isSingleChar('<') || t.isSingleChar('[')) { - t = t.getNextToken(); - while (t!=null && t.isPaintable()) { - if (t.getType()==Token.MARKUP_TAG_NAME || - // Being lenient here and also checking - // for attributes, in case they - // (incorrectly) have whitespace between - // the '<' char and the element name. - t.getType()==Token.MARKUP_TAG_ATTRIBUTE) { - stack.push(t.getLexeme()); - break; - } - t = t.getNextToken(); - } - } - else if (t.length()==2 && t.charAt(0)=='/' && - (t.charAt(1)=='>' || - t.charAt(1)==']')) { - if (!stack.isEmpty()) { // Always true for valid XML - stack.pop(); - } - } - else if (t.length()==2 && - (t.charAt(0)=='<' || t.charAt(0)=='[') && - t.charAt(1)=='/') { - String tagName = null; - if (!stack.isEmpty()) { // Always true for valid XML - tagName = stack.pop(); - } - if (t.getEndOffset()>=dot) { - return tagName; - } - } - } - - t = t.getNextToken(); - - } - - } - - return null; // Should never happen - - } - - @Override - public String getMacroID() { - return getName(); - } - - } - - - /** - * Collapses all comment folds. - */ - public static class CollapseAllCommentFoldsAction extends FoldRelatedAction{ - - private static final long serialVersionUID = 1L; - - public CollapseAllCommentFoldsAction() { - super(rstaCollapseAllCommentFoldsAction); - setProperties("Action.CollapseCommentFolds"); - } - - public CollapseAllCommentFoldsAction(String name, Icon icon, - String desc, Integer mnemonic, KeyStroke accelerator) { - super(name, icon, desc, mnemonic, accelerator); - } - - @Override - public void actionPerformedImpl(ActionEvent e, RTextArea textArea) { - RSyntaxTextArea rsta = (RSyntaxTextArea)textArea; - if (rsta.isCodeFoldingEnabled()) { - FoldCollapser collapser = new FoldCollapser(); - collapser.collapseFolds(rsta.getFoldManager()); - possiblyRepaintGutter(textArea); - } - else { - UIManager.getLookAndFeel().provideErrorFeedback(rsta); - } - } - - @Override - public final String getMacroID() { - return rstaCollapseAllCommentFoldsAction; - } - - } - - - /** - * Collapses all folds. - */ - public static class CollapseAllFoldsAction extends FoldRelatedAction { - - private static final long serialVersionUID = 1L; - - public CollapseAllFoldsAction() { - this(false); - } - - public CollapseAllFoldsAction(boolean localizedName) { - super(rstaCollapseAllFoldsAction); - if (localizedName) { - setProperties("Action.CollapseAllFolds"); - } - } - - public CollapseAllFoldsAction(String name, Icon icon, - String desc, Integer mnemonic, KeyStroke accelerator) { - super(name, icon, desc, mnemonic, accelerator); - } - - @Override - public void actionPerformedImpl(ActionEvent e, RTextArea textArea) { - RSyntaxTextArea rsta = (RSyntaxTextArea)textArea; - if (rsta.isCodeFoldingEnabled()) { - FoldCollapser collapser = new FoldCollapser() { - @Override - public boolean getShouldCollapse(Fold fold) { - return true; - } - }; - collapser.collapseFolds(rsta.getFoldManager()); - possiblyRepaintGutter(textArea); - } - else { - UIManager.getLookAndFeel().provideErrorFeedback(rsta); - } - } - - @Override - public final String getMacroID() { - return rstaCollapseAllFoldsAction; - } - - } - - - /** - * Action for copying text as RTF. - */ - public static class CopyAsRtfAction extends RecordableTextAction { - - private static final long serialVersionUID = 1L; - - public CopyAsRtfAction() { - super(rstaCopyAsRtfAction); - } - - public CopyAsRtfAction(String name, Icon icon, String desc, - Integer mnemonic, KeyStroke accelerator) { - super(name, icon, desc, mnemonic, accelerator); - } - - @Override - public void actionPerformedImpl(ActionEvent e, RTextArea textArea) { - ((RSyntaxTextArea)textArea).copyAsRtf(); - textArea.requestFocusInWindow(); - } - - @Override - public final String getMacroID() { - return getName(); - } - - } - - - /** - * Action for decreasing the font size of all fonts in the text area. - */ - public static class DecreaseFontSizeAction - extends RTextAreaEditorKit.DecreaseFontSizeAction { - - private static final long serialVersionUID = 1L; - - public DecreaseFontSizeAction() { - super(); - } - - public DecreaseFontSizeAction(String name, Icon icon, String desc, - Integer mnemonic, KeyStroke accelerator) { - super(name, icon, desc, mnemonic, accelerator); - } - - @Override - public void actionPerformedImpl(ActionEvent e, RTextArea textArea) { - - RSyntaxTextArea rsta = (RSyntaxTextArea)textArea; - SyntaxScheme scheme = rsta.getSyntaxScheme(); - - // All we need to do is update all of the fonts in syntax - // schemes, then call setSyntaxHighlightingColorScheme with the - // same scheme already being used. This relies on the fact that - // that method does not check whether the new scheme is different - // from the old scheme before updating. - - boolean changed = false; - int count = scheme.getStyleCount(); - for (int i=0; i=MINIMUM_SIZE) { - // Shrink by decreaseAmount. - ss.font = font.deriveFont(newSize); - changed = true; - } - else if (oldSize>MINIMUM_SIZE) { - // Can't shrink by full decreaseAmount, but - // can shrink a little bit. - ss.font = font.deriveFont(MINIMUM_SIZE); - changed = true; - } - } - } - } - - // Do the text area's font also. - Font font = rsta.getFont(); - float oldSize = font.getSize2D(); - float newSize = oldSize - decreaseAmount; - if (newSize>=MINIMUM_SIZE) { - // Shrink by decreaseAmount. - rsta.setFont(font.deriveFont(newSize)); - changed = true; - } - else if (oldSize>MINIMUM_SIZE) { - // Can't shrink by full decreaseAmount, but - // can shrink a little bit. - rsta.setFont(font.deriveFont(MINIMUM_SIZE)); - changed = true; - } - - // If we updated at least one font, update the screen. If - // all of the fonts were already the minimum size, beep. - if (changed) { - rsta.setSyntaxScheme(scheme); - // NOTE: This is a hack to get an encompassing - // RTextScrollPane to repaint its line numbers to account - // for a change in line height due to a font change. I'm - // not sure why we need to do this here but not when we - // change the syntax highlighting color scheme via the - // Options dialog... setSyntaxHighlightingColorScheme() - // calls revalidate() which won't repaint the scroll pane - // if scrollbars don't change, which is why we need this. - Component parent = rsta.getParent(); - if (parent instanceof javax.swing.JViewport) { - parent = parent.getParent(); - if (parent instanceof JScrollPane) { - parent.repaint(); - } - } - } - else - UIManager.getLookAndFeel().provideErrorFeedback(rsta); - - } - - } - - - /** - * Action for when un-indenting lines (either the current line if there is - * selection, or all selected lines if there is one). - */ - public static class DecreaseIndentAction extends RecordableTextAction { - - private static final long serialVersionUID = 1L; - - private Segment s; - - public DecreaseIndentAction() { - this(rstaDecreaseIndentAction); - } - - public DecreaseIndentAction(String name) { - super(name); - s = new Segment(); - } - - @Override - public void actionPerformedImpl(ActionEvent e, RTextArea textArea) { - - if (!textArea.isEditable() || !textArea.isEnabled()) { - UIManager.getLookAndFeel().provideErrorFeedback(textArea); - return; - } - - Document document = textArea.getDocument(); - Element map = document.getDefaultRootElement(); - Caret c = textArea.getCaret(); - int dot = c.getDot(); - int mark = c.getMark(); - int line1 = map.getElementIndex(dot); - int tabSize = textArea.getTabSize(); - - // If there is a selection, indent all lines in the selection. - // Otherwise, indent the line the caret is on. - if (dot!=mark) { - // Note that we cheaply reuse variables here, so don't - // take their names to mean what they are. - int line2 = map.getElementIndex(mark); - dot = Math.min(line1, line2); - mark = Math.max(line1, line2); - Element elem; - try { - for (line1=dot; line1i) { - // If the first character is a tab, remove it. - if (s.array[i]=='\t') { - doc.remove(start, 1); - } - // Otherwise, see if the first character is a space. If it - // is, remove all contiguous whitespaces at the beginning of - // this line, up to the tab size. - else if (s.array[i]==' ') { - i++; - int toRemove = 1; - while (i-1) { - // Go to the position AFTER the bracket so the previous - // bracket (which we were just on) is highlighted. - rsta.setCaretPosition(bracketInfo.y+1); - } - else { - UIManager.getLookAndFeel().provideErrorFeedback(rsta); - } - } - - @Override - public final String getMacroID() { - return rstaGoToMatchingBracketAction; - } - - } - - - /** - * Action for increasing the font size of all fonts in the text area. - */ - public static class IncreaseFontSizeAction - extends RTextAreaEditorKit.IncreaseFontSizeAction { - - private static final long serialVersionUID = 1L; - - public IncreaseFontSizeAction() { - super(); - } - - public IncreaseFontSizeAction(String name, Icon icon, String desc, - Integer mnemonic, KeyStroke accelerator) { - super(name, icon, desc, mnemonic, accelerator); - } - - @Override - public void actionPerformedImpl(ActionEvent e, RTextArea textArea) { - - RSyntaxTextArea rsta = (RSyntaxTextArea)textArea; - SyntaxScheme scheme = rsta.getSyntaxScheme(); - - // All we need to do is update all of the fonts in syntax - // schemes, then call setSyntaxHighlightingColorScheme with the - // same scheme already being used. This relies on the fact that - // that method does not check whether the new scheme is different - // from the old scheme before updating. - - boolean changed = false; - int count = scheme.getStyleCount(); - for (int i=0; ipos that - * is NOT a whitespace char, or -1 if only - * whitespace chars follow pos (or it is the end - * position in the string). - */ - private static final int atEndOfLine(int pos, String s, int sLen) { - for (int i=pos; i0) { - StringBuilder sb = new StringBuilder(); - if (line==textArea.getLineCount()-1) { - sb.append('\n'); - } - if (leadingWS!=null) { - sb.append(leadingWS); - } - sb.append("}\n"); - int dot = textArea.getCaretPosition(); - int end = textArea.getLineEndOffsetOfCurrentLine(); - // Insert at end of line, not at dot: they may have - // pressed Enter in the middle of the line and brought - // some text (though it must be whitespace and/or - // comments) down onto the new line. - textArea.insert(sb.toString(), end); - textArea.setCaretPosition(dot); // Caret may have moved - } - - } - - } - - } - - } - - - /** - * Action for inserting tabs. This is extended to "block indent" a - * group of contiguous lines if they are selected. - */ - public static class InsertTabAction extends RecordableTextAction { - - private static final long serialVersionUID = 1L; - - public InsertTabAction() { - super(insertTabAction); - } - - public InsertTabAction(String name) { - super(name); - } - - @Override - public void actionPerformedImpl(ActionEvent e, RTextArea textArea) { - - if (!textArea.isEditable() || !textArea.isEnabled()) { - UIManager.getLookAndFeel().provideErrorFeedback(textArea); - return; - } - - Document document = textArea.getDocument(); - Element map = document.getDefaultRootElement(); - Caret c = textArea.getCaret(); - int dot = c.getDot(); - int mark = c.getMark(); - int dotLine = map.getElementIndex(dot); - int markLine = map.getElementIndex(mark); - - // If there is a multi-line selection, indent all lines in - // the selection. - if (dotLine!=markLine) { - int first = Math.min(dotLine, markLine); - int last = Math.max(dotLine, markLine); - Element elem; int start; - - // Since we're using Document.insertString(), we must mimic the - // soft tab behavior provided by RTextArea.replaceSelection(). - String replacement = "\t"; - if (textArea.getTabsEmulated()) { - StringBuilder sb = new StringBuilder(); - int temp = textArea.getTabSize(); - for (int i=0; i0 && - // ((mod&ActionEvent.ALT_MASK)==(mod&ActionEvent.CTRL_MASK))) { - // char ch = str.charAt(0); - // if (ch>=0x20 && ch!=0x7F) - // textArea.replaceSelection(str); - //} - textArea.replaceSelection(" "); - } - - @Override - public final String getMacroID() { - return rstaPossiblyInsertTemplateAction; - } - - } - - - /** - * Action to move the selection and/or caret. Constructor indicates - * direction to use. This class overrides the behavior defined in - * {@link RTextAreaEditorKit} to better skip "words" in source code. - */ - public static class PreviousWordAction - extends RTextAreaEditorKit.PreviousWordAction { - - private Segment seg; - - public PreviousWordAction(String nm, boolean select) { - super(nm, select); - seg = new Segment(); - } - - /** - * Overridden to do better with skipping "words" in code. - */ - @Override - protected int getPreviousWord(RTextArea textArea, int offs) - throws BadLocationException { - - if (offs==0) { - return offs; - } - - RSyntaxDocument doc = (RSyntaxDocument)textArea.getDocument(); - Element root = doc.getDefaultRootElement(); - int line = root.getElementIndex(offs); - int start = root.getElement(line).getStartOffset(); - if (offs==start) {// If we're already at the start of the line... - RSyntaxTextArea rsta = (RSyntaxTextArea)textArea; - if (rsta.isCodeFoldingEnabled()) { // End of next visible line - FoldManager fm = rsta.getFoldManager(); - while (--line>=0 && fm.isLineHidden(line)); - if (line>=0) { // Found an earlier visible line - offs = root.getElement(line).getEndOffset() - 1; - } - // No earlier visible line - we must be at offs==0... - return offs; - } - else { - return start-1; // End of previous line. - } - } - doc.getText(start, offs-start, seg); - - // Determine the "type" of char at offs - lower case, upper case, - // whitespace or other - char ch = seg.last(); - - // Skip any "leading" whitespace - while (Character.isWhitespace(ch)) { - ch = seg.previous(); - } - - // Skip the group of letters and/or digits - if (Character.isLetterOrDigit(ch)) { - do { - ch = seg.previous(); - } while (Character.isLetterOrDigit(ch)); - } - - // Skip groups of "anything else" (operators, etc.). - else if (!Character.isWhitespace(ch)) { - do { - ch = seg.previous(); - } while (ch!=Segment.DONE && - !(Character.isLetterOrDigit(ch) || - Character.isWhitespace(ch))); - } - - offs -= seg.getEndIndex() - seg.getIndex(); - if (ch!=Segment.DONE) { - offs++; - } - - return offs; - - } - - } - - - /** - * Selects the word around the caret. This class is here to better - * handle selecting "words" in programming languages. - */ - public static class SelectWordAction - extends RTextAreaEditorKit.SelectWordAction { - - @Override - protected void createActions() { - start = new BeginWordAction("pigdog", false); - end = new EndWordAction("pigdog", true); - } - - } - - - /** - * Action that toggles whether the currently selected lines are - * commented. - */ - public static class ToggleCommentAction extends RecordableTextAction { - - public ToggleCommentAction() { - super(rstaToggleCommentAction); - } - - @Override - public void actionPerformedImpl(ActionEvent e, RTextArea textArea) { - - if (!textArea.isEditable() || !textArea.isEnabled()) { - UIManager.getLookAndFeel().provideErrorFeedback(textArea); - return; - } - - RSyntaxDocument doc = (RSyntaxDocument)textArea.getDocument(); - String[] startEnd = doc.getLineCommentStartAndEnd(); - - if (startEnd==null) { - UIManager.getLookAndFeel().provideErrorFeedback(textArea); - return; - } - - Element map = doc.getDefaultRootElement(); - Caret c = textArea.getCaret(); - int dot = c.getDot(); - int mark = c.getMark(); - int line1 = map.getElementIndex(dot); - int line2 = map.getElementIndex(mark); - int start = Math.min(line1, line2); - int end = Math.max(line1, line2); - - // Don't toggle comment on last line if there is no - // text selected on it. - if (start!=end) { - Element elem = map.getElement(end); - if (Math.max(dot, mark)==elem.getStartOffset()) { - end--; - } - } - - textArea.beginAtomicEdit(); - try { - boolean add = getDoAdd(doc,map, start,end, startEnd); - for (line1=start; line1<=end; line1++) { - Element elem = map.getElement(line1); - handleToggleComment(elem, doc, startEnd, add); - } - } catch (BadLocationException ble) { - ble.printStackTrace(); - UIManager.getLookAndFeel().provideErrorFeedback(textArea); - } finally { - textArea.endAtomicEdit(); - } - - } - - private boolean getDoAdd(Document doc, Element map, int startLine, - int endLine, String[] startEnd) - throws BadLocationException { - boolean doAdd = false; - for (int i=startLine; i<=endLine; i++) { - Element elem = map.getElement(i); - int start = elem.getStartOffset(); - String t = doc.getText(start, elem.getEndOffset()-start-1); - if (!t.startsWith(startEnd[0]) || - (startEnd[1]!=null && !t.endsWith(startEnd[1]))) { - doAdd = true; - break; - } - } - return doAdd; - } - - private void handleToggleComment(Element elem, Document doc, - String[] startEnd, boolean add) throws BadLocationException { - int start = elem.getStartOffset(); - int end = elem.getEndOffset() - 1; - if (add) { - doc.insertString(start, startEnd[0], null); - if (startEnd[1]!=null) { - doc.insertString(end+startEnd[0].length(), startEnd[1], - null); - } - } - else { - doc.remove(start, startEnd[0].length()); - if (startEnd[1]!=null) { - int temp = startEnd[1].length(); - doc.remove(end-startEnd[0].length()-temp, temp); - } - } - } - - @Override - public final String getMacroID() { - return rstaToggleCommentAction; - } - - } - - - /** - * Toggles the fold at the current caret position or line. - */ - public static class ToggleCurrentFoldAction extends FoldRelatedAction { - - private static final long serialVersionUID = 1L; - - public ToggleCurrentFoldAction() { - super(rstaToggleCurrentFoldAction); - setProperties("Action.ToggleCurrentFold"); - } - - public ToggleCurrentFoldAction(String name, Icon icon, String desc, - Integer mnemonic, KeyStroke accelerator) { - super(name, icon, desc, mnemonic, accelerator); - } - - @Override - public void actionPerformedImpl(ActionEvent e, RTextArea textArea) { - RSyntaxTextArea rsta = (RSyntaxTextArea)textArea; - if (rsta.isCodeFoldingEnabled()) { - Fold fold = getClosestFold(rsta); - if (fold!=null) { - fold.toggleCollapsedState(); - } - possiblyRepaintGutter(textArea); - } - else { - UIManager.getLookAndFeel().provideErrorFeedback(rsta); - } - } - - @Override - public final String getMacroID() { - return rstaToggleCurrentFoldAction; - } - - } + private static final long serialVersionUID = 1L; + + public static final String rstaCloseCurlyBraceAction = "RSTA.CloseCurlyBraceAction"; + public static final String rstaCloseMarkupTagAction = "RSTA.CloseMarkupTagAction"; + public static final String rstaCollapseAllFoldsAction = "RSTA.CollapseAllFoldsAction"; + public static final String rstaCollapseAllCommentFoldsAction = "RSTA.CollapseAllCommentFoldsAction"; + public static final String rstaCollapseFoldAction = "RSTA.CollapseFoldAction"; + public static final String rstaCopyAsRtfAction = "RSTA.CopyAsRtfAction"; + public static final String rstaDecreaseIndentAction = "RSTA.DecreaseIndentAction"; + public static final String rstaExpandAllFoldsAction = "RSTA.ExpandAllFoldsAction"; + public static final String rstaExpandFoldAction = "RSTA.ExpandFoldAction"; + public static final String rstaGoToMatchingBracketAction = "RSTA.GoToMatchingBracketAction"; + public static final String rstaPossiblyInsertTemplateAction = "RSTA.TemplateAction"; + public static final String rstaToggleCommentAction = "RSTA.ToggleCommentAction"; + public static final String rstaToggleCurrentFoldAction = "RSTA.ToggleCurrentFoldAction"; + + /** + * The actions that RSyntaxTextAreaEditorKit adds to those of + * RTextAreaEditorKit. + */ + private static final Action[] defaultActions = { + new CloseCurlyBraceAction(), + new CloseMarkupTagAction(), + new BeginWordAction(beginWordAction, false), + new BeginWordAction(selectionBeginWordAction, true), + new ChangeFoldStateAction(rstaCollapseFoldAction, true), + new ChangeFoldStateAction(rstaExpandFoldAction, false), + new CollapseAllFoldsAction(), + new CopyAsRtfAction(), + //new DecreaseFontSizeAction(), + new DecreaseIndentAction(), + new DeletePrevWordAction(), + new EndAction(endAction, false), + new EndAction(selectionEndAction, true), + new EndWordAction(endWordAction, false), + new EndWordAction(endWordAction, true), + new ExpandAllFoldsAction(), + new GoToMatchingBracketAction(), + new InsertBreakAction(), + //new IncreaseFontSizeAction(), + new InsertTabAction(), + new NextWordAction(nextWordAction, false), + new NextWordAction(selectionNextWordAction, true), + new PossiblyInsertTemplateAction(), + new PreviousWordAction(previousWordAction, false), + new PreviousWordAction(selectionPreviousWordAction, true), + new SelectWordAction(), + new ToggleCommentAction(), + }; + + + /** + * Constructor. + */ + public RSyntaxTextAreaEditorKit() { + } + + + /** + * Returns the default document used by RSyntaxTextAreas. + * + * @return The document. + */ + @Override + public Document createDefaultDocument() { + return new RSyntaxDocument(SyntaxConstants.SYNTAX_STYLE_NONE); + } + + + /** + * Overridden to return a row header that is aware of folding. + * + * @param textArea The text area. + * @return The icon row header. + */ + @Override + public IconRowHeader createIconRowHeader(RTextArea textArea) { + return new FoldingAwareIconRowHeader((RSyntaxTextArea) textArea); + } + + + /** + * Fetches the set of commands that can be used + * on a text component that is using a model and + * view produced by this kit. + * + * @return the command list + */ + @Override + public Action[] getActions() { + return TextAction.augmentList(super.getActions(), + RSyntaxTextAreaEditorKit.defaultActions); + } + + + /** + * Returns localized text for an action. There's definitely a better place + * for this functionality. + * + * @param key The key into the action resource bundle. + * @return The localized text. + */ + public static String getString(String key) { + return com.fr.design.i18n.Toolkit.i18nText(key); + } + + + /** + * Positions the caret at the beginning of the word. This class is here + * to better handle finding the "beginning of the word" for programming + * languages. + */ + protected static class BeginWordAction + extends RTextAreaEditorKit.BeginWordAction { + + private Segment seg; + + protected BeginWordAction(String name, boolean select) { + super(name, select); + seg = new Segment(); + } + + @Override + protected int getWordStart(RTextArea textArea, int offs) + throws BadLocationException { + + if (offs == 0) { + return offs; + } + + RSyntaxDocument doc = (RSyntaxDocument) textArea.getDocument(); + int line = textArea.getLineOfOffset(offs); + int start = textArea.getLineStartOffset(line); + if (offs == start) { + return start; + } + int end = textArea.getLineEndOffset(line); + if (line != textArea.getLineCount() - 1) { + end--; + } + doc.getText(start, end - start, seg); + + // Determine the "type" of char at offs - lower case, upper case, + // whitespace or other. We take special care here as we're starting + // in the middle of the Segment to check whether we're already at + // the "beginning" of a word. + int firstIndex = seg.getBeginIndex() + (offs - start) - 1; + seg.setIndex(firstIndex); + char ch = seg.current(); + char nextCh = offs == end ? 0 : seg.array[seg.getIndex() + 1]; + + // The "word" is a group of letters and/or digits + if (Character.isLetterOrDigit(ch)) { + if (offs != end && !Character.isLetterOrDigit(nextCh)) { + return offs; + } + do { + ch = seg.previous(); + } while (Character.isLetterOrDigit(ch)); + } + + // The "word" is whitespace + else if (Character.isWhitespace(ch)) { + if (offs != end && !Character.isWhitespace(nextCh)) { + return offs; + } + do { + ch = seg.previous(); + } while (Character.isWhitespace(ch)); + } + + // Otherwise, the "word" a single "something else" char (operator, + // etc.). + + offs -= firstIndex - seg.getIndex() + 1;//seg.getEndIndex() - seg.getIndex(); + if (ch != Segment.DONE && nextCh != '\n') { + offs++; + } + + return offs; + + } + + } + + + /** + * Expands or collapses the nearest fold. + */ + public static class ChangeFoldStateAction extends FoldRelatedAction { + + private boolean collapse; + + public ChangeFoldStateAction(String name, boolean collapse) { + super(name); + this.collapse = collapse; + } + + public ChangeFoldStateAction(String name, Icon icon, + String desc, Integer mnemonic, KeyStroke accelerator) { + super(name, icon, desc, mnemonic, accelerator); + } + + @Override + public void actionPerformedImpl(ActionEvent e, RTextArea textArea) { + RSyntaxTextArea rsta = (RSyntaxTextArea) textArea; + if (rsta.isCodeFoldingEnabled()) { + Fold fold = getClosestFold(rsta); + if (fold != null) { + fold.setCollapsed(collapse); + } + possiblyRepaintGutter(textArea); + } else { + UIManager.getLookAndFeel().provideErrorFeedback(rsta); + } + } + + @Override + public final String getMacroID() { + return getName(); + } + + } + + + /** + * Action that (optionally) aligns a closing curly brace with the line + * containing its matching opening curly brace. + */ + public static class CloseCurlyBraceAction extends RecordableTextAction { + + private static final long serialVersionUID = 1L; + + private Point bracketInfo; + private Segment seg; + + public CloseCurlyBraceAction() { + super(rstaCloseCurlyBraceAction); + seg = new Segment(); + } + + @Override + public void actionPerformedImpl(ActionEvent e, RTextArea textArea) { + + RSyntaxTextArea rsta = (RSyntaxTextArea) textArea; + RSyntaxDocument doc = (RSyntaxDocument) rsta.getDocument(); + boolean alignCurlyBraces = rsta.isAutoIndentEnabled() && + doc.getCurlyBracesDenoteCodeBlocks(); + + if (alignCurlyBraces) { + textArea.beginAtomicEdit(); + } + + try { + + textArea.replaceSelection("}"); + + // If the user wants to align curly braces... + if (alignCurlyBraces) { + + Element root = doc.getDefaultRootElement(); + int dot = rsta.getCaretPosition() - 1; // Start before '{' + int line = root.getElementIndex(dot); + Element elem = root.getElement(line); + int start = elem.getStartOffset(); + + // Get the current line's text up to the '}' entered. + try { + doc.getText(start, dot - start, seg); + } catch (BadLocationException ble) { // Never happens + ble.printStackTrace(); + return; + } + + // Only attempt to align if there's only whitespace up to + // the '}' entered. + for (int i = 0; i < seg.count; i++) { + char ch = seg.array[seg.offset + i]; + if (!Character.isWhitespace(ch)) { + return; + } + } + + // Locate the matching '{' bracket, and replace the leading + // whitespace for the '}' to match that of the '{' char's line. + bracketInfo = RSyntaxUtilities.getMatchingBracketPosition( + rsta, bracketInfo); + if (bracketInfo.y > -1) { + try { + String ws = RSyntaxUtilities.getLeadingWhitespace( + doc, bracketInfo.y); + rsta.replaceRange(ws, start, dot); + } catch (BadLocationException ble) { + ble.printStackTrace(); + return; + } + } + + } + + } finally { + if (alignCurlyBraces) { + textArea.endAtomicEdit(); + } + } + + } + + @Override + public final String getMacroID() { + return rstaCloseCurlyBraceAction; + } + + } + + + /** + * (Optionally) completes a closing markup tag. + */ + public static class CloseMarkupTagAction extends RecordableTextAction { + + private static final long serialVersionUID = 1L; + + public CloseMarkupTagAction() { + super(rstaCloseMarkupTagAction); + } + + @Override + public void actionPerformedImpl(ActionEvent e, RTextArea textArea) { + + if (!textArea.isEditable() || !textArea.isEnabled()) { + UIManager.getLookAndFeel().provideErrorFeedback(textArea); + return; + } + + RSyntaxTextArea rsta = (RSyntaxTextArea) textArea; + RSyntaxDocument doc = (RSyntaxDocument) rsta.getDocument(); + + Caret c = rsta.getCaret(); + boolean selection = c.getDot() != c.getMark(); + rsta.replaceSelection("/"); + + // Don't automatically complete a tag if there was a selection + int dot = c.getDot(); + + if (doc.getLanguageIsMarkup() && + doc.getCompleteMarkupCloseTags() && + !selection && rsta.getCloseMarkupTags() && dot > 1) { + + try { + + // Check actual char before token type, since it's quicker + char ch = doc.charAt(dot - 2); + if (ch == '<' || ch == '[') { + + Token t = doc.getTokenListForLine( + rsta.getCaretLineNumber()); + t = RSyntaxUtilities.getTokenAtOffset(t, dot - 1); + if (t != null && t.getType() == Token.MARKUP_TAG_DELIMITER) { + //System.out.println("Huzzah - closing tag!"); + String tagName = discoverTagName(doc, dot); + if (tagName != null) { + rsta.replaceSelection(tagName + (char) (ch + 2)); + } + } + + } + + } catch (BadLocationException ble) { // Never happens + UIManager.getLookAndFeel().provideErrorFeedback(rsta); + ble.printStackTrace(); + } + + } + + } + + /** + * Discovers the name of the tag being closed. Assumes standard + * SGML-style markup tags. + * + * @param doc The document to parse. + * @param dot The location of the caret. This should be right after + * the start of a closing tag token (e.g. "</" + * or "[" in the case of BBCode). + * @return The name of the tag to close, or null if it + * could not be determined. + */ + private String discoverTagName(RSyntaxDocument doc, int dot) { + + Stack stack = new Stack(); + + Element root = doc.getDefaultRootElement(); + int curLine = root.getElementIndex(dot); + + for (int i = 0; i <= curLine; i++) { + + Token t = doc.getTokenListForLine(i); + while (t != null && t.isPaintable()) { + + if (t.getType() == Token.MARKUP_TAG_DELIMITER) { + if (t.isSingleChar('<') || t.isSingleChar('[')) { + t = t.getNextToken(); + while (t != null && t.isPaintable()) { + if (t.getType() == Token.MARKUP_TAG_NAME || + // Being lenient here and also checking + // for attributes, in case they + // (incorrectly) have whitespace between + // the '<' char and the element name. + t.getType() == Token.MARKUP_TAG_ATTRIBUTE) { + stack.push(t.getLexeme()); + break; + } + t = t.getNextToken(); + } + } else if (t.length() == 2 && t.charAt(0) == '/' && + (t.charAt(1) == '>' || + t.charAt(1) == ']')) { + if (!stack.isEmpty()) { // Always true for valid XML + stack.pop(); + } + } else if (t.length() == 2 && + (t.charAt(0) == '<' || t.charAt(0) == '[') && + t.charAt(1) == '/') { + String tagName = null; + if (!stack.isEmpty()) { // Always true for valid XML + tagName = stack.pop(); + } + if (t.getEndOffset() >= dot) { + return tagName; + } + } + } + + t = Objects.requireNonNull(t).getNextToken(); + + } + + } + + return null; // Should never happen + + } + + @Override + public String getMacroID() { + return getName(); + } + + } + + + /** + * Collapses all comment folds. + */ + public static class CollapseAllCommentFoldsAction extends FoldRelatedAction { + + private static final long serialVersionUID = 1L; + + public CollapseAllCommentFoldsAction() { + super(rstaCollapseAllCommentFoldsAction); + setProperties("Action.CollapseCommentFolds"); + } + + public CollapseAllCommentFoldsAction(String name, Icon icon, + String desc, Integer mnemonic, KeyStroke accelerator) { + super(name, icon, desc, mnemonic, accelerator); + } + + @Override + public void actionPerformedImpl(ActionEvent e, RTextArea textArea) { + RSyntaxTextArea rsta = (RSyntaxTextArea) textArea; + if (rsta.isCodeFoldingEnabled()) { + FoldCollapser collapser = new FoldCollapser(); + collapser.collapseFolds(rsta.getFoldManager()); + possiblyRepaintGutter(textArea); + } else { + UIManager.getLookAndFeel().provideErrorFeedback(rsta); + } + } + + @Override + public final String getMacroID() { + return rstaCollapseAllCommentFoldsAction; + } + + } + + + /** + * Collapses all folds. + */ + public static class CollapseAllFoldsAction extends FoldRelatedAction { + + private static final long serialVersionUID = 1L; + + public CollapseAllFoldsAction() { + this(false); + } + + public CollapseAllFoldsAction(boolean localizedName) { + super(rstaCollapseAllFoldsAction); + if (localizedName) { + setProperties("Action.CollapseAllFolds"); + } + } + + public CollapseAllFoldsAction(String name, Icon icon, + String desc, Integer mnemonic, KeyStroke accelerator) { + super(name, icon, desc, mnemonic, accelerator); + } + + @Override + public void actionPerformedImpl(ActionEvent e, RTextArea textArea) { + RSyntaxTextArea rsta = (RSyntaxTextArea) textArea; + if (rsta.isCodeFoldingEnabled()) { + FoldCollapser collapser = new FoldCollapser() { + @Override + public boolean getShouldCollapse(Fold fold) { + return true; + } + }; + collapser.collapseFolds(rsta.getFoldManager()); + possiblyRepaintGutter(textArea); + } else { + UIManager.getLookAndFeel().provideErrorFeedback(rsta); + } + } + + @Override + public final String getMacroID() { + return rstaCollapseAllFoldsAction; + } + + } + + + /** + * Action for copying text as RTF. + */ + public static class CopyAsRtfAction extends RecordableTextAction { + + private static final long serialVersionUID = 1L; + + public CopyAsRtfAction() { + super(rstaCopyAsRtfAction); + } + + public CopyAsRtfAction(String name, Icon icon, String desc, + Integer mnemonic, KeyStroke accelerator) { + super(name, icon, desc, mnemonic, accelerator); + } + + @Override + public void actionPerformedImpl(ActionEvent e, RTextArea textArea) { + ((RSyntaxTextArea) textArea).copyAsRtf(); + textArea.requestFocusInWindow(); + } + + @Override + public final String getMacroID() { + return getName(); + } + + } + + + /** + * Action for decreasing the font size of all fonts in the text area. + */ + public static class DecreaseFontSizeAction + extends RTextAreaEditorKit.DecreaseFontSizeAction { + + private static final long serialVersionUID = 1L; + + public DecreaseFontSizeAction() { + super(); + } + + public DecreaseFontSizeAction(String name, Icon icon, String desc, + Integer mnemonic, KeyStroke accelerator) { + super(name, icon, desc, mnemonic, accelerator); + } + + @Override + public void actionPerformedImpl(ActionEvent e, RTextArea textArea) { + + RSyntaxTextArea rsta = (RSyntaxTextArea) textArea; + SyntaxScheme scheme = rsta.getSyntaxScheme(); + + // All we need to do is update all of the fonts in syntax + // schemes, then call setSyntaxHighlightingColorScheme with the + // same scheme already being used. This relies on the fact that + // that method does not check whether the new scheme is different + // from the old scheme before updating. + + boolean changed = false; + int count = scheme.getStyleCount(); + for (int i = 0; i < count; i++) { + Style ss = scheme.getStyle(i); + if (ss != null) { + Font font = ss.font; + if (font != null) { + float oldSize = font.getSize2D(); + float newSize = oldSize - decreaseAmount; + if (newSize >= MINIMUM_SIZE) { + // Shrink by decreaseAmount. + ss.font = font.deriveFont(newSize); + changed = true; + } else if (oldSize > MINIMUM_SIZE) { + // Can't shrink by full decreaseAmount, but + // can shrink a little bit. + ss.font = font.deriveFont(MINIMUM_SIZE); + changed = true; + } + } + } + } + + // Do the text area's font also. + Font font = rsta.getFont(); + float oldSize = font.getSize2D(); + float newSize = oldSize - decreaseAmount; + if (newSize >= MINIMUM_SIZE) { + // Shrink by decreaseAmount. + rsta.setFont(font.deriveFont(newSize)); + changed = true; + } else if (oldSize > MINIMUM_SIZE) { + // Can't shrink by full decreaseAmount, but + // can shrink a little bit. + rsta.setFont(font.deriveFont(MINIMUM_SIZE)); + changed = true; + } + + // If we updated at least one font, update the screen. If + // all of the fonts were already the minimum size, beep. + if (changed) { + rsta.setSyntaxScheme(scheme); + // NOTE: This is a hack to get an encompassing + // RTextScrollPane to repaint its line numbers to account + // for a change in line height due to a font change. I'm + // not sure why we need to do this here but not when we + // change the syntax highlighting color scheme via the + // Options dialog... setSyntaxHighlightingColorScheme() + // calls revalidate() which won't repaint the scroll pane + // if scrollbars don't change, which is why we need this. + Component parent = rsta.getParent(); + if (parent instanceof javax.swing.JViewport) { + parent = parent.getParent(); + if (parent instanceof JScrollPane) { + parent.repaint(); + } + } + } else { + UIManager.getLookAndFeel().provideErrorFeedback(rsta); + } + + } + + } + + + /** + * Action for when un-indenting lines (either the current line if there is + * selection, or all selected lines if there is one). + */ + public static class DecreaseIndentAction extends RecordableTextAction { + + private static final long serialVersionUID = 1L; + + private Segment s; + + public DecreaseIndentAction() { + this(rstaDecreaseIndentAction); + } + + public DecreaseIndentAction(String name) { + super(name); + s = new Segment(); + } + + @Override + public void actionPerformedImpl(ActionEvent e, RTextArea textArea) { + + if (!textArea.isEditable() || !textArea.isEnabled()) { + UIManager.getLookAndFeel().provideErrorFeedback(textArea); + return; + } + + Document document = textArea.getDocument(); + Element map = document.getDefaultRootElement(); + Caret c = textArea.getCaret(); + int dot = c.getDot(); + int mark = c.getMark(); + int line1 = map.getElementIndex(dot); + int tabSize = textArea.getTabSize(); + + // If there is a selection, indent all lines in the selection. + // Otherwise, indent the line the caret is on. + if (dot != mark) { + // Note that we cheaply reuse variables here, so don't + // take their names to mean what they are. + int line2 = map.getElementIndex(mark); + dot = Math.min(line1, line2); + mark = Math.max(line1, line2); + Element elem; + try { + for (line1 = dot; line1 < mark; line1++) { + elem = map.getElement(line1); + handleDecreaseIndent(elem, document, tabSize); + } + // Don't do the last line if the caret is at its + // beginning. We must call getDot() again and not just + // use 'dot' as the caret's position may have changed + // due to the insertion of the tabs above. + elem = map.getElement(mark); + int start = elem.getStartOffset(); + if (Math.max(c.getDot(), c.getMark()) != start) { + handleDecreaseIndent(elem, document, tabSize); + } + } catch (BadLocationException ble) { + ble.printStackTrace(); + UIManager.getLookAndFeel(). + provideErrorFeedback(textArea); + } + } else { + Element elem = map.getElement(line1); + try { + handleDecreaseIndent(elem, document, tabSize); + } catch (BadLocationException ble) { + ble.printStackTrace(); + UIManager.getLookAndFeel(). + provideErrorFeedback(textArea); + } + } + + } + + @Override + public final String getMacroID() { + return rstaDecreaseIndentAction; + } + + /** + * Actually does the "de-indentation." This method finds where the + * given element's leading whitespace ends, then, if there is indeed + * leading whitespace, removes either the last char in it (if it is a + * tab), or removes up to the number of spaces equal to a tab in the + * specified document (i.e., if the tab size was 5 and there were 3 + * spaces at the end of the leading whitespace, the three will be + * removed; if there were 8 spaces, only the first 5 would be + * removed). + * + * @param elem The element to "de-indent." + * @param doc The document containing the specified element. + * @param tabSize The size of a tab, in spaces. + */ + private final void handleDecreaseIndent(Element elem, Document doc, + int tabSize) + throws BadLocationException { + int start = elem.getStartOffset(); + int end = elem.getEndOffset() - 1; // Why always true?? + doc.getText(start, end - start, s); + int i = s.offset; + end = i + s.count; + if (end > i) { + // If the first character is a tab, remove it. + if (s.array[i] == '\t') { + doc.remove(start, 1); + } + // Otherwise, see if the first character is a space. If it + // is, remove all contiguous whitespaces at the beginning of + // this line, up to the tab size. + else if (s.array[i] == ' ') { + i++; + int toRemove = 1; + while (i < end && s.array[i] == ' ' && toRemove < tabSize) { + i++; + toRemove++; + } + doc.remove(start, toRemove); + } + } + } + + } + + + /** + * Deletes the previous word, but differentiates symbols from "words" to + * match the behavior of code editors. + */ + public static class DeletePrevWordAction + extends RTextAreaEditorKit.DeletePrevWordAction { + + private Segment seg = new Segment(); + + @Override + protected int getPreviousWordStart(RTextArea textArea, int offs) + throws BadLocationException { + + if (offs == 0) { + return offs; + } + + RSyntaxDocument doc = (RSyntaxDocument) textArea.getDocument(); + int line = textArea.getLineOfOffset(offs); + int start = textArea.getLineStartOffset(line); + if (offs == start) { + return start - 1; // Just delete the newline + } + int end = textArea.getLineEndOffset(line); + if (line != textArea.getLineCount() - 1) { + end--; + } + doc.getText(start, end - start, seg); + + // Determine the "type" of char at offs - lower case, upper case, + // whitespace or other. We take special care here as we're starting + // in the middle of the Segment to check whether we're already at + // the "beginning" of a word. + int firstIndex = seg.getBeginIndex() + (offs - start) - 1; + seg.setIndex(firstIndex); + char ch = seg.current(); + + // Always strip off whitespace first + if (Character.isWhitespace(ch)) { + do { + ch = seg.previous(); + } while (Character.isWhitespace(ch)); + } + + // The "word" is a group of letters and/or digits + if (Character.isLetterOrDigit(ch)) { + do { + ch = seg.previous(); + } while (Character.isLetterOrDigit(ch)); + } + + // The "word" is a series of symbols. + else { + while (!Character.isWhitespace(ch) && + !Character.isLetterOrDigit(ch) + && ch != Segment.DONE) { + ch = seg.previous(); + } + } + + if (ch == Segment.DONE) { + return start; // Removed last "token" of the line + } + offs -= firstIndex - seg.getIndex(); + return offs; + + } + + } + + + /** + * Moves the caret to the end of the document, taking into account code + * folding. + */ + public static class EndAction extends RTextAreaEditorKit.EndAction { + + public EndAction(String name, boolean select) { + super(name, select); + } + + @Override + protected int getVisibleEnd(RTextArea textArea) { + RSyntaxTextArea rsta = (RSyntaxTextArea) textArea; + return rsta.getLastVisibleOffset(); + } + + } + + + /** + * Positions the caret at the end of the word. This class is here to + * better handle finding the "end of the word" in programming languages. + */ + protected static class EndWordAction + extends RTextAreaEditorKit.EndWordAction { + + private Segment seg; + + protected EndWordAction(String name, boolean select) { + super(name, select); + seg = new Segment(); + } + + @Override + protected int getWordEnd(RTextArea textArea, int offs) + throws BadLocationException { + + RSyntaxDocument doc = (RSyntaxDocument) textArea.getDocument(); + if (offs == doc.getLength()) { + return offs; + } + + int line = textArea.getLineOfOffset(offs); + int end = textArea.getLineEndOffset(line); + if (line != textArea.getLineCount() - 1) { + end--; // Hide newline + } + if (offs == end) { + return end; + } + doc.getText(offs, end - offs, seg); + + // Determine the "type" of char at offs - letter/digit, + // whitespace or other + char ch = seg.first(); + + // The "word" is a group of letters and/or digits + if (Character.isLetterOrDigit(ch)) { + do { + ch = seg.next(); + } while (Character.isLetterOrDigit(ch)); + } + + // The "word" is whitespace. + else if (Character.isWhitespace(ch)) { + + do { + ch = seg.next(); + } while (Character.isWhitespace(ch)); + } + + // Otherwise, the "word" is a single character of some other type + // (operator, etc.). + + offs += seg.getIndex() - seg.getBeginIndex(); + return offs; + + } + + } + + + /** + * Expands all folds. + */ + public static class ExpandAllFoldsAction extends FoldRelatedAction { + + private static final long serialVersionUID = 1L; + + public ExpandAllFoldsAction() { + this(false); + } + + public ExpandAllFoldsAction(boolean localizedName) { + super(rstaExpandAllFoldsAction); + if (localizedName) { + setProperties("Action.ExpandAllFolds"); + } + } + + public ExpandAllFoldsAction(String name, Icon icon, + String desc, Integer mnemonic, KeyStroke accelerator) { + super(name, icon, desc, mnemonic, accelerator); + } + + @Override + public void actionPerformedImpl(ActionEvent e, RTextArea textArea) { + RSyntaxTextArea rsta = (RSyntaxTextArea) textArea; + if (rsta.isCodeFoldingEnabled()) { + FoldManager fm = rsta.getFoldManager(); + for (int i = 0; i < fm.getFoldCount(); i++) { + expand(fm.getFold(i)); + } + possiblyRepaintGutter(rsta); + } else { + UIManager.getLookAndFeel().provideErrorFeedback(rsta); + } + } + + private void expand(Fold fold) { + fold.setCollapsed(false); + for (int i = 0; i < fold.getChildCount(); i++) { + expand(fold.getChild(i)); + } + } + + @Override + public final String getMacroID() { + return rstaExpandAllFoldsAction; + } + + } + + + /** + * Base class for folding-related actions. + */ + static abstract class FoldRelatedAction extends RecordableTextAction { + + public FoldRelatedAction(String name) { + super(name); + } + + public FoldRelatedAction(String name, Icon icon, + String desc, Integer mnemonic, KeyStroke accelerator) { + super(name, icon, desc, mnemonic, accelerator); + } + + protected Fold getClosestFold(RSyntaxTextArea textArea) { + int offs = textArea.getCaretPosition(); + int line = textArea.getCaretLineNumber(); + FoldManager fm = textArea.getFoldManager(); + Fold fold = fm.getFoldForLine(line); + if (fold == null) { + fold = fm.getDeepestOpenFoldContaining(offs); + } + return fold; + } + + /** + * Repaints the gutter in a text area's scroll pane, if necessary. + * + * @param textArea The text area. + */ + protected void possiblyRepaintGutter(RTextArea textArea) { + Gutter gutter = RSyntaxUtilities.getGutter(textArea); + if (gutter != null) { + gutter.repaint(); + } + } + + } + + + /** + * Action for moving the caret to the "matching bracket" of the bracket + * at the caret position (either before or after). + */ + public static class GoToMatchingBracketAction + extends RecordableTextAction { + + private static final long serialVersionUID = 1L; + + private Point bracketInfo; + + public GoToMatchingBracketAction() { + super(rstaGoToMatchingBracketAction); + } + + public GoToMatchingBracketAction(String name, Icon icon, String desc, + Integer mnemonic, KeyStroke accelerator) { + super(name, icon, desc, mnemonic, accelerator); + } + + @Override + public void actionPerformedImpl(ActionEvent e, RTextArea textArea) { + RSyntaxTextArea rsta = (RSyntaxTextArea) textArea; + bracketInfo = RSyntaxUtilities.getMatchingBracketPosition(rsta, + bracketInfo); + if (bracketInfo.y > -1) { + // Go to the position AFTER the bracket so the previous + // bracket (which we were just on) is highlighted. + rsta.setCaretPosition(bracketInfo.y + 1); + } else { + UIManager.getLookAndFeel().provideErrorFeedback(rsta); + } + } + + @Override + public final String getMacroID() { + return rstaGoToMatchingBracketAction; + } + + } + + + /** + * Action for increasing the font size of all fonts in the text area. + */ + public static class IncreaseFontSizeAction + extends RTextAreaEditorKit.IncreaseFontSizeAction { + + private static final long serialVersionUID = 1L; + + public IncreaseFontSizeAction() { + super(); + } + + public IncreaseFontSizeAction(String name, Icon icon, String desc, + Integer mnemonic, KeyStroke accelerator) { + super(name, icon, desc, mnemonic, accelerator); + } + + @Override + public void actionPerformedImpl(ActionEvent e, RTextArea textArea) { + + RSyntaxTextArea rsta = (RSyntaxTextArea) textArea; + SyntaxScheme scheme = rsta.getSyntaxScheme(); + + // All we need to do is update all of the fonts in syntax + // schemes, then call setSyntaxHighlightingColorScheme with the + // same scheme already being used. This relies on the fact that + // that method does not check whether the new scheme is different + // from the old scheme before updating. + + boolean changed = false; + int count = scheme.getStyleCount(); + for (int i = 0; i < count; i++) { + Style ss = scheme.getStyle(i); + if (ss != null) { + Font font = ss.font; + if (font != null) { + float oldSize = font.getSize2D(); + float newSize = oldSize + increaseAmount; + if (newSize <= MAXIMUM_SIZE) { + // Grow by increaseAmount. + ss.font = font.deriveFont(newSize); + changed = true; + } else if (oldSize < MAXIMUM_SIZE) { + // Can't grow by full increaseAmount, but + // can grow a little bit. + ss.font = font.deriveFont(MAXIMUM_SIZE); + changed = true; + } + } + } + } + + // Do the text area's font also. + Font font = rsta.getFont(); + float oldSize = font.getSize2D(); + float newSize = oldSize + increaseAmount; + if (newSize <= MAXIMUM_SIZE) { + // Grow by increaseAmount. + rsta.setFont(font.deriveFont(newSize)); + changed = true; + } else if (oldSize < MAXIMUM_SIZE) { + // Can't grow by full increaseAmount, but + // can grow a little bit. + rsta.setFont(font.deriveFont(MAXIMUM_SIZE)); + changed = true; + } + + // If we updated at least one font, update the screen. If + // all of the fonts were already the minimum size, beep. + if (changed) { + rsta.setSyntaxScheme(scheme); + // NOTE: This is a hack to get an encompassing + // RTextScrollPane to repaint its line numbers to account + // for a change in line height due to a font change. I'm + // not sure why we need to do this here but not when we + // change the syntax highlighting color scheme via the + // Options dialog... setSyntaxHighlightingColorScheme() + // calls revalidate() which won't repaint the scroll pane + // if scrollbars don't change, which is why we need this. + Component parent = rsta.getParent(); + if (parent instanceof javax.swing.JViewport) { + parent = parent.getParent(); + if (parent instanceof JScrollPane) { + parent.repaint(); + } + } + } else { + UIManager.getLookAndFeel().provideErrorFeedback(rsta); + } + + } + + } + + + /** + * Action for when the user presses the Enter key. This is here so we can + * be smart and "auto-indent" for programming languages. + */ + public static class InsertBreakAction + extends RTextAreaEditorKit.InsertBreakAction { + + private static final long serialVersionUID = 1L; + + @Override + public void actionPerformedImpl(ActionEvent e, RTextArea textArea) { + + if (!textArea.isEditable() || !textArea.isEnabled()) { + UIManager.getLookAndFeel().provideErrorFeedback(textArea); + return; + } + + RSyntaxTextArea sta = (RSyntaxTextArea) textArea; + boolean noSelection = sta.getSelectionStart() == sta.getSelectionEnd(); + + // First, see if this language wants to handle inserting newlines + // itself. + boolean handled = false; + if (noSelection) { + RSyntaxDocument doc = (RSyntaxDocument) sta.getDocument(); + handled = doc.insertBreakSpecialHandling(e); + } + + // If not... + if (!handled) { + handleInsertBreak(sta, noSelection); + } + + } + + /** + * @return The first location in the string past pos that + * is NOT a whitespace char, or -1 if only + * whitespace chars follow pos (or it is the end + * position in the string). + */ + private static final int atEndOfLine(int pos, String s, int sLen) { + for (int i = pos; i < sLen; i++) { + if (!RSyntaxUtilities.isWhitespace(s.charAt(i))) { + return i; + } + } + return -1; + } + + private static final int getOpenBraceCount(RSyntaxDocument doc) { + int openCount = 0; + Element root = doc.getDefaultRootElement(); + int lineCount = root.getElementCount(); + for (int i = 0; i < lineCount; i++) { + Token t = doc.getTokenListForLine(i); + while (t != null && t.isPaintable()) { + if (t.getType() == Token.SEPARATOR && t.length() == 1) { + char ch = t.charAt(0); + if (ch == '{') { + openCount++; + } else if (ch == '}') { + openCount--; + } + } + t = t.getNextToken(); + } + } + return openCount; + } + + /** + * Actually inserts the newline into the document, and auto-indents + * if appropriate. This method can be called by token makers who + * implement a custom action for inserting newlines. + * + * @param textArea + * @param noSelection Whether there is no selection. + */ + protected void handleInsertBreak(RSyntaxTextArea textArea, + boolean noSelection) { + // If we're auto-indenting... + if (noSelection && textArea.isAutoIndentEnabled()) { + insertNewlineWithAutoIndent(textArea); + } else { + textArea.replaceSelection("\n"); + if (noSelection) { + possiblyCloseCurlyBrace(textArea, null); + } + } + } + + private void insertNewlineWithAutoIndent(RSyntaxTextArea sta) { + + try { + + int caretPos = sta.getCaretPosition(); + Document doc = sta.getDocument(); + Element map = doc.getDefaultRootElement(); + int lineNum = map.getElementIndex(caretPos); + Element line = map.getElement(lineNum); + int start = line.getStartOffset(); + int end = line.getEndOffset() - 1; // Why always "-1"? + int len = end - start; + String s = doc.getText(start, len); + + // endWS is the end of the leading whitespace of the + // current line. + String leadingWS = RSyntaxUtilities.getLeadingWhitespace(s); + StringBuilder sb = new StringBuilder("\n"); + sb.append(leadingWS); + + // If there is only whitespace between the caret and + // the EOL, pressing Enter auto-indents the new line to + // the same place as the previous line. + int nonWhitespacePos = atEndOfLine(caretPos - start, s, len); + if (nonWhitespacePos == -1) { + if (leadingWS.length() == len && + sta.isClearWhitespaceLinesEnabled()) { + // If the line was nothing but whitespace, select it + // so its contents get removed. + sta.setSelectionStart(start); + sta.setSelectionEnd(end); + } + sta.replaceSelection(sb.toString()); + } + + // If there is non-whitespace between the caret and the + // EOL, pressing Enter takes that text to the next line + // and auto-indents it to the same place as the last + // line. + else { + sb.append(s.substring(nonWhitespacePos)); + sta.replaceRange(sb.toString(), caretPos, end); + sta.setCaretPosition(caretPos + leadingWS.length() + 1); + } + + // Must do it after everything else, as the "smart indent" + // calculation depends on the previous line's state + // AFTER the Enter press (stuff may have been moved down). + if (sta.getShouldIndentNextLine(lineNum)) { + sta.replaceSelection("\t"); + } + + possiblyCloseCurlyBrace(sta, leadingWS); + + } catch (BadLocationException ble) { // Never happens + sta.replaceSelection("\n"); + ble.printStackTrace(); + } + + } + + private void possiblyCloseCurlyBrace(RSyntaxTextArea textArea, + String leadingWS) { + + RSyntaxDocument doc = (RSyntaxDocument) textArea.getDocument(); + + if (textArea.getCloseCurlyBraces() && + doc.getCurlyBracesDenoteCodeBlocks()) { + + int line = textArea.getCaretLineNumber(); + Token t = doc.getTokenListForLine(line - 1); + t = t.getLastNonCommentNonWhitespaceToken(); + + if (t != null && t.isLeftCurly()) { + + if (getOpenBraceCount(doc) > 0) { + StringBuilder sb = new StringBuilder(); + if (line == textArea.getLineCount() - 1) { + sb.append('\n'); + } + if (leadingWS != null) { + sb.append(leadingWS); + } + sb.append("}\n"); + int dot = textArea.getCaretPosition(); + int end = textArea.getLineEndOffsetOfCurrentLine(); + // Insert at end of line, not at dot: they may have + // pressed Enter in the middle of the line and brought + // some text (though it must be whitespace and/or + // comments) down onto the new line. + textArea.insert(sb.toString(), end); + textArea.setCaretPosition(dot); // Caret may have moved + } + + } + + } + + } + + } + + + /** + * Action for inserting tabs. This is extended to "block indent" a + * group of contiguous lines if they are selected. + */ + public static class InsertTabAction extends RecordableTextAction { + + private static final long serialVersionUID = 1L; + + public InsertTabAction() { + super(insertTabAction); + } + + public InsertTabAction(String name) { + super(name); + } + + @Override + public void actionPerformedImpl(ActionEvent e, RTextArea textArea) { + + if (!textArea.isEditable() || !textArea.isEnabled()) { + UIManager.getLookAndFeel().provideErrorFeedback(textArea); + return; + } + + Document document = textArea.getDocument(); + Element map = document.getDefaultRootElement(); + Caret c = textArea.getCaret(); + int dot = c.getDot(); + int mark = c.getMark(); + int dotLine = map.getElementIndex(dot); + int markLine = map.getElementIndex(mark); + + // If there is a multi-line selection, indent all lines in + // the selection. + if (dotLine != markLine) { + int first = Math.min(dotLine, markLine); + int last = Math.max(dotLine, markLine); + Element elem; + int start; + + // Since we're using Document.insertString(), we must mimic the + // soft tab behavior provided by RTextArea.replaceSelection(). + String replacement = "\t"; + if (textArea.getTabsEmulated()) { + StringBuilder sb = new StringBuilder(); + int temp = textArea.getTabSize(); + for (int i = 0; i < temp; i++) { + sb.append(' '); + } + replacement = sb.toString(); + } + + textArea.beginAtomicEdit(); + try { + for (int i = first; i < last; i++) { + elem = map.getElement(i); + start = elem.getStartOffset(); + document.insertString(start, replacement, null); + } + // Don't do the last line if the caret is at its + // beginning. We must call getDot() again and not just + // use 'dot' as the caret's position may have changed + // due to the insertion of the tabs above. + elem = map.getElement(last); + start = elem.getStartOffset(); + if (Math.max(c.getDot(), c.getMark()) != start) { + document.insertString(start, replacement, null); + } + } catch (BadLocationException ble) { // Never happens. + ble.printStackTrace(); + UIManager.getLookAndFeel(). + provideErrorFeedback(textArea); + } finally { + textArea.endAtomicEdit(); + } + } else { + textArea.replaceSelection("\t"); + } + + } + + @Override + public final String getMacroID() { + return insertTabAction; + } + + } + + + /** + * Action to move the selection and/or caret. Constructor indicates + * direction to use. This class overrides the behavior defined in + * {@link RTextAreaEditorKit} to better skip "words" in source code. + */ + public static class NextWordAction + extends RTextAreaEditorKit.NextWordAction { + + private Segment seg; + + public NextWordAction(String nm, boolean select) { + super(nm, select); + seg = new Segment(); + } + + /** + * Overridden to do better with skipping "words" in code. + */ + @Override + protected int getNextWord(RTextArea textArea, int offs) + throws BadLocationException { + + RSyntaxDocument doc = (RSyntaxDocument) textArea.getDocument(); + if (offs == doc.getLength()) { + return offs; + } + + Element root = doc.getDefaultRootElement(); + int line = root.getElementIndex(offs); + int end = root.getElement(line).getEndOffset() - 1; + if (offs == end) {// If we're already at the end of the line... + RSyntaxTextArea rsta = (RSyntaxTextArea) textArea; + if (rsta.isCodeFoldingEnabled()) { // Start of next visible line + FoldManager fm = rsta.getFoldManager(); + int lineCount = root.getElementCount(); + while (++line < lineCount && fm.isLineHidden(line)) { + ; + } + if (line < lineCount) { // Found a lower visible line + offs = root.getElement(line).getStartOffset(); + } + // No lower visible line - we're already at last visible offset + return offs; + } else { + return offs + 1; // Start of next line. + } + } + doc.getText(offs, end - offs, seg); + + // Determine the "type" of char at offs - letter/digit, + // whitespace or other + char ch = seg.first(); + + // Skip the group of letters and/or digits + if (Character.isLetterOrDigit(ch)) { + do { + ch = seg.next(); + } while (Character.isLetterOrDigit(ch)); + } + + // Skip groups of "anything else" (operators, etc.). + else if (!Character.isWhitespace(ch)) { + do { + ch = seg.next(); + } while (ch != Segment.DONE && + !(Character.isLetterOrDigit(ch) || + Character.isWhitespace(ch))); + } + + // Skip any trailing whitespace + while (Character.isWhitespace(ch)) { + ch = seg.next(); + } + + offs += seg.getIndex() - seg.getBeginIndex(); + return offs; + + } + + } + + + /** + * Action for when the user tries to insert a template (that is, + * they've typed a template ID and pressed the trigger character + * (a space) in an attempt to do the substitution). + */ + public static class PossiblyInsertTemplateAction extends RecordableTextAction { + + private static final long serialVersionUID = 1L; + + public PossiblyInsertTemplateAction() { + super(rstaPossiblyInsertTemplateAction); + } + + @Override + public void actionPerformedImpl(ActionEvent e, RTextArea textArea) { + + if (!textArea.isEditable() || !textArea.isEnabled()) { + return; + } + + RSyntaxTextArea rsta = (RSyntaxTextArea) textArea; + + if (RSyntaxTextArea.getTemplatesEnabled()) { + + Document doc = textArea.getDocument(); + if (doc != null) { + + try { + + CodeTemplateManager manager = RSyntaxTextArea. + getCodeTemplateManager(); + CodeTemplate template = manager == null ? null : + manager.getTemplate(rsta); + + // A non-null template means modify the text to insert! + if (template != null) { + template.invoke(rsta); + } + + // No template - insert default text. This is + // exactly what DefaultKeyTypedAction does. + else { + doDefaultInsert(rsta); + } + + } catch (BadLocationException ble) { + UIManager.getLookAndFeel(). + provideErrorFeedback(textArea); + } + + + } // End of if (doc!=null). + + } // End of if (textArea.getTemplatesEnabled()). + + // If templates aren't enabled, just insert the text as usual. + else { + doDefaultInsert(rsta); + } + + } + + private final void doDefaultInsert(RTextArea textArea) { + // FIXME: We need a way to get the "trigger string" (i.e., + // the text that was just typed); however, the text area's + // template manager might be null (if templates are disabled). + // Also, the manager's trigger string doesn't yet match up with + // that defined in RSyntaxTextAreaEditorKit.java (which is + // hardcoded as a space)... + //String str = manager.getInsertTriggerString(); + //int mod = manager.getInsertTrigger().getModifiers(); + //if (str!=null && str.length()>0 && + // ((mod&ActionEvent.ALT_MASK)==(mod&ActionEvent.CTRL_MASK))) { + // char ch = str.charAt(0); + // if (ch>=0x20 && ch!=0x7F) + // textArea.replaceSelection(str); + //} + textArea.replaceSelection(" "); + } + + @Override + public final String getMacroID() { + return rstaPossiblyInsertTemplateAction; + } + + } + + + /** + * Action to move the selection and/or caret. Constructor indicates + * direction to use. This class overrides the behavior defined in + * {@link RTextAreaEditorKit} to better skip "words" in source code. + */ + public static class PreviousWordAction + extends RTextAreaEditorKit.PreviousWordAction { + + private Segment seg; + + public PreviousWordAction(String nm, boolean select) { + super(nm, select); + seg = new Segment(); + } + + /** + * Overridden to do better with skipping "words" in code. + */ + @Override + protected int getPreviousWord(RTextArea textArea, int offs) + throws BadLocationException { + + if (offs == 0) { + return offs; + } + + RSyntaxDocument doc = (RSyntaxDocument) textArea.getDocument(); + Element root = doc.getDefaultRootElement(); + int line = root.getElementIndex(offs); + int start = root.getElement(line).getStartOffset(); + if (offs == start) {// If we're already at the start of the line... + RSyntaxTextArea rsta = (RSyntaxTextArea) textArea; + if (rsta.isCodeFoldingEnabled()) { // End of next visible line + FoldManager fm = rsta.getFoldManager(); + while (--line >= 0 && fm.isLineHidden(line)) { + ; + } + if (line >= 0) { // Found an earlier visible line + offs = root.getElement(line).getEndOffset() - 1; + } + // No earlier visible line - we must be at offs==0... + return offs; + } else { + return start - 1; // End of previous line. + } + } + doc.getText(start, offs - start, seg); + + // Determine the "type" of char at offs - lower case, upper case, + // whitespace or other + char ch = seg.last(); + + // Skip any "leading" whitespace + while (Character.isWhitespace(ch)) { + ch = seg.previous(); + } + + // Skip the group of letters and/or digits + if (Character.isLetterOrDigit(ch)) { + do { + ch = seg.previous(); + } while (Character.isLetterOrDigit(ch)); + } + + // Skip groups of "anything else" (operators, etc.). + else if (!Character.isWhitespace(ch)) { + do { + ch = seg.previous(); + } while (ch != Segment.DONE && + !(Character.isLetterOrDigit(ch) || + Character.isWhitespace(ch))); + } + + offs -= seg.getEndIndex() - seg.getIndex(); + if (ch != Segment.DONE) { + offs++; + } + + return offs; + + } + + } + + + /** + * Selects the word around the caret. This class is here to better + * handle selecting "words" in programming languages. + */ + public static class SelectWordAction + extends RTextAreaEditorKit.SelectWordAction { + + @Override + protected void createActions() { + start = new BeginWordAction("pigdog", false); + end = new EndWordAction("pigdog", true); + } + + } + + + /** + * Action that toggles whether the currently selected lines are + * commented. + */ + public static class ToggleCommentAction extends RecordableTextAction { + + public ToggleCommentAction() { + super(rstaToggleCommentAction); + } + + @Override + public void actionPerformedImpl(ActionEvent e, RTextArea textArea) { + + if (!textArea.isEditable() || !textArea.isEnabled()) { + UIManager.getLookAndFeel().provideErrorFeedback(textArea); + return; + } + + RSyntaxDocument doc = (RSyntaxDocument) textArea.getDocument(); + String[] startEnd = doc.getLineCommentStartAndEnd(); + + if (startEnd == null) { + UIManager.getLookAndFeel().provideErrorFeedback(textArea); + return; + } + + Element map = doc.getDefaultRootElement(); + Caret c = textArea.getCaret(); + int dot = c.getDot(); + int mark = c.getMark(); + int line1 = map.getElementIndex(dot); + int line2 = map.getElementIndex(mark); + int start = Math.min(line1, line2); + int end = Math.max(line1, line2); + + // Don't toggle comment on last line if there is no + // text selected on it. + if (start != end) { + Element elem = map.getElement(end); + if (Math.max(dot, mark) == elem.getStartOffset()) { + end--; + } + } + + textArea.beginAtomicEdit(); + try { + boolean add = getDoAdd(doc, map, start, end, startEnd); + for (line1 = start; line1 <= end; line1++) { + Element elem = map.getElement(line1); + handleToggleComment(elem, doc, startEnd, add); + } + } catch (BadLocationException ble) { + ble.printStackTrace(); + UIManager.getLookAndFeel().provideErrorFeedback(textArea); + } finally { + textArea.endAtomicEdit(); + } + + } + + private boolean getDoAdd(Document doc, Element map, int startLine, + int endLine, String[] startEnd) + throws BadLocationException { + boolean doAdd = false; + for (int i = startLine; i <= endLine; i++) { + Element elem = map.getElement(i); + int start = elem.getStartOffset(); + String t = doc.getText(start, elem.getEndOffset() - start - 1); + if (!t.startsWith(startEnd[0]) || + (startEnd[1] != null && !t.endsWith(startEnd[1]))) { + doAdd = true; + break; + } + } + return doAdd; + } + + private void handleToggleComment(Element elem, Document doc, + String[] startEnd, boolean add) throws BadLocationException { + int start = elem.getStartOffset(); + int end = elem.getEndOffset() - 1; + if (add) { + doc.insertString(start, startEnd[0], null); + if (startEnd[1] != null) { + doc.insertString(end + startEnd[0].length(), startEnd[1], + null); + } + } else { + doc.remove(start, startEnd[0].length()); + if (startEnd[1] != null) { + int temp = startEnd[1].length(); + doc.remove(end - startEnd[0].length() - temp, temp); + } + } + } + + @Override + public final String getMacroID() { + return rstaToggleCommentAction; + } + + } + + + /** + * Toggles the fold at the current caret position or line. + */ + public static class ToggleCurrentFoldAction extends FoldRelatedAction { + + private static final long serialVersionUID = 1L; + + public ToggleCurrentFoldAction() { + super(rstaToggleCurrentFoldAction); + setProperties("Action.ToggleCurrentFold"); + } + + public ToggleCurrentFoldAction(String name, Icon icon, String desc, + Integer mnemonic, KeyStroke accelerator) { + super(name, icon, desc, mnemonic, accelerator); + } + + @Override + public void actionPerformedImpl(ActionEvent e, RTextArea textArea) { + RSyntaxTextArea rsta = (RSyntaxTextArea) textArea; + if (rsta.isCodeFoldingEnabled()) { + Fold fold = getClosestFold(rsta); + if (fold != null) { + fold.toggleCollapsedState(); + } + possiblyRepaintGutter(textArea); + } else { + UIManager.getLookAndFeel().provideErrorFeedback(rsta); + } + } + + @Override + public final String getMacroID() { + return rstaToggleCurrentFoldAction; + } + + } } \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSyntaxUtilities.java b/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSyntaxUtilities.java index 87be45892..ddb3ddfa3 100644 --- a/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSyntaxUtilities.java +++ b/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSyntaxUtilities.java @@ -3,12 +3,30 @@ * * RSyntaxUtilities.java - Utility methods used by RSyntaxTextArea and its * views. - * + * * This library is distributed under a modified BSD license. See the included * RSyntaxTextArea.License.txt file for details. */ package com.fr.design.gui.syntax.ui.rsyntaxtextarea; +import com.fr.design.gui.syntax.ui.rsyntaxtextarea.TokenUtils.TokenSubList; +import com.fr.design.gui.syntax.ui.rsyntaxtextarea.folding.FoldManager; +import com.fr.design.gui.syntax.ui.rtextarea.Gutter; +import com.fr.design.gui.syntax.ui.rtextarea.RTextArea; +import com.fr.design.gui.syntax.ui.rtextarea.RTextScrollPane; + +import javax.swing.JLabel; +import javax.swing.JViewport; +import javax.swing.SwingConstants; +import javax.swing.UIManager; +import javax.swing.text.BadLocationException; +import javax.swing.text.Caret; +import javax.swing.text.Document; +import javax.swing.text.Element; +import javax.swing.text.Position; +import javax.swing.text.Segment; +import javax.swing.text.TabExpander; +import javax.swing.text.View; import java.awt.Color; import java.awt.Container; import java.awt.Point; @@ -16,23 +34,9 @@ import java.awt.Rectangle; import java.awt.Shape; import java.awt.Toolkit; import java.util.Map; +import java.util.Objects; import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException; -import javax.swing.*; -import javax.swing.text.BadLocationException; -import javax.swing.text.Caret; -import javax.swing.text.Document; -import javax.swing.text.Element; -import javax.swing.text.Position; -import javax.swing.text.Segment; -import javax.swing.text.TabExpander; -import javax.swing.text.View; - -import com.fr.design.gui.syntax.ui.rsyntaxtextarea.TokenUtils.TokenSubList; -import com.fr.design.gui.syntax.ui.rsyntaxtextarea.folding.FoldManager; -import com.fr.design.gui.syntax.ui.rtextarea.Gutter; -import com.fr.design.gui.syntax.ui.rtextarea.RTextArea; -import com.fr.design.gui.syntax.ui.rtextarea.RTextScrollPane; /** @@ -44,1267 +48,1276 @@ import com.fr.design.gui.syntax.ui.rtextarea.RTextScrollPane; */ public class RSyntaxUtilities implements SwingConstants { - /** - * Integer constant representing a Windows-variant OS. - */ - public static final int OS_WINDOWS = 1; - - /** - * Integer constant representing Mac OS X. - */ - public static final int OS_MAC_OSX = 2; - - /** - * Integer constant representing Linux. - */ - public static final int OS_LINUX = 4; - - /** - * Integer constant representing an "unknown" OS. 99.99% of the - * time, this means some UNIX variant (AIX, SunOS, etc.). - */ - public static final int OS_OTHER = 8; - - /** - * Used for the color of hyperlinks when a LookAndFeel uses light text - * against a dark background. - */ - private static final Color LIGHT_HYPERLINK_FG = new Color(0xd8ffff); - - private static final int OS = getOSImpl(); - - //private static final int DIGIT_MASK = 1; - private static final int LETTER_MASK = 2; - //private static final int WHITESPACE_MASK = 4; - //private static final int UPPER_CASE_MASK = 8; - private static final int HEX_CHARACTER_MASK = 16; - private static final int LETTER_OR_DIGIT_MASK = 32; - private static final int BRACKET_MASK = 64; - private static final int JAVA_OPERATOR_MASK = 128; - - /** - * A lookup table used to quickly decide if a 16-bit Java char is a - * US-ASCII letter (A-Z or a-z), a digit, a whitespace char (either space - * (0x0020) or tab (0x0009)), etc. This method should be faster - * than Character.isLetter, Character.isDigit, - * and Character.isWhitespace because we know we are dealing - * with ASCII chars and so don't have to worry about code planes, etc. - */ - private static final int[] dataTable = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, // 0-15 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 16-31 - 4, 128, 0, 0, 0, 128, 128, 0, 64, 64, 128, 128, 0, 128, 0, 128, // 32-47 - 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 128, 0, 128, 128, 128, 128, // 48-63 - 0, 58, 58, 58, 58, 58, 58, 42, 42, 42, 42, 42, 42, 42, 42, 42, // 64-79 - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 64, 0, 64, 128, 0, // 80-95 - 0, 50, 50, 50, 50, 50, 50, 34, 34, 34, 34, 34, 34, 34, 34, 34, // 96-111 - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 64, 128, 64, 128, 0, // 112-127 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 128-143 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 144- - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 160- - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 176- - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 192- - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 208- - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 224- - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 // 240-255. - }; - - /** - * Used in bracket matching methods. - */ - private static Segment charSegment = new Segment(); - - /** - * Used in token list manipulation methods. - */ - private static final TokenImpl tempToken = new TokenImpl(); - - /** - * Used internally. - */ - private static final char[] JS_KEYWORD_RETURN = { 'r', 'e', 't', 'u', 'r', 'n' }; - - /** - * Used internally. - */ - private static final String BRACKETS = "{([})]"; - - - /** - * Returns a string with characters that are special to HTML (such as - * <, > and &) replaced - * by their HTML escape sequences. - * - * @param s The input string. - * @param newlineReplacement What to replace newline characters with. - * If this is null, they are simply removed. - * @param inPreBlock Whether this HTML will be in within pre - * tags. If this is true, spaces will be kept as-is; - * otherwise, they will be converted to " ". - * @return The escaped version of s. - */ - public static final String escapeForHtml(String s, - String newlineReplacement, boolean inPreBlock) { - - if (s==null) { - return null; - } - if (newlineReplacement==null) { - newlineReplacement = ""; - } - final String tabString = " "; - boolean lastWasSpace = false; - - StringBuilder sb = new StringBuilder(); - - for (int i=0; i': - sb.append(">"); - lastWasSpace = false; - break; - default: - sb.append(ch); - lastWasSpace = false; - break; - } - } - - return sb.toString(); - - } - - - /** - * Returns the rendering hints for text that will most accurately reflect - * those of the native windowing system. - * - * @return The rendering hints, or null if they cannot be - * determined. - */ - public static Map getDesktopAntiAliasHints() { - return (Map)Toolkit.getDefaultToolkit(). - getDesktopProperty("awt.font.desktophints"); - } - - - /** - * Returns the color to use for the line underneath a folded region line. - * - * @param textArea The text area. - * @return The color to use. - */ - public static Color getFoldedLineBottomColor(RSyntaxTextArea textArea) { - Color color = Color.gray; - Gutter gutter = RSyntaxUtilities.getGutter(textArea); - if (gutter!=null) { - color = gutter.getFoldIndicatorForeground(); - } - return color; - } - - - /** - * Returns the gutter component of the scroll pane containing a text - * area, if any. - * - * @param textArea The text area. - * @return The gutter, or null if the text area is not in - * an {@link RTextScrollPane}. - * @see RTextScrollPane#getGutter() - */ - public static Gutter getGutter(RTextArea textArea) { - Gutter gutter = null; - Container parent = textArea.getParent(); - if (parent instanceof JViewport) { - parent = parent.getParent(); - if (parent instanceof RTextScrollPane) { - RTextScrollPane sp = (RTextScrollPane)parent; - gutter = sp.getGutter(); // Should always be non-null - } - } - return gutter; - } - - - /** - * Returns the color to use for hyperlink-style components. This method - * will return Color.blue unless it appears that the current - * LookAndFeel uses light text on a dark background, in which case a - * brighter alternative is returned. - * - * @return The color to use for hyperlinks. - * @see #isLightForeground(Color) - */ - public static final Color getHyperlinkForeground() { - - // This property is defined by all standard LaFs, even Nimbus (!), - // but you never know what crazy LaFs there are... - Color fg = UIManager.getColor("Label.foreground"); - if (fg==null) { - fg = new JLabel().getForeground(); - } - - return isLightForeground(fg) ? LIGHT_HYPERLINK_FG : Color.blue; - - } - - - /** - * Returns the leading whitespace of a string. - * - * @param text The String to check. - * @return The leading whitespace. - * @see #getLeadingWhitespace(Document, int) - */ - public static String getLeadingWhitespace(String text) { - int count = 0; - int len = text.length(); - while (countoffs is not a valid offset - * in the document. - * @see #getLeadingWhitespace(String) - */ - public static String getLeadingWhitespace(Document doc, int offs) - throws BadLocationException { - Element root = doc.getDefaultRootElement(); - int line = root.getElementIndex(offs); - Element elem = root.getElement(line); - int startOffs = elem.getStartOffset(); - int endOffs = elem.getEndOffset() - 1; - String text = doc.getText(startOffs, endOffs-startOffs); - return getLeadingWhitespace(text); - } - - - private static final Element getLineElem(Document d, int offs) { - Element map = d.getDefaultRootElement(); - int index = map.getElementIndex(offs); - Element elem = map.getElement(index); - if ((offs>=elem.getStartOffset()) && (offsp0, as this is - * the character where the x-pixel value is 0. - * - * @param textArea The text area containing the text. - * @param s A segment in which to load the line. This is passed in so we - * don't have to reallocate a new Segment for each - * call. - * @param p0 The starting position in the physical line in the document. - * @param p1 The position for which to get the bounding box in the view. - * @param e How to expand tabs. - * @param rect The rectangle whose x- and width-values are changed to - * represent the bounding box of p1. This is reused - * to keep from needlessly reallocating Rectangles. - * @param x0 The x-coordinate (pixel) marking the left-hand border of the - * text. This is useful if the text area has a border, for example. - * @return The bounding box in the view of the character p1. - * @throws BadLocationException If p0 or p1 is - * not a valid location in the specified text area's document. - * @throws IllegalArgumentException If p0 and p1 - * are not on the same line. - */ - public static Rectangle getLineWidthUpTo(RSyntaxTextArea textArea, - Segment s, int p0, int p1, - TabExpander e, Rectangle rect, - int x0) - throws BadLocationException { - - RSyntaxDocument doc = (RSyntaxDocument)textArea.getDocument(); - - // Ensure p0 and p1 are valid document positions. - if (p0<0) - throw new BadLocationException("Invalid document position", p0); - else if (p1>doc.getLength()) - throw new BadLocationException("Invalid document position", p1); - - // Ensure p0 and p1 are in the same line, and get the start/end - // offsets for that line. - Element map = doc.getDefaultRootElement(); - int lineNum = map.getElementIndex(p0); - // We do ">1" because p1 might be the first position on the next line - // or the last position on the previous one. - // if (lineNum!=map.getElementIndex(p1)) - if (Math.abs(lineNum-map.getElementIndex(p1))>1) - throw new IllegalArgumentException("p0 and p1 are not on the " + - "same line (" + p0 + ", " + p1 + ")."); - - // Get the token list. - Token t = doc.getTokenListForLine(lineNum); - - // Modify the token list 't' to begin at p0 (but still have correct - // token types, etc.), and get the x-location (in pixels) of the - // beginning of this new token list. - TokenSubList subList = TokenUtils.getSubTokenList(t, p0, e, textArea, - 0, tempToken); - t = subList.tokenList; - - rect = t.listOffsetToView(textArea, e, p1, x0, rect); - return rect; - - } - - - /** - * Returns the location of the bracket paired with the one at the current - * caret position. - * - * @param textArea The text area. - * @param input A point to use as the return value. If this is - * null, a new object is created and returned. - * @return A point representing the matched bracket info. The "x" field - * is the offset of the bracket at the caret position (either just - * before or just after the caret), and the "y" field is the offset - * of the matched bracket. Both "x" and "y" will be - * -1 if there isn't a matching bracket (or the caret - * isn't on a bracket). - */ - public static Point getMatchingBracketPosition(RSyntaxTextArea textArea, - Point input) { - - if (input==null) { - input = new Point(); - } - input.setLocation(-1, -1); - - try { - - // Actually position just BEFORE caret. - int caretPosition = textArea.getCaretPosition() - 1; - RSyntaxDocument doc = (RSyntaxDocument)textArea.getDocument(); - char bracket = 0; - - // If the caret was at offset 0, we can't check "to its left." - if (caretPosition>=0) { - bracket = doc.charAt(caretPosition); - } - - // Try to match a bracket "to the right" of the caret if one - // was not found on the left. - int index = BRACKETS.indexOf(bracket); - if (index==-1 && caretPosition