forked from fanruan/design
Browse Source
Merge in DESIGN/design from ~STARRYI/design:feature/x to feature/x * commit '7249227b0afea298be29eb4ad901c6752c93e865': REPORT-51919 主题切换research/11.0
starryi
3 years ago
27 changed files with 1019 additions and 165 deletions
@ -0,0 +1,140 @@
|
||||
package com.fr.design.gui.style; |
||||
|
||||
import com.fr.base.theme.FormTheme; |
||||
import com.fr.base.theme.TemplateTheme; |
||||
import com.fr.design.dialog.BasicPane; |
||||
import com.fr.design.event.GlobalNameListener; |
||||
import com.fr.design.event.GlobalNameObserver; |
||||
import com.fr.design.event.UIObserver; |
||||
import com.fr.design.event.UIObserverListener; |
||||
import com.fr.design.file.HistoryTemplateListCache; |
||||
import com.fr.design.gui.ibutton.UIButtonGroup; |
||||
import com.fr.design.gui.ilable.UILabel; |
||||
import com.fr.design.i18n.Toolkit; |
||||
import com.fr.design.layout.FRGUIPaneFactory; |
||||
import com.fr.design.layout.TableLayout; |
||||
import com.fr.design.layout.TableLayoutHelper; |
||||
import com.fr.design.mainframe.JTemplate; |
||||
|
||||
import javax.swing.BorderFactory; |
||||
import javax.swing.JPanel; |
||||
import java.awt.BorderLayout; |
||||
import java.awt.Component; |
||||
import java.awt.Dimension; |
||||
import java.awt.event.ActionEvent; |
||||
import java.awt.event.ActionListener; |
||||
import java.util.ArrayList; |
||||
import java.util.List; |
||||
|
||||
/** |
||||
* @author Starryi |
||||
* @version 1.0 |
||||
* Created by Starryi on 2021/8/19 |
||||
*/ |
||||
public class FollowingThemePane extends BasicPane implements UIObserver { |
||||
public static final int SETTING_LABEL_WIDTH = 60; |
||||
|
||||
public static final String[] FOLLOWING_THEME_STRING_ARRAYS = new String[]{ |
||||
Toolkit.i18nText("Fine-Design_Style_Follow_Theme"), |
||||
Toolkit.i18nText("Fine-Design_Style_Not_Follow_Theme"), |
||||
}; |
||||
|
||||
private final UIButtonGroup<String> followingThemeButtonGroup; |
||||
private final List<FollowingThemeActionChangeListener> changeListeners = new ArrayList<>(); |
||||
private UIObserverListener uiObserverListener; |
||||
|
||||
private JPanel container; |
||||
|
||||
public FollowingThemePane(String name) { |
||||
this.setLayout(FRGUIPaneFactory.createBorderLayout()); |
||||
this.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); |
||||
|
||||
followingThemeButtonGroup = new UIButtonGroup<>(FOLLOWING_THEME_STRING_ARRAYS); |
||||
followingThemeButtonGroup.setSelectedIndex(1); |
||||
followingThemeButtonGroup.addActionListener(new ActionListener() { |
||||
@Override |
||||
public void actionPerformed(ActionEvent e) { |
||||
for (FollowingThemeActionChangeListener changeListener : changeListeners) { |
||||
changeListener.onFollowingTheme(isFollowingTheme()); |
||||
} |
||||
|
||||
// 与主题相关的属性面板更新完毕后,再通知外层更新数据
|
||||
if (uiObserverListener != null) { |
||||
uiObserverListener.doChange(); |
||||
} |
||||
} |
||||
}); |
||||
|
||||
UILabel followingThemeLabel = new UILabel(name); |
||||
|
||||
double p = TableLayout.PREFERRED; |
||||
double f = TableLayout.FILL; |
||||
JPanel followingThemePane = |
||||
TableLayoutHelper.createGapTableLayoutPane( new Component[][]{new Component[] { followingThemeLabel, followingThemeButtonGroup}}, |
||||
new double[] { p }, new double[] { SETTING_LABEL_WIDTH, f }, 10, 0); |
||||
followingThemePane.setBorder(BorderFactory.createEmptyBorder(10, 0, 0, 0)); |
||||
followingThemePane.setVisible(false); |
||||
|
||||
add(followingThemePane, BorderLayout.NORTH); |
||||
container = FRGUIPaneFactory.createBorderLayout_S_Pane(); |
||||
add(container, BorderLayout.CENTER); |
||||
} |
||||
|
||||
public void addFollowThemePane(JPanel content, FollowingThemeActionChangeListener changeListener) { |
||||
if (content != null) { |
||||
container.add(content, BorderLayout.NORTH); |
||||
changeListeners.add(changeListener); |
||||
|
||||
JPanel nextContainer = FRGUIPaneFactory.createBorderLayout_S_Pane(); |
||||
container.add(nextContainer, BorderLayout.CENTER); |
||||
container = nextContainer; |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
protected String title4PopupWindow() { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public void registerChangeListener(UIObserverListener uiObserverListener) { |
||||
this.uiObserverListener = uiObserverListener; |
||||
} |
||||
|
||||
@Override |
||||
public boolean shouldResponseChangeListener() { |
||||
return true; |
||||
} |
||||
|
||||
public interface FollowingThemeActionChangeListener { |
||||
void onFollowingTheme(boolean following); |
||||
} |
||||
|
||||
public TemplateTheme getUsingTheme() { |
||||
JTemplate<?, ?> template = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); |
||||
if (template != null) { |
||||
TemplateTheme theme = template.getTemplateTheme(); |
||||
if (theme instanceof FormTheme) { |
||||
return theme; |
||||
} |
||||
} |
||||
return null; |
||||
} |
||||
|
||||
public void supportFollowingTheme(boolean supporting) { |
||||
getComponent(0).setVisible(supporting); |
||||
if (!supporting) { |
||||
setFollowingTheme(false); |
||||
} |
||||
} |
||||
|
||||
public void setFollowingTheme(boolean following) { |
||||
followingThemeButtonGroup.setSelectedIndex(following ? 0 : 1); |
||||
for (FollowingThemeActionChangeListener changeListener : changeListeners) { |
||||
changeListener.onFollowingTheme(isFollowingTheme()); |
||||
} |
||||
} |
||||
public boolean isFollowingTheme() { |
||||
return followingThemeButtonGroup.getSelectedIndex() == 0; |
||||
} |
||||
} |
@ -0,0 +1,102 @@
|
||||
package com.fr.design.gui.style; |
||||
|
||||
import com.fr.design.ExtraDesignClassManager; |
||||
import com.fr.design.event.UIObserverListener; |
||||
import com.fr.design.fun.BackgroundQuickUIProvider; |
||||
import com.fr.design.mainframe.backgroundpane.BackgroundQuickPane; |
||||
import com.fr.design.mainframe.backgroundpane.ColorBackgroundQuickPane; |
||||
import com.fr.design.mainframe.backgroundpane.GradientBackgroundQuickPane; |
||||
import com.fr.design.mainframe.backgroundpane.ImageBackgroundQuickPane; |
||||
import com.fr.design.mainframe.backgroundpane.NullBackgroundQuickPane; |
||||
import com.fr.design.mainframe.backgroundpane.PatternBackgroundQuickPane; |
||||
import com.fr.design.mainframe.backgroundpane.TextureBackgroundQuickPane; |
||||
|
||||
import java.util.ArrayList; |
||||
import java.util.List; |
||||
import java.util.Set; |
||||
|
||||
/** |
||||
* @author Starryi |
||||
* @version 1.0 |
||||
* Created by Starryi on 2021/8/19 |
||||
*/ |
||||
public class ReportBackgroundSpecialPane extends BackgroundPane { |
||||
public ReportBackgroundSpecialPane(){ |
||||
super(); |
||||
} |
||||
|
||||
@Override |
||||
protected BackgroundQuickPane[] supportKindsOfBackgroundUI() { |
||||
NullBackgroundQuickPane nullBackgroundPane = new NullBackgroundQuickPane(); |
||||
|
||||
ColorBackgroundQuickPane colorBackgroundPane = new ColorBackgroundQuickPane(); |
||||
colorBackgroundPane.registerChangeListener(new UIObserverListener() { |
||||
@Override |
||||
public void doChange() { |
||||
fireStateChanged(); |
||||
} |
||||
}); |
||||
|
||||
ImageBackgroundQuickPane imageBackgroundPane = new ImageBackgroundQuickPane(); |
||||
imageBackgroundPane.registerChangeListener(new UIObserverListener() { |
||||
@Override |
||||
public void doChange() { |
||||
fireStateChanged(); |
||||
} |
||||
}); |
||||
|
||||
GradientBackgroundQuickPane gradientBackgroundPane = createGradientBackgroundQuickPane(); |
||||
gradientBackgroundPane.registerChangeListener(new UIObserverListener() { |
||||
@Override |
||||
public void doChange() { |
||||
fireStateChanged(); |
||||
} |
||||
}); |
||||
|
||||
TextureBackgroundQuickPane textureBackgroundPane = new TextureBackgroundQuickPane(); |
||||
textureBackgroundPane.registerChangeListener(new UIObserverListener() { |
||||
@Override |
||||
public void doChange() { |
||||
fireStateChanged(); |
||||
} |
||||
}); |
||||
|
||||
PatternBackgroundQuickPane patternBackgroundPane = new PatternBackgroundQuickPane(); |
||||
patternBackgroundPane.registerChangeListener(new UIObserverListener() { |
||||
@Override |
||||
public void doChange() { |
||||
fireStateChanged(); |
||||
} |
||||
}); |
||||
|
||||
|
||||
|
||||
List<BackgroundQuickPane> kinds = new ArrayList<BackgroundQuickPane>(); |
||||
|
||||
kinds.add(nullBackgroundPane); |
||||
kinds.add(colorBackgroundPane); |
||||
kinds.add(imageBackgroundPane); |
||||
kinds.add(gradientBackgroundPane); |
||||
kinds.add(textureBackgroundPane); |
||||
kinds.add(patternBackgroundPane); |
||||
|
||||
Set<BackgroundQuickUIProvider> providers = ExtraDesignClassManager.getInstance().getArray(BackgroundQuickUIProvider.MARK_STRING); |
||||
for (BackgroundQuickUIProvider provider : providers) { |
||||
BackgroundQuickPane newTypePane = provider.appearanceForBackground(); |
||||
newTypePane.registerChangeListener(new UIObserverListener() { |
||||
@Override |
||||
public void doChange() { |
||||
fireStateChanged(); |
||||
} |
||||
}); |
||||
kinds.add(newTypePane); |
||||
} |
||||
|
||||
return kinds.toArray(new BackgroundQuickPane[kinds.size()]); |
||||
} |
||||
|
||||
protected GradientBackgroundQuickPane createGradientBackgroundQuickPane() { |
||||
// 使用默认的150宽度构建渐变条
|
||||
return new GradientBackgroundQuickPane(); |
||||
} |
||||
} |
@ -0,0 +1,211 @@
|
||||
package com.fr.design.report; |
||||
|
||||
import com.fr.base.theme.ReportTheme; |
||||
import com.fr.base.theme.TemplateTheme; |
||||
import com.fr.base.theme.settings.ThemedComponentStyle; |
||||
import com.fr.base.theme.settings.ThemedReportBodyStyle; |
||||
import com.fr.design.designer.IntervalConstants; |
||||
import com.fr.design.dialog.BasicPane; |
||||
import com.fr.design.gui.frpane.AbstractAttrNoScrollPane; |
||||
import com.fr.design.gui.frpane.AttributeChangeListener; |
||||
import com.fr.design.gui.icheckbox.UICheckBox; |
||||
import com.fr.design.gui.ilable.UILabel; |
||||
import com.fr.design.gui.style.ReportBackgroundSpecialPane; |
||||
import com.fr.design.gui.style.FollowingThemePane; |
||||
import com.fr.design.i18n.Toolkit; |
||||
import com.fr.design.layout.FRGUIPaneFactory; |
||||
import com.fr.design.layout.TableLayout; |
||||
import com.fr.design.layout.TableLayoutHelper; |
||||
import com.fr.design.mainframe.theme.ui.BorderUtils; |
||||
import com.fr.form.ui.PaddingMargin; |
||||
import com.fr.general.Background; |
||||
import com.fr.page.ReportSettingsProvider; |
||||
import com.fr.report.stable.ReportSettings; |
||||
|
||||
import javax.swing.BorderFactory; |
||||
import javax.swing.JPanel; |
||||
import javax.swing.SwingConstants; |
||||
import javax.swing.border.CompoundBorder; |
||||
import java.awt.BorderLayout; |
||||
import java.awt.Color; |
||||
import java.awt.Component; |
||||
import java.awt.Dimension; |
||||
import java.awt.Graphics; |
||||
import java.awt.Graphics2D; |
||||
import java.awt.Shape; |
||||
import java.awt.geom.Rectangle2D; |
||||
|
||||
public class NewReportBackgroundPane extends BasicPane { |
||||
private final UICheckBox isPrintBackgroundCheckBox; |
||||
private final UICheckBox isExportBackgroundCheckBox; |
||||
private final BackgroundProfilePane profilePane; |
||||
|
||||
public NewReportBackgroundPane() { |
||||
setLayout(FRGUIPaneFactory.createBorderLayout()); |
||||
setBorder(BorderFactory.createEmptyBorder()); |
||||
setPreferredSize(new Dimension(600, 570)); |
||||
|
||||
profilePane = new BackgroundProfilePane(); |
||||
isPrintBackgroundCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Print_Background")); |
||||
isExportBackgroundCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Export_Background")); |
||||
|
||||
add(profilePane, BorderLayout.CENTER); |
||||
add(createBottomPane(), BorderLayout.SOUTH); |
||||
} |
||||
|
||||
private JPanel createBottomPane() { |
||||
JPanel container = new JPanel(); |
||||
container.setPreferredSize(new Dimension(container.getPreferredSize().width, 30)); |
||||
container.add(isExportBackgroundCheckBox); |
||||
container.add(isPrintBackgroundCheckBox); |
||||
return container; |
||||
} |
||||
|
||||
@Override |
||||
protected String title4PopupWindow() { |
||||
return Toolkit.i18nText("Fine-Design_Report_Background"); |
||||
} |
||||
|
||||
public void populate(ReportSettingsProvider reportSettings) { |
||||
this.profilePane.populateBean(reportSettings); |
||||
this.isPrintBackgroundCheckBox.setSelected(reportSettings.isPrintBackground()); |
||||
this.isExportBackgroundCheckBox.setSelected(reportSettings.isExportBackground()); |
||||
} |
||||
|
||||
public void update(ReportSettingsProvider reportSettings) { |
||||
this.profilePane.updateBean(reportSettings); |
||||
reportSettings.setPrintBackground(this.isPrintBackgroundCheckBox.isSelected()); |
||||
reportSettings.setExportBackground(this.isExportBackgroundCheckBox.isSelected()); |
||||
} |
||||
|
||||
private static class BackgroundPreviewPane extends JPanel { |
||||
private Background background = null; |
||||
|
||||
void refresh(Background background) { |
||||
this.background = background; |
||||
repaint(); |
||||
} |
||||
|
||||
@Override |
||||
public void paint(Graphics g) { |
||||
g.setColor(Color.WHITE); |
||||
g.fillRect(0, 0, getWidth(), getHeight()); |
||||
Graphics2D g2d = (Graphics2D) g; |
||||
if (background != null) { |
||||
Shape shape = new Rectangle2D.Double(0, 0, getWidth(), getHeight()); |
||||
background.paint(g2d, shape); |
||||
} |
||||
} |
||||
} |
||||
|
||||
private static class BackgroundProfilePane extends AbstractAttrNoScrollPane { |
||||
public static final int SETTING_LABEL_WIDTH = 60; |
||||
|
||||
private BackgroundPreviewPane previewPane; |
||||
private FollowingThemePane themePane; |
||||
private ReportBackgroundSpecialPane backgroundPane; |
||||
private JPanel backgroundLabeledPane; |
||||
|
||||
@Override |
||||
protected JPanel createContentPane() { |
||||
previewPane = new BackgroundPreviewPane(); |
||||
themePane = new FollowingThemePane(Toolkit.i18nText("Fine-Design_Report_Background_Setting")); |
||||
themePane.supportFollowingTheme(true); |
||||
|
||||
double p = TableLayout.PREFERRED; |
||||
double f = TableLayout.FILL; |
||||
|
||||
JPanel uiLabelPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); |
||||
uiLabelPane.add(new UILabel(Toolkit.i18nText("Fine-Design_Report_Background_Fill")), BorderLayout.NORTH); |
||||
uiLabelPane.setBorder(BorderFactory.createEmptyBorder(10, 0, 0, 0)); |
||||
backgroundPane = new ReportBackgroundSpecialPane(); |
||||
backgroundLabeledPane = TableLayoutHelper.createCommonTableLayoutPane( |
||||
new Component[][]{ new Component[] { uiLabelPane, backgroundPane } }, |
||||
new double[] { p }, new double[] { SETTING_LABEL_WIDTH, f}, IntervalConstants.INTERVAL_L1 |
||||
); |
||||
themePane.addFollowThemePane(backgroundLabeledPane, new FollowingThemePane.FollowingThemeActionChangeListener() { |
||||
@Override |
||||
public void onFollowingTheme(boolean following) { |
||||
backgroundLabeledPane.setVisible(!following); |
||||
|
||||
if (following) { |
||||
TemplateTheme theme = themePane.getUsingTheme(); |
||||
if (theme instanceof ReportTheme) { |
||||
ThemedReportBodyStyle style = ((ReportTheme) theme).getBodyStyle(); |
||||
Background background = style.getBackground(); |
||||
backgroundPane.populateBean(background); |
||||
previewPane.refresh(background); |
||||
} |
||||
} |
||||
} |
||||
}); |
||||
|
||||
JPanel contentContainer = FRGUIPaneFactory.createBorderLayout_S_Pane(); |
||||
contentContainer.setBorder(BorderFactory.createEmptyBorder()); |
||||
contentContainer.setBorder(BorderFactory.createEmptyBorder()); |
||||
contentContainer.setPreferredSize(new Dimension(600, 540)); |
||||
contentContainer.add(createLeftPane(), BorderLayout.WEST); |
||||
contentContainer.add(createRightPane(), BorderLayout.EAST); |
||||
|
||||
addAttributeChangeListener(new AttributeChangeListener() { |
||||
@Override |
||||
public void attributeChange() { |
||||
valueChangeAction(); |
||||
} |
||||
}); |
||||
|
||||
return contentContainer; |
||||
} |
||||
|
||||
@Override |
||||
protected void initContentPane() { |
||||
super.initContentPane(); |
||||
leftContentPane.setBorder(BorderFactory.createEmptyBorder()); |
||||
} |
||||
|
||||
private JPanel createLeftPane() { |
||||
JPanel container = FRGUIPaneFactory.createLeftFlowZeroGapBorderPane(); |
||||
container.setBorder(BorderFactory.createEmptyBorder()); |
||||
JPanel titledPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); |
||||
titledPane.setBorder(new CompoundBorder( |
||||
BorderUtils.createTitleBorder("预览", 12), |
||||
BorderFactory.createEmptyBorder(5, 5, 4, 5) |
||||
)); |
||||
titledPane.setPreferredSize(new Dimension(397, 502)); |
||||
container.add(titledPane, BorderLayout.WEST); |
||||
titledPane.add(previewPane, BorderLayout.WEST); |
||||
previewPane.setPreferredSize(new Dimension(387, 480)); |
||||
|
||||
return container; |
||||
} |
||||
|
||||
private JPanel createRightPane() { |
||||
JPanel container = FRGUIPaneFactory.createBorderLayout_S_Pane(); |
||||
container.setBorder(BorderFactory.createEmptyBorder()); |
||||
container.setPreferredSize(new Dimension(253, 502)); |
||||
container.add(themePane, BorderLayout.NORTH); |
||||
return container; |
||||
} |
||||
|
||||
private void valueChangeAction() { |
||||
previewPane.refresh(backgroundPane.update()); |
||||
} |
||||
|
||||
public void populateBean(ReportSettingsProvider reportSettings) { |
||||
if (reportSettings instanceof ReportSettings) { |
||||
boolean followingTheme = ((ReportSettings) reportSettings).isBackgroundFollowingTheme(); |
||||
themePane.setFollowingTheme(followingTheme); |
||||
backgroundLabeledPane.setVisible(!followingTheme); |
||||
} |
||||
backgroundPane.populateBean(reportSettings.getBackground()); |
||||
previewPane.refresh(reportSettings.getBackground()); |
||||
} |
||||
|
||||
public void updateBean(ReportSettingsProvider reportSettings) { |
||||
if (reportSettings instanceof ReportSettings) { |
||||
((ReportSettings) reportSettings).setBackgroundFollowingTheme(themePane.isFollowingTheme()); |
||||
} |
||||
reportSettings.setBackground(backgroundPane.update()); |
||||
} |
||||
} |
||||
} |
Loading…
Reference in new issue