Browse Source

Merge pull request #10527 in DESIGN/design from release/11.0 to bugfix/11.0

* commit '71144fbbf755fa53692b047b26081fe2ad49a255':
  REPORT-83305 修复修改后界面出现异常
  REPORT-83498 单元格-格式-常规选中替换会提示查找内容不符
  REPORT-83501 多次替换时,下一次会覆盖上一次替换的记录
  REPORT-83339 设置项-切换模板后,数据集的查找结果还是上一个模板的
  REPORT-80690 删除未使用的方法
  REPORT-83305 添加注释
  REPORT-83305 【批量操作单元格】修改格式->撤销,格式恢复异常 【问题原因】选择不同格式,格式面板发生多次变化,导致多次触发保存 【改动思路】更改格式修改方式 【review建议】
bugfix/11.0
superman 2 years ago
parent
commit
d3c83182d0
  1. 81
      designer-base/src/main/java/com/fr/design/gui/style/TextFormatPaneContainer.java
  2. 2
      designer-realize/src/main/java/com/fr/design/actions/replace/action/setting/CellFormatType.java
  3. 2
      designer-realize/src/main/java/com/fr/design/actions/replace/action/setting/action/SearchDSColumnAction.java
  4. 6
      designer-realize/src/main/java/com/fr/design/actions/replace/ui/ITReplaceMainDialog.java
  5. 13
      designer-realize/src/main/java/com/fr/design/dscolumn/ResultSetGroupDockingPane.java
  6. 4
      designer-realize/src/main/java/com/fr/design/dscolumn/ResultSetGroupPane.java
  7. 10
      designer-realize/src/main/java/com/fr/design/dscolumn/SelectedDataColumnPane.java
  8. 10
      designer-realize/src/main/java/com/fr/grid/selection/CellSelection.java
  9. 301
      designer-realize/src/main/java/com/fr/quickeditor/CellQuickEditor.java
  10. 236
      designer-realize/src/main/java/com/fr/quickeditor/cellquick/CellDSColumnEditor.java

81
designer-base/src/main/java/com/fr/design/gui/style/TextFormatPaneContainer.java

@ -0,0 +1,81 @@
package com.fr.design.gui.style;
import com.fr.base.Style;
import com.fr.design.gui.frpane.AbstractAttrNoScrollPane;
import com.fr.design.gui.frpane.AttributeChangeListener;
import javax.swing.BorderFactory;
import javax.swing.JPanel;
import java.awt.BorderLayout;
import java.awt.Dimension;
/**
* 封装格式panel管理 AttributeChangeListener
*
* @author Leo.Qin
* @version 11.0
* Created by Leo.Qin on 2022/10/31
*/
public class TextFormatPaneContainer extends AbstractAttrNoScrollPane {
private TextFormatPane formatPane;
private AttributeChangeListener oldListner;
@Override
protected JPanel createContentPane() {
formatPane = new TextFormatPane();
return formatPane;
}
protected void initContentPane() {
leftContentPane = createContentPane();
if (leftContentPane != null) {
leftContentPane.setBorder(BorderFactory.createEmptyBorder());
this.add(leftContentPane, BorderLayout.CENTER);
}
}
@Override
public Dimension getPreferredSize() {
if (formatPane == null) {
return super.getPreferredSize();
}
return formatPane.getPreferredSize();
}
/**
* 根据单元格样式填充面板设置
*
* @param style 单元格样式
*/
public void populateBean(Style style) {
formatPane.populateBean(style);
}
/**
* 根据面板设置获取修改后的单元格样式
*
* @param style 单元格当前样式
* @return 更新后的单元格样式
*/
public Style update(Style style) {
return formatPane.update(style);
}
@Override
public void removeAttributeChangeListener() {
super.removeAttributeChangeListener();
}
@Override
public void addAttributeChangeListener(AttributeChangeListener listener) {
oldListner = listener;
super.addAttributeChangeListener(listener);
}
/**
* 恢复使用AttributeChangeListener
*/
public void restoreAttributeChangeListener() {
super.addAttributeChangeListener(oldListner);
}
}

2
designer-realize/src/main/java/com/fr/design/actions/replace/action/setting/CellFormatType.java

