diff --git a/designer-base/src/main/java/com/fr/design/dialog/BasicPane.java b/designer-base/src/main/java/com/fr/design/dialog/BasicPane.java index e684d81f6c..930dde76c7 100644 --- a/designer-base/src/main/java/com/fr/design/dialog/BasicPane.java +++ b/designer-base/src/main/java/com/fr/design/dialog/BasicPane.java @@ -3,6 +3,7 @@ package com.fr.design.dialog; import com.fr.common.annotations.Open; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.itextfield.UITextField; +import com.fr.design.i18n.DesignSizeI18nManager; import com.fr.design.i18n.Toolkit; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.stable.core.PropertyChangeAdapter; @@ -33,7 +34,7 @@ public abstract class BasicPane extends JPanel { * @return 对话框 */ public BasicDialog showWindow(Window window, DialogActionListener l) { - return showWindowWithCustomSize(window, l, BasicDialog.DEFAULT); + return showWindowWithCustomSize(window, l, DesignSizeI18nManager.getInstance().i18nDimension(this.i18nText4PopupWindow())); } /** @@ -236,6 +237,14 @@ public abstract class BasicPane extends JPanel { return title4PopupWindow(); } + /** + * 国际化标识 + * @return 默认是取当前类的全限定名 + */ + protected String i18nText4PopupWindow() { + return this.getClass().getName(); + } + /** * 作为名字面板 * @@ -403,4 +412,4 @@ public abstract class BasicPane extends JPanel { } -} \ No newline at end of file +} diff --git a/designer-base/src/main/java/com/fr/design/fun/PluginManagerProvider.java b/designer-base/src/main/java/com/fr/design/fun/PluginManagerProvider.java new file mode 100644 index 0000000000..11fcecc2c1 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/fun/PluginManagerProvider.java @@ -0,0 +1,20 @@ +package com.fr.design.fun; + +import com.fr.design.actions.UpdateAction; +import com.fr.stable.fun.mark.Selectable; + +/** + * 替换插件管理入口 + * @author Lucian.Chen + * @version 10.0 + * Created by Lucian.Chen on 2021/2/20 + */ +public interface PluginManagerProvider extends Selectable { + + String MARK_STRING = "PluginManagerProvider"; + + int CURRENT_LEVEL = 1; + + // 插件管理 + UpdateAction pluginManagerAction(); +} diff --git a/designer-base/src/main/java/com/fr/design/fun/impl/AbstractPluginManagerProvider.java b/designer-base/src/main/java/com/fr/design/fun/impl/AbstractPluginManagerProvider.java new file mode 100644 index 0000000000..cfffd66f4d --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/fun/impl/AbstractPluginManagerProvider.java @@ -0,0 +1,30 @@ +package com.fr.design.fun.impl; + +import com.fr.design.fun.PluginManagerProvider; +import com.fr.stable.fun.assist.Selector; +import com.fr.stable.fun.impl.AbstractProvider; +import com.fr.stable.fun.mark.API; + +/** + * @author Lucian.Chen + * @version 10.0 + * Created by Lucian.Chen on 2021/2/20 + */ +@API(level = PluginManagerProvider.CURRENT_LEVEL) +public abstract class AbstractPluginManagerProvider extends AbstractProvider implements PluginManagerProvider { + + public int currentAPILevel() { + return CURRENT_LEVEL; + } + + @Override + public String mark4Provider() { + return getClass().getName(); + } + + @Override + public Selector selector() { + return Selector.ALWAYS; + } + +} diff --git a/designer-base/src/main/java/com/fr/design/i18n/DesignSizeI18nManager.java b/designer-base/src/main/java/com/fr/design/i18n/DesignSizeI18nManager.java new file mode 100644 index 0000000000..1dd2306b89 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/i18n/DesignSizeI18nManager.java @@ -0,0 +1,57 @@ +package com.fr.design.i18n; + +import com.fr.design.dialog.BasicDialog; +import com.fr.general.GeneralContext; +import com.fr.locale.LocaleManager; +import com.fr.locale.impl.FineLocaleManager; + +import java.awt.Dimension; +import java.util.Map; + +/** + * Created by kerry on 2/23/21 + */ +public class DesignSizeI18nManager { + private static final String I18N_DIMENSION_PATH = "com/fr/design/i18n/dimension"; + private static final String DIMENSION_REGEX = "^[1-9]\\d*\\*[1-9]\\d*$"; + private static final String SEPARATOR_REGEX = "\\*"; + private static final int WIDTH_INDEX = 0; + private static final int HEIGHT_INDEX = 1; + private static final int SPLIT_LENGTH = 2; + + private static DesignSizeI18nManager instance = new DesignSizeI18nManager(); + + public static DesignSizeI18nManager getInstance() { + return instance; + } + + private LocaleManager localeManager = FineLocaleManager.create(); + + private DesignSizeI18nManager() { + localeManager.addResource(I18N_DIMENSION_PATH); + } + + public Dimension i18nDimension(String key) { + if (!containKey(key)) { + return BasicDialog.DEFAULT; + } + String dimension = localeManager.getLocalBundle(GeneralContext.getLocale()).getText(localeManager, key); + return parseDimensionFromText(dimension); + } + + private boolean containKey(String key) { + Map localeKV = localeManager.getLocalBundle(GeneralContext.getLocale()).getKV(localeManager); + return localeKV != null && localeKV.containsKey(key); + } + + private Dimension parseDimensionFromText(String dimensionText) { + if (!dimensionText.matches(DIMENSION_REGEX)) { + return BasicDialog.DEFAULT; + } + String[] arr = dimensionText.split(SEPARATOR_REGEX); + if (arr.length < SPLIT_LENGTH) { + return BasicDialog.DEFAULT; + } + return new Dimension(Integer.parseInt(arr[WIDTH_INDEX]), Integer.parseInt(arr[HEIGHT_INDEX])); + } +} diff --git a/designer-base/src/main/java/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java b/designer-base/src/main/java/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java index d1abb908bb..33a2aaadfc 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java @@ -41,6 +41,7 @@ import com.fr.design.actions.server.PluginManagerAction; import com.fr.design.file.NewTemplatePane; import com.fr.design.fun.MenuHandler; import com.fr.design.fun.OemProcessor; +import com.fr.design.fun.PluginManagerProvider; import com.fr.design.fun.TableDataPaneProcessor; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.ilable.UILabel; @@ -72,6 +73,7 @@ import com.fr.plugin.observer.PluginEventListener; import com.fr.plugin.observer.PluginEventType; import com.fr.stable.ArrayUtils; import com.fr.stable.StringUtils; +import com.fr.stable.bridge.ObjectHolder; import com.fr.stable.os.support.OSBasedAction; import com.fr.stable.os.support.OSSupportCenter; import com.fr.start.OemHandler; @@ -487,11 +489,7 @@ public abstract class ToolBarMenuDock { } if (!DesignerMode.isAuthorityEditing()) { - if (shouldShowPlugin()) { - menuDef.addShortCut( - new PluginManagerAction() - ); - } + addPluginManagerAction(menuDef); menuDef.addShortCut( new FunctionManagerAction(), new GlobalParameterAction() @@ -502,6 +500,23 @@ public abstract class ToolBarMenuDock { return menuDef; } + private void addPluginManagerAction(MenuDef menuDef) { + Set providers = ExtraDesignClassManager.getInstance().getArray(PluginManagerProvider.MARK_STRING); + if (providers != null) { + for (PluginManagerProvider provider : providers) { + if (provider.selector().accept(new ObjectHolder())) { + menuDef.addShortCut(provider.pluginManagerAction()); + return; + } + } + } + if (shouldShowPlugin()) { + menuDef.addShortCut( + new PluginManagerAction() + ); + } + } + private ShortCut createGlobalTDAction() { TableDataPaneProcessor processor = ExtraDesignClassManager.getInstance().getSingle(TableDataPaneProcessor.XML_TAG); return processor == null ? new GlobalTableDataAction() : processor.createServerTDAction(); diff --git a/designer-base/src/main/java/com/fr/env/PluginErrorRemindDialog.java b/designer-base/src/main/java/com/fr/env/PluginErrorRemindDialog.java index 42dae0fa19..1558d72e95 100644 --- a/designer-base/src/main/java/com/fr/env/PluginErrorRemindDialog.java +++ b/designer-base/src/main/java/com/fr/env/PluginErrorRemindDialog.java @@ -1,12 +1,16 @@ package com.fr.env; +import com.fr.design.ExtraDesignClassManager; +import com.fr.design.actions.UpdateAction; import com.fr.design.actions.server.PluginManagerAction; +import com.fr.design.fun.PluginManagerProvider; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.general.FRFont; import com.fr.general.IOUtils; +import com.fr.stable.bridge.ObjectHolder; import javax.swing.BorderFactory; import javax.swing.Icon; @@ -23,6 +27,7 @@ import java.awt.Frame; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.util.Set; /** * 插件启动失败提示窗 @@ -77,7 +82,7 @@ public class PluginErrorRemindDialog extends JDialog implements ActionListener { UIButton okButton = new UIButton(Toolkit.i18nText("Fine-Design_Plugin_Error_Remind_Deal_With")); cancelButton.addActionListener(this); - okButton.addActionListener(new PluginManagerActionAdapter(this)); + okButton.addActionListener(new PluginManagerHandleAction(this)); // 按钮 JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT)); @@ -102,18 +107,34 @@ public class PluginErrorRemindDialog extends JDialog implements ActionListener { this.dispose(); } - private static class PluginManagerActionAdapter extends PluginManagerAction { + private static class PluginManagerHandleAction extends UpdateAction { private JDialog jDialog; + private UpdateAction pluginManagerAction; - public PluginManagerActionAdapter(JDialog jDialog) { + public PluginManagerHandleAction(JDialog jDialog) { this.jDialog = jDialog; + initPluginManagerAction(); + } + + private void initPluginManagerAction() { + Set providers = ExtraDesignClassManager.getInstance().getArray(PluginManagerProvider.MARK_STRING); + if (providers != null) { + for (PluginManagerProvider provider : providers) { + if (provider.selector().accept(new ObjectHolder())) { + this.pluginManagerAction = provider.pluginManagerAction(); + } + } + } + if (this.pluginManagerAction == null) { + this.pluginManagerAction = new PluginManagerAction(); + } } @Override public void actionPerformed(ActionEvent e) { this.jDialog.dispose(); - super.actionPerformed(e); + this.pluginManagerAction.actionPerformed(e); } } diff --git a/designer-base/src/main/resources/com/fr/design/i18n/dimension_en.properties b/designer-base/src/main/resources/com/fr/design/i18n/dimension_en.properties new file mode 100644 index 0000000000..1cafa6d35d --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/i18n/dimension_en.properties @@ -0,0 +1 @@ +com.fr.design.report.ReportColumnsPane=800*600 diff --git a/designer-base/src/main/resources/com/fr/design/i18n/dimension_ja_JP.properties b/designer-base/src/main/resources/com/fr/design/i18n/dimension_ja_JP.properties new file mode 100644 index 0000000000..e69de29bb2 diff --git a/designer-base/src/main/resources/com/fr/design/i18n/dimension_ko_KR.properties b/designer-base/src/main/resources/com/fr/design/i18n/dimension_ko_KR.properties new file mode 100644 index 0000000000..e69de29bb2 diff --git a/designer-base/src/main/resources/com/fr/design/i18n/dimension_zh.properties b/designer-base/src/main/resources/com/fr/design/i18n/dimension_zh.properties new file mode 100644 index 0000000000..69c2fcef48 --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/i18n/dimension_zh.properties @@ -0,0 +1 @@ +# \u9ED8\u8BA4\u4E3A\u7C7B\u7684\u5168\u9650\u5B9A\u540D\uFF08\u53EF\u81EA\u5B9A\u4E49key\uFF09= width * height diff --git a/designer-base/src/main/resources/com/fr/design/i18n/dimension_zh_TW.properties b/designer-base/src/main/resources/com/fr/design/i18n/dimension_zh_TW.properties new file mode 100644 index 0000000000..e69de29bb2 diff --git a/designer-base/src/test/java/com/fr/design/i18n/DesignSizeI18nManagerTest.java b/designer-base/src/test/java/com/fr/design/i18n/DesignSizeI18nManagerTest.java new file mode 100644 index 0000000000..da9789526b --- /dev/null +++ b/designer-base/src/test/java/com/fr/design/i18n/DesignSizeI18nManagerTest.java @@ -0,0 +1,80 @@ +package com.fr.design.i18n; + +import com.fr.general.GeneralContext; +import com.fr.invoke.Reflect; +import org.easymock.EasyMock; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.powermock.api.easymock.PowerMock; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; + +import java.awt.Dimension; +import java.util.Locale; + +/** + * Created by kerry on 2/24/21 + */ +@RunWith(PowerMockRunner.class) +@PrepareForTest(GeneralContext.class) +public class DesignSizeI18nManagerTest { + @Test + public void testI18nDimension() { + Dimension dimension = DesignSizeI18nManager.getInstance().i18nDimension("com.fr.design.report.ReportColumnsPane"); + validDimension(dimension, 660, 600); + + PowerMock.mockStatic(GeneralContext.class); + EasyMock.expect(GeneralContext.getLocale()).andReturn(Locale.ENGLISH).times(3); + PowerMock.replayAll(); + + dimension = DesignSizeI18nManager.getInstance().i18nDimension("com.fr.design.report.ReportColumnsPane"); + validDimension(dimension, 800, 600); + } + + @Test + public void testContainKey() { + PowerMock.mockStatic(GeneralContext.class); + EasyMock.expect(GeneralContext.getLocale()).andReturn(Locale.ENGLISH).times(3); + PowerMock.replayAll(); + + boolean result = Reflect.on(DesignSizeI18nManager.getInstance()).call("containKey", "testKey").get(); + Assert.assertFalse(result); + + result = Reflect.on(DesignSizeI18nManager.getInstance()).call("containKey", "com.fr.design.report.ReportColumnsPane").get(); + Assert.assertTrue(result); + + } + + @Test + public void testParseDimensionFromText() { + String dimensionText = "800*600"; + Dimension result = Reflect.on(DesignSizeI18nManager.getInstance()).call("parseDimensionFromText", dimensionText).get(); + validDimension(result, 800, 600); + + dimensionText = "800* 600"; + result = Reflect.on(DesignSizeI18nManager.getInstance()).call("parseDimensionFromText", dimensionText).get(); + validDimension(result, 660, 600); + + dimensionText = " 800*600"; + result = Reflect.on(DesignSizeI18nManager.getInstance()).call("parseDimensionFromText", dimensionText).get(); + validDimension(result, 660, 600); + + dimensionText = "800*600s"; + result = Reflect.on(DesignSizeI18nManager.getInstance()).call("parseDimensionFromText", dimensionText).get(); + validDimension(result, 660, 600); + + dimensionText = "800s*600"; + result = Reflect.on(DesignSizeI18nManager.getInstance()).call("parseDimensionFromText", dimensionText).get(); + validDimension(result, 660, 600); + + dimensionText = "800-600"; + result = Reflect.on(DesignSizeI18nManager.getInstance()).call("parseDimensionFromText", dimensionText).get(); + validDimension(result, 660, 600); + } + + private void validDimension(Dimension dimension, int width, int height) { + Assert.assertEquals(width, dimension.width); + Assert.assertEquals(height, dimension.height); + } +}