package com.fr.design.widgettheme; import com.fine.swing.ui.layout.Column; import com.fr.base.background.ColorBackground; import com.fr.base.theme.TemplateTheme; import com.fr.design.beans.BasicBeanPane; import com.fr.design.designer.IntervalConstants; import com.fr.design.file.HistoryTemplateListCache; import com.fr.design.gui.frpane.FontSizeComboPane; import com.fr.design.gui.frpane.UIPercentDragPane; import com.fr.design.gui.ibutton.UIButtonGroup; import com.fr.design.gui.ibutton.UIColorButton; import com.fr.design.gui.ibutton.UIToggleButton; import com.fr.design.gui.icombobox.LineComboBox; import com.fr.design.gui.icombobox.UIComboBox; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.style.FRFontPane; 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 com.fr.design.style.color.NewColorSelectBox; import com.fr.design.utils.DesignUtils; import com.fr.design.widget.ui.designer.component.UIBoundSpinner; import com.fr.form.ui.Widget; import com.fr.general.FRFont; import com.fr.general.IOUtils; import com.fr.util.ColorUtils; import com.fr.widgettheme.theme.bean.ButtonBackground; import com.fr.widgettheme.theme.panel.ButtonStyleDefinedPane; import com.fr.widgettheme.theme.widget.style.BorderStyle; import com.fr.widgettheme.theme.widget.style.ButtonBackgroundStyle; import com.fr.widgettheme.theme.widget.style.ThemeTextStyle; import com.fr.widgettheme.theme.widget.style.ThemedWidgetStyle; import com.fr.widgettheme.theme.widget.theme.WidgetThemeDisplayConstants; import com.fr.widgettheme.util.WidgetStyleComponentCombiner; import com.fr.widgettheme.util.WidgetThemeDesignerUtils; import javax.swing.BorderFactory; import javax.swing.JPanel; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import static com.fine.swing.ui.layout.Layouts.cell; import static com.fine.swing.ui.layout.Layouts.column; /** * 样式设置pane抽象类 * * @author obo * @since 11.0 * Created on 2023/11/13 */ public abstract class BaseStyleSettingPane extends BasicBeanPane { protected List styleSettingList; //样式切换标题头部 protected UIButtonGroup styleSettingHead; // 自定义样式 protected JPanel customPane; // 主题色 protected NewColorSelectBox colorSelectBox; // 边框线型 protected LineComboBox lineComboBox; /** * 边框颜色 */ protected NewColorSelectBox borderColorSelectBox; // 圆角边框 protected UIBoundSpinner borderRadiusSpinner; // 字体详细设置 protected FRFontPane frFontPane; // 按钮背景设置 protected ButtonStyleDefinedPane buttonStyleDefinedPane; protected NewColorSelectBox selectBgColorBox; /** * 主题文本样式的字体大小 */ protected FontSizeComboPane fontSizePane; /** * 主题文本样式的字体颜色 */ protected UIColorButton fontColorButton; /** * 字体名选择器 */ protected UIComboBox fontNameSelectBox; /** * 字体粗体配置 */ protected UIToggleButton bold; /** * 字体斜体配置 */ protected UIToggleButton italic; /** * 控件背景颜色配置面板 */ protected NewColorSelectBox widgetBgColorSelectBox; /** * 控件背景透明度配置面板 */ protected UIPercentDragPane widgetBgAlphaDragPane; /** * 控件图标颜色 */ protected NewColorSelectBox iconColorSelectBox; private final Map labelMap = new HashMap<>(); private final Map paneMap = new HashMap<>(); public BaseStyleSettingPane(List styleSettingList) { this.styleSettingList = styleSettingList; initLabelMap(); initStyleEditor(); initPane(); initDefaultValue(); } protected void initPane() { this.setLayout(FRGUIPaneFactory.createBorderLayout()); this.add(createHeadPane(), BorderLayout.NORTH); this.add(createCustomPane(), BorderLayout.CENTER); } protected void initStyleEditor() { colorSelectBox = new NewColorSelectBox(WidgetThemeDisplayConstants.THEME_WIDGET_COMPONENT_WIDTH, false); initBorderPane(); frFontPane = new FRFontPane(); buttonStyleDefinedPane = new ButtonStyleDefinedPane(); selectBgColorBox = new NewColorSelectBox(WidgetThemeDisplayConstants.THEME_WIDGET_COMPONENT_WIDTH, true); iconColorSelectBox = new NewColorSelectBox(WidgetThemeDisplayConstants.THEME_WIDGET_COMPONENT_WIDTH, true); fontNameSelectBox = new UIComboBox(DesignUtils.getAvailableFontFamilyNames4Report()); fontSizePane = new FontSizeComboPane(); fontColorButton = new UIColorButton(); bold = new UIToggleButton(IOUtils.readIcon("/com/fr/design/images/m_format/cellstyle/bold.png")); italic = new UIToggleButton(IOUtils.readIcon("/com/fr/design/images/m_format/cellstyle/italic.png")); widgetBgColorSelectBox = new NewColorSelectBox(WidgetThemeDisplayConstants.THEME_WIDGET_COMPONENT_WIDTH, true); widgetBgAlphaDragPane = new UIPercentDragPane(); paneMap.put(StyleSetting.THEME_COLOR, colorSelectBox); paneMap.put(StyleSetting.LINE_TYPE, lineComboBox); paneMap.put(StyleSetting.LINE_COLOR, borderColorSelectBox); paneMap.put(StyleSetting.TEXT_STYLE, WidgetStyleComponentCombiner.combineTextStyleComponent(fontNameSelectBox, fontSizePane, fontColorButton, italic, bold)); paneMap.put(StyleSetting.BORDER_RADIUS, borderRadiusSpinner); paneMap.put(StyleSetting.FONT, frFontPane); paneMap.put(StyleSetting.BTN_BACKGROUND, buttonStyleDefinedPane); paneMap.put(StyleSetting.SELECT_COLOR, selectBgColorBox); paneMap.put(StyleSetting.WIDGET_BACKGROUND, initBackGroundComponent()); paneMap.put(StyleSetting.ICON_COLOR, iconColorSelectBox); } private Column initBackGroundComponent() { return column( 10, cell(widgetBgColorSelectBox), cell(widgetBgAlphaDragPane) ).getComponent(); } protected JPanel createHeadPane() { UILabel headLabel = new UILabel(Toolkit.i18nText("Fine-Design_Widget_Theme_Style_Setting")); String[] titles = new String[]{Toolkit.i18nText("Fine-Design_Widget_Follow_Theme"), Toolkit.i18nText("Fine-Design_Widget_Theme_Custom")}; styleSettingHead = new UIButtonGroup(titles) { @Override public void setSelectedIndex(int newSelectedIndex, boolean fireChanged) { super.setSelectedIndex(newSelectedIndex, fireChanged); switchCard(); } }; JPanel headPane = TableLayoutHelper.createGapTableLayoutPane(new Component[][]{ new Component[]{headLabel, styleSettingHead}}, TableLayoutHelper.FILL_LASTCOLUMN, IntervalConstants.INTERVAL_W1, IntervalConstants.INTERVAL_L1); headPane.setBorder(BorderFactory.createEmptyBorder(0, 0, IntervalConstants.INTERVAL_L1, 0)); return headPane; } protected JPanel createCustomPane() { int size = styleSettingList.size(); double f = TableLayout.FILL; double p = TableLayout.PREFERRED; int columnCount = 2; double[] rowSize = new double[size]; for (int i = 0; i < size; i++) { rowSize[i] = p; } double[] columnSize = {p, f}; int[][] rowCount = new int[size][columnCount]; for (int i = 0; i < size; i++) { for (int j = 0; j < columnCount; j++) { rowCount[i][j] = 1; } } customPane = TableLayoutHelper.createGapTableLayoutPane(createComponents(size), rowSize, columnSize, rowCount, IntervalConstants.INTERVAL_W1, IntervalConstants.INTERVAL_L1); customPane.setBorder(BorderFactory.createEmptyBorder(0, 0, IntervalConstants.INTERVAL_L1, 0)); return customPane; } protected Component[][] createComponents(int size) { Component[][] result = new Component[size][2]; for (int i = 0; i < size; i++) { result[i] = createComponentByStyleSetting(styleSettingList.get(i)); } return result; } protected Component[] createComponentByStyleSetting(StyleSetting styleSetting) { Component[] components = new Component[2]; components[0] = labelMap.get(styleSetting); components[1] = paneMap.get(styleSetting); return components; } protected void switchCard() { customPane.setVisible(styleSettingHead.getSelectedIndex() == 1); } protected void initDefaultValue() { // 读取当前模板的主题 JTemplate template = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); if (JTemplate.isValid(template)) { TemplateTheme theme = template.getTemplateTheme(); ThemedWidgetStyle widgetStyle = (ThemedWidgetStyle) theme.getWidgetStyle(); if (widgetStyle != null) { setThemedStyle(widgetStyle); return; } } setDefaultStyle(); } private void setThemedStyle(ThemedWidgetStyle widgetStyle) { setColorSelectBox(widgetStyle.getThemeColor()); setLineComboBox(widgetStyle.getBorderStyle().getLineType()); setBorderRadiusSpinner(widgetStyle.getBorderStyle().getRadius()); setTextStylePane(widgetStyle.getTextStyle()); setFrFontPane(widgetStyle.getFontStyle().getFont()); setButtonStyleDefinedPane(widgetStyle.getButtonBackgroundStyle()); setSelectBgColor(widgetStyle.getSelectBackgroundColor()); setWidgetBackground(widgetStyle.getWidgetBackground()); setBorderColor(widgetStyle.getBorderStyle().getBorderColor()); setIconColor(widgetStyle.getIconColor()); } private void setColorSelectBox(Color themeColor) { if (colorSelectBox != null) { colorSelectBox.setSelectObject(themeColor); } } private void setLineComboBox(int lineType) { if (lineComboBox != null) { lineComboBox.setSelectedLineStyle(lineType); } } private void setBorderRadiusSpinner(double radius) { if (borderRadiusSpinner != null) { borderRadiusSpinner.setValue(radius); } } private void setTextStylePane(ThemeTextStyle textStyle) { if (fontSizePane != null) { this.fontSizePane.setValue(textStyle.getFontSize()); } if (fontColorButton != null) { this.fontColorButton.setColor(textStyle.getFontColor()); } if (bold != null) { this.bold.setSelected(textStyle.isBold()); } if (italic != null) { this.italic.setSelected(textStyle.isItalic()); } if (fontNameSelectBox != null) { this.fontNameSelectBox.setSelectedItem(textStyle.getName()); } } private void setFrFontPane(FRFont font) { if (frFontPane != null) { frFontPane.populateBean(font); } } private void setButtonStyleDefinedPane(ButtonBackgroundStyle backgroundStyle) { if (buttonStyleDefinedPane != null) { buttonStyleDefinedPane.populate(ButtonBackground.create(backgroundStyle)); } } private void setDefaultStyle() { setColorSelectBox(ThemedWidgetStyle.DEFAULT_COLOR); setLineComboBox(BorderStyle.DEFAULT_LINE_TYPE); setBorderRadiusSpinner(BorderStyle.DEFAULT_BORDER_RADIUS); setTextStylePane(ThemeTextStyle.DEFAULT_WIDGET_STYLE); setFrFontPane(FRFont.getInstance()); setSelectBgColor(WidgetThemeDisplayConstants.DEFAULT_TRANSPARENT_COLOR); setWidgetBackground(WidgetThemeDisplayConstants.DEFAULT_COLOR_BACKGROUND); setBorderColor(BorderStyle.DEFAULT_WIDGET_BORDER_COLOR); setIconColor(Color.BLACK); } private void setSelectBgColor(Color selectBgColor) { if (selectBgColorBox != null) { selectBgColorBox.setSelectObject(selectBgColor); } } private void setWidgetBackground(ColorBackground background) { if (widgetBgColorSelectBox != null) { widgetBgColorSelectBox.setSelectObject(background.getColor()); } if (widgetBgAlphaDragPane != null) { //0-255,需要转化为 double alpha = ColorUtils.roundColorAlphaDouble(background.getColor()); widgetBgAlphaDragPane.populateBean(alpha); } } private void setBorderColor(Color borderColor) { if(borderColorSelectBox != null) { borderColorSelectBox.setSelectObject(borderColor); } } private void setIconColor(Color iconColor) { if(iconColorSelectBox != null) { iconColorSelectBox.setSelectObject(iconColor); } } /** * 初始化枚举和UILabel对应的map */ private void initLabelMap() { for (StyleSetting setting : StyleSetting.values()) { labelMap.put(setting, WidgetThemeDesignerUtils.createTopAlignmentLabel(Toolkit.i18nText(setting.getLabelI18nKey()))); } } private void initBorderPane() { lineComboBox = new LineComboBox(WidgetThemeDisplayConstants.BORDER_LINE_STYLE_ARRAY); borderColorSelectBox = new NewColorSelectBox(WidgetThemeDisplayConstants.THEME_WIDGET_COMPONENT_WIDTH, true); borderRadiusSpinner = new UIBoundSpinner(0, Integer.MAX_VALUE, 1); lineComboBox.addItemListener(e -> borderColorSelectBox.setVisible(!Integer.valueOf(0).equals(e.getItem()))); } }