@ -61,7 +61,7 @@ public enum CellFormatType {
@Override @Override
public boolean isEverChanged(Info info, String inputStr, String extraStr) { public boolean isEverChanged(Info info, String inputStr, String extraStr) {
CellElement cellElement = (CellElement) info.getContent().getReplaceObject(); CellElement cellElement = (CellElement) info.getContent().getReplaceObject();
return (cellElement.getStyle() != null && cellElement.getStyle().getFormat() == null); return !(cellElement.getStyle() != null && cellElement.getStyle().getFormat() == null);
} }
}, },
/** /**

2
designer-realize/src/main/java/com/fr/design/actions/replace/action/setting/action/SearchDSColumnAction.java

@ -39,8 +39,8 @@ public class SearchDSColumnAction implements SearchAction {
content.setShowStr(dataName); content.setShowStr(dataName);
content.setTemplateName(jTemplate.getTemplateName()); content.setTemplateName(jTemplate.getTemplateName());
dsColumnInfos.add(new DataSourceInfo(content)); dsColumnInfos.add(new DataSourceInfo(content));
setDsColumnInfos(dsColumnInfos);
} }
setDsColumnInfos(dsColumnInfos);
} }
public List<DataSourceInfo> getDsColumnInfos() { public List<DataSourceInfo> getDsColumnInfos() {

6
designer-realize/src/main/java/com/fr/design/actions/replace/ui/ITReplaceMainDialog.java

@ -514,7 +514,7 @@ public class ITReplaceMainDialog extends UIDialog {
String thirdStr = GeneralUtils.objectToString(northPane.getReplaceExtraSettingComboBox().getSelectedItem()); String thirdStr = GeneralUtils.objectToString(northPane.getReplaceExtraSettingComboBox().getSelectedItem());
HistoryTemplateListCache.getInstance().getCurrentEditingTemplate().fireTargetModified(true); HistoryTemplateListCache.getInstance().getCurrentEditingTemplate().fireTargetModified(true);
for (Info info : searchSettingResultList) { for (Info info : searchSettingResultList) {
if (info.getContent().isSelected()) { if (isSupportReplace(info)) {
SettingController controller = SettingController.match(firstStr); SettingController controller = SettingController.match(firstStr);
if (controller != null) { if (controller != null) {
controller.replace(info, secondStr, thirdStr); controller.replace(info, secondStr, thirdStr);
@ -549,6 +549,10 @@ public class ITReplaceMainDialog extends UIDialog {
} }
} }
} }
private boolean isSupportReplace(Info info) {
return info.getContent().isSelected() && !info.getContent().isReplaced();
}
private boolean isSelectSearch(int optionSelected) { private boolean isSelectSearch(int optionSelected) {
return optionSelected == NONE; return optionSelected == NONE;

13
designer-realize/src/main/java/com/fr/design/dscolumn/ResultSetGroupDockingPane.java

@ -228,9 +228,6 @@ public class ResultSetGroupDockingPane extends ResultSetGroupPane {
this.listener = listener; this.listener = listener;
} }
void fireTargetChanged() {
listener.itemStateChanged(null);
}
@Override @Override
public void setRecordGrouper(RecordGrouper recordGrouper) { public void setRecordGrouper(RecordGrouper recordGrouper) {
@ -249,8 +246,16 @@ public class ResultSetGroupDockingPane extends ResultSetGroupPane {
functionComboBox.removeItemListener(this.listener); functionComboBox.removeItemListener(this.listener);
} }
@Override
public void update(Set<TemplateCellElement> cellElements) { public void update(Set<TemplateCellElement> cellElements) {
cellElements.forEach(this::updateCellElement); cellElements.forEach(this::updateCellElement);
} }
@Override
public Dimension getPreferredSize() {
if (this.isVisible()) {
return super.getPreferredSize();
} else {
return new Dimension();
}
}
} }

4
designer-realize/src/main/java/com/fr/design/dscolumn/ResultSetGroupPane.java

@ -47,9 +47,6 @@ public abstract class ResultSetGroupPane extends JPanel {
abstract void setRecordGrouper(RecordGrouper recordGrouper); abstract void setRecordGrouper(RecordGrouper recordGrouper);
void fireTargetChanged() {
};
ActionListener groupAdvancedListener = new ActionListener() { ActionListener groupAdvancedListener = new ActionListener() {
public void actionPerformed(ActionEvent evt) { public void actionPerformed(ActionEvent evt) {
if (cellElement == null) { if (cellElement == null) {
@ -75,7 +72,6 @@ public abstract class ResultSetGroupPane extends JPanel {
dSColumn.setGrouper(rg); dSColumn.setGrouper(rg);
} }
setRecordGrouper(rg); setRecordGrouper(rg);
fireTargetChanged();
JTemplate targetComponent = DesignerContext.getDesignerFrame().getSelectedJTemplate(); JTemplate targetComponent = DesignerContext.getDesignerFrame().getSelectedJTemplate();
if (targetComponent != null) { if (targetComponent != null) {
targetComponent.fireTargetModified(); targetComponent.fireTargetModified();

10
designer-realize/src/main/java/com/fr/design/dscolumn/SelectedDataColumnPane.java

@ -392,4 +392,14 @@ public class SelectedDataColumnPane extends BasicPane {
} }
return new ArrayList<>(); return new ArrayList<>();
} }
@Override
public Dimension getPreferredSize() {
if (this.isVisible()) {
return super.getPreferredSize();
}
else {
return new Dimension();
}
}
} }

10
designer-realize/src/main/java/com/fr/grid/selection/CellSelection.java

@ -70,6 +70,7 @@ public class CellSelection extends Selection {
private Rectangle editRectangle = new Rectangle(0, 0, 1, 1); private Rectangle editRectangle = new Rectangle(0, 0, 1, 1);
private List cellRectangleList = new ArrayList(); private List cellRectangleList = new ArrayList();
private Set<TemplateCellElement> cellElements = new HashSet<>();
public CellSelection() { public CellSelection() {
this(0, 0, 1, 1); this(0, 0, 1, 1);
@ -745,9 +746,10 @@ public class CellSelection extends Selection {
if (cellElement != null) { if (cellElement != null) {
value = cellElement.getValue(); value = cellElement.getValue();
} }
Set<TemplateCellElement> allCellElement = getAllCellElements(tplEC);
boolean sameType = checkSameType(allCellElement); cellElements = getAllCellElements(tplEC);
boolean sameType = checkSameType(cellElements);
// 多选时,多元格元素类型 // 多选时,多元格元素类型
value = sameType && value != null ? value : StringUtils.EMPTY; value = sameType && value != null ? value : StringUtils.EMPTY;
@ -813,6 +815,10 @@ public class CellSelection extends Selection {
return cellElements; return cellElements;
} }
public Set<TemplateCellElement> getCellElements() {
return cellElements;
}
@Override @Override
public void populatePropertyPane(ElementCasePane ePane) { public void populatePropertyPane(ElementCasePane ePane) {
CellElementPropertyPane.getInstance().reInit(ePane); CellElementPropertyPane.getInstance().reInit(ePane);

301
designer-realize/src/main/java/com/fr/quickeditor/CellQuickEditor.java

@ -5,13 +5,12 @@ import com.fr.base.Style;
import com.fr.design.actions.UpdateAction; import com.fr.design.actions.UpdateAction;
import com.fr.design.actions.core.ActionFactory; import com.fr.design.actions.core.ActionFactory;
import com.fr.design.file.HistoryTemplateListCache; import com.fr.design.file.HistoryTemplateListCache;
import com.fr.design.gui.frpane.AbstractAttrNoScrollPane;
import com.fr.design.gui.frpane.AttributeChangeListener; import com.fr.design.gui.frpane.AttributeChangeListener;
import com.fr.design.gui.icombobox.UIComboBox; import com.fr.design.gui.icombobox.UIComboBox;
import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.ilable.UILabel;
import com.fr.design.gui.iscrollbar.UIScrollBar; import com.fr.design.gui.iscrollbar.UIScrollBar;
import com.fr.design.gui.itextfield.UITextField; import com.fr.design.gui.itextfield.UITextField;
import com.fr.design.gui.style.TextFormatPane; import com.fr.design.gui.style.TextFormatPaneContainer;
import com.fr.design.i18n.Toolkit; import com.fr.design.i18n.Toolkit;
import com.fr.design.layout.TableLayout; import com.fr.design.layout.TableLayout;
import com.fr.design.layout.TableLayoutHelper; import com.fr.design.layout.TableLayoutHelper;
@ -35,8 +34,8 @@ import javax.swing.JComponent;
import javax.swing.JOptionPane; import javax.swing.JOptionPane;
import javax.swing.JPanel; import javax.swing.JPanel;
import javax.swing.JScrollBar; import javax.swing.JScrollBar;
import javax.swing.SwingUtilities;
import java.awt.BorderLayout; import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Component; import java.awt.Component;
import java.awt.Container; import java.awt.Container;
import java.awt.Dimension; import java.awt.Dimension;
@ -46,6 +45,7 @@ import java.awt.event.AdjustmentEvent;
import java.awt.event.AdjustmentListener; import java.awt.event.AdjustmentListener;
import java.awt.event.MouseWheelEvent; import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener; import java.awt.event.MouseWheelListener;
import java.text.Format;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Objects; import java.util.Objects;
import java.util.Set; import java.util.Set;
@ -67,12 +67,7 @@ public abstract class CellQuickEditor extends QuickEditor<ElementCasePane> {
private static final int CONTENT_PANE_WIDTH_GAP = 3; private static final int CONTENT_PANE_WIDTH_GAP = 3;
private static final int MOUSE_WHEEL_SPEED = 5; private static final int MOUSE_WHEEL_SPEED = 5;
private static final int SCROLLBAR_WIDTH = 7; private static final int SCROLLBAR_WIDTH = 7;
private UILabel cellLabel;
/**
* 区分单选多选单元格生成相应设置面板
*/
private final String SINGLE_SELECT = "singleSelect";
private final String MULTIPLE_SELECT = "multipleSelect";
private int maxHeight = 280; private int maxHeight = 280;
private static final int TITLE_HEIGHT = 50; private static final int TITLE_HEIGHT = 50;
@ -82,21 +77,16 @@ public abstract class CellQuickEditor extends QuickEditor<ElementCasePane> {
*/ */
protected UITextField columnRowTextField; protected UITextField columnRowTextField;
protected TemplateCellElement cellElement; protected TemplateCellElement cellElement;
private TextFormatPane formatPane; private TextFormatPaneContainer formatPane;
private final JPanel topContentContainer; private JPanel topContentContainer;
private final JComponent centerBodyContainer; private JComponent centerBodyContainer;
private UILabel multipleLabelTip;
private CardLayout topCardLayout;
/**
* 不同单元格元素产生的面板
*/
private CardLayout centerCardLayout;
// 占位label // 占位label
protected final UILabel EMPTY_LABEL = new UILabel(); protected final UILabel EMPTY_LABEL = new UILabel();
private UIComboBox singleComboBox; private UIComboBox comboBox;
private UIComboBox multipleComboBox;
private UpdateAction[] cellInsertActions; private UpdateAction[] cellInsertActions;
private int selectedIndex; private int selectedIndex;
@ -106,23 +96,38 @@ public abstract class CellQuickEditor extends QuickEditor<ElementCasePane> {
private ActionListener comboBoxActionListener; private ActionListener comboBoxActionListener;
public CellQuickEditor() { public CellQuickEditor() {
initComponents();
createPanelBody();
}
private void initComponents() {
EMPTY_LABEL.setPreferredSize(LABEL_DIMENSION); EMPTY_LABEL.setPreferredSize(LABEL_DIMENSION);
topContentContainer = initTopContent();
formatPane = createFormatPane();
centerBodyContainer = createCenterBody();
multipleLabelTip = FRWidgetFactory.createLineWrapLabel(Toolkit.i18nText("Fine-Design_Basic_Cell_Element_Multiple_Tip"));
multipleLabelTip.setEnabled(false);
}
private void createPanelBody() {
double p = TableLayout.PREFERRED; double p = TableLayout.PREFERRED;
double f = TableLayout.FILL; double f = TableLayout.FILL;
double[] columnSize = {p, f}; double[] columnSize = {f};
JPanel formatContainerPanel = createFormatPane();
topContentContainer = initTopContent();
centerBodyContainer = createAllCenterBody();
if (isScrollAll()) { if (isScrollAll()) {
double[] scrollAllRowSize = {p, p, p}; double[] scrollAllRowSize = {p, p, p, p};
prepareScrollBar(); prepareScrollBar();
topContentContainer.setBorder(BorderFactory.createMatteBorder(10, 10, 0, 0, this.getBackground())); multipleLabelTip.setBorder(BorderFactory.createMatteBorder(5, 10, 0, 0, this.getBackground()));
formatContainerPanel.setBorder(BorderFactory.createMatteBorder(0, 10, 0, 0, this.getBackground())); topContentContainer.setBorder(BorderFactory.createMatteBorder(0, 10, 0, 0, this.getBackground()));
formatPane.setBorder(BorderFactory.createMatteBorder(0, 10, 0, 0, this.getBackground()));
centerBodyContainer.setBorder(BorderFactory.createMatteBorder(0, 10, 0, 0, this.getBackground())); centerBodyContainer.setBorder(BorderFactory.createMatteBorder(0, 10, 0, 0, this.getBackground()));
Component[][] components = new Component[][]{ Component[][] components = new Component[][]{
new Component[]{topContentContainer, null}, new Component[]{multipleLabelTip},
new Component[]{formatContainerPanel, null}, new Component[]{topContentContainer},
new Component[]{centerBodyContainer, null} new Component[]{formatPane},
new Component[]{centerBodyContainer}
}; };
leftContentPane = TableLayoutHelper.createGapTableLayoutPane(components, scrollAllRowSize, columnSize, HGAP, VGAP); leftContentPane = TableLayoutHelper.createGapTableLayoutPane(components, scrollAllRowSize, columnSize, HGAP, VGAP);
this.setLayout(new CellElementBarLayout(leftContentPane) { this.setLayout(new CellElementBarLayout(leftContentPane) {
@ -151,14 +156,16 @@ public abstract class CellQuickEditor extends QuickEditor<ElementCasePane> {
this.add(scrollBar); this.add(scrollBar);
this.add(leftContentPane); this.add(leftContentPane);
} else { } else {
double[] scrollContentRowSize = {p, p, f}; double[] scrollContentRowSize = {p, p, p, f};
topContentContainer.setBorder(BorderFactory.createMatteBorder(10, 10, 0, 10, this.getBackground())); multipleLabelTip.setBorder(BorderFactory.createMatteBorder(5, 10, 0, 0, this.getBackground()));
formatContainerPanel.setBorder(BorderFactory.createMatteBorder(0, 10, 0, 10, this.getBackground())); topContentContainer.setBorder(BorderFactory.createMatteBorder(0, 10, 0, 10, this.getBackground()));
formatPane.setBorder(BorderFactory.createMatteBorder(0, 10, 0, 10, this.getBackground()));
centerBodyContainer.setBorder(BorderFactory.createMatteBorder(0, 0, 0, 0, this.getBackground())); centerBodyContainer.setBorder(BorderFactory.createMatteBorder(0, 0, 0, 0, this.getBackground()));
Component[][] components = new Component[][]{ Component[][] components = new Component[][]{
new Component[]{topContentContainer, null}, new Component[]{multipleLabelTip},
new Component[]{formatContainerPanel, null}, new Component[]{topContentContainer},
new Component[]{centerBodyContainer, null} new Component[]{formatPane},
new Component[]{centerBodyContainer}
}; };
this.setLayout(new BorderLayout()); this.setLayout(new BorderLayout());
this.add(TableLayoutHelper.createGapTableLayoutPane(components, scrollContentRowSize, columnSize, HGAP, VGAP), BorderLayout.CENTER); this.add(TableLayoutHelper.createGapTableLayoutPane(components, scrollContentRowSize, columnSize, HGAP, VGAP), BorderLayout.CENTER);
@ -187,31 +194,6 @@ public abstract class CellQuickEditor extends QuickEditor<ElementCasePane> {
*/ */
public abstract Object getComboBoxSelected(); public abstract Object getComboBoxSelected();
/**
* 初始化创建单选及多选面板
*
* @return 创建的面板
*/
private JComponent createAllCenterBody() {
centerCardLayout = new CardLayout();
JPanel centerPanel = new JPanel(centerCardLayout);
centerPanel.add(SINGLE_SELECT, createCenterBody());
centerPanel.add(MULTIPLE_SELECT, createCenterBody4Multiple());
return centerPanel;
}
/**
* 为多选单元格创建详细面板默认创建空面板
*
* @return 空面板
*/
public JComponent createCenterBody4Multiple() {
return new JPanel();
}
/** /**
* 刷新 * 刷新
@ -224,61 +206,90 @@ public abstract class CellQuickEditor extends QuickEditor<ElementCasePane> {
refreshFormatPanel(); refreshFormatPanel();
refreshDetails(); refreshDetails();
refreshMultipleDetails();
}
/**
* 多选时默认隐藏与插入元素类型相关的所有面板
* 若其他面板需要扩展多选时可修改的内容
* 通过重写改方法实现显示/隐藏部分组件
*/
public void refreshMultipleDetails() {
centerBodyContainer.setVisible(tc.isSelectedOneCell());
} }
private void refreshFormatPanel() { private void refreshFormatPanel() {
// 在populate的时候会多次触发AttributeChangeListener事件,
// 导致不断更新单元格格式,因此populate的时候暂时删除listener
formatPane.removeAttributeChangeListener();
if (cellElement != null) { if (cellElement != null) {
formatPane.populateBean(cellElement.getStyle()); formatPane.populateBean(cellElement.getStyle());
} else { } else {
formatPane.populateBean(Style.DEFAULT_STYLE); formatPane.populateBean(Style.DEFAULT_STYLE);
} }
formatPane.restoreAttributeChangeListener();
} }
private void refreshPanel() { private void refreshPanel() {
changeVisiableState();
CellSelection cs = (CellSelection) tc.getSelection(); CellSelection cs = (CellSelection) tc.getSelection();
ColumnRow columnRow = ColumnRow.valueOf(cs.getColumn(), cs.getRow()); ColumnRow columnRow = ColumnRow.valueOf(cs.getColumn(), cs.getRow());
String selectType = tc.isSelectedOneCell() ? SINGLE_SELECT : MULTIPLE_SELECT;
topCardLayout.show(topContentContainer, selectType);
centerCardLayout.show(centerBodyContainer, selectType);
columnRowTextField.setText(columnRow.toString()); columnRowTextField.setText(columnRow.toString());
cellElement = tc.getEditingElementCase().getTemplateCellElement(cs.getColumn(), cs.getRow()); cellElement = tc.getEditingElementCase().getTemplateCellElement(cs.getColumn(), cs.getRow());
JTemplate jTemplate = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); JTemplate jTemplate = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate();
if (jTemplate != null) { if (jTemplate != null) {
singleComboBox.removeActionListener(comboBoxActionListener); comboBox.removeActionListener(comboBoxActionListener);
singleComboBox.removeAllItems(); comboBox.removeAllItems();
String[] items = getDefaultComboBoxItems(); String[] items = getDefaultComboBoxItems();
for (String item : items) { for (String item : items) {
singleComboBox.addItem(item); comboBox.addItem(item);
multipleComboBox.addItem(item);
} }
Object comboBoxSelected = getComboBoxSelected(); Object comboBoxSelected = getComboBoxSelected();
if (comboBoxSelected != null) { if (comboBoxSelected != null) {
singleComboBox.setSelectedItem(((ShortCut) comboBoxSelected).getMenuKeySet().getMenuKeySetName()); comboBox.setSelectedItem(((ShortCut) comboBoxSelected).getMenuKeySet().getMenuKeySetName());
multipleComboBox.setSelectedItem(((ShortCut) comboBoxSelected).getMenuKeySet().getMenuKeySetName());
} else { } else {
singleComboBox.setSelectedIndex(1); comboBox.setSelectedIndex(1);
multipleComboBox.setSelectedIndex(1);
} }
currentSelectedIndex = singleComboBox.getSelectedIndex(); currentSelectedIndex = comboBox.getSelectedIndex();
comboBoxActionListener = new ActionListener() { comboBoxActionListener = new ActionListener() {
@Override @Override
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
cellInsertActions = ActionFactory.createCellInsertAction(ElementCasePane.class, tc); cellInsertActions = ActionFactory.createCellInsertAction(ElementCasePane.class, tc);
selectedIndex = singleComboBox.getSelectedIndex(); selectedIndex = comboBox.getSelectedIndex();
singleComboBox.setPopupVisible(false); comboBox.setPopupVisible(false);
singleComboBox.repaint(); comboBox.repaint();
// comboBox.getSelectedIndex()可能返回-1 // comboBox.getSelectedIndex()可能返回-1
if (selectedIndex != -1 && selectedIndex < cellInsertActions.length) { if (selectedIndex != -1 && selectedIndex < cellInsertActions.length) {
cellInsertActions[selectedIndex].actionPerformed(e); cellInsertActions[selectedIndex].actionPerformed(e);
} }
singleComboBox.setSelectedIndex(currentSelectedIndex); comboBox.setSelectedIndex(currentSelectedIndex);
} }
}; };
singleComboBox.addActionListener(comboBoxActionListener); comboBox.addActionListener(comboBoxActionListener);
}
}
/**
* 单选多选时切换部分组件的 隐藏/显示 状态
*/
private void changeVisiableState() {
boolean selectedOneCell = tc.isSelectedOneCell();
comboBox.setEnabled(selectedOneCell);
if (selectedOneCell) {
columnRowTextField.setPreferredSize(null);
cellLabel.setPreferredSize(null);
multipleLabelTip.setPreferredSize(new Dimension());
} else {
columnRowTextField.setPreferredSize(new Dimension());
cellLabel.setPreferredSize(new Dimension());
multipleLabelTip.setPreferredSize(null);
} }
} }
@ -289,44 +300,19 @@ public abstract class CellQuickEditor extends QuickEditor<ElementCasePane> {
private JPanel initTopContent() { private JPanel initTopContent() {
topCardLayout = new CardLayout();
JPanel topContentPane = new JPanel(topCardLayout);
// 单选面板
double p = TableLayout.PREFERRED; double p = TableLayout.PREFERRED;
double f = TableLayout.FILL; double f = TableLayout.FILL;
double[] columnSize = {GraphHelper.getWidth(Toolkit.i18nText("Fine-Design_Report_Insert_Cell_Element")), f}; double[] columnSize = {GraphHelper.getWidth(Toolkit.i18nText("Fine-Design_Report_Insert_Cell_Element")), f};
double[] rowSize = {p, p}; double[] rowSize = {p, p};
UILabel cellLabel = new UILabel(Toolkit.i18nText("Fine-Design_Basic_Cell")); cellLabel = FRWidgetFactory.createLineWrapLabel(Toolkit.i18nText("Fine-Design_Basic_Cell"));
UILabel insertContentLabel = FRWidgetFactory.createLineWrapLabel(Toolkit.i18nText("Fine-Design_Report_Insert_Cell_Element")); UILabel insertContentLabel = FRWidgetFactory.createLineWrapLabel(Toolkit.i18nText("Fine-Design_Report_Insert_Cell_Element"));
initCellElementEditComboBox(); initCellElementEditComboBox();
Component[][] components = new Component[][]{ Component[][] components = new Component[][]{
new Component[]{cellLabel, columnRowTextField = initColumnRowTextField()}, new Component[]{cellLabel, columnRowTextField = initColumnRowTextField()},
new Component[]{insertContentLabel, UIComponentUtils.wrapWithBorderLayoutPane(singleComboBox)}, new Component[]{insertContentLabel, UIComponentUtils.wrapWithBorderLayoutPane(comboBox)},
};
JPanel singlePanel = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, HGAP, VGAP);
topContentPane.add(SINGLE_SELECT, singlePanel);
// 多选面板
UILabel multipleTipLabel = FRWidgetFactory.createLineWrapLabel(Toolkit.i18nText("Fine-Design_Basic_Cell_Element_Multiple_Tip"));
multipleTipLabel.setEnabled(false);
multipleTipLabel.setBorder(BorderFactory.createMatteBorder(5, 0, 0, 0, this.getBackground()));
UILabel insertContentLabel1 = FRWidgetFactory.createLineWrapLabel(Toolkit.i18nText("Fine-Design_Report_Insert_Cell_Element"));
Component[][] components1 = new Component[][]{
new Component[]{insertContentLabel1, UIComponentUtils.wrapWithBorderLayoutPane(multipleComboBox)},
};
multipleComboBox.setEnabled(false);
JPanel insertPanel = TableLayoutHelper.createGapTableLayoutPane(components1, new double[]{p}, columnSize, HGAP,
VGAP);
Component[][] components2 = new Component[][]{
new Component[]{multipleTipLabel},
new Component[]{insertPanel},
}; };
JPanel multiplePanel = TableLayoutHelper.createGapTableLayoutPane(components2, rowSize, new double[]{f}, HGAP, VGAP); return TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, HGAP, VGAP);
topContentPane.add(MULTIPLE_SELECT, multiplePanel);
return topContentPane;
} }
private void prepareScrollBar() { private void prepareScrollBar() {
@ -374,23 +360,19 @@ public abstract class CellQuickEditor extends QuickEditor<ElementCasePane> {
private void initCellElementEditComboBox() { private void initCellElementEditComboBox() {
JTemplate jTemplate = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); JTemplate jTemplate = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate();
if (jTemplate == null) { if (jTemplate == null) {
singleComboBox = new UIComboBox(); comboBox = new UIComboBox();
multipleComboBox = new UIComboBox();
return; return;
} }
final String[] items = getDefaultComboBoxItems(); final String[] items = getDefaultComboBoxItems();
singleComboBox = new UIComboBox(items); comboBox = new UIComboBox(items);
multipleComboBox = new UIComboBox(items);
final Object comboBoxSelected = getComboBoxSelected(); final Object comboBoxSelected = getComboBoxSelected();
if (comboBoxSelected != null) { if (comboBoxSelected != null) {
singleComboBox.setSelectedItem(((ShortCut) comboBoxSelected).getMenuKeySet().getMenuKeySetName()); comboBox.setSelectedItem(((ShortCut) comboBoxSelected).getMenuKeySet().getMenuKeySetName());
multipleComboBox.setSelectedItem(((ShortCut) comboBoxSelected).getMenuKeySet().getMenuKeySetName());
} else { } else {
singleComboBox.setSelectedIndex(1); comboBox.setSelectedIndex(1);
multipleComboBox.setSelectedIndex(1);
} }
currentSelectedIndex = singleComboBox.getSelectedIndex(); currentSelectedIndex = comboBox.getSelectedIndex();
singleComboBox.addActionListener(comboBoxActionListener); comboBox.addActionListener(comboBoxActionListener);
} }
private String[] getDefaultComboBoxItems() { private String[] getDefaultComboBoxItems() {
@ -439,61 +421,52 @@ public abstract class CellQuickEditor extends QuickEditor<ElementCasePane> {
/** /**
* 创建格式化面板 * 创建格式化面板
* @return
*/ */
private JPanel createFormatPane() { private TextFormatPaneContainer createFormatPane() {
formatPane = new TextFormatPane(); TextFormatPaneContainer formatPane = new TextFormatPaneContainer();
AbstractAttrNoScrollPane container = new AbstractAttrNoScrollPane() {
@Override
protected JPanel createContentPane() {
return formatPane;
}
protected void initContentPane() {
leftContentPane = createContentPane();
if (leftContentPane != null) {
leftContentPane.setBorder(BorderFactory.createEmptyBorder());
this.add(leftContentPane, BorderLayout.CENTER);
}
}
@Override AttributeChangeListener attributeChangeListener = new AttributeChangeListener() {
public Dimension getPreferredSize() {
if (formatPane == null) {
return super.getPreferredSize();
}
return formatPane.getPreferredSize();
}
};
container.addAttributeChangeListener(new AttributeChangeListener() {
@Override @Override
public void attributeChange() { public void attributeChange() {
isEditing = true; SwingUtilities.invokeLater(new Runnable() {
boolean updateStyle = false; @Override
public void run() {
CellSelection cs = (CellSelection) tc.getSelection(); // 耗时任务放线程中,让其他UI组件更新界面,
TemplateElementCase editingElementCase = tc.getEditingElementCase(); // 防止多次调用此处每次获取的界面值不同,导致不断更新单元格格式
Set<TemplateCellElement> allCellElements = cs.getAllCellElements(editingElementCase); isEditing = true;
for (TemplateCellElement cellElement : allCellElements) { boolean updateStyle = false;
Style elementStyle = cellElement.getStyle();
Style style = formatPane.update(elementStyle); CellSelection cs = (CellSelection) tc.getSelection();
if (!Objects.equals(style.getFormat(), elementStyle.getFormat())) { TemplateElementCase editingElementCase = tc.getEditingElementCase();
// 点击单元格,但未设置格式时,不将单元格设置为编辑状态,防止将所选的每个单元格都设置为编辑状态 Set<TemplateCellElement> allCellElements = cs.getCellElements();
editingElementCase.addCellElement(cellElement); Style oldStyle = cellElement == null ? Style.DEFAULT_STYLE : cellElement.getStyle();
cellElement.setStyle(style); Style style = formatPane.update(oldStyle);
updateStyle = true; for (TemplateCellElement cellElement : allCellElements) {
Format elementFormat = cellElement.getStyle().getFormat();
Format paneFormat = style.getFormat();
if (!Objects.equals(paneFormat, elementFormat)) {
// 点击单元格,但未设置格式时,不将单元格设置为编辑状态,防止将所选的每个单元格都设置为编辑状态
editingElementCase.addCellElement(cellElement);
cellElement.setStyle(style);
updateStyle = true;
}
}
if (updateStyle) {
// 防止频繁触发保存
fireTargetModified();
}
isEditing = false;
} }
} });
if (updateStyle) {
// 防止频繁触发保存
fireTargetModified();
}
isEditing = false;
} }
}); };
return container;
formatPane.addAttributeChangeListener(attributeChangeListener);
return formatPane;
} }
} }

236
designer-realize/src/main/java/com/fr/quickeditor/cellquick/CellDSColumnEditor.java

@ -58,7 +58,6 @@ import java.awt.event.ItemEvent;
import java.awt.event.ItemListener; import java.awt.event.ItemListener;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashSet;
import java.util.Set; import java.util.Set;
import static com.fr.report.cell.cellattr.core.group.FilterTypeEnum.BOTTOM; import static com.fr.report.cell.cellattr.core.group.FilterTypeEnum.BOTTOM;
@ -107,10 +106,6 @@ public class CellDSColumnEditor extends CellQuickEditor {
* 数据列高级设置 * 数据列高级设置
*/ */
private DSColumnAdvancedEditorPane cellDSColumnAdvancedPane; private DSColumnAdvancedEditorPane cellDSColumnAdvancedPane;
/**
* 多选面板设置
*/
private DSColumnMultipleEditorPane cellDSColumnMultiplePane;
public CellDSColumnEditor() { public CellDSColumnEditor() {
super(); super();
@ -145,7 +140,6 @@ public class CellDSColumnEditor extends CellQuickEditor {
protected void refreshDetails() { protected void refreshDetails() {
cellDSColumnBasicPane.populate(); cellDSColumnBasicPane.populate();
cellDSColumnAdvancedPane.populate(); cellDSColumnAdvancedPane.populate();
cellDSColumnMultiplePane.populate();
this.validate(); this.validate();
} }
@ -165,6 +159,10 @@ public class CellDSColumnEditor extends CellQuickEditor {
tabsHeaderIconPane = new UIHeadGroup(iconArray) { tabsHeaderIconPane = new UIHeadGroup(iconArray) {
@Override @Override
public void tabChanged(int index) { public void tabChanged(int index) {
// 由于多选的时候修改了 cellDSColumnBasicPane 中组件的visiable属性,切换时需要将其设置为false
cellDSColumnBasicPane.setVisible(false);
card.show(cardContainer, paneList.get(index).title4PopupWindow()); card.show(cardContainer, paneList.get(index).title4PopupWindow());
paneList.get(index).populate(); paneList.get(index).populate();
} }
@ -190,7 +188,6 @@ public class CellDSColumnEditor extends CellQuickEditor {
super.release(); super.release();
cellDSColumnBasicPane.release(); cellDSColumnBasicPane.release();
cellDSColumnAdvancedPane.release(); cellDSColumnAdvancedPane.release();
cellDSColumnMultiplePane.release();
} }
@ -241,7 +238,10 @@ public class CellDSColumnEditor extends CellQuickEditor {
@Override @Override
public void update() { public void update() {
dataPane.update(cellElement); dataPane.update(cellElement);
groupPane.update();
CellSelection selection = (CellSelection) tc.getSelection();
Set<TemplateCellElement> allCellElements = selection.getCellElements();
groupPane.update(allCellElements);
} }
@Override @Override
@ -286,7 +286,7 @@ public class CellDSColumnEditor extends CellQuickEditor {
private void initComponents(){ private void initComponents(){
dataPane = new SelectedDataColumnPane(true, true); dataPane = new SelectedDataColumnPane(true, true);
groupPane = new ResultSetGroupDockingPane(); groupPane = new ResultSetGroupDockingPane();
initListener(); initListener();
double[] rowSize = {P}, columnSize = {60, F}; double[] rowSize = {P}, columnSize = {60, F};
UILabel uiLabel = FRWidgetFactory.createLineWrapLabel(Toolkit.i18nText("Fine-Design_Report_Filter_Conditions")); UILabel uiLabel = FRWidgetFactory.createLineWrapLabel(Toolkit.i18nText("Fine-Design_Report_Filter_Conditions"));
condition = new DSColumnConditionAction(); condition = new DSColumnConditionAction();
@ -303,8 +303,7 @@ public class CellDSColumnEditor extends CellQuickEditor {
conditionPane = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, HGAP, VGAP); conditionPane = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, HGAP, VGAP);
this.setBorder(BorderFactory.createEmptyBorder(10, 0, 0, 0)); this.setBorder(BorderFactory.createEmptyBorder(10, 0, 0, 0));
} }
private void initListener() { private void initListener() {
dataPane.setListener(new ItemListener() { dataPane.setListener(new ItemListener() {
@Override @Override
@ -318,30 +317,64 @@ public class CellDSColumnEditor extends CellQuickEditor {
groupPane.setListener(new ItemListener() { groupPane.setListener(new ItemListener() {
@Override @Override
public void itemStateChanged(ItemEvent e) { public void itemStateChanged(ItemEvent e) {
if (e == null) { CellSelection selection = (CellSelection) tc.getSelection();
Set<TemplateCellElement> allCellElements = selection.getCellElements();
groupPane.update(allCellElements);
if (e == null || e.getStateChange() == ItemEvent.DESELECTED) {
//分组-高级-自定义点确定的时候传进来null的e,但是这时候应该触发保存 //分组-高级-自定义点确定的时候传进来null的e,但是这时候应该触发保存
groupPane.update(); groupPane.update(allCellElements);
fireTargetModified();
return;
}
if (e.getStateChange() == ItemEvent.DESELECTED) {
groupPane.update();
fireTargetModified(); fireTargetModified();
} }
} }
}); });
} }
@Override @Override
protected AttributeChangeListener getAttributeChangeListener() { protected AttributeChangeListener getAttributeChangeListener() {
return new AttributeChangeListener() { return new AttributeChangeListener() {
@Override @Override
public void attributeChange() { public void attributeChange() {
update();
fireTargetModified();
} }
}; };
} }
public void setMultipleVisible(boolean selectedOneCell) {
// 数据源面板 需要在单选与多选间切换显示状态
dataPane.setVisible(selectedOneCell);
if (!selectedOneCell) {
// 只有在批量操作的时候才需要判断是否隐藏条件面板
CellSelection selection = (CellSelection) tc.getSelection();
boolean sameDSName = checkSameDSName(selection.getCellElements());
conditionPane.setVisible(sameDSName);
} else {
conditionPane.setVisible(true);
}
}
/**
* 判断是否属于同一个数据集
*
* @param cellElements
* @return
*/
private boolean checkSameDSName(Set<TemplateCellElement> cellElements) {
String lastDSName = StringUtils.EMPTY;
for (TemplateCellElement cellElement : cellElements) {
DSColumn dsColumn = (DSColumn) cellElement.getValue();
String dsName = dsColumn.getDSName();
if (StringUtils.isNotEmpty(lastDSName) && !StringUtils.equals(dsName, lastDSName)) {
return false;
}
lastDSName = dsName;
}
return true;
}
} }
@ -1026,163 +1059,12 @@ public class CellDSColumnEditor extends CellQuickEditor {
} }
class DSColumnMultipleEditorPane extends AbstractDSCellEditorPane {
/**
* 数据分组设置
*/
private ResultSetGroupDockingPane groupPane;
/**
* 条件过滤按钮面板
*/
private JPanel conditionPane;
/**
* 条件过滤按钮触发动作
*/
private DSColumnConditionAction condition;
/**
* 条件过滤按钮
*/
private UIButton conditionUIButton;
@Override
public String getIconPath() {
return Toolkit.i18nText("Fine-Design_Report_Basic");
}
@Override
public String title4PopupWindow() {
return Toolkit.i18nText("FR-Designer_Basic");
}
@Override
public void update() {
groupPane.update();
}
@Override
public void populate() {
this.removeAttributeChangeListener();
if (tc != null) {
CellSelection selection = (CellSelection) tc.getSelection();
Set<TemplateCellElement> cellElements = selection.getAllCellElements(tc.getEditingElementCase());
conditionPane.setVisible(checkSameDSName(cellElements));
condition.setEditingComponent(tc);
cellElements.forEach(cellElement -> groupPane.populate(cellElement));
}
this.addAttributeChangeListener();
}
/**
* 判断是否属于同一个数据集
*
* @param cellElements
* @return
*/
private boolean checkSameDSName(Set<TemplateCellElement> cellElements) {
String lastDSName = StringUtils.EMPTY;
for (TemplateCellElement cellElement : cellElements) {
DSColumn dsColumn = (DSColumn) cellElement.getValue();
String dsName = dsColumn.getDSName();
if (StringUtils.isNotEmpty(lastDSName) && !StringUtils.equals(dsName, lastDSName)) {
return false;
}
lastDSName = dsName;
}
return true;
}
@Override
protected void release() {
condition.setEditingComponent(null);
}
/**
* 创建有内容的面板显示信息
*
* @return content JPanel
*/
@Override
protected JPanel createContentPane() {
initComponents();
double[] columnSize = {F};
double[] rowSize = {P, P};
Component[][] components = new Component[][]{
//数据分组设置
new Component[]{this.groupPane},
//条件过滤
new Component[]{this.conditionPane}
};
return TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, HGAP, VGAP);
}
private void initComponents() {
groupPane = new ResultSetGroupDockingPane();
initListener();
double[] rowSize = {P}, columnSize = {60, F};
UILabel uiLabel = FRWidgetFactory.createLineWrapLabel(Toolkit.i18nText("Fine-Design_Report_Filter_Conditions"));
condition = new DSColumnConditionAction();
if (tc != null) {
condition.setEditingComponent(tc);
}
//丢掉icon,修改按钮名称为编辑
condition.setSmallIcon(UIConstants.EMPTY_ICON);
condition.setName(Toolkit.i18nText("Fine-Design_Basic_Edit"));
conditionUIButton = new UIButton(condition);
Component[][] components = new Component[][]{
new Component[]{uiLabel, UIComponentUtils.wrapWithBorderLayoutPane(conditionUIButton)}
};
conditionPane = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, HGAP, VGAP);
this.setBorder(BorderFactory.createEmptyBorder(10, 0, 0, 0));
}
private void initListener() {
groupPane.setListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
Set<TemplateCellElement> cellElements = new HashSet<>();
if (tc != null) {
CellSelection selection = (CellSelection) tc.getSelection();
cellElements = selection.getAllCellElements(tc.getEditingElementCase());
}
if (e == null) {
//分组-高级-自定义点确定的时候传进来null的e,但是这时候应该触发保存
groupPane.update(cellElements);
fireTargetModified();
return;
}
if (e.getStateChange() == ItemEvent.DESELECTED) {
groupPane.update(cellElements);
fireTargetModified();
}
}
});
}
@Override
protected AttributeChangeListener getAttributeChangeListener() {
return new AttributeChangeListener() {
@Override
public void attributeChange() {
update();
fireTargetModified();
}
};
}
}
@Override @Override
public JComponent createCenterBody4Multiple() { public void refreshMultipleDetails() {
cellDSColumnMultiplePane = new DSColumnMultipleEditorPane(); tabsHeaderIconPane.setVisible(tc.isSelectedOneCell());
return cellDSColumnMultiplePane; cellDSColumnAdvancedPane.setVisible(tc.isSelectedOneCell());
cellDSColumnBasicPane.setMultipleVisible(tc.isSelectedOneCell());
} }
@Override @Override

Loading…
Cancel
Save