From d44b2ed3aa33be21ddc483a65917191eef5283cb Mon Sep 17 00:00:00 2001 From: Starryi Date: Thu, 2 Sep 2021 17:20:16 +0800 Subject: [PATCH 1/4] =?UTF-8?q?REPORT-58586=20FR11-=E4=BA=8C=E8=BD=AE?= =?UTF-8?q?=E5=9B=9E=E5=BD=92-=E5=8D=95=E5=85=83=E6=A0=BC=E5=B1=9E?= =?UTF-8?q?=E6=80=A7-=E6=A0=B7=E5=BC=8F-=E5=88=87=E6=8D=A2=E6=88=90?= =?UTF-8?q?=E8=B7=9F=E9=9A=8F=E4=B8=BB=E9=A2=98=E5=90=8E=EF=BC=8C=E9=BC=A0?= =?UTF-8?q?=E6=A0=87=E6=97=A0=E6=B3=95=E4=B8=8A=E6=BB=91=E8=87=B3=E9=A1=B6?= =?UTF-8?q?=E9=83=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 【问题原因】 内层多加了一个ScrollPane就会有这个BUG,和外层的ScrollPane冲突了。 先和之前的预定义样式列表的实现保持一致吧,只有最外层的能滚动, 看看后面能不能优化下 【改动思路】 同上 --- .../fr/design/mainframe/cell/settingpane/style/StylePane.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/cell/settingpane/style/StylePane.java b/designer-realize/src/main/java/com/fr/design/mainframe/cell/settingpane/style/StylePane.java index 93bf523970..e559cfaa41 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/cell/settingpane/style/StylePane.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/cell/settingpane/style/StylePane.java @@ -7,7 +7,6 @@ import com.fr.design.dialog.BasicPane; import com.fr.design.event.UIObserver; import com.fr.design.event.UIObserverListener; import com.fr.design.gui.ibutton.UIButtonGroup; -import com.fr.design.gui.icontainer.UIScrollPane; import com.fr.design.gui.ilable.UILabel; import com.fr.design.i18n.Toolkit; import com.fr.design.layout.TableLayout; @@ -132,8 +131,7 @@ public class StylePane extends BasicPane implements UIObserver { uiLabel.setPreferredSize(new Dimension(uiLabel.getPreferredSize().width, 20)); container.add(uiLabel, BorderLayout.NORTH); themedCellStyleListPane.setBorder(BorderFactory.createEmptyBorder()); - UIScrollPane scrollPane = new UIScrollPane(themedCellStyleListPane); - container.add(scrollPane, BorderLayout.CENTER); + container.add(themedCellStyleListPane, BorderLayout.CENTER); return container; } From a242b1cd59484a6721ee9197bf35ca759109fa75 Mon Sep 17 00:00:00 2001 From: Starryi Date: Thu, 2 Sep 2021 18:22:59 +0800 Subject: [PATCH 2/4] =?UTF-8?q?REPORT-58389=20=E3=80=90FR11=E4=BA=8C?= =?UTF-8?q?=E8=BD=AE=E5=9B=9E=E5=BD=92=E3=80=91=E8=AE=BE=E8=AE=A1=E5=99=A8?= =?UTF-8?q?-frm=E6=A8=A1=E6=9D=BF=E6=92=A4=E9=94=80/=E5=88=87=E6=8D=A2?= =?UTF-8?q?=E4=B8=BB=E9=A2=98=EF=BC=8C=E8=AE=BE=E8=AE=A1=E7=94=BB=E5=B8=83?= =?UTF-8?q?=E9=83=BD=E4=BC=9A=E5=8F=98=E5=B0=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 【问题原因】 1. 主题功能仅负责撤销回退的数据模型修改,不进行界 面刷新,界面刷新依然由原来的撤销回退逻辑完成,优化 撤销回退的效率 2. 设计器修刷新界面后,需要恢复下画布尺寸和滚动条位置 【改动思路】 同上 --- .../java/com/fr/design/mainframe/JTemplate.java | 2 -- .../main/java/com/fr/design/mainframe/JForm.java | 15 +++++++++++++-- .../java/com/fr/design/mainframe/JWorkBook.java | 4 +++- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java b/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java index 4e0a8090eb..8bb23786f6 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java @@ -625,8 +625,6 @@ public abstract class JTemplate> */ public void redo() { this.getUndoManager().redo(); - // 重做前模版使用主题可能已经被删除或修改,需要重置模版样式 - checkAndResetTheme(); fireSuperTargetModified(); } diff --git a/designer-form/src/main/java/com/fr/design/mainframe/JForm.java b/designer-form/src/main/java/com/fr/design/mainframe/JForm.java index 04dd922430..9d03edbc07 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/JForm.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/JForm.java @@ -664,9 +664,11 @@ public class JForm extends JTemplate implements BaseJForm implements BaseJForm implements BaseJForm { @Override protected void applyUndoState(WorkBookUndoState u) { try { - this.setTarget((WorkBook) u.getWorkBook().clone()); + WorkBook undoWorkBook = (WorkBook) u.getWorkBook().clone(); + undoWorkBook.checkAndResetTheme(); + this.setTarget(undoWorkBook); if (!DesignerMode.isAuthorityEditing()) { if (u.getAuthorityType() != BaseUndoState.NORMAL_STATE) { applyAll(u); From 0c6391f2d9831e22abe03a4950c6c807bbe888b8 Mon Sep 17 00:00:00 2001 From: Starryi Date: Thu, 2 Sep 2021 18:58:38 +0800 Subject: [PATCH 3/4] =?UTF-8?q?REPORT-58800=20=E3=80=90=E4=B8=BB=E9=A2=98?= =?UTF-8?q?=E5=88=87=E6=8D=A2=E3=80=91=E4=BC=98=E5=8C=96=E4=B8=BB=E9=A2=98?= =?UTF-8?q?=E9=80=89=E6=8B=A9=E7=95=8C=E9=9D=A2=20=E5=BA=94=E7=94=A8?= =?UTF-8?q?=E4=B8=BB=E9=A2=98=E7=9A=84=E4=BA=A4=E4=BA=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 【问题原因】 交互变更: 直接点击主题列表中的主题块就可以切换当前模版使用的主题 【改动思路】 同上 --- .../theme/TemplateThemeListPane.java | 20 +++--- .../dialog/TemplateThemeUsingDialog.java | 65 ++----------------- 2 files changed, 18 insertions(+), 67 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/TemplateThemeListPane.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/TemplateThemeListPane.java index 524c272ac9..4930335126 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/theme/TemplateThemeListPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/TemplateThemeListPane.java @@ -126,15 +126,17 @@ public class TemplateThemeListPane extends BasicPane { } private void setSelectedBlock(TemplateThemeBlock block) { - if (selectedBlock != null) { - selectedBlock.setSelected(false); - } - selectedBlock = block; - if (selectedBlock != null) { - selectedBlock.setSelected(true); - } - if (changeListener != null) { - changeListener.fireChanged(new ChangeEvent(this)); + if (selectedBlock != block) { + if (selectedBlock != null) { + selectedBlock.setSelected(false); + } + selectedBlock = block; + if (selectedBlock != null) { + selectedBlock.setSelected(true); + } + if (changeListener != null) { + changeListener.fireChanged(new ChangeEvent(this)); + } } } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/dialog/TemplateThemeUsingDialog.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/dialog/TemplateThemeUsingDialog.java index 1d17bb4eb2..e4f4b5fd27 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/theme/dialog/TemplateThemeUsingDialog.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/dialog/TemplateThemeUsingDialog.java @@ -1,9 +1,8 @@ package com.fr.design.mainframe.theme.dialog; -import com.fr.base.theme.ThemedTemplate; import com.fr.base.theme.TemplateTheme; import com.fr.base.theme.TemplateThemeConfig; -import com.fr.design.base.mode.DesignModeContext; +import com.fr.base.theme.ThemedTemplate; import com.fr.design.event.ChangeEvent; import com.fr.design.event.ChangeListener; import com.fr.design.gui.ibutton.UIButton; @@ -11,7 +10,6 @@ import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.mainframe.theme.TemplateThemeListPane; import com.fr.design.mainframe.theme.ui.BorderUtils; -import com.fr.stable.StringUtils; import com.fr.workspace.WorkContext; import javax.swing.BorderFactory; @@ -43,56 +41,27 @@ TemplateThemeUsingDialog extends TemplateThemeDialog { JPanel content = createContent(); UIButton openThemeManagerButton = createOpenThemeManagerButton(); - UIButton usingCurrentThemeButton = createUsingCurrentThemeButton(); UIButton completeButton = createCompleteButton(); setContentPane(createDialogContentPane(content, new UIButton[]{ openThemeManagerButton }, - new UIButton[]{ usingCurrentThemeButton, completeButton } + new UIButton[]{ completeButton } )); themeListPane.startListenThemeConfig(); - resetEnableCurrentThemeButton(themeListPane.getSelectedTheme(), usingCurrentThemeButton); themeListPane.setSelectedChangeListener(new ChangeListener() { @Override public void fireChanged(ChangeEvent event) { - resetEnableCurrentThemeButton(themeListPane.getSelectedTheme(), usingCurrentThemeButton); + TemplateTheme theme = themeListPane.getSelectedTheme(); + if (theme != null) { + currentTemplate.setTemplateTheme(theme); + themeListPane.repaint(); + } } }); } - private void resetEnableCurrentThemeButton(T selectedTheme, UIButton usingCurrentThemeButton) { - if (selectedTheme == null) { - usingCurrentThemeButton.setEnabled(false); - return; - } - String selectedThemeName = selectedTheme.getName(); - if (StringUtils.isEmpty(selectedThemeName)) { - usingCurrentThemeButton.setEnabled(false); - return; - } - - if (currentTemplate == null) { - usingCurrentThemeButton.setEnabled(false); - return; - } - - TemplateTheme templateUsingTheme = currentTemplate.getTemplateTheme(); - if (templateUsingTheme == null) { - usingCurrentThemeButton.setEnabled(true); - return; - } - - String templateUsingThemeName = templateUsingTheme.getName(); - if (StringUtils.isEmpty(templateUsingThemeName)) { - usingCurrentThemeButton.setEnabled(true); - return; - } - - usingCurrentThemeButton.setEnabled(!StringUtils.equals(templateUsingThemeName, selectedTheme.getName())); - } - private JPanel createContent() { JPanel container = FRGUIPaneFactory.createBorderLayout_S_Pane(); container.setBorder(BorderFactory.createEmptyBorder(10, 10, 0, 10)); @@ -123,17 +92,6 @@ TemplateThemeUsingDialog extends TemplateThemeDialog { return null; } - private UIButton createUsingCurrentThemeButton() { - UIButton button = new UIButton(Toolkit.i18nText("Fine-Design_Basic_Template_Theme_Using_Dialog_Use")); - button.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - apply2CurrentTemplate(button); - } - }); - return button; - } - private UIButton createCompleteButton() { UIButton button = new UIButton(Toolkit.i18nText("Fine-Design_Basic_Template_Theme_Using_Dialog_Complete")); button.addActionListener(new ActionListener() { @@ -150,13 +108,4 @@ TemplateThemeUsingDialog extends TemplateThemeDialog { themeListPane.stopAsyncFetchTheme(); super.exit(); } - - private void apply2CurrentTemplate(UIButton usingCurrentThemeButton) { - TemplateTheme theme = themeListPane.getSelectedTheme(); - if (theme != null) { - currentTemplate.setTemplateTheme(theme); - themeListPane.repaint(); - usingCurrentThemeButton.setEnabled(false); - } - } } \ No newline at end of file From e2534d993323efe587a1bba7f64483ff820c0ec5 Mon Sep 17 00:00:00 2001 From: Starryi Date: Fri, 3 Sep 2021 11:41:25 +0800 Subject: [PATCH 4/4] =?UTF-8?q?REPORT-58503=20=E3=80=90=E4=B8=BB=E9=A2=98?= =?UTF-8?q?=E5=88=87=E6=8D=A2=E3=80=91=E9=A2=84=E8=A7=88=E5=8C=BAui?= =?UTF-8?q?=E6=94=B9=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 【问题原因】 单元格样式预览显示透明块 【改动思路】 同上 --- .../fr/design/cell/CellStylePreviewPane.java | 82 ++++++++++++++++++ .../theme/edit/cell/CellStyleEditPane.java | 53 ++--------- .../design/images/transparent_background.png | Bin 0 -> 24823 bytes .../style/ThemedCellStyleListPane.java | 46 +--------- .../com/fr/design/report/ReportStylePane.java | 42 +-------- 5 files changed, 94 insertions(+), 129 deletions(-) create mode 100644 designer-base/src/main/java/com/fr/design/cell/CellStylePreviewPane.java create mode 100644 designer-base/src/main/resources/com/fr/design/images/transparent_background.png diff --git a/designer-base/src/main/java/com/fr/design/cell/CellStylePreviewPane.java b/designer-base/src/main/java/com/fr/design/cell/CellStylePreviewPane.java new file mode 100644 index 0000000000..d566bbf987 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/cell/CellStylePreviewPane.java @@ -0,0 +1,82 @@ +package com.fr.design.cell; + +import com.fr.base.NameStyle; +import com.fr.base.ScreenResolution; +import com.fr.base.Style; +import com.fr.design.mainframe.theme.TemplateThemeBlock; +import com.fr.general.IOUtils; + +import javax.swing.Icon; +import javax.swing.JComponent; +import javax.swing.JPanel; +import java.awt.Dimension; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Image; +import java.awt.Toolkit; + +/** + * @author Starryi + * @version 1.0 + * Created by Starryi on 2021/9/3 + */ +public class CellStylePreviewPane extends JPanel { + + private static final Image transparentBackgroundImage = Toolkit.getDefaultToolkit().createImage(CellStylePreviewPane.class.getResource("/com/fr/design/images/transparent_background.png")); + private final float transparentBackgroundWidth; + private final float transparentBackgroundHeight; + private final float transparentBackgroundAspect; + private String paintText = "Report"; + private Style style = Style.DEFAULT_STYLE; + + public CellStylePreviewPane() { + transparentBackgroundWidth = transparentBackgroundImage.getWidth(null); + transparentBackgroundHeight = transparentBackgroundImage.getHeight(null); + transparentBackgroundAspect = 1.0F * transparentBackgroundImage.getWidth(null) / transparentBackgroundImage.getHeight(null); + } + + public void setStyle(Style style) { + this.style = style; + if (style instanceof NameStyle) { + paintText = ((NameStyle) style).getName(); + } + repaint(); + } + + @Override + public void paintComponent(Graphics g) { + Graphics2D g2d = (Graphics2D) g; + int resolution = ScreenResolution.getScreenResolution(); + + int width = getWidth(); + int height = getHeight(); + + float scaleWidth = 1.0F * getWidth() / transparentBackgroundWidth; + float scaleHeight = 1.0F * getHeight() / transparentBackgroundHeight; + float maxScale = Math.max(scaleWidth, scaleHeight); + + if (maxScale <= 1) { + scaleWidth = scaleHeight = 1; + } else { + scaleHeight = scaleWidth = maxScale; + } + g2d.drawImage(transparentBackgroundImage, 0, 0, (int) (transparentBackgroundWidth * scaleWidth), (int) (transparentBackgroundHeight * scaleHeight), null); + + if (style == Style.DEFAULT_STYLE) { + // 如果是默认的style,就只写"Report"上去 + Style.paintContent(g2d, paintText, style, width, height, resolution); + return; + } + + Style.paintBackground(g2d, style, width, height); + + Style.paintContent(g2d, paintText, style, width, height, resolution); + + Style.paintBorder(g2d, style, getWidth() - 3, getHeight() - 3); + } + + @Override + public Dimension getMinimumSize() { + return getPreferredSize(); + } +} diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/cell/CellStyleEditPane.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/cell/CellStyleEditPane.java index a2991a89f2..53e4d9a912 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/cell/CellStyleEditPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/edit/cell/CellStyleEditPane.java @@ -1,8 +1,7 @@ package com.fr.design.mainframe.theme.edit.cell; -import com.fr.base.ScreenResolution; -import com.fr.base.Style; import com.fr.base.theme.settings.ThemedCellStyle; +import com.fr.design.cell.CellStylePreviewPane; import com.fr.design.constants.UIConstants; import com.fr.design.dialog.AttrScrollPane; import com.fr.design.dialog.BasicPane; @@ -18,12 +17,9 @@ import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.mainframe.theme.ui.BorderUtils; import javax.swing.BorderFactory; -import javax.swing.JComponent; import javax.swing.JPanel; import java.awt.BorderLayout; import java.awt.Dimension; -import java.awt.Graphics; -import java.awt.Graphics2D; import java.awt.GridLayout; import java.util.ArrayList; import java.util.List; @@ -39,7 +35,7 @@ import static com.fr.design.i18n.Toolkit.i18nText; */ public class CellStyleEditPane extends MultiTabPane { private ThemedCellStyle cellStyle; - private PreviewArea previewArea; + private CellStylePreviewPane previewArea; private boolean populating; private AttributeChangeListener attributeChangeListener; @@ -78,7 +74,7 @@ public class CellStyleEditPane extends MultiTabPane { for (BasicPane basicPane : paneList) { ((AbstractBasicStylePane) basicPane).populateBean(ob.getStyle()); - previewArea.preview(ob.getStyle()); + previewArea.setStyle(ob.getStyle()); } this.populating = false; } @@ -112,7 +108,8 @@ public class CellStyleEditPane extends MultiTabPane { jPanel.setLayout(new BorderLayout(0, 4)); JPanel previewPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - previewArea = new PreviewArea(); + previewArea = new CellStylePreviewPane(); + previewArea.setPreferredSize(new Dimension(223, 30)); previewPane.setBorder(BorderUtils.createTitleBorder(i18nText("Fine-Design_Basic_Preview"))); previewPane.add(previewArea, BorderLayout.CENTER); @@ -138,7 +135,7 @@ public class CellStyleEditPane extends MultiTabPane { } ThemedCellStyle cellStyle = updateBean(); if (cellStyle != null) { - previewArea.preview(cellStyle.getStyle()); + previewArea.setStyle(cellStyle.getStyle()); } fireAttrChangeListener(); } @@ -157,42 +154,4 @@ public class CellStyleEditPane extends MultiTabPane { @Override public void updateBean(ThemedCellStyle ob) {} - - private static class PreviewArea extends JComponent { - - private static final String paintText = "Report"; - private Style style = Style.DEFAULT_STYLE; - - public PreviewArea() { - setPreferredSize(new Dimension(223, 30)); - } - - public void preview(Style style) { - this.style = style; - repaint(); - } - - @Override - public void paintComponent(Graphics g) { - Graphics2D g2d = (Graphics2D) g; - int resolution = ScreenResolution.getScreenResolution(); - - if (style == Style.DEFAULT_STYLE) { - // 如果是默认的style,就只写"Report"上去 - Style.paintContent(g2d, paintText, style, getWidth() - 3, getHeight() - 3, resolution); - return; - } - - Style.paintBackground(g2d, style, getWidth() - 3, getHeight() - 3); - - Style.paintContent(g2d, paintText, style, getWidth() - 3, getHeight() - 3, resolution); - - Style.paintBorder(g2d, style, getWidth() - 3, getHeight() - 3); - } - - @Override - public Dimension getMinimumSize() { - return getPreferredSize(); - } - } } diff --git a/designer-base/src/main/resources/com/fr/design/images/transparent_background.png b/designer-base/src/main/resources/com/fr/design/images/transparent_background.png new file mode 100644 index 0000000000000000000000000000000000000000..cfb233f46e5e5e3c5349a7639004806f54c1eee2 GIT binary patch literal 24823 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 imp private static class RadioButtonListCellRenderer extends JPanel implements ListCellRenderer, Serializable { private final UIRadioButton button; - private final PreviewArea previewArea; + private final CellStylePreviewPane previewArea; public RadioButtonListCellRenderer() { super(); @@ -150,7 +147,7 @@ public class ThemedCellStyleListPane extends FurtherBasicBeanPane imp setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); setPreferredSize(new Dimension(getPreferredSize().width, 40)); button = new UIRadioButton(); - previewArea = new PreviewArea(); + previewArea = new CellStylePreviewPane(); add(button, BorderLayout.WEST); add(previewArea, BorderLayout.CENTER); } @@ -162,41 +159,4 @@ public class ThemedCellStyleListPane extends FurtherBasicBeanPane imp return this; } } - - private static class PreviewArea extends JComponent { - - private String paintText = "Report"; - private Style style = Style.DEFAULT_STYLE; - - public void setStyle(Style style) { - this.style = style; - if (style instanceof NameStyle) { - paintText = ((NameStyle) style).getName(); - } - repaint(); - } - - @Override - public void paintComponent(Graphics g) { - Graphics2D g2d = (Graphics2D) g; - int resolution = ScreenResolution.getScreenResolution(); - - if (style == Style.DEFAULT_STYLE) { - // 如果是默认的style,就只写"Report"上去 - Style.paintContent(g2d, paintText, style, getWidth() - 3, getHeight() - 3, resolution); - return; - } - - Style.paintBackground(g2d, style, getWidth() - 3, getHeight() - 3); - - Style.paintContent(g2d, paintText, style, getWidth() - 3, getHeight() - 3, resolution); - - Style.paintBorder(g2d, style, getWidth() - 3, getHeight() - 3); - } - - @Override - public Dimension getMinimumSize() { - return getPreferredSize(); - } - } } \ No newline at end of file diff --git a/designer-realize/src/main/java/com/fr/design/report/ReportStylePane.java b/designer-realize/src/main/java/com/fr/design/report/ReportStylePane.java index 91b3641ff3..94b18f969d 100644 --- a/designer-realize/src/main/java/com/fr/design/report/ReportStylePane.java +++ b/designer-realize/src/main/java/com/fr/design/report/ReportStylePane.java @@ -1,9 +1,9 @@ package com.fr.design.report; import com.fr.base.NameStyle; -import com.fr.base.ScreenResolution; import com.fr.base.Style; import com.fr.design.border.UIRoundedBorder; +import com.fr.design.cell.CellStylePreviewPane; import com.fr.design.constants.UIConstants; import com.fr.design.designer.IntervalConstants; import com.fr.design.dialog.BasicPane; @@ -52,8 +52,6 @@ import java.awt.CardLayout; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; -import java.awt.Graphics; -import java.awt.Graphics2D; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; @@ -66,7 +64,7 @@ public class ReportStylePane extends BasicPane { }; public static final int DEFAULT_SELECTED_INDEX = 0; - private final PreviewArea previewArea; + private final CellStylePreviewPane previewArea; private final UIButtonGroup followingThemeButtonGroup; private final CustomFloatStyleSettingPane customStylePane; private final ThemedCellStyleListPane themedCellStyleListPane; @@ -78,7 +76,7 @@ public class ReportStylePane extends BasicPane { setLayout(FRGUIPaneFactory.createBorderLayout()); setBorder(BorderFactory.createEmptyBorder(10, 10, 0, 10)); - previewArea = new PreviewArea(); + previewArea = new CellStylePreviewPane(); followingThemeButtonGroup = new UIButtonGroup<>(FOLLOWING_THEME_STRING_ARRAYS); customStylePane = new CustomFloatStyleSettingPane(); themedCellStyleListPane = new ThemedCellStyleListPane(); @@ -333,40 +331,6 @@ public class ReportStylePane extends BasicPane { previewArea.setStyle(updateBean()); } - private static class PreviewArea extends JComponent { - - private static final String paintText = "Report"; - private Style style = Style.DEFAULT_STYLE; - - public void setStyle(Style style) { - this.style = style; - repaint(); - } - - @Override - public void paintComponent(Graphics g) { - Graphics2D g2d = (Graphics2D) g; - int resolution = ScreenResolution.getScreenResolution(); - - if (style == Style.DEFAULT_STYLE) { - // 如果是默认的style,就只写"Report"上去 - Style.paintContent(g2d, paintText, style, getWidth() - 3, getHeight() - 3, resolution); - return; - } - - Style.paintBackground(g2d, style, getWidth() - 3, getHeight() - 3); - - Style.paintContent(g2d, paintText, style, getWidth() - 3, getHeight() - 3, resolution); - - Style.paintBorder(g2d, style, getWidth() - 3, getHeight() - 3); - } - - @Override - public Dimension getMinimumSize() { - return getPreferredSize(); - } - } - private static class CustomFloatStyleSettingPane extends BasicPane implements ChangeListener { private static final int ALIGNMENT_INDEX = 1; private static final int FONT_INDEX = 2;