diff --git a/designer-base/src/main/java/com/fr/design/mainframe/mobile/processor/AbstractMobileStyleDefinePaneCreator.java b/designer-base/src/main/java/com/fr/design/mainframe/mobile/processor/AbstractMobileStyleDefinePaneCreator.java new file mode 100644 index 000000000..203a83f13 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/mainframe/mobile/processor/AbstractMobileStyleDefinePaneCreator.java @@ -0,0 +1,23 @@ +package com.fr.design.mainframe.mobile.processor; + +import com.fr.stable.fun.mark.API; + +/** + * 移动端Form控件,样式模板,通用属性替换接口 + * + * @author Coral.Chen + * @since 11.0 + * Created on 2023/4/11 + */ +@API(level = MobileStyleDefinePaneCreator.CURRENT_LEVEL) +public abstract class AbstractMobileStyleDefinePaneCreator implements MobileStyleDefinePaneCreator { + @Override + public int currentAPILevel() { + return CURRENT_LEVEL; + } + + @Override + public int layerIndex() { + return DEFAULT_LAYER_INDEX; + } +} \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/mainframe/mobile/processor/MobileStyleDefinePaneCreator.java b/designer-base/src/main/java/com/fr/design/mainframe/mobile/processor/MobileStyleDefinePaneCreator.java new file mode 100644 index 000000000..3b5e2cb86 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/mainframe/mobile/processor/MobileStyleDefinePaneCreator.java @@ -0,0 +1,40 @@ +package com.fr.design.mainframe.mobile.processor; + +import com.fr.design.beans.BasicBeanPane; +import com.fr.design.mainframe.mobile.ui.MobileStyleCustomDefinePane; +import com.fr.form.ui.Widget; +import com.fr.form.ui.mobile.MobileCommonExtraStyle; +import com.fr.form.ui.mobile.MobileStyle; +import com.fr.stable.fun.mark.Immutable; +import org.jetbrains.annotations.Nullable; + +/** + * 移动端Form控件,样式模板,通用属性替换接口 + * + * @author Coral.Chen + * @since 11.0 + * Created on 2023/4/11 + */ +public interface MobileStyleDefinePaneCreator extends Immutable { + String XML_TAG = "MobileStyleDefinePaneCreator"; + + int CURRENT_LEVEL = 1; + + /** + *

创建通用属性样式界面,可替换{@link com.fr.design.mainframe.mobile.ui.MobileStyleDefinePane} + *

每种样式的通用属性面板是一样的 + * + * @param widget 控件 + * @param customDefinePane 自定义面板 + * @param mobileStyle 移动端样式 + * @return + */ + @Nullable BasicBeanPane createBaseBeanPane(Widget widget, Class customDefinePane, Class mobileStyle); + + /** + * 替换通用属性面板,注册额外属性 + * + * @return 属性类 + */ + @Nullable Class classForCommonExtraStyle(Widget widget); +} \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileStyleDefinePane.java b/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileStyleDefinePane.java index 6c03df00d..268672fb3 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileStyleDefinePane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileStyleDefinePane.java @@ -53,22 +53,28 @@ public class MobileStyleDefinePane extends BasicBeanPane { private UISpinner borderRadius; private NewColorSelectBox iconColor; private MobileStyleFontConfigPane fontConfigPane; + private MobileStyle mobileStyle; MobileStyleDefinePane(Widget widget, Class customBeanPaneClass, Class mobileStyleClazz) { this.widget = widget; this.customBeanPane = Reflect.on(customBeanPaneClass).create(widget).get(); this.mobileStyleClazz = mobileStyleClazz; + initMobileStyle(widget); init(); } + private void initMobileStyle(Widget widget) { + mobileStyle = widget.getMobileStyle() != null ? widget.getMobileStyle() : Reflect.on(mobileStyleClazz).create().get(); + } + @Override public void populateBean(MobileStyle ob) { this.customBeanPane.populateBean(ob); customCombo.setSelectedIndex(ob.isCommonCustom() ? 1 : 0); - if(ob.getCommonBackground() != null) { - colorSelectBox.setSelectObject(((ColorBackground)ob.getCommonBackground()).getColor()); + if (ob.getCommonBackground() != null) { + colorSelectBox.setSelectObject(((ColorBackground) ob.getCommonBackground()).getColor()); } borderType.setSelectedLineStyle(ob.getCommonBorderType()); if (ob.getCommonBorderColor() != null) { @@ -85,7 +91,6 @@ public class MobileStyleDefinePane extends BasicBeanPane { @Override public MobileStyle updateBean() { - MobileStyle mobileStyle = Reflect.on(mobileStyleClazz).create().get(); this.widget.setMobileStyle(mobileStyle); this.customBeanPane.updateBean(); mobileStyle.setCommonCustom(customCombo.getSelectedIndex() == 1); diff --git a/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileStylePane.java b/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileStylePane.java index 3573427ca..6fefd7b7e 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileStylePane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileStylePane.java @@ -5,17 +5,32 @@ import com.fr.design.beans.BasicBeanPane; import com.fr.design.dialog.BasicPane; import com.fr.design.fun.MobileWidgetStyleProvider; import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.mainframe.mobile.processor.MobileStyleDefinePaneProcessor; +import com.fr.event.Event; +import com.fr.event.EventDispatcher; +import com.fr.event.Listener; import com.fr.form.ui.Widget; import com.fr.form.ui.container.WScaleLayout; +import com.fr.form.ui.mobile.MobileCommonExtraStyle; import com.fr.form.ui.mobile.MobileStyle; +import com.fr.form.ui.mobile.StyleClassMap; import com.fr.form.ui.widget.CRBoundsWidget; import com.fr.log.FineLoggerFactory; +import com.fr.plugin.context.PluginContext; +import com.fr.plugin.observer.PluginEventType; import com.fr.stable.ArrayUtils; -import javax.swing.*; +import javax.swing.DefaultListCellRenderer; +import javax.swing.DefaultListModel; +import javax.swing.JList; +import javax.swing.JPanel; +import javax.swing.ListCellRenderer; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; -import java.awt.*; +import java.awt.BorderLayout; +import java.awt.CardLayout; +import java.awt.Component; +import java.awt.Dimension; import java.util.HashMap; import java.util.Map; @@ -28,9 +43,11 @@ public class MobileStylePane extends BasicPane { private JList styleList; private Map> map = new HashMap<>(); + private boolean checkFlag = true; + public MobileStylePane(Widget widget) { - if(widget instanceof WScaleLayout) { - this.widget = ((CRBoundsWidget)((WScaleLayout) widget).getBoundsWidget()).getWidget(); + if (widget instanceof WScaleLayout) { + this.widget = ((CRBoundsWidget) ((WScaleLayout) widget).getBoundsWidget()).getWidget(); } else { this.widget = widget; } @@ -63,13 +80,18 @@ public class MobileStylePane extends BasicPane { } private void init() { + initComponent(); + initPluginListener(); + } + + private void initComponent() { this.setLayout(FRGUIPaneFactory.createBorderLayout()); listModel = new DefaultListModel<>(); card = new CardLayout(); right = FRGUIPaneFactory.createCardLayout_S_Pane(); right.setLayout(card); MobileWidgetStyleProvider[] styleProviders = getMobileWidgetStyleProviders(); - for(MobileWidgetStyleProvider styleProvider: styleProviders) { + for (MobileWidgetStyleProvider styleProvider : styleProviders) { this.addProvider2View(styleProvider); } this.addWestList(); @@ -107,7 +129,15 @@ public class MobileStylePane extends BasicPane { listModel.addElement(displayName); try { + MobileStyleDefinePaneProcessor processor = ExtraDesignClassManager.getInstance().getSingle(MobileStyleDefinePaneProcessor.XML_TAG); BasicBeanPane mobileStyleBasicBeanPane = new MobileStyleDefinePane(widget, appearanceClazz, mobileStyleClazz); + if (checkFlag && processor != null && processor.createBaseBeanPane(widget, appearanceClazz, mobileStyleClazz) != null) { + mobileStyleBasicBeanPane = processor.createBaseBeanPane(widget, appearanceClazz, mobileStyleClazz); + Class extraStyle = processor.classForCommonExtraStyle(widget); + if (extraStyle != null) { + StyleClassMap.getCommonStyleMap().put(extraStyle.getName(), extraStyle.getName()); + } + } right.add(displayName, mobileStyleBasicBeanPane); map.put(displayName, mobileStyleBasicBeanPane); } catch (Exception e) { @@ -133,4 +163,33 @@ public class MobileStylePane extends BasicPane { styleProviders = ArrayUtils.insert(0, styleProviders, defaultMobileWidgetStyleProvider); return styleProviders; } + + private void initPluginListener() { + EventDispatcher.listen(PluginEventType.AfterRun, new Listener() { + @Override + public void on(Event event, PluginContext pluginContext) { + if (pluginContext.getRuntime().contain(MobileStyleDefinePaneProcessor.XML_TAG)) { + checkFlag = true; + refreshDockingView(); + } + } + }); + EventDispatcher.listen(PluginEventType.BeforeStop, new Listener() { + @Override + public void on(Event event, PluginContext pluginContext) { + if (pluginContext.getRuntime().contain(MobileStyleDefinePaneProcessor.XML_TAG)) { + checkFlag = false; + refreshDockingView(); + } + } + }); + } + + private void refreshDockingView() { + removeAll(); + initComponent(); + populate(widget.getMobileStyle()); + this.updateUI(); + this.repaint(); + } } \ No newline at end of file