diff --git a/designer/src/com/fr/design/mainframe/cell/CellEditorPane.java b/designer/src/com/fr/design/mainframe/cell/CellEditorPane.java index 48b6d8a179..6fbf73dc0f 100644 --- a/designer/src/com/fr/design/mainframe/cell/CellEditorPane.java +++ b/designer/src/com/fr/design/mainframe/cell/CellEditorPane.java @@ -1,6 +1,15 @@ package com.fr.design.mainframe.cell; -import com.fr.design.dialog.BasicPane; +import com.fr.design.gui.iscrollbar.UIScrollBar; +import com.fr.design.mainframe.CellElementPropertyPane; +import com.fr.quickeditor.cellquick.CellElementBarLayout; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.AdjustmentEvent; +import java.awt.event.AdjustmentListener; +import java.awt.event.MouseWheelEvent; +import java.awt.event.MouseWheelListener; /** * 右侧单元格元素面板抽象类 @@ -9,7 +18,20 @@ import com.fr.design.dialog.BasicPane; * @version 2017年7月25日 * @since 9.0 */ -public abstract class CellEditorPane extends BasicPane { +public abstract class CellEditorPane extends JPanel { + + /*滚动条相关配置*/ + private static final int MAXVALUE = 100; + private static final int TITLE_HEIGHT = 95; + private static final int CONTENT_PANE_WIDTH_GAP = 3; + private static final int SCROLLBAR_WIDTH = 7; + private static final int MOUSE_WHEEL_SPEED = 5; + private int maxHeight = 280; + + private JPanel leftContentPane; + private UIScrollBar scrollBar; + + protected abstract JPanel createContentPane(); public abstract String getIconPath(); @@ -22,7 +44,76 @@ public abstract class CellEditorPane extends BasicPane { /** * 更新面板数据 - * */ public abstract void populate(); + + protected void createScrollPane() { + leftContentPane = this.createContentPane(); + this.prepareScrollBar(); + leftContentPane.setBorder(BorderFactory.createMatteBorder(10, 10, 0, 0, this.getBackground())); + + this.setLayout(new CellElementBarLayout(leftContentPane) { + @Override + public void layoutContainer(Container parent) { + maxHeight = CellElementPropertyPane.getInstance().getHeight() - TITLE_HEIGHT; + int beginY; + if ((MAXVALUE - scrollBar.getVisibleAmount()) == 0) { + beginY = 0; + } else { + int preferredHeight = leftContentPane.getPreferredSize().height; + int value = scrollBar.getValue(); + beginY = value * (preferredHeight - maxHeight) / (MAXVALUE - scrollBar.getVisibleAmount()); + } + int width = parent.getWidth(); + int height = parent.getHeight(); + if (leftContentPane.getPreferredSize().height > maxHeight) { + leftContentPane.setBounds(0, -beginY, width - SCROLLBAR_WIDTH - CONTENT_PANE_WIDTH_GAP, height + beginY); + scrollBar.setBounds(width - SCROLLBAR_WIDTH - CONTENT_PANE_WIDTH_GAP, 0, SCROLLBAR_WIDTH + CONTENT_PANE_WIDTH_GAP, height); + } else { + leftContentPane.setBounds(0, 0, width - SCROLLBAR_WIDTH - CONTENT_PANE_WIDTH_GAP, height); + } + } + }); + this.add(scrollBar); + this.add(leftContentPane); + } + + + private void prepareScrollBar() { + scrollBar = new UIScrollBar(UIScrollBar.VERTICAL) { + @Override + public int getVisibleAmount() { + int preferredHeight = leftContentPane.getPreferredSize().height; + int e = MAXVALUE * (maxHeight) / preferredHeight; + setVisibleAmount(e); + return e; + } + + @Override + public int getMaximum() { + return MAXVALUE; + } + }; + + scrollBar.addAdjustmentListener(new AdjustmentListener() { + + @Override + public void adjustmentValueChanged(AdjustmentEvent e) { + doLayout(); + } + }); + this.addMouseWheelListener(new MouseWheelListener() { + + @Override + public void mouseWheelMoved(MouseWheelEvent e) { + int value = scrollBar.getValue(); + value += MOUSE_WHEEL_SPEED * e.getWheelRotation(); + scrollBar.setValue(value); + doLayout(); + } + }); + scrollBar.setPreferredSize(new Dimension(SCROLLBAR_WIDTH + CONTENT_PANE_WIDTH_GAP, this.getHeight())); + scrollBar.setBlockIncrement(SCROLLBAR_WIDTH + CONTENT_PANE_WIDTH_GAP); + scrollBar.setBorder(BorderFactory.createMatteBorder(0, CONTENT_PANE_WIDTH_GAP, 0, 0, this.getBackground())); + } } diff --git a/designer/src/com/fr/quickeditor/CellQuickEditor.java b/designer/src/com/fr/quickeditor/CellQuickEditor.java index 683f17bc73..a3cd546434 100644 --- a/designer/src/com/fr/quickeditor/CellQuickEditor.java +++ b/designer/src/com/fr/quickeditor/CellQuickEditor.java @@ -18,6 +18,7 @@ import com.fr.design.menu.ShortCut; import com.fr.design.selection.QuickEditor; import com.fr.general.Inter; import com.fr.grid.selection.CellSelection; +import com.fr.quickeditor.cellquick.CellElementBarLayout; import com.fr.report.cell.TemplateCellElement; import com.fr.stable.ColumnRow; @@ -33,37 +34,145 @@ import java.util.ArrayList; */ public abstract class CellQuickEditor extends QuickEditor { - /*滚动条相关配置*/ - private static final int MAXVALUE = 100; - private static final int TITLE_HEIGHT = 50; - private static final int MOUSE_WHEEL_SPEED = 5; - private static final int CONTENT_PANE_WIDTH_GAP = 4; - private static final int SCROLLBAR_WIDTH = 8; - private int maxHeight = 280; + /*面板配置*/ protected UITextField columnRowTextField; protected TemplateCellElement cellElement; /*占位label*/ protected static final Dimension LABEL_DIMENSION = new Dimension(60, 20); protected static final UILabel EMPTY_LABEL = new UILabel(); + protected static final int VGAP = 10, HGAP = 8, VGAP_INNER = 3; static { EMPTY_LABEL.setPreferredSize(LABEL_DIMENSION); } - protected static final int VGAP = 10, HGAP = 8, VGAP_INNER = 3; + /*滚动条相关配置*/ + private static final int MAXVALUE = 100; + private static final int CONTENT_PANE_WIDTH_GAP = 3; + private static final int MOUSE_WHEEL_SPEED = 5; + private static final int SCROLLBAR_WIDTH = 7; + private int maxHeight = 280; + private static final int TITLE_HEIGHT = 50; + private UIComboBox comboBox; private UpdateAction[] cellInsertActions; private int selectedIndex; + private int currentSelectedIndex; private JPanel leftContentPane; private UIScrollBar scrollBar; - /*占位label*/ - protected static UILabel emptyLabel = new UILabel(); - - private int currentSelectedIndex; public CellQuickEditor() { + double p = TableLayout.PREFERRED; + double f = TableLayout.FILL; + double[] columnSize = {p, f}; + double[] rowSize = {p, p}; + JComponent centerBody = createCenterBody(); + JPanel topContent = initTopContent(); + if (isScrollAll()) { + prepareScrollBar(); + topContent.setBorder(BorderFactory.createMatteBorder(10, 10, 0, 0, this.getBackground())); + centerBody.setBorder(BorderFactory.createMatteBorder(0, 10, 0, 0, this.getBackground())); + Component[][] components = new Component[][]{ + new Component[]{topContent, null}, + new Component[]{centerBody, null} + }; + leftContentPane = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, HGAP, VGAP); + this.setLayout(new CellElementBarLayout(leftContentPane) { + @Override + public void layoutContainer(Container parent) { + maxHeight = CellElementPropertyPane.getInstance().getHeight() - TITLE_HEIGHT; + int beginY; + if ((MAXVALUE - scrollBar.getVisibleAmount()) == 0) { + beginY = 0; + } else { + int preferredHeight = leftContentPane.getPreferredSize().height; + int value = scrollBar.getValue(); + beginY = value * (preferredHeight - maxHeight) / (MAXVALUE - scrollBar.getVisibleAmount()); + } + int width = parent.getWidth(); + int height = parent.getHeight(); + if (leftContentPane.getPreferredSize().height > maxHeight) { + leftContentPane.setBounds(0, -beginY, width - SCROLLBAR_WIDTH - CONTENT_PANE_WIDTH_GAP, height + beginY); + scrollBar.setBounds(width - SCROLLBAR_WIDTH - CONTENT_PANE_WIDTH_GAP, 0, SCROLLBAR_WIDTH + CONTENT_PANE_WIDTH_GAP, height); + } else { + leftContentPane.setBounds(0, 0, width - SCROLLBAR_WIDTH - CONTENT_PANE_WIDTH_GAP, height); + } + leftContentPane.validate(); + } + }); + this.add(scrollBar); + this.add(leftContentPane); + } else { + topContent.setBorder(BorderFactory.createMatteBorder(10, 10, 0, 10, this.getBackground())); + centerBody.setBorder(BorderFactory.createMatteBorder(0, 0, 0, 0, this.getBackground())); + Component[][] components = new Component[][]{ + new Component[]{topContent, null}, + new Component[]{centerBody, null} + }; + this.setLayout(new BorderLayout()); + this.add(TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, HGAP, VGAP), BorderLayout.CENTER); + } + } + + /** + * 初始化详细信息面板 + * + * @return JComponent 待显示的详细信息面板 + */ + public abstract JComponent createCenterBody(); + + /** + * 是否全局具有滚动条 + * + * @return boolean 是否全局具有滚动条 + */ + public abstract boolean isScrollAll(); + + + /** + * 初始化下拉框中的类型 + * + * @return JComponent 待显示的详细信息面板 + */ + public abstract Object getComboBoxSelected(); + + /** + * 刷新 + */ + @Override + protected void refresh() { + CellSelection cs = (CellSelection) tc.getSelection(); + ColumnRow columnRow = ColumnRow.valueOf(cs.getColumn(), cs.getRow()); + columnRowTextField.setText(columnRow.toString()); + cellElement = tc.getEditingElementCase().getTemplateCellElement(cs.getColumn(), cs.getRow()); + refreshDetails(); + } + + /** + * 刷新详细信息 + */ + protected abstract void refreshDetails(); + + + private JPanel initTopContent() { + double p = TableLayout.PREFERRED; + double f = TableLayout.FILL; + double[] columnSize = {p, f}; + double[] rowSize = {p, p}; + UILabel cellLabel = new UILabel(Inter.getLocText("FR-Designer_Cell")); + cellLabel.setPreferredSize(LABEL_DIMENSION); + UILabel insertContentLabel = new UILabel(Inter.getLocText("FR-Designer_Insert_Cell_Element")); + insertContentLabel.setPreferredSize(LABEL_DIMENSION); + UIComboBox cellElementEditComboBox = initCellElementEditComboBox(); + Component[][] components = new Component[][]{ + new Component[]{cellLabel, columnRowTextField = initColumnRowTextField()}, + new Component[]{insertContentLabel, cellElementEditComboBox}, + }; + return TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, HGAP, VGAP); + } + private void prepareScrollBar() { scrollBar = new UIScrollBar(UIScrollBar.VERTICAL) { @Override public int getVisibleAmount() { @@ -77,7 +186,6 @@ public abstract class CellQuickEditor extends QuickEditor { public int getMaximum() { return MAXVALUE; } - }; scrollBar.addAdjustmentListener(new AdjustmentListener() { @@ -98,43 +206,11 @@ public abstract class CellQuickEditor extends QuickEditor { } }); - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double[] columnSize = {p, f}; - double[] rowSize = {p, p}; - JComponent centerBody = createCenterBody(); - centerBody.setBorder(BorderFactory.createMatteBorder(0, 10, 0, 0, this.getBackground())); - Component[][] components = new Component[][]{ - new Component[]{initTopContent(), null}, - new Component[]{centerBody, null} - }; - leftContentPane = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, HGAP, VGAP); - this.setLayout(new BarLayout()); - this.add(scrollBar); - this.add(leftContentPane); - } - - - private JPanel initTopContent() { - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double[] columnSize = {p, f}; - double[] rowSize = {p, p}; - UILabel cellLabel = new UILabel(Inter.getLocText("FR-Designer_Cell")); - cellLabel.setPreferredSize(LABEL_DIMENSION); - UILabel insertContentLabel = new UILabel(Inter.getLocText("FR-Designer_Insert_Cell_Element")); - insertContentLabel.setPreferredSize(LABEL_DIMENSION); - UIComboBox cellElementEditComboBox = initCellElementEditComboBox(); - Component[][] components = new Component[][]{ - new Component[]{cellLabel, columnRowTextField = initColumnRowTextField()}, - new Component[]{insertContentLabel, cellElementEditComboBox}, - }; - JPanel topContent = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, HGAP, VGAP); - topContent.setBorder(BorderFactory.createEmptyBorder(10, 10, 0, 0)); - return topContent; + scrollBar.setPreferredSize(new Dimension(SCROLLBAR_WIDTH + CONTENT_PANE_WIDTH_GAP, this.getHeight())); + scrollBar.setBlockIncrement(SCROLLBAR_WIDTH + CONTENT_PANE_WIDTH_GAP); + scrollBar.setBorder(BorderFactory.createMatteBorder(0, CONTENT_PANE_WIDTH_GAP, 0, 0, this.getBackground())); } - /** * 初始化添加按钮 * @@ -209,88 +285,4 @@ public abstract class CellQuickEditor extends QuickEditor { }); return columnRowTextField; } - - - /** - * 初始化详细信息面板 - * - * @return JComponent 待显示的详细信息面板 - */ - public abstract JComponent createCenterBody(); - - - /** - * 初始化下拉框中的类型 - * - * @return JComponent 待显示的详细信息面板 - */ - public abstract Object getComboBoxSelected(); - - /** - * 刷新 - */ - @Override - protected void refresh() { - CellSelection cs = (CellSelection) tc.getSelection(); - ColumnRow columnRow = ColumnRow.valueOf(cs.getColumn(), cs.getRow()); - columnRowTextField.setText(columnRow.toString()); - cellElement = tc.getEditingElementCase().getTemplateCellElement(cs.getColumn(), cs.getRow()); - refreshDetails(); - } - - /** - * 刷新详细信息 - */ - protected abstract void refreshDetails(); - - /** - * 属性面板的滚动条和内容区域的布局管理类 - * yaoh.wu 由于这边不能继承{@link com.fr.design.mainframe.AbstractAttrPane.BarLayout},所以冗余了一份滚动条代码进来 - * - * @see com.fr.design.mainframe.AbstractAttrPane.BarLayout - */ - protected class BarLayout implements LayoutManager { - - @Override - public void addLayoutComponent(String name, Component comp) { - - } - - @Override - public void removeLayoutComponent(Component comp) { - - } - - @Override - public Dimension preferredLayoutSize(Container parent) { - return leftContentPane.getPreferredSize(); - } - - @Override - public Dimension minimumLayoutSize(Container parent) { - return leftContentPane.getMinimumSize(); - } - - @Override - public void layoutContainer(Container parent) { - maxHeight = CellElementPropertyPane.getInstance().getHeight() - TITLE_HEIGHT; - int beginY; - if ((MAXVALUE - scrollBar.getVisibleAmount()) == 0) { - beginY = 0; - } else { - int preferredHeight = leftContentPane.getPreferredSize().height; - int value = scrollBar.getValue(); - beginY = value * (preferredHeight - maxHeight) / (MAXVALUE - scrollBar.getVisibleAmount()); - } - int width = parent.getWidth(); - int height = parent.getHeight(); - if (leftContentPane.getPreferredSize().height > maxHeight) { - leftContentPane.setBounds(0, -beginY, width - scrollBar.getWidth() - CONTENT_PANE_WIDTH_GAP, height + beginY); - scrollBar.setBounds(width - scrollBar.getWidth() - 1, 0, scrollBar.getWidth(), height); - } else { - leftContentPane.setBounds(0, 0, width - SCROLLBAR_WIDTH - CONTENT_PANE_WIDTH_GAP, height); - } - leftContentPane.validate(); - } - } } \ No newline at end of file diff --git a/designer/src/com/fr/quickeditor/cellquick/CellBiasTextPainterEditor.java b/designer/src/com/fr/quickeditor/cellquick/CellBiasTextPainterEditor.java index d5d8e1f800..8347f6d0d9 100644 --- a/designer/src/com/fr/quickeditor/cellquick/CellBiasTextPainterEditor.java +++ b/designer/src/com/fr/quickeditor/cellquick/CellBiasTextPainterEditor.java @@ -68,4 +68,9 @@ public class CellBiasTextPainterEditor extends CellQuickEditor { protected void refreshDetails() { } + @Override + public boolean isScrollAll() { + return true; + } + } \ No newline at end of file diff --git a/designer/src/com/fr/quickeditor/cellquick/CellDSColumnEditor.java b/designer/src/com/fr/quickeditor/cellquick/CellDSColumnEditor.java index d7c6ddbd47..4ea7a138c9 100644 --- a/designer/src/com/fr/quickeditor/cellquick/CellDSColumnEditor.java +++ b/designer/src/com/fr/quickeditor/cellquick/CellDSColumnEditor.java @@ -98,6 +98,11 @@ public class CellDSColumnEditor extends CellQuickEditor { return centerPane; } + @Override + public boolean isScrollAll() { + return false; + } + /** * 内容全部重新动态生成,不然容易出错 * 刷新详细信息面板 @@ -158,9 +163,11 @@ public class CellDSColumnEditor extends CellQuickEditor { paneList = new ArrayList<>(); /*基本设置面板*/ DSColumnBasicEditorPane cellDSColumnBasicPane = new DSColumnBasicEditorPane(); + paneList.add(cellDSColumnBasicPane); /*高级设置面板*/ cellDSColumnAdvancedPane = new DSColumnAdvancedEditorPane(); + paneList.add(cellDSColumnAdvancedPane); } @@ -209,7 +216,6 @@ public class CellDSColumnEditor extends CellQuickEditor { }; DSColumnBasicEditorPane() { - this.setLayout(new BorderLayout()); dataPane = new SelectedDataColumnPane(true, true, tc, cellElement); groupPane = new ResultSetGroupDockingPane(tc); dataPane.addListener(dataListener); @@ -231,8 +237,9 @@ public class CellDSColumnEditor extends CellQuickEditor { new Component[]{uiLabel, uiButton} }; conditionPane = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, HGAP, VGAP); - this.add(this.createContentPane(), BorderLayout.CENTER); + this.createScrollPane(); this.setBorder(BorderFactory.createEmptyBorder(10, 0, 0, 0)); + } @@ -265,7 +272,7 @@ public class CellDSColumnEditor extends CellQuickEditor { * * @return content JPanel */ - private JPanel createContentPane() { + protected JPanel createContentPane() { double[] columnSize = {F}; double[] rowSize = {P, P, P}; @@ -303,9 +310,8 @@ public class CellDSColumnEditor extends CellQuickEditor { public DSColumnAdvancedEditorPane() { - this.setLayout(new BorderLayout()); - this.add(this.createContentPane(), BorderLayout.CENTER); this.setBorder(BorderFactory.createEmptyBorder(10, 0, 0, 0)); + this.createScrollPane(); } @@ -415,7 +421,7 @@ public class CellDSColumnEditor extends CellQuickEditor { * * @return 内容面板 */ - private JPanel createContentPane() { + protected JPanel createContentPane() { this.setLayout(FRGUIPaneFactory.createBorderLayout()); //结果集排序 sortPane = new ResultSetSortConfigPane(); diff --git a/designer/src/com/fr/quickeditor/cellquick/CellElementBarLayout.java b/designer/src/com/fr/quickeditor/cellquick/CellElementBarLayout.java new file mode 100644 index 0000000000..c9714bc465 --- /dev/null +++ b/designer/src/com/fr/quickeditor/cellquick/CellElementBarLayout.java @@ -0,0 +1,41 @@ +package com.fr.quickeditor.cellquick; + +import javax.swing.*; +import java.awt.*; + +/** + * 单元格元素面板的滚动条 + * + * @see com.fr.design.mainframe.AbstractAttrPane.BarLayout + */ +public abstract class CellElementBarLayout implements LayoutManager { + + private JPanel leftContentPane; + + protected CellElementBarLayout(JPanel leftContentPane) { + this.leftContentPane = leftContentPane; + } + + @Override + public void addLayoutComponent(String name, Component comp) { + + } + + @Override + public void removeLayoutComponent(Component comp) { + + } + + @Override + public Dimension preferredLayoutSize(Container parent) { + return leftContentPane.getPreferredSize(); + } + + @Override + public Dimension minimumLayoutSize(Container parent) { + return leftContentPane.getMinimumSize(); + } + + @Override + public abstract void layoutContainer(Container parent); +} \ No newline at end of file diff --git a/designer/src/com/fr/quickeditor/cellquick/CellFormulaQuickEditor.java b/designer/src/com/fr/quickeditor/cellquick/CellFormulaQuickEditor.java index 7429b146eb..7d245434cc 100644 --- a/designer/src/com/fr/quickeditor/cellquick/CellFormulaQuickEditor.java +++ b/designer/src/com/fr/quickeditor/cellquick/CellFormulaQuickEditor.java @@ -203,4 +203,9 @@ public class CellFormulaQuickEditor extends CellQuickEditor { formulaTextField.getDocument().addDocumentListener(documentListener); } + @Override + public boolean isScrollAll() { + return true; + } + } \ No newline at end of file diff --git a/designer/src/com/fr/quickeditor/cellquick/CellImageQuickEditor.java b/designer/src/com/fr/quickeditor/cellquick/CellImageQuickEditor.java index 25818e79f3..d33ff1828d 100644 --- a/designer/src/com/fr/quickeditor/cellquick/CellImageQuickEditor.java +++ b/designer/src/com/fr/quickeditor/cellquick/CellImageQuickEditor.java @@ -72,6 +72,11 @@ public class CellImageQuickEditor extends CellQuickEditor { } + @Override + public boolean isScrollAll() { + return true; + } + @Override public Object getComboBoxSelected() { return ActionFactory.createAction(ImageCellAction.class); diff --git a/designer/src/com/fr/quickeditor/cellquick/CellRichTextEditor.java b/designer/src/com/fr/quickeditor/cellquick/CellRichTextEditor.java index 75ef442dae..1c0bdd04da 100644 --- a/designer/src/com/fr/quickeditor/cellquick/CellRichTextEditor.java +++ b/designer/src/com/fr/quickeditor/cellquick/CellRichTextEditor.java @@ -49,4 +49,9 @@ public class CellRichTextEditor extends CellQuickEditor { richTextButton.setAction(subReportCellAction); } + @Override + public boolean isScrollAll() { + return true; + } + } \ No newline at end of file diff --git a/designer/src/com/fr/quickeditor/cellquick/CellStringQuickEditor.java b/designer/src/com/fr/quickeditor/cellquick/CellStringQuickEditor.java index c82a3883dc..bd5ea60d1c 100644 --- a/designer/src/com/fr/quickeditor/cellquick/CellStringQuickEditor.java +++ b/designer/src/com/fr/quickeditor/cellquick/CellStringQuickEditor.java @@ -90,6 +90,11 @@ public class CellStringQuickEditor extends CellQuickEditor { return content; } + @Override + public boolean isScrollAll() { + return true; + } + private void changeReportPaneCell(String tmpText) { isEditing = true; diff --git a/designer/src/com/fr/quickeditor/cellquick/CellSubReportEditor.java b/designer/src/com/fr/quickeditor/cellquick/CellSubReportEditor.java index 70d8c51ea1..be34789f9b 100644 --- a/designer/src/com/fr/quickeditor/cellquick/CellSubReportEditor.java +++ b/designer/src/com/fr/quickeditor/cellquick/CellSubReportEditor.java @@ -50,4 +50,8 @@ public class CellSubReportEditor extends CellQuickEditor { return ActionFactory.createAction(SubReportCellAction.class); } + @Override + public boolean isScrollAll() { + return true; + } } \ No newline at end of file