diff --git a/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/DefaultMobileStyleDefinePane.java b/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/DefaultMobileStyleDefinePane.java new file mode 100644 index 000000000..d397c8d52 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/DefaultMobileStyleDefinePane.java @@ -0,0 +1,99 @@ +package com.fr.design.mainframe.mobile.ui; + +import com.fr.base.GraphHelper; +import com.fr.design.mainframe.widget.preview.MobileTemplatePreviewPane; +import com.fr.form.ui.CardSwitchButton; +import com.fr.form.ui.container.cardlayout.WCardTagLayout; +import com.fr.general.FRFont; +import com.fr.general.cardtag.mobile.DefaultMobileTemplateStyle; +import com.fr.general.cardtag.mobile.MobileTemplateStyle; + +import java.awt.BasicStroke; +import java.awt.Dimension; +import java.awt.FontMetrics; +import java.awt.Graphics; +import java.awt.Graphics2D; + +public class DefaultMobileStyleDefinePane extends MobileTemplateStyleDefinePane { + + public DefaultMobileStyleDefinePane(WCardTagLayout tagLayout) { + super(tagLayout); + } + + @Override + public void populateBean(MobileTemplateStyle ob) { + updatePreviewPane(); + } + + protected void createConfigPane() { + + } + + @Override + protected void initDefaultConfig() { + + } + + @Override + public MobileTemplateStyle updateSubStyle() { + return null; + } + + @Override + public MobileTemplateStyle updateBean() { + return new DefaultMobileTemplateStyle(); + } + + @Override + protected MobileTemplateStyle getDefaultTemplateStyle() { + return new DefaultMobileTemplateStyle(); + } + + @Override + protected String title4PopupWindow() { + return null; + } + + protected MobileTemplatePreviewPane createPreviewPane() { + return new DefaultStylePreviewPane(); + } + + public class DefaultStylePreviewPane extends MobileTemplatePreviewPane { + + public DefaultStylePreviewPane() { + this.setBackground(DefaultMobileTemplateStyle.DEFAULT_INITIAL_COLOR); + } + + public void repaint() { + super.repaint(); + } + + @Override + public void paint(Graphics g) { + super.paint(g); + Dimension dimension = this.getSize(); + int panelWidth = dimension.width; + int panelHeight = dimension.height; + Graphics2D g2d = (Graphics2D) g.create(); + FRFont frFont = DefaultMobileTemplateStyle.DEFAULT_TAB_FONT.getFont(); + FontMetrics fm = GraphHelper.getFontMetrics(frFont); + WCardTagLayout cardTagLayout = DefaultMobileStyleDefinePane.this.getTagLayout(); + int eachWidth = panelWidth / cardTagLayout.getWidgetCount(); + g2d.setFont(frFont); + int fontHeight = fm.getHeight(); + int ascentHeight = fm.getAscent(); + for (int i = 0; i < cardTagLayout.getWidgetCount(); i++) { + CardSwitchButton cardSwitchButton = cardTagLayout.getSwitchButton(i); + String widgetName = cardSwitchButton.getText(); + int width = fm.stringWidth(widgetName); + g2d.drawString(widgetName, (eachWidth - width) / 2, (panelHeight - fontHeight) / 2 + ascentHeight); + if (i == 0) { + g2d.setStroke(new BasicStroke(2.0f)); + g2d.drawLine(0, panelHeight - 1, eachWidth, panelHeight - 1); + } + g2d.translate(eachWidth, 0); + } + } + } + +} diff --git a/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/DownMenuStyleDefinePane.java b/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/DownMenuStyleDefinePane.java new file mode 100644 index 000000000..a0184c9a8 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/DownMenuStyleDefinePane.java @@ -0,0 +1,193 @@ +package com.fr.design.mainframe.mobile.ui; + +import com.fr.base.GraphHelper; +import com.fr.base.IconManager; +import com.fr.design.constants.LayoutConstants; +import com.fr.design.designer.IntervalConstants; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.layout.TableLayoutHelper; +import com.fr.design.mainframe.widget.UITitleSplitLine; +import com.fr.design.mainframe.widget.preview.MobileTemplatePreviewPane; +import com.fr.form.ui.CardSwitchButton; +import com.fr.form.ui.container.cardlayout.WCardTagLayout; +import com.fr.general.FRFont; +import com.fr.general.cardtag.mobile.DownMenuStyle; +import com.fr.general.cardtag.mobile.LineDescription; +import com.fr.general.cardtag.mobile.MobileTemplateStyle; + +import javax.swing.BorderFactory; +import javax.swing.JPanel; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; +import java.awt.Color; +import java.awt.Component; +import java.awt.Dimension; +import java.awt.FlowLayout; +import java.awt.FontMetrics; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Stroke; +import java.util.ArrayList; + +public class DownMenuStyleDefinePane extends StyleDefinePaneWithSelectConf { + private LinePane splitLinePane; + private TabIconConfigPane initIconConfigPane; + private TabIconConfigPane selectIconConfigPane; + + public DownMenuStyleDefinePane(WCardTagLayout tagLayout) { + super(tagLayout); + } + + protected void createExtraConfPane(JPanel centerPane) { + JPanel panel = FRGUIPaneFactory.createVerticalFlowLayout_Pane(true, FlowLayout.LEADING, 0, 0); + panel.setBorder(BorderFactory.createEmptyBorder(0, 20, 5, 20)); + UITitleSplitLine iconSplitLine = new UITitleSplitLine(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Icon"), 520); + iconSplitLine.setPreferredSize(new Dimension(520, 20)); + centerPane.add(iconSplitLine); + + initIconConfigPane = new TabIconConfigPane(getTagLayout().getWidgetCount()); + selectIconConfigPane = new TabIconConfigPane(getTagLayout().getWidgetCount()); + + UILabel initIconLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Mobile_Initial_Icon")); + UILabel selectIconLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Mobile_Select_Icon")); + initIconLabel.setPreferredSize(new Dimension(55, 20)); + selectIconLabel.setPreferredSize(new Dimension(55, 20)); + JPanel initIconContainPane = TableLayoutHelper.createGapTableLayoutPane(new Component[][]{new Component[]{initIconLabel, initIconConfigPane}}, TableLayoutHelper.FILL_LASTCOLUMN, IntervalConstants.INTERVAL_L1, LayoutConstants.VGAP_MEDIUM); + JPanel selectIconContainePane = TableLayoutHelper.createGapTableLayoutPane(new Component[][]{new Component[]{selectIconLabel, selectIconConfigPane}}, TableLayoutHelper.FILL_LASTCOLUMN, IntervalConstants.INTERVAL_L1, LayoutConstants.VGAP_MEDIUM); + initIconContainPane.setPreferredSize(new Dimension(240, 50)); + selectIconContainePane.setPreferredSize(new Dimension(240, 50)); + panel.add(initIconContainPane); + panel.add(selectIconContainePane); + UITitleSplitLine splitLine = new UITitleSplitLine(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Mobile_Spit_Line"), 520); + splitLine.setPreferredSize(new Dimension(520, 20)); + splitLinePane = new LinePane(); + splitLinePane.addLineChangeListener(new ChangeListener() { + @Override + public void stateChanged(ChangeEvent e) { + updatePreviewPane(); + } + }); + centerPane.add(panel); + centerPane.add(splitLine); + centerPane.add(splitLinePane); + } + + @Override + protected void initDefaultConfig() { + this.initialColorBox.setSelectObject(DownMenuStyle.DEFAULT_INITIAL_COLOR); + this.fontConfPane.populate(DownMenuStyle.DEFAULT_TAB_FONT.getFont()); + this.selectColorBox.setSelectObject(DownMenuStyle.DEFAULT_SELECT_COLOR); + this.selectFontColor.setColor(DownMenuStyle.DEFAULT_SELECT_FONT_COLOR); + this.splitLinePane.populate(DownMenuStyle.DEFAULT_SPLIT_LINE); + } + + @Override + protected MobileTemplatePreviewPane createPreviewPane() { + return new DownMenuStylePreviewPane(); + } + + + @Override + public void populateBean(MobileTemplateStyle ob) { + super.populateBean(ob); + DownMenuStyle downMenuStyle = (DownMenuStyle) ob; + splitLinePane.populate(downMenuStyle.getSplitLine()); + ArrayList initialIconNames = new ArrayList(); + ArrayList selectIconNames = new ArrayList(); + for (int i = 0; i < getTagLayout().getWidgetCount(); i++) { + CardSwitchButton cardSwitchButton = (CardSwitchButton) getTagLayout().getWidget(i); + initialIconNames.add(cardSwitchButton.getInitIconName()); + selectIconNames.add(cardSwitchButton.getSelectIconName()); + } + initIconConfigPane.populate(initialIconNames); + selectIconConfigPane.populate(selectIconNames); + } + + @Override + protected MobileTemplateStyle getDefaultTemplateStyle() { + return new DownMenuStyle(); + } + + @Override + public MobileTemplateStyle updateStyleWithSelectConf() { + DownMenuStyle downMenuStyle = new DownMenuStyle(); + downMenuStyle.setSplitLine(splitLinePane.update()); + ArrayList initialIconNames = initIconConfigPane.update(); + ArrayList selectIconNames = selectIconConfigPane.update(); + for (int i = 0; i < getTagLayout().getWidgetCount(); i++) { + CardSwitchButton cardSwitchButton = (CardSwitchButton) getTagLayout().getWidget(i); + cardSwitchButton.setInitIconName(initialIconNames.get(i)); + cardSwitchButton.setSelectIconName(selectIconNames.get(i)); + } + return downMenuStyle; + } + + @Override + protected String title4PopupWindow() { + return null; + } + + public class DownMenuStylePreviewPane extends MobileTemplatePreviewPane { + private static final int ICON_OFFSET = 16; + private static final int GAP = 6; + private static final String PAINT_ICON = "fund_white"; + private LineDescription splitLine; + + public DownMenuStylePreviewPane() { + this.setBackground(Color.decode("#3888EE")); + } + + public void repaint() { + super.repaint(); + } + + @Override + public void paint(Graphics g) { + super.paint(g); + Color selectFontColor = this.getTabFontConfig().getSelectColor(); + Dimension dimension = this.getSize(); + int panelWidth = dimension.width; + int panelHeight = dimension.height; + Graphics2D g2d = (Graphics2D) g.create(); + FRFont frFont = this.getTabFontConfig().getFont(); + FontMetrics fm = GraphHelper.getFontMetrics(frFont); + WCardTagLayout cardTagLayout = DownMenuStyleDefinePane.this.getTagLayout(); + int eachWidth = panelWidth / cardTagLayout.getWidgetCount(); + g2d.setFont(frFont); + int fontHeight = fm.getHeight(); + int ascent = fm.getAscent(); + for (int i = 0; i < cardTagLayout.getWidgetCount(); i++) { + + g2d.setColor(i == 0 ? selectFontColor : frFont.getForeground()); + CardSwitchButton cardSwitchButton = cardTagLayout.getSwitchButton(i); + String widgetName = cardSwitchButton.getText(); + int width = fm.stringWidth(widgetName); + if(i == 0){ + Color oldColor = g2d.getColor(); + g2d.setColor(this.getSelectColor()); + g2d.fillRect(0, 0 ,eachWidth, panelHeight); + g2d.setColor(oldColor); + } + String iconName = PAINT_ICON; + g2d.drawImage(IconManager.getIconManager().getIconImage(iconName), (eachWidth - ICON_OFFSET) / 2, (panelHeight - ICON_OFFSET - GAP - fontHeight) / 2, null); + g2d.drawString(widgetName, (eachWidth - width) / 2, (panelHeight + ICON_OFFSET + GAP - fontHeight) / 2 + ascent); + Stroke oldStroke = g2d.getStroke(); + if (splitLine.getLineStyle() != 0) { + g2d.setColor(splitLine.getColor()); + g2d.setStroke(GraphHelper.getStroke(splitLine.getLineStyle())); + g2d.drawLine(eachWidth, 0, eachWidth, panelHeight); + } + g2d.setStroke(oldStroke); + g2d.translate(eachWidth, 0); + + } + + } + + public void populateConfig(MobileTemplateStyle templateStyle) { + super.populateConfig(templateStyle); + this.splitLine = ((DownMenuStyle) templateStyle).getSplitLine(); + } + } +} diff --git a/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/LinePane.java b/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/LinePane.java new file mode 100644 index 000000000..fabc7ca5b --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/LinePane.java @@ -0,0 +1,108 @@ +package com.fr.design.mainframe.mobile.ui; + +import com.fr.design.constants.LayoutConstants; +import com.fr.design.designer.IntervalConstants; +import com.fr.design.gui.icombobox.LineComboBox; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.layout.TableLayoutHelper; +import com.fr.design.layout.VerticalFlowLayout; +import com.fr.design.style.color.NewColorSelectBox; +import com.fr.general.cardtag.mobile.LineDescription; +import com.fr.stable.CoreConstants; + +import javax.swing.BorderFactory; +import javax.swing.JPanel; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; +import javax.swing.event.EventListenerList; +import java.awt.Component; +import java.awt.Dimension; +import java.awt.FlowLayout; +import java.awt.event.ItemEvent; +import java.awt.event.ItemListener; + +public class LinePane extends JPanel { + private LineComboBox lineStyle; + private NewColorSelectBox lineColor; + private EventListenerList lineChangeListener = new EventListenerList(); + + public LinePane() { + init(); + } + + private void init() { + this.setLayout(new VerticalFlowLayout(FlowLayout.CENTER, 0, 10)); + this.setBorder(BorderFactory.createEmptyBorder(0, 20, 5, 20)); + UILabel lineLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_FRFont_Line_Style")); + UILabel colorLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Colors")); + lineLabel.setPreferredSize(new Dimension(55, 20)); + colorLabel.setPreferredSize(new Dimension(55, 20)); + + lineStyle = new LineComboBox(CoreConstants.UNDERLINE_STYLE_ARRAY); + lineStyle.setPreferredSize(new Dimension(152, 20)); + lineColor = new NewColorSelectBox(137); + lineStyle.addItemListener(new ItemListener() { + @Override + public void itemStateChanged(ItemEvent e) { + fireLineStateChanged(); + } + }); + lineColor.addSelectChangeListener(new ChangeListener() { + @Override + public void stateChanged(ChangeEvent e) { + fireLineStateChanged(); + } + }); + this.add(TableLayoutHelper.createGapTableLayoutPane(new Component[][]{new Component[]{lineLabel, lineStyle}}, TableLayoutHelper.FILL_LASTCOLUMN, IntervalConstants.INTERVAL_L1, LayoutConstants.VGAP_MEDIUM)); + this.add(TableLayoutHelper.createGapTableLayoutPane(new Component[][]{new Component[]{colorLabel, lineColor}}, TableLayoutHelper.FILL_LASTCOLUMN, IntervalConstants.INTERVAL_L1, LayoutConstants.VGAP_MEDIUM)); + } + + public LineDescription update() { + LineDescription lineDescription = new LineDescription(); + lineDescription.setColor(lineColor.getSelectObject()); + lineDescription.setLineStyle(lineStyle.getSelectedLineStyle()); + return lineDescription; + } + + public void populate(LineDescription lineDescription) { + lineStyle.setSelectedLineStyle(lineDescription.getLineStyle()); + lineColor.setSelectObject(lineDescription.getColor()); + } + + + /** + * 添加监听 + * + * @param changeListener 监听列表 + */ + public void addLineChangeListener(ChangeListener changeListener) { + lineChangeListener.add(ChangeListener.class, changeListener); + } + + /** + * 移除监听 + * Removes an old ColorChangeListener. + * + * @param changeListener 监听列表 + */ + public void removeLineChangeListener(ChangeListener changeListener) { + lineChangeListener.remove(ChangeListener.class, changeListener); + } + + /** + * 颜色状态改变 + */ + public void fireLineStateChanged() { + Object[] listeners = lineChangeListener.getListenerList(); + ChangeEvent e = null; + + for (int i = listeners.length - 2; i >= 0; i -= 2) { + if (listeners[i] == ChangeListener.class) { + if (e == null) { + e = new ChangeEvent(this); + } + ((ChangeListener) listeners[i + 1]).stateChanged(e); + } + } + } +} diff --git a/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileTemplateStyleDefinePane.java b/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileTemplateStyleDefinePane.java new file mode 100644 index 000000000..9f5809f92 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileTemplateStyleDefinePane.java @@ -0,0 +1,218 @@ +package com.fr.design.mainframe.mobile.ui; + +import com.fr.design.beans.BasicBeanPane; +import com.fr.design.constants.LayoutConstants; +import com.fr.design.designer.IntervalConstants; +import com.fr.design.dialog.AttrScrollPane; +import com.fr.design.dialog.BasicScrollPane; +import com.fr.design.gui.icombobox.UIComboBox; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.layout.TableLayoutHelper; +import com.fr.design.mainframe.widget.MobileTabFontConfPane; +import com.fr.design.mainframe.widget.UITitleSplitLine; +import com.fr.design.mainframe.widget.preview.MobileTemplatePreviewPane; +import com.fr.design.style.color.NewColorSelectBox; +import com.fr.design.utils.gui.GUICoreUtils; +import com.fr.form.ui.container.cardlayout.WCardTagLayout; +import com.fr.general.FRFont; +import com.fr.general.cardtag.mobile.MobileTemplateStyle; +import com.fr.general.cardtag.mobile.TabFontConfig; + +import javax.swing.BorderFactory; +import javax.swing.JPanel; +import javax.swing.border.TitledBorder; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Component; +import java.awt.Dimension; +import java.awt.FlowLayout; +import java.awt.Font; +import java.awt.event.ItemEvent; +import java.awt.event.ItemListener; + +public abstract class MobileTemplateStyleDefinePane extends BasicBeanPane { + private static final String[] TAB_STYLES = new String[]{com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Default"), + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_Custom")}; + private UIComboBox custom; + protected NewColorSelectBox initialColorBox; + protected MobileTabFontConfPane fontConfPane; + private JPanel centerPane; + protected MobileTemplatePreviewPane previewPane; + private WCardTagLayout tagLayout; + + + public MobileTemplatePreviewPane getPreviewPane() { + return previewPane; + } + + public MobileTemplateStyleDefinePane(WCardTagLayout tagLayout) { + this.tagLayout = tagLayout; + init(); + } + + + public WCardTagLayout getTagLayout() { + return tagLayout; + } + + protected void init() { + this.setLayout(FRGUIPaneFactory.createBorderLayout()); + previewPane = createPreviewPane(); + previewPane.setPreferredSize(new Dimension(500, 60)); + JPanel northPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); + TitledBorder titledBorder = GUICoreUtils.createTitledBorder(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Preview"), null); + titledBorder.setTitleFont(FRFont.getInstance("PingFangSC-Regular", Font.PLAIN, 9, Color.BLUE)); + northPane.setBorder(titledBorder); + northPane.setPreferredSize(new Dimension(500, 83)); + northPane.add(previewPane, BorderLayout.CENTER); + this.add(northPane, BorderLayout.NORTH); + createConfigPane(); + + } + + protected void createConfigPane() { + JPanel configPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); + TitledBorder titledBorder = GUICoreUtils.createTitledBorder(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Set"), null); + titledBorder.setTitleFont(FRFont.getInstance("PingFangSC-Regular", Font.PLAIN, 9, Color.BLUE)); + configPane.setBorder(titledBorder); + centerPane = createCenterPane(); + custom = new UIComboBox(TAB_STYLES); + custom.addItemListener(new ItemListener() { + @Override + public void itemStateChanged(ItemEvent e) { + boolean isCustom = custom.getSelectedIndex() == 1; + centerPane.setVisible(isCustom); + updatePreviewPane(); + } + }); + centerPane.setVisible(false); + custom.setPreferredSize(new Dimension(157, 20)); + final JPanel scrollPanel = FRGUIPaneFactory.createBorderLayout_S_Pane(); + BasicScrollPane basicScrollPane = new AttrScrollPane() { + @Override + protected JPanel createContentPane() { + return scrollPanel; + } + }; + configPane.add(basicScrollPane, BorderLayout.CENTER); + this.add(configPane, BorderLayout.CENTER); + + JPanel outPanel = FRGUIPaneFactory.createBoxFlowInnerContainer_S_Pane(); + outPanel.setBorder(BorderFactory.createEmptyBorder(10, 20, 5, 20)); + UILabel tabStyleLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Mobile_Tab_Style")); + tabStyleLabel.setPreferredSize(new Dimension(55, 20)); + JPanel jPanel = TableLayoutHelper.createGapTableLayoutPane(new Component[][]{new Component[]{tabStyleLabel, custom}}, TableLayoutHelper.FILL_LASTCOLUMN, IntervalConstants.INTERVAL_L1, LayoutConstants.VGAP_MEDIUM); + jPanel.setPreferredSize(new Dimension(200, 20)); + outPanel.add(jPanel); + scrollPanel.add(outPanel, BorderLayout.NORTH); + + UITitleSplitLine backgroundSplit = new UITitleSplitLine(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Background"), 520); + backgroundSplit.setPreferredSize(new Dimension(520, 20)); + centerPane.add(backgroundSplit); + + centerPane.add(createBackgroundConfPane()); + + UITitleSplitLine fontSplit = new UITitleSplitLine(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Mobile_Tab_Char"), 520); + fontSplit.setPreferredSize(new Dimension(520, 20)); + centerPane.add(fontSplit); + + centerPane.add(createFontConfPane()); + + createExtraConfPane(centerPane); + + scrollPanel.add(centerPane, BorderLayout.CENTER); + initDefaultConfig(); + } + + protected JPanel createCenterPane() { + JPanel panel = FRGUIPaneFactory.createVerticalFlowLayout_Pane(true, FlowLayout.LEADING, 0, 10); + return panel; + } + + protected JPanel createBackgroundConfPane() { + initialColorBox = new NewColorSelectBox(137); + initialColorBox.addSelectChangeListener(new ChangeListener() { + @Override + public void stateChanged(ChangeEvent e) { + updatePreviewPane(); + } + }); + UILabel fillLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Fill")); + fillLabel.setPreferredSize(new Dimension(55, 20)); + + JPanel jPanel = TableLayoutHelper.createGapTableLayoutPane(new Component[][]{new Component[]{fillLabel, initialColorBox}}, TableLayoutHelper.FILL_LASTCOLUMN, IntervalConstants.INTERVAL_L1, LayoutConstants.VGAP_MEDIUM); + jPanel.setPreferredSize(new Dimension(240, 20)); + initialColorBox.setPreferredSize(new Dimension(157, 20)); + jPanel.setBorder(BorderFactory.createEmptyBorder(0, 20, 5, 20)); + return jPanel; + } + + protected JPanel createFontConfPane() { + fontConfPane = new MobileTabFontConfPane(); + fontConfPane.addFontChangeListener(new ChangeListener() { + @Override + public void stateChanged(ChangeEvent e) { + updatePreviewPane(); + } + }); + UILabel initCharLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Mobile_Tab_Init_Char")); + initCharLabel.setPreferredSize(new Dimension(55, 20)); + JPanel jPanel3 = GUICoreUtils.createBoxFlowInnerContainerPane(5, 0); + jPanel3.add(initCharLabel); + jPanel3.add(fontConfPane); + jPanel3.setBorder(BorderFactory.createEmptyBorder(0, 20, 0, 20)); + return jPanel3; + } + + + protected void createExtraConfPane(JPanel centerPane) { + + } + + protected abstract void initDefaultConfig(); + + protected abstract MobileTemplatePreviewPane createPreviewPane(); + + @Override + public void populateBean(MobileTemplateStyle ob) { + centerPane.setVisible(ob.isCustom()); + custom.setSelectedItem(!ob.isCustom() ? com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Default") : + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_Custom")); + initialColorBox.setSelectObject(ob.getInitialColor()); + fontConfPane.populate(ob.getTabFontConfig().getFont()); + updatePreviewPane(); + } + + + @Override + public MobileTemplateStyle updateBean() { + if (custom.getSelectedIndex() == 0) { + return getDefaultTemplateStyle(); + } + MobileTemplateStyle ob = updateSubStyle(); + ob.setCustom(custom.getSelectedIndex() == 1); + ob.setInitialColor(initialColorBox.getSelectObject()); + TabFontConfig config = ob.getTabFontConfig(); + config.setFont(fontConfPane.update()); + return ob; + } + + protected abstract MobileTemplateStyle getDefaultTemplateStyle(); + + public void updatePreviewPane() { + previewPane.populateConfig(updateBean()); + previewPane.setBackground(previewPane.getInitialColor()); + previewPane.repaint(); + } + + public abstract MobileTemplateStyle updateSubStyle(); + + + @Override + protected String title4PopupWindow() { + return null; + } +} diff --git a/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/SliderStyleDefinePane.java b/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/SliderStyleDefinePane.java new file mode 100644 index 000000000..ee81be2ee --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/SliderStyleDefinePane.java @@ -0,0 +1,165 @@ +package com.fr.design.mainframe.mobile.ui; + +import com.fr.base.GraphHelper; +import com.fr.design.constants.LayoutConstants; +import com.fr.design.designer.IntervalConstants; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.layout.TableLayoutHelper; +import com.fr.design.mainframe.widget.UITitleSplitLine; +import com.fr.design.mainframe.widget.preview.MobileTemplatePreviewPane; +import com.fr.design.style.color.NewColorSelectBox; +import com.fr.form.ui.container.cardlayout.WCardTagLayout; +import com.fr.general.FRFont; +import com.fr.general.cardtag.mobile.MobileTemplateStyle; +import com.fr.general.cardtag.mobile.SliderStyle; + +import javax.swing.BorderFactory; +import javax.swing.JPanel; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; +import java.awt.Color; +import java.awt.Component; +import java.awt.Dimension; +import java.awt.FlowLayout; +import java.awt.FontMetrics; +import java.awt.Graphics; +import java.awt.Graphics2D; + +public class SliderStyleDefinePane extends MobileTemplateStyleDefinePane { + private NewColorSelectBox initDotColor; + private NewColorSelectBox selectDotColor; + + + public SliderStyleDefinePane(WCardTagLayout tagLayout) { + super(tagLayout); + } + + @Override + public void populateBean(MobileTemplateStyle ob) { + super.populateBean(ob); + SliderStyle sliderStyle = (SliderStyle) ob; + initDotColor.setSelectObject(sliderStyle.getInitDotColor()); + selectDotColor.setSelectObject(sliderStyle.getSelectDotColor()); + } + + @Override + protected MobileTemplateStyle getDefaultTemplateStyle() { + return new SliderStyle(); + } + + @Override + public MobileTemplateStyle updateSubStyle() { + SliderStyle sliderStyle = new SliderStyle(); + sliderStyle.setInitDotColor(initDotColor.getSelectObject()); + sliderStyle.setSelectDotColor(selectDotColor.getSelectObject()); + return sliderStyle; + } + + + protected void createExtraConfPane(JPanel centerPane) { + JPanel panel = FRGUIPaneFactory.createVerticalFlowLayout_Pane(true, FlowLayout.LEADING, 0, 10); + panel.setBorder(BorderFactory.createEmptyBorder(0, 20, 5, 20)); + UITitleSplitLine dotIndicator = new UITitleSplitLine(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Mobile_Slider_Dot_Indicator"), 520); + dotIndicator.setPreferredSize(new Dimension(520, 20)); + centerPane.add(dotIndicator); + initDotColor = new NewColorSelectBox(137); + initDotColor.addSelectChangeListener(new ChangeListener() { + @Override + public void stateChanged(ChangeEvent e) { + updatePreviewPane(); + } + }); + selectDotColor = new NewColorSelectBox(137); + selectDotColor.addSelectChangeListener(new ChangeListener() { + @Override + public void stateChanged(ChangeEvent e) { + updatePreviewPane(); + } + }); + UILabel initColor = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Mobile_Init_Fill")); + + UILabel selectColor = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Mobile_Select_Fill")); + initColor.setPreferredSize(new Dimension(55, 20)); + selectColor.setPreferredSize(new Dimension(55, 20)); + JPanel initDotColorPane = TableLayoutHelper.createGapTableLayoutPane(new Component[][]{new Component[]{initColor, initDotColor}}, TableLayoutHelper.FILL_LASTCOLUMN, IntervalConstants.INTERVAL_L1, LayoutConstants.VGAP_MEDIUM); + JPanel selectDotColorPane = TableLayoutHelper.createGapTableLayoutPane(new Component[][]{new Component[]{selectColor, selectDotColor}}, TableLayoutHelper.FILL_LASTCOLUMN, IntervalConstants.INTERVAL_L1, LayoutConstants.VGAP_MEDIUM); + initDotColorPane.setPreferredSize(new Dimension(240, 20)); + selectDotColorPane.setPreferredSize(new Dimension(240, 20)); + panel.add(initDotColorPane); + panel.add(selectDotColorPane); + centerPane.add(panel); + } + + @Override + protected void initDefaultConfig() { + this.initialColorBox.setSelectObject(SliderStyle.DEFAULT_INITIAL_COLOR); + this.fontConfPane.populate(SliderStyle.DEFAULT_TAB_FONT.getFont()); + initDotColor.setSelectObject(SliderStyle.DEFAULT_INITIAL_DOT_COLOR); + selectDotColor.setSelectObject(SliderStyle.DEFAULT_SELECT_DOT_COLOR); + } + + @Override + protected MobileTemplatePreviewPane createPreviewPane() { + return new SliderStylePreviewPane(); + } + + + @Override + protected String title4PopupWindow() { + return null; + } + + + public class SliderStylePreviewPane extends MobileTemplatePreviewPane { + private static final int CIRCLE_SIZE = 6; + private static final int GAP = 4; + private static final int OFFSET_X = 10; + private Color initDotColor; + private Color selectDotColor; + + public SliderStylePreviewPane() { + + } + + public void repaint() { + super.repaint(); + } + + @Override + public void paint(Graphics g) { + super.paint(g); + Dimension dimension = this.getSize(); + int panelHeight = dimension.height; + Graphics2D g2d = (Graphics2D) g.create(); + FRFont frFont = this.getTabFontConfig().getFont(); + g2d.setFont(frFont); + g2d.setColor(frFont.getForeground()); + FontMetrics fm = GraphHelper.getFontMetrics(frFont); + int fontHeight = fm.getHeight(); + int ascent = fm.getAscent(); + g2d.drawString(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Mobile_Slider_Title"), OFFSET_X, (panelHeight - fontHeight - GAP - CIRCLE_SIZE) / 2 + ascent); + WCardTagLayout cardTagLayout = SliderStyleDefinePane.this.getTagLayout(); + g2d.translate(OFFSET_X, (panelHeight + fontHeight + GAP - CIRCLE_SIZE) / 2); + for (int i = 0; i < cardTagLayout.getWidgetCount(); i++) { + if (i == 0) { + g2d.setColor(selectDotColor); + g2d.fillOval(0, 0, CIRCLE_SIZE, CIRCLE_SIZE); + g2d.translate(CIRCLE_SIZE + GAP, 0); + continue; + } + g2d.setColor(initDotColor); + g2d.fillOval(0, 0, CIRCLE_SIZE, CIRCLE_SIZE); + g2d.translate(CIRCLE_SIZE + GAP, 0); + } + + } + + public void populateConfig(MobileTemplateStyle templateStyle) { + super.populateConfig(templateStyle); + this.initDotColor = ((SliderStyle) templateStyle).getInitDotColor(); + this.selectDotColor = ((SliderStyle) templateStyle).getSelectDotColor(); + } + } + +} diff --git a/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/StyleDefinePaneWithSelectConf.java b/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/StyleDefinePaneWithSelectConf.java new file mode 100644 index 000000000..9096fc957 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/StyleDefinePaneWithSelectConf.java @@ -0,0 +1,113 @@ +package com.fr.design.mainframe.mobile.ui; + +import com.fr.design.constants.LayoutConstants; +import com.fr.design.designer.IntervalConstants; +import com.fr.design.gui.ibutton.UIColorButton; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.layout.TableLayoutHelper; +import com.fr.design.mainframe.widget.MobileTabFontConfPane; +import com.fr.design.style.color.NewColorSelectBox; +import com.fr.form.ui.container.cardlayout.WCardTagLayout; +import com.fr.general.cardtag.mobile.MobileTemplateStyle; + +import javax.swing.BorderFactory; +import javax.swing.JPanel; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; +import java.awt.Component; +import java.awt.Dimension; +import java.awt.FlowLayout; + +public abstract class StyleDefinePaneWithSelectConf extends MobileTemplateStyleDefinePane { + + protected NewColorSelectBox selectColorBox; + protected UIColorButton selectFontColor; + + public StyleDefinePaneWithSelectConf(WCardTagLayout tagLayout) { + super(tagLayout); + } + + protected JPanel createBackgroundConfPane() { + JPanel panel = FRGUIPaneFactory.createVerticalFlowLayout_Pane(true, FlowLayout.LEADING, 0, 10); + panel.setBorder(BorderFactory.createEmptyBorder(0, 20, 5, 20)); + initialColorBox = new NewColorSelectBox(137); + initialColorBox.addSelectChangeListener(new ChangeListener() { + @Override + public void stateChanged(ChangeEvent e) { + updatePreviewPane(); + } + }); + + selectColorBox = new NewColorSelectBox(137); + selectColorBox.addSelectChangeListener(new ChangeListener() { + @Override + public void stateChanged(ChangeEvent e) { + updatePreviewPane(); + } + }); + UILabel initFillLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Mobile_Init_Fill")); + UILabel selectFillLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Mobile_Select_Fill")); + initFillLabel.setPreferredSize(new Dimension(55, 20)); + selectFillLabel.setPreferredSize(new Dimension(55, 20)); + JPanel jPanel2 = TableLayoutHelper.createGapTableLayoutPane(new Component[][]{new Component[]{initFillLabel, initialColorBox}}, TableLayoutHelper.FILL_LASTCOLUMN, IntervalConstants.INTERVAL_L1, LayoutConstants.VGAP_MEDIUM); + JPanel jPanel3 = TableLayoutHelper.createGapTableLayoutPane(new Component[][]{new Component[]{selectFillLabel, selectColorBox}}, TableLayoutHelper.FILL_LASTCOLUMN, IntervalConstants.INTERVAL_L1, LayoutConstants.VGAP_MEDIUM); + jPanel2.setPreferredSize(new Dimension(240, 20)); + jPanel3.setPreferredSize(new Dimension(240, 20)); + panel.add(jPanel2); + panel.add(jPanel3); + return panel; + } + + protected JPanel createFontConfPane() { + JPanel panel = FRGUIPaneFactory.createVerticalFlowLayout_Pane(true, FlowLayout.LEADING, 0, 10); + panel.setBorder(BorderFactory.createEmptyBorder(0, 20, 5, 20)); + fontConfPane = new MobileTabFontConfPane(); + fontConfPane.addFontChangeListener(new ChangeListener() { + @Override + public void stateChanged(ChangeEvent e) { + updatePreviewPane(); + } + }); + selectFontColor = new UIColorButton(); + selectFontColor.addColorChangeListener(new ChangeListener() { + @Override + public void stateChanged(ChangeEvent e) { + + updatePreviewPane(); + } + }); + UILabel initCharLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Mobile_Tab_Init_Char")); + initCharLabel.setPreferredSize(new Dimension(55, 20)); + JPanel jPanel3 = TableLayoutHelper.createGapTableLayoutPane(new Component[][]{new Component[]{initCharLabel, fontConfPane}}, TableLayoutHelper.FILL_LASTCOLUMN, IntervalConstants.INTERVAL_L1, LayoutConstants.VGAP_MEDIUM); + jPanel3.setPreferredSize(new Dimension(500, 20)); + + UILabel selectCharLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Mobile_Tab_Select_Char")); + selectCharLabel.setPreferredSize(new Dimension(55, 20)); + selectFontColor.setPreferredSize(new Dimension(20, 20)); + JPanel jPanel4 = TableLayoutHelper.createGapTableLayoutPane(new Component[][]{new Component[]{selectCharLabel, selectFontColor}}, TableLayoutHelper.FILL_LASTCOLUMN, IntervalConstants.INTERVAL_L1, LayoutConstants.VGAP_MEDIUM); + JPanel jPanel5 = FRGUIPaneFactory.createLeftFlowZeroGapBorderPane(); + jPanel5.setPreferredSize(new Dimension(500, 20)); + jPanel5.add(jPanel4); + panel.add(jPanel3); + panel.add(jPanel5); + return panel; + } + + @Override + public MobileTemplateStyle updateSubStyle() { + MobileTemplateStyle mobileTemplateStyle = updateStyleWithSelectConf(); + mobileTemplateStyle.setSelectColor(selectColorBox.getSelectObject()); + mobileTemplateStyle.getTabFontConfig().setSelectColor(selectFontColor.getColor()); + return mobileTemplateStyle; + } + + protected abstract MobileTemplateStyle updateStyleWithSelectConf(); + + @Override + public void populateBean(MobileTemplateStyle mobileTemplateStyle) { + super.populateBean(mobileTemplateStyle); + selectColorBox.setSelectObject(mobileTemplateStyle.getSelectColor()); + selectFontColor.setColor(mobileTemplateStyle.getTabFontConfig().getSelectColor()); + } +} diff --git a/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/TabIconConfigPane.java b/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/TabIconConfigPane.java new file mode 100644 index 000000000..6f424e19e --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/TabIconConfigPane.java @@ -0,0 +1,172 @@ +package com.fr.design.mainframe.mobile.ui; + +import com.fr.base.GraphHelper; +import com.fr.base.IconManager; +import com.fr.design.dialog.BasicDialog; +import com.fr.design.dialog.DialogActionAdapter; +import com.fr.design.gui.ibutton.UIButton; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.mainframe.DesignerContext; +import com.fr.design.web.CustomIconPane; +import com.fr.form.ui.WidgetInfoConfig; +import com.fr.general.ComparatorUtils; +import com.fr.stable.Constants; + +import javax.swing.BorderFactory; +import javax.swing.JComponent; +import javax.swing.JPanel; +import javax.swing.JToggleButton; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; +import javax.swing.plaf.basic.BasicButtonUI; +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Cursor; +import java.awt.Dimension; +import java.awt.FlowLayout; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Image; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.geom.Rectangle2D; +import java.util.ArrayList; + +public class TabIconConfigPane extends JPanel { + private UIButton editIconButton; + private String curIconName; + private IconButton selectIconButton; + private ArrayList iconButtons = new ArrayList(); + + public TabIconConfigPane(int count) { + initComp(count); + } + + public void initComp(int count) { + this.setLayout(FRGUIPaneFactory.createBorderLayout()); + JPanel panel = FRGUIPaneFactory.createLeftFlowZeroGapBorderPane(); + panel.setBorder(BorderFactory.createEmptyBorder(5, 0, 5, 0)); + editIconButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Edit")); + editIconButton.setPreferredSize(new Dimension(62, 20)); + panel.add(editIconButton); + editIconButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + final CustomIconPane cip = new CustomIconPane(); + BasicDialog editDialog = cip.showWindow(DesignerContext.getDesignerFrame()); + editDialog.addDialogActionListener(new DialogActionAdapter() { + @Override + public void doOk() { + curIconName = cip.update(); + setShowIconImage(); + TabIconConfigPane.this.repaint(); + } + }); + editDialog.setVisible(true); + } + }); + editIconButton.setEnabled(false); + this.add(panel, BorderLayout.CENTER); + + JPanel northPane = new JPanel(); + northPane.setLayout(new FlowLayout(FlowLayout.LEFT, 5, 0)); + for (int i = 0; i < count; i++) { + IconButton iconButton = new IconButton(""); + northPane.add(iconButton); + iconButtons.add(iconButton); + } + this.add(northPane, BorderLayout.NORTH); + } + + public void setShowIconImage() { + selectIconButton.setIconName(curIconName); + } + + public void populate(ArrayList iconArr) { + for (int i = 0; i < iconButtons.size(); i++) { + iconButtons.get(i).setIconName(iconArr.get(i)); + } + } + + public ArrayList update() { + ArrayList iconNames = new ArrayList(); + for (int i = 0; i < iconButtons.size(); i++) { + iconNames.add(iconButtons.get(i).getIconName()); + } + return iconNames; + } + + + private class IconButton extends JToggleButton implements ActionListener { + private String iconName; + private Image iconImage = null; + private static final int ICON_BUTTON_SIZE = 20; + private static final int ICON_X = 2; + private static final int ICON_Y = 2; + + public IconButton(String name) { + this.iconName = name; + this.addActionListener(this); + this.setBackground(Color.WHITE); + this.setCursor(new Cursor(Cursor.HAND_CURSOR)); + this.iconImage = WidgetInfoConfig.getInstance().getIconManager().getIconImage(name); + } + + @Override + public void updateUI() { + setUI(new BasicButtonUI() { + public void paint(Graphics g, JComponent c) { + super.paint(g, c); + } + }); + } + + public String getIconName() { + return iconName; + } + + public void setIconName(String iconName) { + this.iconName = iconName; + this.iconImage = WidgetInfoConfig.getInstance().getIconManager().getIconImage(iconName); + } + + @Override + public void paintComponent(Graphics g) { + super.paintComponent(g); + Graphics2D g2d = (Graphics2D) g; + // carl:这里缩放显示 16 × 16 + if (iconImage != null) { + g2d.drawImage(iconImage, ICON_X, ICON_Y, IconManager.DEFAULT_ICONWIDTH, IconManager.DEFAULT_ICONHEIGHT, null); + } + if (this.iconName != null && ComparatorUtils.equals(this, selectIconButton)) { + g2d.setPaint(Color.decode("#419BF9")); + } else { + g2d.setPaint(Color.decode("#D9DADD")); + } + GraphHelper.draw(g2d, new Rectangle2D.Double(0, 0, 20, 20), Constants.LINE_MEDIUM); + } + + @Override + public Dimension getPreferredSize() { + return new Dimension(ICON_BUTTON_SIZE, ICON_BUTTON_SIZE); + } + + public void actionPerformed(ActionEvent evt) { + selectIconButton = this; + editIconButton.setEnabled(true); + TabIconConfigPane.this.repaint();// repaint + } + + @Override + public void addChangeListener(ChangeListener changeListener) { + this.changeListener = changeListener; + } + + private void fireChagneListener() { + if (this.changeListener != null) { + ChangeEvent evt = new ChangeEvent(this); + this.changeListener.stateChanged(evt); + } + } + + } +} diff --git a/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/TemplateStyleDefinePaneFactory.java b/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/TemplateStyleDefinePaneFactory.java new file mode 100644 index 000000000..3f923707d --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/TemplateStyleDefinePaneFactory.java @@ -0,0 +1,55 @@ +package com.fr.design.mainframe.mobile.ui; + +import com.fr.design.beans.BasicBeanPane; +import com.fr.form.ui.container.cardlayout.WCardTagLayout; +import com.fr.general.cardtag.mobile.DefaultMobileTemplateStyle; +import com.fr.general.cardtag.mobile.DownMenuStyle; +import com.fr.general.cardtag.mobile.MobileTemplateStyle; +import com.fr.general.cardtag.mobile.SliderStyle; +import com.fr.general.cardtag.mobile.UpMenuStyle; +import com.fr.invoke.Reflect; +import com.fr.log.FineLoggerFactory; + +import java.util.HashMap; +import java.util.Map; + +public class TemplateStyleDefinePaneFactory { + private static Map defineMap = new HashMap(); + + static { + defineMap.put(DefaultMobileTemplateStyle.STYLE_NAME, new StyleDefinePaneUI(DefaultMobileStyleDefinePane.class)); + defineMap.put(UpMenuStyle.STYLE_NAME, new StyleDefinePaneUI(UpMenuStyleDefinePane.class)); + defineMap.put(DownMenuStyle.STYLE_NAME, new StyleDefinePaneUI(DownMenuStyleDefinePane.class)); + defineMap.put(SliderStyle.STYLE_NAME, new StyleDefinePaneUI(SliderStyleDefinePane.class)); + } + + public static BasicBeanPane createDefinePane(String style, WCardTagLayout tagLayout) { + StyleDefinePaneUI styleDefinePaneUI = defineMap.get(style); + Class> clazz = styleDefinePaneUI.getaClass(); + if (clazz == null) { + } + BasicBeanPane quickPane = null; + try { + quickPane = Reflect.on(clazz).create(tagLayout).get(); + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } + return quickPane; + } + + private static class StyleDefinePaneUI { + private Class> aClass; + + public StyleDefinePaneUI(Class> aClass) { + this.aClass = aClass; + } + + public Class> getaClass() { + return aClass; + } + + public void setaClass(Class> aClass) { + this.aClass = aClass; + } + } +} diff --git a/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/UpMenuStyleDefinePane.java b/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/UpMenuStyleDefinePane.java new file mode 100644 index 000000000..3812324d4 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/UpMenuStyleDefinePane.java @@ -0,0 +1,222 @@ +package com.fr.design.mainframe.mobile.ui; + +import com.fr.base.GraphHelper; +import com.fr.design.constants.LayoutConstants; +import com.fr.design.designer.IntervalConstants; +import com.fr.design.gui.ibutton.UIRadioButton; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.layout.TableLayoutHelper; +import com.fr.design.mainframe.widget.UITitleSplitLine; +import com.fr.design.mainframe.widget.preview.MobileTemplatePreviewPane; +import com.fr.form.ui.CardSwitchButton; +import com.fr.form.ui.container.cardlayout.WCardTagLayout; +import com.fr.general.FRFont; +import com.fr.general.cardtag.mobile.LineDescription; +import com.fr.general.cardtag.mobile.MobileTemplateStyle; +import com.fr.general.cardtag.mobile.UpMenuStyle; + +import javax.swing.BorderFactory; +import javax.swing.ButtonGroup; +import javax.swing.JPanel; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Component; +import java.awt.Dimension; +import java.awt.FontMetrics; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Stroke; + +public class UpMenuStyleDefinePane extends StyleDefinePaneWithSelectConf { + private UIRadioButton gapFix; + private UIRadioButton titleWidthFix; + private LinePane bottomBorderPane; + private LinePane underLinePane; + + public UpMenuStyleDefinePane(WCardTagLayout tagLayout) { + super(tagLayout); + } + + protected JPanel createCenterPane() { + JPanel panel = super.createCenterPane(); + UILabel displayGap = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Mobile_Display_Gap")); + displayGap.setPreferredSize(new Dimension(55, 20)); + gapFix = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Mobile_Gap_Fix")); + titleWidthFix = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Mobile_Title_Width_Fix")); + ButtonGroup buttonGroup = new ButtonGroup(); + titleWidthFix.setSelected(true); + buttonGroup.add(gapFix); + gapFix.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); + titleWidthFix.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); + buttonGroup.add(titleWidthFix); + gapFix.addChangeListener(new ChangeListener() { + @Override + public void stateChanged(ChangeEvent e) { + updatePreviewPane(); + } + }); + titleWidthFix.addChangeListener(new ChangeListener() { + @Override + public void stateChanged(ChangeEvent e) { + updatePreviewPane(); + } + }); + + + JPanel flowLeft = FRGUIPaneFactory.createNormalFlowInnerContainer_M_Pane(); + flowLeft.add(gapFix); + flowLeft.add(titleWidthFix); + JPanel centerPane = TableLayoutHelper.createGapTableLayoutPane(new Component[][]{new Component[]{displayGap, flowLeft}}, TableLayoutHelper.FILL_LASTCOLUMN, IntervalConstants.INTERVAL_L1, LayoutConstants.VGAP_MEDIUM); + centerPane.setBorder(BorderFactory.createEmptyBorder(0, 20, 15, 20)); + centerPane.setPreferredSize(new Dimension(500, 20)); + JPanel outerPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); + outerPane.setBorder(BorderFactory.createEmptyBorder(0, 0, 15, 0)); + outerPane.add(centerPane, BorderLayout.CENTER); + panel.add(outerPane); + return panel; + } + + protected void createExtraConfPane(JPanel centerPane) { + bottomBorderPane = new LinePane(); + underLinePane = new LinePane(); + bottomBorderPane.addLineChangeListener(new ChangeListener() { + @Override + public void stateChanged(ChangeEvent e) { + updatePreviewPane(); + } + }); + underLinePane.addLineChangeListener(new ChangeListener() { + @Override + public void stateChanged(ChangeEvent e) { + updatePreviewPane(); + } + }); + UITitleSplitLine titleSplitLine = new UITitleSplitLine(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Mobile_Spit_Line"), 520); + titleSplitLine.setPreferredSize(new Dimension(520, 20)); + centerPane.add(titleSplitLine); + centerPane.add(bottomBorderPane); + UITitleSplitLine titleUnderLine = new UITitleSplitLine(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Mobile_Under_Line"), 520); + titleUnderLine.setPreferredSize(new Dimension(520, 20)); + centerPane.add(titleUnderLine); + centerPane.add(underLinePane); + } + + @Override + protected void initDefaultConfig() { + this.initialColorBox.setSelectObject(UpMenuStyle.DEFAULT_INITIAL_COLOR); + this.fontConfPane.populate(UpMenuStyle.DEFAULT_TAB_FONT.getFont()); + this.selectColorBox.setSelectObject(UpMenuStyle.DEFAULT_SELECT_COLOR); + this.selectFontColor.setColor(UpMenuStyle.DEFAULT_SELECT_FONT_COLOR); + this.bottomBorderPane.populate(UpMenuStyle.DEFAULT_BOTTOM_BORDER); + this.underLinePane.populate(UpMenuStyle.DEFAULT_UNDER_LINE); + } + + @Override + protected MobileTemplatePreviewPane createPreviewPane() { + return new UpMenuStylePreviewPane(); + } + + @Override + public void populateBean(MobileTemplateStyle ob) { + super.populateBean(ob); + UpMenuStyle style = (UpMenuStyle) ob; + gapFix.setSelected(style.isGapFix()); + titleWidthFix.setSelected(style.isTitleWidthFix()); + bottomBorderPane.populate(style.getBottomBorder()); + underLinePane.populate(style.getUnderline()); + } + + @Override + protected MobileTemplateStyle getDefaultTemplateStyle() { + return new UpMenuStyle(); + } + + + @Override + public MobileTemplateStyle updateStyleWithSelectConf() { + UpMenuStyle style = new UpMenuStyle(); + style.setGapFix(gapFix.isSelected()); + style.setTitleWidthFix(titleWidthFix.isSelected()); + style.setBottomBorder(bottomBorderPane.update()); + style.setUnderline(underLinePane.update()); + return style; + } + + @Override + protected String title4PopupWindow() { + return null; + } + + + public class UpMenuStylePreviewPane extends MobileTemplatePreviewPane { + private LineDescription bottomBorder; + private LineDescription underLine; + private boolean isGapFix; + + public UpMenuStylePreviewPane() { + this.setBackground(Color.WHITE); + } + + public void repaint() { + super.repaint(); + } + + @Override + public void paint(Graphics g) { + super.paint(g); + Color selectFontColor = this.getTabFontConfig().getSelectColor(); + Dimension dimension = this.getSize(); + int panelWidth = dimension.width; + int panelHeight = dimension.height; + Graphics2D g2d = (Graphics2D) g.create(); + FRFont frFont = UpMenuStyleDefinePane.this.fontConfPane.update(); + FontMetrics fm = GraphHelper.getFontMetrics(frFont); + WCardTagLayout cardTagLayout = UpMenuStyleDefinePane.this.getTagLayout(); + int eachWidth = panelWidth / cardTagLayout.getWidgetCount(); + g2d.setFont(frFont); + int fontHeight = fm.getHeight(); + int ascentHeight = fm.getAscent(); + for (int i = 0; i < cardTagLayout.getWidgetCount(); i++) { + g2d.setColor(i == 0 ? selectFontColor : frFont.getForeground()); + CardSwitchButton cardSwitchButton = cardTagLayout.getSwitchButton(i); + String widgetName = cardSwitchButton.getText(); + int width = fm.stringWidth(widgetName); + if(i == 0){ + Color oldColor = g2d.getColor(); + g2d.setColor(this.getSelectColor()); + g2d.fillRect(0, 0 ,eachWidth, panelHeight); + g2d.setColor(oldColor); + } + g2d.drawString(widgetName, (eachWidth - width) / 2, (panelHeight - fontHeight) / 2 + ascentHeight); + Stroke oldStroke = g2d.getStroke(); + if (i == 0) { + g2d.setColor(this.underLine.getColor()); + g2d.setStroke(GraphHelper.getStroke(underLine.getLineStyle())); + int underLineX = this.isGapFix ? (eachWidth - width) / 2 : 0; + int underLineWidth = this.isGapFix ? width : eachWidth; + g2d.drawLine(underLineX, panelHeight - 1, underLineX + underLineWidth, panelHeight - 1); + } + if (bottomBorder.getLineStyle() != 0) { + g2d.setColor(bottomBorder.getColor()); + g2d.setStroke(GraphHelper.getStroke(bottomBorder.getLineStyle())); + g2d.drawLine(eachWidth, 0, eachWidth, panelHeight); + } + g2d.setStroke(oldStroke); + g2d.translate(eachWidth, 0); + } + + + } + + public void populateConfig(MobileTemplateStyle templateStyle) { + super.populateConfig(templateStyle); + this.bottomBorder = ((UpMenuStyle) templateStyle).getBottomBorder(); + this.underLine = ((UpMenuStyle) templateStyle).getUnderline(); + this.isGapFix = ((UpMenuStyle) templateStyle).isGapFix(); + } + } + +} diff --git a/designer-base/src/main/java/com/fr/design/mainframe/widget/MobileTabFontConfPane.java b/designer-base/src/main/java/com/fr/design/mainframe/widget/MobileTabFontConfPane.java new file mode 100644 index 000000000..b4d678f98 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/mainframe/widget/MobileTabFontConfPane.java @@ -0,0 +1,144 @@ +package com.fr.design.mainframe.widget; + +import com.fr.base.BaseUtils; +import com.fr.base.Utils; +import com.fr.design.gui.ibutton.UIColorButton; +import com.fr.design.gui.ibutton.UIToggleButton; +import com.fr.design.gui.icombobox.UIComboBox; +import com.fr.general.FRFont; + +import javax.swing.Icon; +import javax.swing.JPanel; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; +import javax.swing.event.EventListenerList; +import java.awt.Dimension; +import java.awt.FlowLayout; +import java.awt.Font; +import java.awt.event.ItemEvent; +import java.awt.event.ItemListener; +import java.util.Vector; + +public class MobileTabFontConfPane extends JPanel { + private static final Icon[] ITALIC_ICONS = {BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/italic.png"), BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/italic_white.png")}; + private static final Icon[] BOLD_ICONS = {BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/bold.png"), BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/bold_white.png")}; + + private EventListenerList fontChangeListener = new EventListenerList(); + private UIComboBox fontFamily; + private UIComboBox fontSize; + private UIToggleButton bold; + private UIColorButton color; + private UIToggleButton italic; + + + public MobileTabFontConfPane() { + super(); + init(); + } + + private void init() { + this.setLayout(new FlowLayout(FlowLayout.LEFT, 5, 0)); + fontFamily = new UIComboBox(Utils.getAvailableFontFamilyNames4Report()); + Vector integerList = new Vector(); + for (int i = 1; i < 100; i++) { + integerList.add(i); + } + fontFamily.setPreferredSize(new Dimension(152, 20)); + fontSize = new UIComboBox(integerList); + color = new UIColorButton(); + bold = new UIToggleButton(BOLD_ICONS, true); + italic = new UIToggleButton(ITALIC_ICONS, true); + fontFamily.addItemListener(new ItemListener() { + @Override + public void itemStateChanged(ItemEvent e) { + fireFontStateChanged(); + } + }); + fontSize.addItemListener(new ItemListener() { + @Override + public void itemStateChanged(ItemEvent e) { + fireFontStateChanged(); + } + }); + bold.addChangeListener(new ChangeListener() { + @Override + public void stateChanged(ChangeEvent e) { + fireFontStateChanged(); + } + }); + italic.addChangeListener(new ChangeListener() { + @Override + public void stateChanged(ChangeEvent e) { + fireFontStateChanged(); + } + }); + color.addColorChangeListener(new ChangeListener() { + @Override + public void stateChanged(ChangeEvent e) { + fireFontStateChanged(); + } + }); + this.add(fontFamily); + this.add(fontSize); + this.add(color); + this.add(bold); + this.add(italic); + + } + + public FRFont update() { + String family = (String) fontFamily.getSelectedItem(); + int size = (int) fontSize.getSelectedItem(); + int style = Font.PLAIN; + style += this.bold.isSelected() ? Font.BOLD : Font.PLAIN; + style += this.italic.isSelected() ? Font.ITALIC : Font.PLAIN; + FRFont frFont = FRFont.getInstance(family, style, size, color.getColor()); + return frFont; + } + + public void populate(FRFont frFont) { + fontFamily.setSelectedItem(frFont.getFamily()); + fontSize.setSelectedItem(frFont.getSize()); + color.setColor(frFont.getForeground()); + bold.setSelected(frFont.isBold()); + italic.setSelected(frFont.isItalic()); + + } + + + /** + * 添加监听 + * + * @param changeListener 监听列表 + */ + public void addFontChangeListener(ChangeListener changeListener) { + fontChangeListener.add(ChangeListener.class, changeListener); + } + + /** + * 移除监听 + * Removes an old ColorChangeListener. + * + * @param changeListener 监听列表 + */ + public void removeFontChangeListener(ChangeListener changeListener) { + fontChangeListener.remove(ChangeListener.class, changeListener); + } + + /** + * 颜色状态改变 + */ + public void fireFontStateChanged() { + Object[] listeners = fontChangeListener.getListenerList(); + ChangeEvent e = null; + + for (int i = listeners.length - 2; i >= 0; i -= 2) { + if (listeners[i] == ChangeListener.class) { + if (e == null) { + e = new ChangeEvent(this); + } + ((ChangeListener) listeners[i + 1]).stateChanged(e); + } + } + } +} diff --git a/designer-base/src/main/java/com/fr/design/mainframe/widget/UITitleSplitLine.java b/designer-base/src/main/java/com/fr/design/mainframe/widget/UITitleSplitLine.java new file mode 100644 index 000000000..f7e2779a4 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/mainframe/widget/UITitleSplitLine.java @@ -0,0 +1,50 @@ +package com.fr.design.mainframe.widget; + +import com.fr.design.gui.ilable.UILabel; +import com.fr.general.FRFont; +import javax.swing.JPanel; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Graphics; + +public class UITitleSplitLine extends JPanel { + private static final Color LINE_COLOR = Color.decode("#E0E0E1"); + private static final Color TITLE_COLOR = Color.decode("#333334"); + private static final FRFont TITLE_FONT = FRFont.getInstance("PingFangSC-Regular", 0, 12.0F); + private static final int OFFSETX = 10; + private static final int OFFSET = 3; + private Color color; + private UILabel label; + private int width; + + + + public UITitleSplitLine(String title, int width) { + this(title, LINE_COLOR, width); + } + + public UITitleSplitLine(String title, Color color, int width) { + super(); + this.color = color; + this.width = width; + this.label = new UILabel(title); + } + + public void paint(Graphics g) { + super.paint(g); + Dimension size = label.getPreferredSize(); + int labelH = size.height; + g.setColor(color); + g.drawLine(0, labelH / 2, OFFSETX, labelH / 2); + g.drawLine(OFFSETX + size.width + OFFSET * 2, labelH / 2, width, labelH / 2); + g.translate(OFFSETX + OFFSET, 0); + label.setFont(TITLE_FONT); + label.setForeground(TITLE_COLOR); + label.setSize(size.width, size.height); + label.paint(g); + g.translate(-OFFSETX - OFFSET, 0); + } + + + +} diff --git a/designer-base/src/main/java/com/fr/design/mainframe/widget/accessibles/AbstractTemplateStylePane.java b/designer-base/src/main/java/com/fr/design/mainframe/widget/accessibles/AbstractTemplateStylePane.java new file mode 100644 index 000000000..482b2cebc --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/mainframe/widget/accessibles/AbstractTemplateStylePane.java @@ -0,0 +1,10 @@ +package com.fr.design.mainframe.widget.accessibles; + +import com.fr.design.dialog.BasicPane; + +public abstract class AbstractTemplateStylePane extends BasicPane { + + public abstract void populate(T ob); + + public abstract T update(); +} diff --git a/designer-base/src/main/java/com/fr/design/mainframe/widget/accessibles/AccessibleTemplateStyleEditor.java b/designer-base/src/main/java/com/fr/design/mainframe/widget/accessibles/AccessibleTemplateStyleEditor.java index 9e32a4d46..195a92e8a 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/widget/accessibles/AccessibleTemplateStyleEditor.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/widget/accessibles/AccessibleTemplateStyleEditor.java @@ -2,7 +2,6 @@ package com.fr.design.mainframe.widget.accessibles; import com.fr.design.dialog.BasicDialog; import com.fr.design.dialog.DialogActionAdapter; -import com.fr.general.cardtag.TemplateStyle; import com.fr.design.mainframe.widget.wrappers.TemplateStyleWrapper; import javax.swing.SwingUtilities; @@ -15,18 +14,16 @@ public class AccessibleTemplateStyleEditor extends UneditableAccessibleEditor { private static final Dimension DEFAULT_DIMENSION = new Dimension(600, 400); - private TemplateStylePane stylePane; + private AbstractTemplateStylePane stylePane; - public AccessibleTemplateStyleEditor() { + public AccessibleTemplateStyleEditor(AbstractTemplateStylePane stylePane) { super(new TemplateStyleWrapper()); + this.stylePane = stylePane; } @Override protected void showEditorPane() { - if (stylePane == null) { - stylePane = new TemplateStylePane(); - stylePane.setPreferredSize(DEFAULT_DIMENSION); - } + stylePane.setPreferredSize(DEFAULT_DIMENSION); BasicDialog dlg = stylePane.showWindow(SwingUtilities.getWindowAncestor(this)); dlg.addDialogActionListener(new DialogActionAdapter() { @@ -36,7 +33,7 @@ public class AccessibleTemplateStyleEditor extends UneditableAccessibleEditor { fireStateChanged(); } }); - stylePane.populate((TemplateStyle) getValue()); + stylePane.populate(getValue()); dlg.setVisible(true); } } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/widget/accessibles/MobileTemplateStylePane.java b/designer-base/src/main/java/com/fr/design/mainframe/widget/accessibles/MobileTemplateStylePane.java new file mode 100644 index 000000000..f88221a42 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/mainframe/widget/accessibles/MobileTemplateStylePane.java @@ -0,0 +1,113 @@ +package com.fr.design.mainframe.widget.accessibles; + +import com.fr.design.beans.BasicBeanPane; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.mainframe.mobile.ui.TemplateStyleDefinePaneFactory; +import com.fr.form.ui.container.cardlayout.WCardTagLayout; +import com.fr.general.cardtag.mobile.DefaultMobileTemplateStyle; +import com.fr.general.cardtag.mobile.DownMenuStyle; +import com.fr.general.cardtag.mobile.MobileTemplateStyle; +import com.fr.general.cardtag.mobile.SliderStyle; +import com.fr.general.cardtag.mobile.UpMenuStyle; +import javax.swing.DefaultListCellRenderer; +import javax.swing.DefaultListModel; +import javax.swing.JList; +import javax.swing.JPanel; +import javax.swing.ListCellRenderer; +import java.awt.BorderLayout; +import java.awt.CardLayout; +import java.awt.Component; +import java.awt.Dimension; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class MobileTemplateStylePane extends AbstractTemplateStylePane { + private static final List STYLE_LIST = new ArrayList(); + static { + STYLE_LIST.add(DefaultMobileTemplateStyle.STYLE_NAME); + STYLE_LIST.add(UpMenuStyle.STYLE_NAME); + STYLE_LIST.add(DownMenuStyle.STYLE_NAME); + STYLE_LIST.add(SliderStyle.STYLE_NAME); + } + + private DefaultListModel listModel; + private JList styleList; + private Map> map = new HashMap<>(); + private JPanel right; + private CardLayout card; + public MobileTemplateStylePane(WCardTagLayout tagLayout){ + init(tagLayout); + } + + public void init(WCardTagLayout tagLayout){ + this.setLayout(FRGUIPaneFactory.createBorderLayout()); + listModel = new DefaultListModel(); + card = new CardLayout(); + right = FRGUIPaneFactory.createCardLayout_S_Pane(); + right.setLayout(card); + for(String style : STYLE_LIST){ + listModel.addElement(style); + BasicBeanPane styleBasicBeanPane = TemplateStyleDefinePaneFactory.createDefinePane(style, tagLayout); + map.put(style, styleBasicBeanPane); + right.add(style, styleBasicBeanPane); + } + styleList = new JList(listModel); + styleList.setCellRenderer(render); + + JPanel westPane = FRGUIPaneFactory.createBorderLayout_L_Pane(); + westPane.add(styleList, BorderLayout.CENTER); + westPane.setPreferredSize(new Dimension(100, 500)); + + + JPanel centerPane = FRGUIPaneFactory.createBorderLayout_L_Pane(); + JPanel attrConfPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); + centerPane.setPreferredSize(new Dimension(500, 500)); + attrConfPane.add(right, BorderLayout.CENTER); + centerPane.add(attrConfPane, BorderLayout.CENTER); + styleList.addMouseListener(new MouseAdapter() { + public void mouseClicked(MouseEvent e) { + String selectedValue = (String)styleList.getSelectedValue(); + card.show(right, selectedValue); + } + }); + this.add(westPane, BorderLayout.WEST); + this.add(centerPane, BorderLayout.CENTER); + } + public static ListCellRenderer render = new DefaultListCellRenderer() { + @Override + public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { + super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); + + if (value instanceof MobileTemplateStyle) { + MobileTemplateStyle l = (MobileTemplateStyle) value; + this.setText(l.toString()); + } + return this; + } + }; + + @Override + protected String title4PopupWindow() { + return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Tab_Style_Template"); + } + + public void populate(MobileTemplateStyle templateStyle) { + for(int i = 0; i< listModel.getSize(); i++){ + if((listModel.getElementAt(i)).equals(templateStyle.getStyle())){ + styleList.setSelectedIndex(i); + map.get(templateStyle.getStyle()).populateBean(templateStyle); + card.show(right, templateStyle.getStyle()); + return; + } + } + styleList.setSelectedIndex(0); + } + + public MobileTemplateStyle update() { + return map.get(styleList.getSelectedValue()).updateBean(); + } +} diff --git a/designer-base/src/main/java/com/fr/design/mainframe/widget/accessibles/TemplateStylePane.java b/designer-base/src/main/java/com/fr/design/mainframe/widget/accessibles/TemplateStylePane.java index fdd6cbb32..6374a19c5 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/widget/accessibles/TemplateStylePane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/widget/accessibles/TemplateStylePane.java @@ -21,16 +21,17 @@ import javax.swing.ListCellRenderer; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Dimension; +import java.awt.Rectangle; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; /** * Created by kerry on 2017/11/23. */ -public class TemplateStylePane extends BasicPane { +public class TemplateStylePane extends AbstractTemplateStylePane { private DefaultListModel listModel; private JList styleList; - private TemplateStylePreviewPane previewPane = new TemplateStylePreviewPane(new DefaultTemplateStyle()); + private TemplateStylePreviewPane previewPane = new TemplateStylePreviewPane(new DefaultTemplateStyle(), new Rectangle(0, 50, 540, 400)); public TemplateStylePane(){ init(); diff --git a/designer-base/src/main/java/com/fr/design/mainframe/widget/accessibles/TemplateStylePreviewPane.java b/designer-base/src/main/java/com/fr/design/mainframe/widget/accessibles/TemplateStylePreviewPane.java index 0f684006a..1e47d3089 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/widget/accessibles/TemplateStylePreviewPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/widget/accessibles/TemplateStylePreviewPane.java @@ -1,26 +1,23 @@ package com.fr.design.mainframe.widget.accessibles; -import com.fr.base.BaseUtils; import com.fr.general.cardtag.TemplateStyle; import javax.swing.JPanel; import java.awt.Graphics; import java.awt.Graphics2D; -import java.awt.Image; +import java.awt.Rectangle; /** * Created by kerry on 2017/12/11. */ public class TemplateStylePreviewPane extends JPanel { - private static final int WIDTH = 540; - private static final int HEIGHT = 400; - private static final int OFFSETY = 50; - + private Rectangle rectangle; private TemplateStyle templateStyle; - public TemplateStylePreviewPane(TemplateStyle templateStyle){ + public TemplateStylePreviewPane(TemplateStyle templateStyle, Rectangle rectangle){ this.templateStyle = templateStyle; + this.rectangle = rectangle; } public void repaint (TemplateStyle templateStyle){ @@ -32,7 +29,6 @@ public class TemplateStylePreviewPane extends JPanel { public void paint(Graphics g) { super.paint(g); Graphics2D g2d = (Graphics2D) g.create(); - Image image = BaseUtils.readImage(templateStyle.getPreview()); - g2d.drawImage(image, 0, OFFSETY, WIDTH, HEIGHT, null); + templateStyle.paintPreview(g2d, rectangle); } } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/widget/preview/MobileTemplatePreviewPane.java b/designer-base/src/main/java/com/fr/design/mainframe/widget/preview/MobileTemplatePreviewPane.java new file mode 100644 index 000000000..d5ddbb6b9 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/mainframe/widget/preview/MobileTemplatePreviewPane.java @@ -0,0 +1,53 @@ +package com.fr.design.mainframe.widget.preview; + +import com.fr.general.cardtag.mobile.MobileTemplateStyle; +import com.fr.general.cardtag.mobile.TabFontConfig; + +import javax.swing.JPanel; +import java.awt.Color; + +public abstract class MobileTemplatePreviewPane extends JPanel { + private Color initialColor; + private Color selectColor; + private TabFontConfig tabFontConfig = new TabFontConfig(); + + public Color getInitialColor() { + return initialColor; + } + + public void setInitialColor(Color initialColor) { + this.initialColor = initialColor; + } + + public Color getSelectColor() { + return selectColor; + } + + public void setSelectColor(Color selectColor) { + this.selectColor = selectColor; + } + + public TabFontConfig getTabFontConfig() { + return tabFontConfig; + } + + public void setTabFontConfig(TabFontConfig tabFontConfig) { + this.tabFontConfig = tabFontConfig; + } + + public MobileTemplatePreviewPane(){ + + } + + public void populateConfig(MobileTemplateStyle templateStyle){ + this.setInitialColor(templateStyle.getInitialColor()); + this.setBackground(templateStyle.getInitialColor()); + this.setSelectColor(templateStyle.getSelectColor()); + this.setTabFontConfig(templateStyle.getTabFontConfig()); + } + + public void repaint (){ + super.repaint(); + } + +} diff --git a/designer-base/src/main/java/com/fr/design/utils/gui/GUICoreUtils.java b/designer-base/src/main/java/com/fr/design/utils/gui/GUICoreUtils.java index fb8b07be8..21af9365d 100644 --- a/designer-base/src/main/java/com/fr/design/utils/gui/GUICoreUtils.java +++ b/designer-base/src/main/java/com/fr/design/utils/gui/GUICoreUtils.java @@ -526,6 +526,18 @@ public abstract class GUICoreUtils{ return leftPane; } + + /** + * 创建一个靠左流式布局,流式内嵌 + * + * @return JPanel对象 + */ + public static JPanel createBoxFlowInnerContainerPane(int hgap, int vgap) { + JPanel jp = new JPanel(); + jp.setLayout(new FlowLayout(FlowLayout.LEFT, hgap, vgap)); + return jp; + } + /** * 生成一个以流式布局为布局的面板 * @param comps 面板中的组件以及布局的参数,后3位参数(可选)分别表示对齐方式,水平间隙,垂直间隙 diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardTagLayout.java b/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardTagLayout.java index f0d155f7a..1b9d2690e 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardTagLayout.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardTagLayout.java @@ -16,9 +16,11 @@ import com.fr.design.designer.creator.XCreatorUtils; import com.fr.design.designer.creator.XLayoutContainer; import com.fr.design.designer.creator.XWHorizontalBoxLayout; import com.fr.design.designer.creator.XWidgetCreator; +import com.fr.design.designer.properties.mobile.TabMobilePropertyUI; import com.fr.design.form.layout.FRFlowLayout; import com.fr.design.form.layout.FRHorizontalLayout; import com.fr.design.form.layout.FRVerticalLayout; +import com.fr.design.fun.WidgetPropertyUIProvider; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.imenu.UIPopupMenu; import com.fr.design.mainframe.EditingMouseListener; @@ -328,6 +330,10 @@ public class XWCardTagLayout extends XWHorizontalBoxLayout { return ComparatorUtils.equals(displayPosition, WTabDisplayPosition.TOP_POSITION) || ComparatorUtils.equals(displayPosition, WTabDisplayPosition.BOTTOM_POSITION); } + @Override + public WidgetPropertyUIProvider[] getWidgetPropertyUIProviders() { + return new WidgetPropertyUIProvider[]{ new TabMobilePropertyUI(this)}; + } /** * data属性改变触发其他操作 diff --git a/designer-form/src/main/java/com/fr/design/designer/properties/mobile/TabMobilePropertyUI.java b/designer-form/src/main/java/com/fr/design/designer/properties/mobile/TabMobilePropertyUI.java new file mode 100644 index 000000000..8ebdbd769 --- /dev/null +++ b/designer-form/src/main/java/com/fr/design/designer/properties/mobile/TabMobilePropertyUI.java @@ -0,0 +1,30 @@ +package com.fr.design.designer.properties.mobile; + +import com.fr.design.designer.creator.XCreator; +import com.fr.design.dialog.BasicPane; +import com.fr.design.fun.impl.AbstractWidgetPropertyUIProvider; +import com.fr.design.gui.itable.AbstractPropertyTable; +import com.fr.design.widget.ui.designer.mobile.TabMobileWidgetDefinePane; + +public class TabMobilePropertyUI extends AbstractWidgetPropertyUIProvider { + private XCreator xCreator; + + public TabMobilePropertyUI(XCreator xCreator){ + this.xCreator = xCreator; + } + + @Override + public AbstractPropertyTable createWidgetAttrTable() { + return null; + } + + @Override + public BasicPane createWidgetAttrPane() { + return new TabMobileWidgetDefinePane(xCreator); + } + + @Override + public String tableTitle() { + return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Mobile_Attr"); + } +} diff --git a/designer-form/src/main/java/com/fr/design/widget/ui/designer/layout/WCardTagLayoutDefinePane.java b/designer-form/src/main/java/com/fr/design/widget/ui/designer/layout/WCardTagLayoutDefinePane.java index ee021d260..d1e68baf3 100644 --- a/designer-form/src/main/java/com/fr/design/widget/ui/designer/layout/WCardTagLayoutDefinePane.java +++ b/designer-form/src/main/java/com/fr/design/widget/ui/designer/layout/WCardTagLayoutDefinePane.java @@ -15,6 +15,7 @@ import com.fr.design.layout.TableLayout; import com.fr.design.layout.TableLayoutHelper; import com.fr.design.mainframe.widget.accessibles.AccessibleTabPaneBackgroundEditor; import com.fr.design.mainframe.widget.accessibles.AccessibleTemplateStyleEditor; +import com.fr.design.mainframe.widget.accessibles.TemplateStylePane; import com.fr.design.widget.ui.designer.AbstractDataModify; import com.fr.form.ui.LayoutBorderStyle; import com.fr.form.ui.container.WTabDisplayPosition; @@ -51,7 +52,7 @@ public class WCardTagLayoutDefinePane extends AbstractDataModify this.setLayout(FRGUIPaneFactory.createBorderLayout()); backgroundEditor = new AccessibleTabPaneBackgroundEditor(); - templateStyleEditor = new AccessibleTemplateStyleEditor(); + templateStyleEditor = new AccessibleTemplateStyleEditor(new TemplateStylePane()); double f = TableLayout.FILL; double p = TableLayout.PREFERRED; double[] rowSize = {p, p, p, p, p}; diff --git a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/TabMobileWidgetDefinePane.java b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/TabMobileWidgetDefinePane.java new file mode 100644 index 000000000..f6d94da06 --- /dev/null +++ b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/TabMobileWidgetDefinePane.java @@ -0,0 +1,69 @@ +package com.fr.design.widget.ui.designer.mobile; + +import com.fr.design.constants.LayoutConstants; +import com.fr.design.designer.IntervalConstants; +import com.fr.design.designer.creator.XCreator; +import com.fr.design.gui.frpane.AttributeChangeListener; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.layout.TableLayoutHelper; +import com.fr.design.mainframe.DesignerContext; +import com.fr.design.mainframe.FormDesigner; +import com.fr.design.mainframe.widget.accessibles.AccessibleTemplateStyleEditor; +import com.fr.design.mainframe.widget.accessibles.MobileTemplateStylePane; +import com.fr.form.ui.container.cardlayout.WCardTagLayout; +import com.fr.general.cardtag.mobile.MobileTemplateStyle; + +import javax.swing.JPanel; +import java.awt.BorderLayout; +import java.awt.Component; + +public class TabMobileWidgetDefinePane extends MobileWidgetDefinePane { + private XCreator xCreator; + private AccessibleTemplateStyleEditor templateStyleEditor; + private AttributeChangeListener changeListener; + + public TabMobileWidgetDefinePane(XCreator xCreator) { + this.xCreator = xCreator; + } + + private void bindListeners2Widgets() { + reInitAllListeners(); + this.changeListener = new AttributeChangeListener() { + @Override + public void attributeChange() { + update(); + } + }; + } + /** + * 后台初始化所有事件. + */ + private void reInitAllListeners() { + initListener(this); + } + + @Override + public void initPropertyGroups(Object source) { + this.setLayout(FRGUIPaneFactory.createBorderLayout()); + UILabel label = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Tab_Style_Template")); + templateStyleEditor = new AccessibleTemplateStyleEditor(new MobileTemplateStylePane((WCardTagLayout) xCreator.toData())); + JPanel jPanel = TableLayoutHelper.createGapTableLayoutPane(new Component[][]{new Component[]{label, templateStyleEditor}}, TableLayoutHelper.FILL_LASTCOLUMN, IntervalConstants.INTERVAL_L1, LayoutConstants.VGAP_MEDIUM); + this.add(jPanel, BorderLayout.CENTER); + } + + @Override + public void populate(FormDesigner designer) { + templateStyleEditor.setValue(((WCardTagLayout)xCreator.toData()).getMobileTemplateStyle()); + // 数据 populate 完成后,再设置监听 + this.bindListeners2Widgets(); + this.addAttributeChangeListener(changeListener); + } + + @Override + public void update() { + ((WCardTagLayout)xCreator.toData()).setMobileTemplateStyle((MobileTemplateStyle) templateStyleEditor.getValue()); + DesignerContext.getDesignerFrame().getSelectedJTemplate().fireTargetModified(); // 触发设计器保存按钮亮起来 + + } +}