diff --git a/designer-base/src/main/java/com/fr/design/DesignState.java b/designer-base/src/main/java/com/fr/design/DesignState.java index fcc971b7e..239093d3f 100644 --- a/designer-base/src/main/java/com/fr/design/DesignState.java +++ b/designer-base/src/main/java/com/fr/design/DesignState.java @@ -1,9 +1,7 @@ package com.fr.design; -import com.fr.base.BaseUtils; import com.fr.base.vcs.DesignerMode; import com.fr.design.mainframe.toolbar.ToolBarMenuDockPlus; -import com.fr.workspace.WorkContext; /** * Created by IntelliJ IDEA. diff --git a/designer-base/src/main/java/com/fr/design/DesignerEnvManager.java b/designer-base/src/main/java/com/fr/design/DesignerEnvManager.java index 1f8ef8541..6ebd349cb 100644 --- a/designer-base/src/main/java/com/fr/design/DesignerEnvManager.java +++ b/designer-base/src/main/java/com/fr/design/DesignerEnvManager.java @@ -24,6 +24,7 @@ import com.fr.general.ComparatorUtils; import com.fr.general.FRLogFormatter; import com.fr.general.GeneralContext; import com.fr.general.IOUtils; +import com.fr.general.SupportLocale; import com.fr.general.locale.LocaleCenter; import com.fr.general.locale.LocaleMark; import com.fr.general.xml.GeneralXMLTools; @@ -116,7 +117,7 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter { private Color paginationLineColor = Color.black; // line color of paper private boolean supportCellEditorDef = false; private boolean isDragPermited = false; - private Locale language = Locale.getDefault(); + private Locale language = checkLocale(Locale.getDefault()); //2014-8-26默认显示全部, 因为以前的版本, 虽然是false, 实际上是显示所有表, 因此这边要兼容 private boolean useOracleSystemSpace = true; private int cachingTemplateLimit = CACHINGTEMPLATE_LIMIT; @@ -144,6 +145,8 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter { //记录当前激活码的在线激活状态. private int activeKeyStatus = -1; private boolean joinProductImprove = true; + + private boolean embedServerLazyStartup = false; //最近使用的颜色 private ColorSelectConfigManager configManager = new ColorSelectConfigManager(); /** @@ -717,6 +720,24 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter { designerPushUpdateConfigManager.setAutoPushUpdateEnabled(autoPushUpdateEnabled); } + /** + * 内置服务器是否使用时启动 + * + * @return 结果 + */ + public boolean isEmbedServerLazyStartup() { + return embedServerLazyStartup; + } + + /** + * 设置内置服务器使用时启动 + * + * @param embedServerLazyStartup 使用时启动 + */ + public void setEmbedServerLazyStartup(boolean embedServerLazyStartup) { + this.embedServerLazyStartup = embedServerLazyStartup; + } + /** * 是否磁盘空间参数 * @@ -1323,7 +1344,7 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter { String tmpVal; if ((tmpVal = reader.getElementValue()) != null) { if (!CommonUtils.isNumber(tmpVal)) { - setLanguage(CommonUtils.stringToLocale(tmpVal)); + setLanguage(checkLocale(CommonUtils.stringToLocale(tmpVal))); } else { // 用于兼容10.0之前的版本 int value = Integer.parseInt(tmpVal); @@ -1372,6 +1393,16 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter { } } + /** + * 对国际化进行校验 + * 非简繁英日韩的默认环境 设计器全部默认为英文版本 + * @param locale + * @return + */ + private Locale checkLocale(Locale locale) { + return SupportLocale.getInstance().isSupport(locale) ? locale : Locale.US; + } + private void readReportLengthUnit(XMLableReader reader) { String tmpVal; if (StringUtils.isNotBlank(tmpVal = reader.getElementValue())) { @@ -1604,6 +1635,7 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter { if ((tmpVal = reader.getAttrAsString("recentSelectedConnection", null)) != null) { this.setRecentSelectedConnection(tmpVal); } + this.setEmbedServerLazyStartup(reader.getAttrAsBoolean("embedServerLazyStartup", false)); } private void readReportPaneAttributions(XMLableReader reader) { @@ -1848,6 +1880,9 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter { if (this.isTemplateTreePaneExpanded()) { writer.attr("templateTreePaneExpanded", this.isTemplateTreePaneExpanded()); } + if (this.isEmbedServerLazyStartup()) { + writer.attr("embedServerLazyStartup", this.isEmbedServerLazyStartup()); + } writer.end(); } diff --git a/designer-base/src/main/java/com/fr/design/ExtraDesignClassManager.java b/designer-base/src/main/java/com/fr/design/ExtraDesignClassManager.java index 1bd44728e..bd2e50d57 100644 --- a/designer-base/src/main/java/com/fr/design/ExtraDesignClassManager.java +++ b/designer-base/src/main/java/com/fr/design/ExtraDesignClassManager.java @@ -20,6 +20,7 @@ import com.fr.plugin.AbstractExtraClassManager; import com.fr.plugin.injectable.PluginModule; import com.fr.plugin.injectable.PluginSingleInjection; import com.fr.plugin.solution.closeable.CloseableContainedSet; +import com.fr.stable.Filter; import com.fr.stable.plugin.ExtraDesignClassManagerProvider; import java.util.ArrayList; @@ -41,7 +42,7 @@ public class ExtraDesignClassManager extends AbstractExtraClassManager implement private static ExtraDesignClassManager classManager = new ExtraDesignClassManager(); private Set shortCuts = new CloseableContainedSet<>(HashSet.class); - + public static ExtraDesignClassManager getInstance() { return classManager; } @@ -111,26 +112,39 @@ public class ExtraDesignClassManager extends AbstractExtraClassManager implement return result.toArray(new WidgetOption[result.size()]); } - public WidgetOption[] getWebWidgetOptions() { + return getWebWidgetOptions(new Filter() { + @Override + public boolean accept(ToolbarItemProvider toolbarItemProvider) { + return true; + } + }); + } + + public WidgetOption[] getWebWidgetOptions(Filter filter) { Set set = getArray(ToolbarItemProvider.XML_TAG); - if (set.isEmpty()) { + return getWebWidgetOptions(set, filter); + } + + public WidgetOption[] getWebWidgetOptions(Set set, Filter filter) { + if (set == null || set.isEmpty()) { return new WidgetOption[0]; } List list = new ArrayList<>(); for (ToolbarItemProvider provider : set) { - WidgetOption option = WidgetOptionFactory.createByWidgetClass( - provider.nameForWidget(), - IOUtils.readIcon(provider.iconPathForWidget()), - provider.classForWidget() - ); - list.add(option); + if (filter != null && filter.accept(provider)) { + WidgetOption option = WidgetOptionFactory.createByWidgetClass( + provider.nameForWidget(), + IOUtils.readIcon(provider.iconPathForWidget()), + provider.classForWidget() + ); + list.add(option); + } } return list.toArray(new WidgetOption[list.size()]); } - public Map, Class> getFormWidgetOptionsMap() { Set set = getArray(FormWidgetOptionProvider.XML_TAG); Map, Class> map = new HashMap<>(); @@ -168,7 +182,6 @@ public class ExtraDesignClassManager extends AbstractExtraClassManager implement } - public WidgetOption[] getCellWidgetOptions() { Set set = getArray(CellWidgetOptionProvider.XML_TAG); if (set.isEmpty()) { diff --git a/designer-base/src/main/java/com/fr/design/actions/community/QuestionAction.java b/designer-base/src/main/java/com/fr/design/actions/community/QuestionAction.java index 717537df6..9a19ef4cc 100644 --- a/designer-base/src/main/java/com/fr/design/actions/community/QuestionAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/community/QuestionAction.java @@ -10,38 +10,37 @@ import javax.swing.*; import java.awt.event.ActionEvent; -public class QuestionAction extends UpdateAction -{ - - public QuestionAction() - { this.setMenuKeySet(QUESTIONS); - this.setName(getMenuKeySet().getMenuName()); - this.setMnemonic(getMenuKeySet().getMnemonic()); - this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/bbs/question.png")); - -} - -@Override -public void actionPerformed(ActionEvent arg0) -{ - String url = CloudCenter.getInstance().acquireUrlByKind("bbs.questions"); - BrowseUtils.browser(url); -} - public static final MenuKeySet QUESTIONS = new MenuKeySet() { - @Override - public char getMnemonic() { - return 'Q'; - } - - @Override - public String getMenuName() { - return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Community_Questions"); - } - - @Override - public KeyStroke getKeyStroke() { - return null; - } - }; +public class QuestionAction extends UpdateAction { + + public QuestionAction() { + this.setMenuKeySet(QUESTIONS); + this.setName(getMenuKeySet().getMenuName()); + this.setMnemonic(getMenuKeySet().getMnemonic()); + this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/bbs/question.png")); + + } + + @Override + public void actionPerformed(ActionEvent arg0) { + String url = CloudCenter.getInstance().acquireUrlByKind("bbs.questions"); + BrowseUtils.browser(url); + } + + public static final MenuKeySet QUESTIONS = new MenuKeySet() { + @Override + public char getMnemonic() { + return 'Q'; + } + + @Override + public String getMenuName() { + return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Community_Questions"); + } + + @Override + public KeyStroke getKeyStroke() { + return null; + } + }; } diff --git a/designer-base/src/main/java/com/fr/design/actions/file/PreferencePane.java b/designer-base/src/main/java/com/fr/design/actions/file/PreferencePane.java index 2a856f159..27b246188 100644 --- a/designer-base/src/main/java/com/fr/design/actions/file/PreferencePane.java +++ b/designer-base/src/main/java/com/fr/design/actions/file/PreferencePane.java @@ -1,6 +1,6 @@ package com.fr.design.actions.file; -import com.fr.base.BaseUtils; +import com.fr.cluster.engine.base.FineClusterConfig; import com.fr.config.Configuration; import com.fr.config.ServerPreferenceConfig; import com.fr.design.DesignerEnvManager; @@ -18,12 +18,13 @@ import com.fr.design.gui.icombobox.UIComboBox; import com.fr.design.gui.icombobox.UIDictionaryComboBox; import com.fr.design.gui.ilable.ActionLabel; import com.fr.design.gui.ilable.UILabel; +import com.fr.design.gui.iprogressbar.UIProgressBarUI; import com.fr.design.gui.ispinner.UISpinner; import com.fr.design.gui.itextfield.UITextField; -import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.layout.TableLayout; import com.fr.design.layout.TableLayoutHelper; +import com.fr.design.layout.VerticalFlowLayout; import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.vcs.VcsConfigManager; import com.fr.design.mainframe.vcs.common.VcsHelper; @@ -36,32 +37,26 @@ import com.fr.general.IOUtils; import com.fr.general.Inter; import com.fr.general.log.Log4jConfig; import com.fr.locale.InterProviderFactory; +import com.fr.log.FineLoggerFactory; +import com.fr.stable.Constants; import com.fr.third.apache.log4j.Level; import com.fr.transaction.Configurations; import com.fr.transaction.Worker; - -import javax.swing.BorderFactory; -import javax.swing.JFileChooser; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.KeyStroke; -import javax.swing.SwingUtilities; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; -import java.awt.BorderLayout; -import java.awt.Component; -import java.awt.Dimension; -import java.awt.Font; -import java.awt.Window; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.KeyAdapter; -import java.awt.event.KeyEvent; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; +import com.fr.workspace.WorkContext; +import com.fr.workspace.server.vcs.VcsOperator; +import com.fr.workspace.server.vcs.git.config.GcConfig; + +import javax.swing.*; +import javax.swing.event.*; +import java.awt.*; +import java.awt.event.*; import java.io.File; +import java.text.DecimalFormat; import java.util.Locale; import java.util.Map; +import java.util.concurrent.ExecutionException; + +import static com.fr.design.i18n.Toolkit.i18nText; /** * 选项对话框 @@ -143,14 +138,23 @@ public class PreferencePane extends BasicPane { private UICheckBox useUniverseDBMCheckbox; private UICheckBox joinProductImproveCheckBox; private UICheckBox autoPushUpdateCheckBox; + private UICheckBox embedServerLazyStartupCheckBox; private UICheckBox vcsEnableCheckBox; private UICheckBox saveCommitCheckBox; private UICheckBox useIntervalCheckBox; private IntegerEditor saveIntervalEditor; + private UICheckBox gcEnableCheckBox; + private UIButton gcButton; private UILabel remindVcsLabel; - + private JDialog gcDialog; + private UILabel gcMessage = new UILabel(); + private JPanel gcDialogDownPane = new JPanel(); + private JPanel gcProgressBarPanel = new JPanel(); + private JProgressBar gcProgressBar; + private Timer gcProgressTimer; + private UIButton gcOkButton = new UIButton(i18nText("Fine-Design_Report_OK")); public PreferencePane() { this.initComponents(); @@ -163,9 +167,9 @@ public class PreferencePane extends BasicPane { UITabbedPane jtabPane = new UITabbedPane(); JPanel generalPane = FRGUIPaneFactory.createY_AXISBoxInnerContainer_L_Pane(); - jtabPane.addTab(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_General"), generalPane); + jtabPane.addTab(i18nText("Fine-Design_Basic_General"), generalPane); JPanel advancePane = FRGUIPaneFactory.createY_AXISBoxInnerContainer_L_Pane(); - jtabPane.addTab(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Advanced"), advancePane); + jtabPane.addTab(i18nText("Fine-Design_Basic_Advanced"), advancePane); contentPane.add(jtabPane, BorderLayout.NORTH); createFunctionPane(generalPane); @@ -186,31 +190,31 @@ public class PreferencePane extends BasicPane { createServerPane(advancePane); - JPanel oraclePane = FRGUIPaneFactory.createTitledBorderPane("Oracle" + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Oracle_All_Tables")); - oracleSpace = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Show_All_Oracle_Tables")); + JPanel oraclePane = FRGUIPaneFactory.createTitledBorderPane("Oracle" + i18nText("Fine-Design_Basic_Oracle_All_Tables")); + oracleSpace = new UICheckBox(i18nText("Fine-Design_Basic_Show_All_Oracle_Tables")); oraclePane.add(oracleSpace); - JPanel debuggerPane = FRGUIPaneFactory.createTitledBorderPane(Toolkit.i18nText("Fine-Design_Basic_Develop_Tools")); - openDebugComboBox = new UICheckBox(Toolkit.i18nText("Fine-Design_Basic_Open_Debug_Window")); + JPanel debuggerPane = FRGUIPaneFactory.createTitledBorderPane(i18nText("Fine-Design_Basic_Develop_Tools")); + openDebugComboBox = new UICheckBox(i18nText("Fine-Design_Basic_Open_Debug_Window")); debuggerPane.add(openDebugComboBox, BorderLayout.CENTER); advancePane.add(debuggerPane); - JPanel upmSelectorPane = FRGUIPaneFactory.createTitledBorderPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Update_Plugin_Manager")); - useOptimizedUPMCheckbox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Use_New_Update_Plugin_Manager")); + JPanel upmSelectorPane = FRGUIPaneFactory.createTitledBorderPane(i18nText("Fine-Design_Basic_Update_Plugin_Manager")); + useOptimizedUPMCheckbox = new UICheckBox(i18nText("Fine-Design_Basic_Use_New_Update_Plugin_Manager")); upmSelectorPane.add(useOptimizedUPMCheckbox); advancePane.add(upmSelectorPane); - JPanel dbmSelectorPane = FRGUIPaneFactory.createTitledBorderPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Database_Manager")); - useUniverseDBMCheckbox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Use_Universe_Database_Manager")); + JPanel dbmSelectorPane = FRGUIPaneFactory.createTitledBorderPane(i18nText("Fine-Design_Basic_Database_Manager")); + useUniverseDBMCheckbox = new UICheckBox(i18nText("Fine-Design_Basic_Use_Universe_Database_Manager")); dbmSelectorPane.add(useUniverseDBMCheckbox); advancePane.add(dbmSelectorPane); - JPanel improvePane = FRGUIPaneFactory.createVerticalTitledBorderPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Product_Improve")); - joinProductImproveCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Join_Product_Improve")); + JPanel improvePane = FRGUIPaneFactory.createVerticalTitledBorderPane(i18nText("Fine-Design_Basic_Product_Improve")); + joinProductImproveCheckBox = new UICheckBox(i18nText("Fine-Design_Basic_Join_Product_Improve")); improvePane.add(joinProductImproveCheckBox); if (DesignerPushUpdateManager.getInstance().isAutoPushUpdateSupported()) { - autoPushUpdateCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Automatic_Push_Update")); + autoPushUpdateCheckBox = new UICheckBox(i18nText("Fine-Design_Automatic_Push_Update")); improvePane.add(autoPushUpdateCheckBox); } @@ -219,23 +223,33 @@ public class PreferencePane extends BasicPane { spaceUpPane.add(createMemoryPane(), BorderLayout.CENTER); spaceUpPane.add(improvePane, BorderLayout.SOUTH); advancePane.add(spaceUpPane); + + JPanel embedServerPanel = FRGUIPaneFactory.createVerticalTitledBorderPane(i18nText("Fine-Design_Embed_Server")); + embedServerLazyStartupCheckBox = new UICheckBox(i18nText("Fine-Design_Startup_When_Needed")); + embedServerPanel.add(embedServerLazyStartupCheckBox); + advancePane.add(embedServerPanel); + } private void createVcsSettingPane(JPanel generalPane) { - JPanel vcsPane = FRGUIPaneFactory.createVerticalTitledBorderPane(Toolkit.i18nText("Fine-Design_Vcs_Title")); + JPanel vcsPane = FRGUIPaneFactory.createVerticalTitledBorderPane(i18nText("Fine-Design_Vcs_Title")); generalPane.add(vcsPane); - remindVcsLabel = new UILabel(Toolkit.i18nText("Fine-Design_Vcs_Remind")); + remindVcsLabel = new UILabel(i18nText("Fine-Design_Vcs_Remind")); remindVcsLabel.setVisible(!VcsHelper.getInstance().needInit()); - vcsEnableCheckBox = new UICheckBox(Toolkit.i18nText("Fine-Design_Vcs_SaveAuto")); - saveCommitCheckBox = new UICheckBox(Toolkit.i18nText("Fine-Design_Vcs_No_Delete")); + vcsEnableCheckBox = new UICheckBox(i18nText("Fine-Design_Vcs_SaveAuto")); + saveCommitCheckBox = new UICheckBox(i18nText("Fine-Design_Vcs_No_Delete")); saveIntervalEditor = new IntegerEditor(60); useIntervalCheckBox = new UICheckBox(); + + //gc面板 + JPanel gcControlPane = createGcControlPane(); + JPanel enableVcsPanel = new JPanel(FRGUIPaneFactory.createLeftZeroLayout()); enableVcsPanel.add(vcsEnableCheckBox); enableVcsPanel.add(remindVcsLabel); JPanel intervalPanel = new JPanel(FRGUIPaneFactory.createLeftZeroLayout()); - final UILabel everyLabel = new UILabel(Toolkit.i18nText("Fine-Design_Vcs_Every")); - final UILabel delayLabel = new UILabel(Toolkit.i18nText("Fine-Design_Vcs_Delay")); + final UILabel everyLabel = new UILabel(i18nText("Fine-Design_Vcs_Every")); + final UILabel delayLabel = new UILabel(i18nText("Fine-Design_Vcs_Delay")); intervalPanel.add(useIntervalCheckBox); intervalPanel.add(everyLabel); intervalPanel.add(saveIntervalEditor); @@ -262,24 +276,61 @@ public class PreferencePane extends BasicPane { vcsPane.add(enableVcsPanel); vcsPane.add(intervalPanel); vcsPane.add(saveCommitCheckBox); + vcsPane.add(gcControlPane); + } + + /** + * 模创建板版本gc 配置操作面板 + * + * @return 面板 + */ + private JPanel createGcControlPane() { + //gc面板 + JPanel gcControlPane = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 0)); + JPanel gcButtonPane = new JPanel(new FlowLayout(FlowLayout.LEFT, 40, 0)); + gcEnableCheckBox = new UICheckBox(i18nText("Fine-Design_Vcs_Storage_Optimization")); + gcButton = initGcButton(); + gcButtonPane.add(gcButton); + gcControlPane.add(gcEnableCheckBox); + gcControlPane.add(gcButtonPane); + gcButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent evt) { + tryGc(); + } + }); + gcEnableCheckBox.addChangeListener(new ChangeListener() { + @Override + public void stateChanged(ChangeEvent e) { + gcButton.setEnabled(gcEnableCheckBox.isSelected()); + } + }); + + //集群下禁用 + if (FineClusterConfig.getInstance().isCluster()) { + gcEnableCheckBox.setEnabled(false); + gcButton.setEnabled(false); + } + return gcControlPane; } private void createFunctionPane(JPanel generalPane) { - JPanel functionPane = FRGUIPaneFactory.createTitledBorderPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Preference_Function")); + JPanel functionPane = FRGUIPaneFactory.createTitledBorderPane(i18nText("Fine-Design_Basic_Preference_Function")); generalPane.add(functionPane); //添加supportUndo选择项 - supportUndoCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Preference_Support_Undo")); + supportUndoCheckBox = new UICheckBox(i18nText("Fine-Design_Basic_Preference_Support_Undo")); functionPane.add(supportUndoCheckBox); //添加maxUndoLimit //String[] undoTimes = {"最大撤销次数","5次","10次","15次","20次","50次"}; - String[] undoTimes = {com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Max_Undo_Limit"), MAX_UNDO_LIMIT_5 + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Time(s)"), MAX_UNDO_LIMIT_10 + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Time(s)") - , MAX_UNDO_LIMIT_15 + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Time(s)"), MAX_UNDO_LIMIT_20 + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Time(s)"), MAX_UNDO_LIMIT_50 + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Time(s)")}; + String[] undoTimes = {i18nText("Fine-Design_Basic_Max_Undo_Limit"), MAX_UNDO_LIMIT_5 + i18nText("Fine-Design_Basic_Time(s)"), MAX_UNDO_LIMIT_10 + i18nText("Fine-Design_Basic_Time(s)") + , MAX_UNDO_LIMIT_15 + i18nText("Fine-Design_Basic_Time(s)"), MAX_UNDO_LIMIT_20 + i18nText("Fine-Design_Basic_Time(s)"), MAX_UNDO_LIMIT_50 + i18nText("Fine-Design_Basic_Time(s)")}; maxUndoLimit = new UIComboBox(undoTimes); functionPane.add(maxUndoLimit); //不支持撤销则不能选择撤销可缓存,也不能设置最大撤销次数 supportUndoCheckBox.addActionListener(new ActionListener() { + @Override public void actionPerformed(ActionEvent e) { maxUndoLimit.setEnabled(supportUndoCheckBox.isSelected()); } @@ -288,31 +339,32 @@ public class PreferencePane extends BasicPane { //添加supportDefaultParentCalculate选择项 supportDefaultParentCalculateCheckBox = new UICheckBox( - com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Preference_Support_Default_Parent_Calculate")); + i18nText("Fine-Design_Basic_Preference_Support_Default_Parent_Calculate")); functionPane.add(supportDefaultParentCalculateCheckBox); } private void createEditPane(JPanel generalPane) { //samuel:编辑器设置 - JPanel editPane = FRGUIPaneFactory.createTitledBorderPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Editor_Preference")); + JPanel editPane = FRGUIPaneFactory.createTitledBorderPane(i18nText("Fine-Design_Basic_Editor_Preference")); generalPane.add(editPane); //设置是否支持将字符串编辑为公式 - supportStringToFormulaBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Support_String_To_Formula")); + supportStringToFormulaBox = new UICheckBox(i18nText("Fine-Design_Report_Support_String_To_Formula")); editPane.add(supportStringToFormulaBox); //是否默认转化 - defaultStringToFormulaBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Always")); + defaultStringToFormulaBox = new UICheckBox(i18nText("Fine-Design_Basic_Always")); editPane.add(defaultStringToFormulaBox); //不支持转化则不能默认执行 supportStringToFormulaBox.addActionListener(new ActionListener() { + @Override public void actionPerformed(ActionEvent e) { defaultStringToFormulaBox.setEnabled(supportStringToFormulaBox.isSelected()); } }); JPanel keyStrokePane = new JPanel(new BorderLayout()); - keyStrokePane.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Support_Auto_Complete_Shortcut") + ":"), BorderLayout.WEST); + keyStrokePane.add(new UILabel(i18nText("Fine-Design_Basic_Support_Auto_Complete_Shortcut") + ":"), BorderLayout.WEST); shortCutLabel = new UILabel(); keyStrokePane.add(shortCutLabel, BorderLayout.CENTER); editPane.add(keyStrokePane); @@ -342,7 +394,7 @@ public class PreferencePane extends BasicPane { requestFocusInWindow(); label = new UILabel(text); add(GUICoreUtils.createBorderLayoutPane( - new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Support_Current_Auto_Complete_Shortcut") + ":"), + new UILabel(i18nText("Fine-Design_Basic_Support_Current_Auto_Complete_Shortcut") + ":"), BorderLayout.WEST, label, BorderLayout.CENTER), @@ -376,24 +428,24 @@ public class PreferencePane extends BasicPane { private void createGuiOfGridPane(JPanel generalPane) { // GridPane - JPanel guiOfGridPane = FRGUIPaneFactory.createTitledBorderPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Preference_Setting_Grid")); + JPanel guiOfGridPane = FRGUIPaneFactory.createTitledBorderPane(i18nText("Fine-Design_Basic_Preference_Setting_Grid")); generalPane.add(guiOfGridPane); - supportCellEditorDefCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Preference_Support_Cell_Editor_Definition")); + supportCellEditorDefCheckBox = new UICheckBox(i18nText("Fine-Design_Basic_Preference_Support_Cell_Editor_Definition")); guiOfGridPane.add(supportCellEditorDefCheckBox); - isDragPermitedCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Preference_Is_Drag_Permited")); + isDragPermitedCheckBox = new UICheckBox(i18nText("Fine-Design_Basic_Preference_Is_Drag_Permited")); guiOfGridPane.add(isDragPermitedCheckBox); } private void createColorSettingPane(JPanel generalPane) { // Color Setting Pane - JPanel colorSettingPane = FRGUIPaneFactory.createTitledBorderPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Preference_Setting_Colors")); + JPanel colorSettingPane = FRGUIPaneFactory.createTitledBorderPane(i18nText("Fine-Design_Basic_Preference_Setting_Colors")); generalPane.add(colorSettingPane); - new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Preference_Grid_Line_Color")); + new UILabel(i18nText("Fine-Design_Basic_Preference_Grid_Line_Color")); - new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Preference_Pagination_Line_Color")); + new UILabel(i18nText("Fine-Design_Basic_Preference_Pagination_Line_Color")); gridLineColorTBButton = new UIColorButton(IOUtils.readIcon("/com/fr/design/images/gui/color/foreground.png")); gridLineColorTBButton.setEnabled(this.isEnabled()); @@ -402,10 +454,10 @@ public class PreferencePane extends BasicPane { paginationLineColorTBButton.setEnabled(this.isEnabled()); JPanel leftPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); - leftPane.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Preference_Grid_Line_Color") + ":")); + leftPane.add(new UILabel(i18nText("Fine-Design_Basic_Preference_Grid_Line_Color") + ":")); leftPane.add(gridLineColorTBButton); JPanel rightPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); - rightPane.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Preference_Pagination_Line_Color") + ":")); + rightPane.add(new UILabel(i18nText("Fine-Design_Basic_Preference_Pagination_Line_Color") + ":")); rightPane.add(paginationLineColorTBButton); colorSettingPane.add(leftPane); colorSettingPane.add(rightPane); @@ -415,9 +467,9 @@ public class PreferencePane extends BasicPane { //richer:选择导出log文件的目录. JPanel logPane = FRGUIPaneFactory.createX_AXISBoxInnerContainer_S_Pane(); advancePane.add(logPane); - JPanel logExportPane = FRGUIPaneFactory.createTitledBorderPane("log" + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Export_Setting")); + JPanel logExportPane = FRGUIPaneFactory.createTitledBorderPane("log" + i18nText("Fine-Design_Basic_Export_Setting")); logPane.add(logExportPane); - UILabel logLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Select_Export_Log_Directory") + ":"); + UILabel logLabel = new UILabel(i18nText("Fine-Design_Basic_Select_Export_Log_Directory") + ":"); logExportPane.add(logLabel, BorderLayout.WEST); logExportDirectoryField = new UITextField(24); logExportPane.add(logExportDirectoryField, BorderLayout.CENTER); @@ -425,6 +477,7 @@ public class PreferencePane extends BasicPane { logExportPane.add(chooseDirBtn, BorderLayout.EAST); chooseDirBtn.setPreferredSize(new Dimension(25, 25)); chooseDirBtn.addActionListener(new ActionListener() { + @Override public void actionPerformed(ActionEvent evt) { JFileChooser fileChooser = new JFileChooser(); fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); @@ -436,11 +489,12 @@ public class PreferencePane extends BasicPane { } }); - JPanel logLevelPane = FRGUIPaneFactory.createTitledBorderPane("log" + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Level_Setting")); + JPanel logLevelPane = FRGUIPaneFactory.createTitledBorderPane("log" + i18nText("Fine-Design_Basic_Level_Setting")); logPane.add(logLevelPane); logLevelComboBox = new UIComboBox(LOG); logLevelPane.add(logLevelComboBox); logLevelComboBox.addActionListener(new ActionListener() { + @Override public void actionPerformed(ActionEvent e) { Configurations.update(new Worker() { @Override @@ -460,13 +514,13 @@ public class PreferencePane extends BasicPane { private void createLanPane(JPanel generalPane) { // ben:选择版本语言; JPanel languageAndDashBoard_pane = FRGUIPaneFactory.createX_AXISBoxInnerContainer_S_Pane(); - JPanel LanguagePane = FRGUIPaneFactory.createTitledBorderPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Choose_Language")); + JPanel LanguagePane = FRGUIPaneFactory.createTitledBorderPane(i18nText("Fine-Design_Basic_Choose_Language")); generalPane.add(languageAndDashBoard_pane); languageAndDashBoard_pane.add(LanguagePane); languageComboBox = createLanguageComboBox(); - ActionLabel languageLabel = new ActionLabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Designer_Language")); + ActionLabel languageLabel = new ActionLabel(i18nText("Fine-Design_Basic_Designer_Language")); languageLabel.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { @@ -480,7 +534,7 @@ public class PreferencePane extends BasicPane { dlg.setVisible(true); } }); - UILabel noticeLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Work_After_Restart_Designer"));//sail:提示重启后生效 + UILabel noticeLabel = new UILabel(i18nText("Fine-Design_Basic_Work_After_Restart_Designer"));//sail:提示重启后生效 double p = TableLayout.PREFERRED; double rowSize[] = {p}; double columnSize[] = {p, p, p}; @@ -526,16 +580,16 @@ public class PreferencePane extends BasicPane { double rowSize[] = {p}; // 长度单位选择 - JPanel lengthPane = FRGUIPaneFactory.createTitledBorderPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Setting_Ruler_Units")); + JPanel lengthPane = FRGUIPaneFactory.createTitledBorderPane(i18nText("Fine-Design_Basic_Setting_Ruler_Units")); advancePane.add(lengthPane); - pageLengthComboBox = new UIComboBox(new String[]{com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Page_Setup_MM"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Unit_CM"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Unit_INCH")}); + pageLengthComboBox = new UIComboBox(new String[]{i18nText("Fine-Design_Basic_Page_Setup_MM"), i18nText("Fine-Design_Report_Unit_CM"), i18nText("Fine-Design_Report_Unit_INCH")}); pageLengthComboBox.setPreferredSize(new Dimension(80, 20)); pageLengthComboBox.setMinimumSize(new Dimension(80, 20)); - reportLengthComboBox = new UIComboBox(new String[]{com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Page_Setup_MM"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Unit_CM"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Unit_INCH"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Unit_PT_Duplicate")}); + reportLengthComboBox = new UIComboBox(new String[]{i18nText("Fine-Design_Basic_Page_Setup_MM"), i18nText("Fine-Design_Report_Unit_CM"), i18nText("Fine-Design_Report_Unit_INCH"), i18nText("Fine-Design_Report_Unit_PT_Duplicate")}); reportLengthComboBox.setPreferredSize(new Dimension(80, 20)); reportLengthComboBox.setMinimumSize(new Dimension(80, 20)); - UILabel pagelengthLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Page_Setup_Scale_Units") + ":"); - UILabel reportLengthLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Report_Design_Ruler_Units") + ":"); + UILabel pagelengthLabel = new UILabel(i18nText("Fine-Design_Basic_Page_Setup_Scale_Units") + ":"); + UILabel reportLengthLabel = new UILabel(i18nText("Fine-Design_Basic_Report_Design_Ruler_Units") + ":"); Component[][] lengthComponents = { {pagelengthLabel, pageLengthComboBox, reportLengthLabel, reportLengthComboBox}, }; @@ -548,13 +602,13 @@ public class PreferencePane extends BasicPane { double rowSize[] = {p}; double columnSize[] = {p, p, p}; - JPanel serverPortPane = FRGUIPaneFactory.createTitledBorderPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Web_Preview_Port_Setting")); + JPanel serverPortPane = FRGUIPaneFactory.createTitledBorderPane(i18nText("Fine-Design_Basic_Web_Preview_Port_Setting")); advancePane.add(serverPortPane); portEditor = new IntegerEditor(); portEditor.setPreferredSize(new Dimension(80, 20)); portEditor.setMinimumSize(new Dimension(80, 20)); - UILabel notiJlabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Work_After_Restart_Designer")); - UILabel serverPortLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Web_Preview_Port") + ":"); + UILabel notiJlabel = new UILabel(i18nText("Fine-Design_Basic_Work_After_Restart_Designer")); + UILabel serverPortLabel = new UILabel(i18nText("Fine-Design_Basic_Web_Preview_Port") + ":"); Component[][] portComponents = { {serverPortLabel, portEditor, notiJlabel}, }; @@ -563,10 +617,10 @@ public class PreferencePane extends BasicPane { } private JPanel createMemoryPane() { - JPanel memoryPane = FRGUIPaneFactory.createTitledBorderPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Preference_Caching_Template")); - UILabel memoryLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Preference_Max_Caching_Template")); + JPanel memoryPane = FRGUIPaneFactory.createTitledBorderPane(i18nText("Fine-Design_Basic_Preference_Caching_Template")); + UILabel memoryLabel = new UILabel(i18nText("Fine-Design_Basic_Preference_Max_Caching_Template")); UILabel memoryTipLabel = FRWidgetFactory.createLineWrapLabel( - com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Preference_Caching_Template_Tip"), MEMORY_TIP_LABEL_MAX_WIDTH); + i18nText("Fine-Design_Basic_Preference_Caching_Template_Tip"), MEMORY_TIP_LABEL_MAX_WIDTH); memoryTipLabel.setBorder(BorderFactory.createEmptyBorder(0, CACHING_GAP, 0, 0)); cachingTemplateSpinner = new UISpinner(0, CACHING_MAX, 1, CACHING_DEFAULT); JPanel memorySpace = new JPanel(FRGUIPaneFactory.createLeftZeroLayout()); @@ -579,7 +633,7 @@ public class PreferencePane extends BasicPane { @Override protected String title4PopupWindow() { - return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_M_Window_Preference"); + return i18nText("Fine-Design_Basic_M_Window_Preference"); } /** @@ -629,7 +683,8 @@ public class PreferencePane extends BasicPane { saveIntervalEditor.setValue(vcsConfigManager.getSaveInterval()); saveCommitCheckBox.setSelected(vcsConfigManager.isSaveCommit()); useIntervalCheckBox.setSelected(vcsConfigManager.isUseInterval()); - + gcEnableCheckBox.setSelected(GcConfig.getInstance().isGcEnable()); + gcButton.setEnabled(gcEnableCheckBox.isSelected()); supportCellEditorDefCheckBox.setSelected(designerEnvManager.isSupportCellEditorDef()); isDragPermitedCheckBox.setSelected(designerEnvManager.isDragPermited()); @@ -660,6 +715,8 @@ public class PreferencePane extends BasicPane { if (this.autoPushUpdateCheckBox != null) { this.autoPushUpdateCheckBox.setSelected(designerEnvManager.isAutoPushUpdateEnabled()); } + + this.embedServerLazyStartupCheckBox.setSelected(designerEnvManager.isEmbedServerLazyStartup()); } private int chooseCase(int sign) { @@ -721,11 +778,24 @@ public class PreferencePane extends BasicPane { designerEnvManager.setOracleSystemSpace(this.oracleSpace.isSelected()); designerEnvManager.setCachingTemplateLimit((int) this.cachingTemplateSpinner.getValue()); designerEnvManager.setJoinProductImprove(this.joinProductImproveCheckBox.isSelected()); + designerEnvManager.setEmbedServerLazyStartup(this.embedServerLazyStartupCheckBox.isSelected()); VcsConfigManager vcsConfigManager = designerEnvManager.getVcsConfigManager(); vcsConfigManager.setSaveInterval(this.saveIntervalEditor.getValue()); vcsConfigManager.setVcsEnable(this.vcsEnableCheckBox.isSelected()); vcsConfigManager.setSaveCommit(this.saveCommitCheckBox.isSelected()); vcsConfigManager.setUseInterval(this.useIntervalCheckBox.isSelected()); + Configurations.update(new Worker() { + @Override + public void run() { + GcConfig.getInstance().setGcEnable(gcEnableCheckBox.isSelected()); + } + + @Override + public Class[] targets() { + return new Class[]{GcConfig.class}; + } + }); + if (this.autoPushUpdateCheckBox != null) { designerEnvManager.setAutoPushUpdateEnabled(this.autoPushUpdateCheckBox.isSelected()); } @@ -756,13 +826,12 @@ public class PreferencePane extends BasicPane { @Override public Class[] targets() { - return new Class[] {ServerPreferenceConfig.class}; + return new Class[]{ServerPreferenceConfig.class}; } }); } - // 如果语言设置改变了,则显示重启对话框 public void showRestartDialog() { if (!languageChanged) { @@ -770,12 +839,12 @@ public class PreferencePane extends BasicPane { } int rv = JOptionPane.showOptionDialog( null, - com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Language_Change_Successful"), - com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Warning"), + i18nText("Fine-Design_Basic_Language_Change_Successful"), + i18nText("Fine-Design_Basic_Plugin_Warning"), JOptionPane.YES_NO_OPTION, JOptionPane.INFORMATION_MESSAGE, null, - new String[]{com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Restart_Designer"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Restart_Designer_Later")}, + new String[]{i18nText("Fine-Design_Basic_Restart_Designer"), i18nText("Fine-Design_Basic_Restart_Designer_Later")}, null ); if (rv == JOptionPane.OK_OPTION) { @@ -797,4 +866,203 @@ public class PreferencePane extends BasicPane { public BasicDialog showWindow(Window window, DialogActionListener l) { return showWindowWithCustomSize(window, l, new Dimension(BasicDialog.DEFAULT.width, this.getPreferredSize().height + OFFSET_HEIGHT)); } + + private void tryGc() { + final SwingWorker worker = new SwingWorker() { + private long size = 0; + + @Override + protected Boolean doInBackground() { + size = WorkContext.getCurrent().get(VcsOperator.class).immediatelyGc(); + return true; + } + + @Override + protected void done() { + try { + get(); + } catch (ExecutionException e) { + updateGcDialogPanelInfo(i18nText("Fine-Design_Vcs_Need_Update_Remote_Server_Jar")); + return; + } catch (InterruptedException e) { + FineLoggerFactory.getLogger().error(e, e.getMessage()); + } + updateGcDialogPanelInfo(i18nText("Fine-Design_Vcs_Reduce_File_Size") + fileSizeConvert(size)); + gcDialogDownPane.revalidate(); + gcDialogDownPane.repaint(); + gcDialogDownPane.add(gcOkButton); + } + }; + worker.execute(); + initGcDialog(); + gcOkButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + gcDialog.dispose(); + } + }); + gcDialog.addWindowListener(new WindowAdapter() { + @Override + public void windowClosed(WindowEvent e) { + stopGcProgressTimer(); + worker.cancel(true); + } + }); + gcDialog.setVisible(true); + gcDialog.dispose(); + } + + /** + * gc 后更新进度条面板信息 + * + * @param message + */ + private void updateGcDialogPanelInfo(String message) { + stopGcProgressTimer(); + gcMessage.setText(message); + if (null != gcProgressBar) { + gcProgressBarPanel.remove(gcProgressBar); + } + if (null != gcDialog) { + gcDialog.setTitle(i18nText("Fine-Design_Form_Joption_News")); + } + } + + /** + * 初始化 gc 对话框 + */ + private void initGcDialog() { + gcDialog = new JDialog((Dialog) SwingUtilities.getWindowAncestor(PreferencePane.this), i18nText("Fine-Design_Vcs_Clean_Progress") + "...", true); + gcDialog.setSize(new Dimension(340, 140)); + + JPanel jp = new JPanel(); + //中上 + JPanel gcUpPane = new JPanel(); + gcUpPane.setLayout(new FlowLayout(FlowLayout.LEFT, 10, 10)); + gcUpPane.add(new UILabel(UIManager.getIcon("OptionPane.informationIcon"))); + gcProgressBarPanel = createProgressBarPane(); + gcUpPane.add(gcProgressBarPanel); + + //中下 + gcDialogDownPane = new JPanel(); + gcDialogDownPane.setLayout(new FlowLayout(FlowLayout.CENTER, 6, 0)); + + jp.setLayout(new BoxLayout(jp, BoxLayout.Y_AXIS)); + jp.add(gcUpPane); + jp.add(gcDialogDownPane); + gcDialog.add(jp); + gcDialog.setResizable(false); + gcDialog.setLocationRelativeTo(SwingUtilities.getWindowAncestor(PreferencePane.this)); + } + + /** + * gc 进度条面板 + * + * @return + */ + private JPanel createProgressBarPane() { + JPanel jp = new JPanel(); + VerticalFlowLayout layout = new VerticalFlowLayout(); + layout.setAlignLeft(true); + jp.setLayout(layout); + + //提示 + gcMessage = new UILabel(i18nText("Fine-Design_Vcs_Cleaning")); + // 创建一个进度条 + gcProgressBar = createGcProgressBar(0, 30, 240, 15, Color.GREEN); + gcProgressTimer = createGcProgressTimer(500, gcProgressBar); + gcProgressTimer.start(); + jp.add(gcMessage); + jp.add(gcProgressBar); + return jp; + } + + /** + * 创建 gc 进度条 + * + * @param min 最小值 + * @param max 最大值 + * @param width 宽度 + * @param height 高度 + * @param color 填充的图片颜色 + * @return + */ + private JProgressBar createGcProgressBar(int min, int max, int width, int height, Color color) { + // 创建一个进度条 + JProgressBar progressBar = new JProgressBar(min, max); + UIProgressBarUI progressBarUI = new UIProgressBarUI(); + progressBar.setUI(progressBarUI); + + //颜色(进度条里的小方块) + progressBar.setForeground(color); + + progressBar.setOpaque(false); + progressBar.setPreferredSize(new Dimension(width, height)); + return progressBar; + } + + /** + * @param delay 每隔 delay 毫秒更新进度 + * @param progressBar 要更新的进度条 + * @return + */ + private Timer createGcProgressTimer(int delay, final JProgressBar progressBar) { + if (null == progressBar) { + return null; + } + // 模拟延时操作进度, 每隔 delay / 1000 秒更新进度 + Timer timer = new Timer(delay, new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + int currentProgress = progressBar.getValue() + 1; + if (currentProgress > progressBar.getMaximum()) { + currentProgress = progressBar.getMinimum(); + } + progressBar.setValue(currentProgress); + } + }); + + return timer; + } + + /** + * 停止进度条模拟计时器 + */ + private void stopGcProgressTimer() { + if (null == gcProgressTimer) { + return; + } + gcProgressTimer.stop(); + } + + /** + * 将字节转换成 KB or MB or GB 保留两位小数 + * + * @param size + * @return + */ + private String fileSizeConvert(long size) { + DecimalFormat df = new DecimalFormat("0.00"); + double n = 1024d; + if (size > Math.pow(n, 3)) { + return df.format(size / Math.pow(n, 3)) + "GB"; + } + if (size > Math.pow(n, 2)) { + return df.format(size / Math.pow(n, 2)) + "MB"; + } + return new StringBuilder().append(df.format(size / n)).append("KB").toString(); + } + + /** + * 立即清理的Button + * + * @return + */ + private UIButton initGcButton() { + UIButton gcButton = new UIButton(i18nText("Fine-Design_Vcs_Clean")); + gcButton.setPreferredSize(new Dimension(100, 15)); + gcButton.setRoundBorder(true, Constants.LEFT); + return gcButton; + } + } diff --git a/designer-base/src/main/java/com/fr/design/actions/file/SwitchExistEnv.java b/designer-base/src/main/java/com/fr/design/actions/file/SwitchExistEnv.java index 2b55da479..568e713bb 100644 --- a/designer-base/src/main/java/com/fr/design/actions/file/SwitchExistEnv.java +++ b/designer-base/src/main/java/com/fr/design/actions/file/SwitchExistEnv.java @@ -21,7 +21,7 @@ public class SwitchExistEnv extends MenuDef { initMenuDef(); } - private void initMenuDef() { + private void initMenuDef() { Iterator nameIt = DesignerEnvManager.getEnvManager().getEnvNameIterator(); while (nameIt.hasNext()) { String name = nameIt.next(); diff --git a/designer-base/src/main/java/com/fr/design/border/UIRoundedBorder.java b/designer-base/src/main/java/com/fr/design/border/UIRoundedBorder.java index 65652cbcd..757bbbbe0 100644 --- a/designer-base/src/main/java/com/fr/design/border/UIRoundedBorder.java +++ b/designer-base/src/main/java/com/fr/design/border/UIRoundedBorder.java @@ -13,23 +13,23 @@ import java.awt.geom.RoundRectangle2D; public class UIRoundedBorder extends LineBorder { private static final long serialVersionUID = 1L; - + private int roundedCorner; private int lineStyle; - + public UIRoundedBorder(Color color) { super(color); } - + public UIRoundedBorder(Color color, int thickness){ super(color, thickness); } - + public UIRoundedBorder(Color color, int thickness, int roundedCorners){ super(color, thickness, true); this.roundedCorner = roundedCorners; } - + public UIRoundedBorder(int lineStyle, Color color, int roundedCorners){ super(color, GraphHelper.getLineStyleSize(lineStyle), true); this.lineStyle = lineStyle; @@ -44,14 +44,15 @@ public class UIRoundedBorder extends LineBorder { return lineStyle; } + @Override public void paintBorder(Component c, Graphics g, int x, int y, int width, int height){ Color oldColor = g.getColor(); Graphics2D g2d = (Graphics2D)g; g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2d.setColor(lineColor); - GraphHelper.draw(g2d, new RoundRectangle2D.Double(x, y, width - 1, height-1, roundedCorner, roundedCorner),lineStyle); + GraphHelper.draw(g2d, new RoundRectangle2D.Double(x, y, width - 1.0D, height - 1.0D, roundedCorner, roundedCorner), lineStyle); g2d.setColor(oldColor); g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF); } -} \ No newline at end of file +} diff --git a/designer-base/src/main/java/com/fr/design/constants/DesignerLaunchStatus.java b/designer-base/src/main/java/com/fr/design/constants/DesignerLaunchStatus.java index 9b7919933..4b532b92d 100644 --- a/designer-base/src/main/java/com/fr/design/constants/DesignerLaunchStatus.java +++ b/designer-base/src/main/java/com/fr/design/constants/DesignerLaunchStatus.java @@ -21,10 +21,15 @@ public enum DesignerLaunchStatus implements Event { */ DESIGNER_INIT_COMPLETE, + /** + * 打开模板完成 + */ + OPEN_LAST_FILE_COMPLETE, + /** * 启动完成 */ - OPEN_LAST_FILE_COMPLETE; + STARTUP_COMPLETE; private static DesignerLaunchStatus status; @@ -34,6 +39,6 @@ public enum DesignerLaunchStatus implements Event { public static void setStatus(DesignerLaunchStatus state) { status = state; - EventDispatcher.asyncFire(DesignerLaunchStatus.getStatus()); + EventDispatcher.fire(DesignerLaunchStatus.getStatus()); } } diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/connect/ConnectionTableProcedurePane.java b/designer-base/src/main/java/com/fr/design/data/datapane/connect/ConnectionTableProcedurePane.java index ed09c87a8..f6f258285 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/connect/ConnectionTableProcedurePane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/connect/ConnectionTableProcedurePane.java @@ -35,7 +35,7 @@ public class ConnectionTableProcedurePane extends BasicPane { private ConnectionComboBoxPanel connectionComboBox; private UICheckBox tableCheckBox; private UICheckBox viewCheckBox; - private UITextField searchField; + protected UITextField searchField; private TableViewList tableViewList; private java.util.List listeners = new java.util.ArrayList(); @@ -90,12 +90,17 @@ public class ConnectionTableProcedurePane extends BasicPane { this.add(tableViewListPane, BorderLayout.CENTER); this.add(filterPane, BorderLayout.SOUTH); this.setPreferredSize(new Dimension(WIDTH, getPreferredSize().height)); + addKeyMonitor(); } protected void filter(Connection connection, String conName, List nameList) { connection.addConnection(nameList, conName, new Class[]{AbstractDatabaseConnection.class}); } + protected void addKeyMonitor() { + + } + protected JPanel createCheckBoxgroupPane() { JPanel checkBoxgroupPane = FRGUIPaneFactory.createNColumnGridInnerContainer_S_Pane(2); JPanel first = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); diff --git a/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/DBTableDataPane.java b/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/DBTableDataPane.java index 85b8fbd7d..44b87cad6 100644 --- a/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/DBTableDataPane.java +++ b/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/DBTableDataPane.java @@ -57,6 +57,8 @@ import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; +import java.awt.event.KeyEvent; +import java.awt.event.KeyListener; import java.util.ArrayList; import java.util.List; @@ -95,6 +97,30 @@ public class DBTableDataPane extends AbstractTableDataPane { connection.addConnection(nameList, conName, new Class[]{JDBCDatabaseConnection.class, JNDIDatabaseConnection.class}); } + + @Override + protected void addKeyMonitor() { + searchField.addKeyListener(new KeyListener() { + + @Override + public void keyTyped(KeyEvent e) { + + } + + @Override + public void keyPressed(KeyEvent e) { + if (e.getKeyCode() == KeyEvent.VK_ENTER) { + e.setKeyCode(KeyEvent.VK_UP); + DBTableDataPane.this.connectionTableProcedurePane.requestFocus(); + } + } + + @Override + public void keyReleased(KeyEvent e) { + + } + }); + } }; connectionTableProcedurePane.addDoubleClickListener(new DoubleClickSelectedNodeOnTreeListener() { diff --git a/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/MaxMemRowCountPanel.java b/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/MaxMemRowCountPanel.java index 4863a2796..dc37d14be 100644 --- a/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/MaxMemRowCountPanel.java +++ b/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/MaxMemRowCountPanel.java @@ -40,7 +40,8 @@ public class MaxMemRowCountPanel extends UIToolbar { } } }; - + + @Override public Dimension getPreferredSize() { Dimension dim = super.getPreferredSize(); dim.width = 340; @@ -81,7 +82,7 @@ public class MaxMemRowCountPanel extends UIToolbar { public void setValue(int value) { if (value >= 0) { showMaxPanel(); - numberSpinner.setValue(Integer.valueOf(value)); + numberSpinner.setValue(value); } else { showAllPanel(); } @@ -94,4 +95,4 @@ public class MaxMemRowCountPanel extends UIToolbar { return ((Number) numberSpinner.getValue()).intValue(); } } -} \ No newline at end of file +} diff --git a/designer-base/src/main/java/com/fr/design/dialog/JWizardPanel.java b/designer-base/src/main/java/com/fr/design/dialog/JWizardPanel.java index 956df9efb..ce3a2f9da 100644 --- a/designer-base/src/main/java/com/fr/design/dialog/JWizardPanel.java +++ b/designer-base/src/main/java/com/fr/design/dialog/JWizardPanel.java @@ -48,7 +48,7 @@ public class JWizardPanel extends BasicPane { // Set the layout for the content area contentPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); - + contentPane.setBorder(BorderFactory.createEmptyBorder(2, 2, 4, 4)); // Step title @@ -60,16 +60,16 @@ public class JWizardPanel extends BasicPane { add(titlePanel, BorderLayout.NORTH); add(contentPane, BorderLayout.CENTER); } - + @Override protected String title4PopupWindow() { return "wizard"; } - + /** * Set the title to use for this step. Normally this title would be unique * for each wizards step. - * + * * @param stepTitle The title to use for this step. */ public void setStepTitle(String stepTitle) { @@ -82,7 +82,7 @@ public class JWizardPanel extends BasicPane { /** * Get the step title to use for this step. - * + * * @return The step title to use for this step. */ public String getStepTitle() { @@ -93,7 +93,7 @@ public class JWizardPanel extends BasicPane { * Get a JPanel to use for adding your own components to this WizardPanel. * Do not add components directly to the JWizardPanel. The JPanel uses the * layout given in the JWizardPanel constructor. - * + * * @return The JPanel to use for adding components for this wizard step. */ public JPanel getContentPane() { @@ -102,7 +102,7 @@ public class JWizardPanel extends BasicPane { /** * Get the wizard step to go to when the Back button is pressed. - * + * * @return The wizard step to go to when the Back button is pressed. */ @@ -114,7 +114,7 @@ public class JWizardPanel extends BasicPane { * Set the wizard step to go to when the Back button is pressed. This should * be set in the constructor of the JWizardPanel subclass since it * determines whether the Back button is enabled or not. - * + * * @param backStep * The wizard step to go to when the Back button is pressed. */ @@ -129,7 +129,7 @@ public class JWizardPanel extends BasicPane { /** * Get the wizard step to go to when the Next button is pressed. - * + * * @return The wizard step to go to when the Next button is pressed. */ public int getNextStep() { @@ -140,7 +140,7 @@ public class JWizardPanel extends BasicPane { * Set the wizard step to go to when the Next button is pressed. This should * be set in the constructor of the JWizardPanel subclass since it * determines whether the Next and Finish buttons are enabled or not. - * + * * @param nextStep The wizard step to go to when the Next button is pressed. */ public void setNextStep(int nextStep) { @@ -154,7 +154,7 @@ public class JWizardPanel extends BasicPane { /** * Returns the JWizardDialog in which this JWizardPanel resides. This is * valid only after the panel has been added to the dialog. - * + * * @return The JWizardDialog in which this JWizardPanel resides. */ @@ -168,7 +168,7 @@ public class JWizardPanel extends BasicPane { public void addNotify() { if (firstNotify) { Font font = stepTitleLabel.getFont(); - font = font.deriveFont(Font.BOLD, font.getSize() * 14 / 10); + font = font.deriveFont(Font.BOLD, font.getSize() * 14 / 10.0F); stepTitleLabel.setFont(font); firstNotify = false; } @@ -177,7 +177,7 @@ public class JWizardPanel extends BasicPane { /** * Set the JWizardDialog parent for this JWizardPanel. - * + * * @param dialogParent * The JWizardPanel parent for this JWizardPanel. */ @@ -188,7 +188,7 @@ public class JWizardPanel extends BasicPane { /** * Calls back(). This allows the JWizardDialog to call the protected method * back(). - * + * * @see #back() */ @@ -199,7 +199,7 @@ public class JWizardPanel extends BasicPane { /** * Calls next(). This allows the JWizardDialog to call the protected method * next(). - * + * * @see #next() */ void doNext() { @@ -209,7 +209,7 @@ public class JWizardPanel extends BasicPane { /** * Called when the Back button is pressed. By default this displays the * wizard step set by setBackStep(). - * + * * @see #setBackStep(int) */ protected void back() { @@ -219,11 +219,11 @@ public class JWizardPanel extends BasicPane { /** * Called when the Next button is pressed. By default this displays the * wizard step set by setNextStep(). - * + * * @see #setNextStep(int) */ protected void next() { dialogParent.goTo(getNextStep()); } -} \ No newline at end of file +} diff --git a/designer-base/src/main/java/com/fr/design/extra/PluginOperateUtils.java b/designer-base/src/main/java/com/fr/design/extra/PluginOperateUtils.java index c7c503ff3..7338a5598 100644 --- a/designer-base/src/main/java/com/fr/design/extra/PluginOperateUtils.java +++ b/designer-base/src/main/java/com/fr/design/extra/PluginOperateUtils.java @@ -96,7 +96,7 @@ public class PluginOperateUtils { com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Delete_Confirmed"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Warning"), JOptionPane.OK_CANCEL_OPTION, - JOptionPane.INFORMATION_MESSAGE + JOptionPane.WARNING_MESSAGE ); if (rv == JOptionPane.OK_OPTION) { PluginMarker pluginMarker = PluginUtils.createPluginMarker(pluginInfo); diff --git a/designer-base/src/main/java/com/fr/design/extra/QQLoginWebPane.java b/designer-base/src/main/java/com/fr/design/extra/QQLoginWebPane.java index 43b7b9614..9928d9ae0 100644 --- a/designer-base/src/main/java/com/fr/design/extra/QQLoginWebPane.java +++ b/designer-base/src/main/java/com/fr/design/extra/QQLoginWebPane.java @@ -163,7 +163,7 @@ public class QQLoginWebPane extends JFXPanel { final BooleanProperty confirmationResult = new SimpleBooleanProperty(); // initialize the confirmation dialog final Stage dialog = new Stage(StageStyle.UTILITY); - dialog.setX(Toolkit.getDefaultToolkit().getScreenSize().getWidth() / 2 - DEFAULT_CONFIRM_WIDTH / 2 + DEFAULT_OFFEST); + dialog.setX(Toolkit.getDefaultToolkit().getScreenSize().getWidth() / 2 - DEFAULT_CONFIRM_WIDTH / 2.0D + DEFAULT_OFFEST); dialog.setY(Toolkit.getDefaultToolkit().getScreenSize().getHeight() / 2 + DEFAULT_OFFEST); dialog.setHeight(DEFAULT_CONFIRM_HEIGHT); dialog.setWidth(DEFAULT_CONFIRM_WIDTH); diff --git a/designer-base/src/main/java/com/fr/design/extra/WebViewDlgHelper.java b/designer-base/src/main/java/com/fr/design/extra/WebViewDlgHelper.java index c6287bacf..bbb10c6d6 100644 --- a/designer-base/src/main/java/com/fr/design/extra/WebViewDlgHelper.java +++ b/designer-base/src/main/java/com/fr/design/extra/WebViewDlgHelper.java @@ -11,6 +11,7 @@ import com.fr.general.ComparatorUtils; import com.fr.general.GeneralContext; import com.fr.general.IOUtils; import com.fr.general.http.HttpClient; +import com.fr.general.http.HttpToolbox; import com.fr.json.JSONObject; import com.fr.log.FineLoggerFactory; import com.fr.plugin.PluginStoreConstants; @@ -293,10 +294,9 @@ public class WebViewDlgHelper { new SwingWorker() { @Override protected Void doInBackground() throws Exception { - HttpClient httpClient = new HttpClient(CloudCenter.getInstance().acquireUrlByKind("shop.plugin.update") + "?" + PluginUtils.FR_VERSION + "=" + ProductConstants.VERSION + "&version=" + PluginStoreConstants.getInstance().getProps("VERSION")); - httpClient.asGet(); - if (httpClient.getResponseCode() == HttpURLConnection.HTTP_OK) { - String text = httpClient.getResponseText(); + String url = CloudCenter.getInstance().acquireUrlByKind("shop.plugin.update"); + if (url != null) { + String text = HttpToolbox.get(url + "?" + PluginUtils.FR_VERSION + "=" + ProductConstants.VERSION + "&version=" + PluginStoreConstants.getInstance().getProps("VERSION")); JSONObject resultJSONObject = new JSONObject(text); String isLatest = resultJSONObject.optString("result"); if (!ComparatorUtils.equals(isLatest, LATEST)) { diff --git a/designer-base/src/main/java/com/fr/design/file/HistoryTemplateListCache.java b/designer-base/src/main/java/com/fr/design/file/HistoryTemplateListCache.java index cb839c6d7..8e75fae0b 100644 --- a/designer-base/src/main/java/com/fr/design/file/HistoryTemplateListCache.java +++ b/designer-base/src/main/java/com/fr/design/file/HistoryTemplateListCache.java @@ -264,11 +264,6 @@ public class HistoryTemplateListCache implements CallbackEvent { if (size == index + 1 && index > 0) { //如果删除的是后一个Tab,则定位到前一个 MutilTempalteTabPane.getInstance().setSelectedIndex(index - 1); - JTemplate selectedFile = MutilTempalteTabPane.getInstance().getSelectedFile(); - if (!isCurrentEditingFile(selectedFile.getPath())) { - //如果此时面板上的实时刷新的selectedIndex得到的和历史的不一样 - DesignerContext.getDesignerFrame().activateJTemplate(selectedFile); - } } } } @@ -277,6 +272,13 @@ public class HistoryTemplateListCache implements CallbackEvent { if (openFileCount == 0) { DesignerContext.getDesignerFrame().addAndActivateJTemplate(); } + + JTemplate selectedFile = MutilTempalteTabPane.getInstance().getSelectedFile(); + if (!isCurrentEditingFile(selectedFile.getPath())) { + //如果此时面板上的实时刷新的selectedIndex得到的和历史的不一样 + DesignerContext.getDesignerFrame().activateJTemplate(selectedFile); + } + MutilTempalteTabPane.getInstance().repaint(); } diff --git a/designer-base/src/main/java/com/fr/design/file/MutilTempalteTabPane.java b/designer-base/src/main/java/com/fr/design/file/MutilTempalteTabPane.java index 968f72a59..5a722239c 100644 --- a/designer-base/src/main/java/com/fr/design/file/MutilTempalteTabPane.java +++ b/designer-base/src/main/java/com/fr/design/file/MutilTempalteTabPane.java @@ -156,6 +156,9 @@ public class MutilTempalteTabPane extends JComponent { } public JTemplate getSelectedFile() { + if (openedTemplate.size() == selectedIndex) { + selectedIndex = Math.max(--selectedIndex, 0); + } return openedTemplate.get(selectedIndex); } @@ -322,7 +325,7 @@ public class MutilTempalteTabPane extends JComponent { @Override public void paintComponent(Graphics g) { super.paintComponent(g); - double maxWidth = getWidth() - LIST_BUTTON_WIDTH; //最大宽度 + double maxWidth = getWidth() - LIST_BUTTON_WIDTH * 1.0D; //最大宽度 Graphics2D g2d = (Graphics2D) g; paintBackgroundAndLine(g2d, maxWidth); } @@ -395,8 +398,8 @@ public class MutilTempalteTabPane extends JComponent { //画下面的那条线 if (templateStartX < maxWidth) { GeneralPath generalPath = new GeneralPath(Path2D.WIND_EVEN_ODD, 2); - generalPath.moveTo((float) templateStartX, getHeight() - 1); - generalPath.lineTo((float) maxWidth, getHeight() - 1); + generalPath.moveTo((float) templateStartX, getHeight() - 1.0F); + generalPath.lineTo((float) maxWidth, getHeight() - 1.0F); g2d.fill(generalPath); //TODO hzzz delete // g2d.setPaint(UIConstants.LINE_COLOR); @@ -406,7 +409,7 @@ public class MutilTempalteTabPane extends JComponent { private void paintDefaultBackground(Graphics2D g2d) { //画默认背景 - g2d.setPaint(new GradientPaint(1, 1, UIConstants.TEMPLATE_TAB_PANE_BACKGROUND, 1, getHeight() - 1, UIConstants.TEMPLATE_TAB_PANE_BACKGROUND)); + g2d.setPaint(new GradientPaint(1, 1, UIConstants.TEMPLATE_TAB_PANE_BACKGROUND, 1, getHeight() - 1.0F, UIConstants.TEMPLATE_TAB_PANE_BACKGROUND)); g2d.fillRect(0, 0, getWidth(), getHeight()); } @@ -532,7 +535,7 @@ public class MutilTempalteTabPane extends JComponent { double[] x = {templateStartX, templateStartX, templateStartX + realWidth, templateStartX + realWidth, templateStartX}; double[] y = {1, getHeight() + 1, getHeight() + 1, 1, 1}; RoundRectangle2D.Double rect1 = new RoundRectangle2D.Double(templateStartX, 1, this.getWidth(), this.getHeight(), 7, 7); - g2d.setPaint(new GradientPaint(1, 1, UIConstants.SELECT_TAB, 1, getHeight() - 1, UIConstants.SELECT_TAB)); + g2d.setPaint(new GradientPaint(1, 1, UIConstants.SELECT_TAB, 1, getHeight() - 1.0F, UIConstants.SELECT_TAB)); //选了30度和60度的特殊角度的x,y作为经过的两个点的坐标 double specialLocation1 = 2.5; double specialLocation2 = 4.330127; @@ -587,9 +590,9 @@ public class MutilTempalteTabPane extends JComponent { double[] x = {templateStartX, templateStartX, templateStartX + realWidth, templateStartX + realWidth, templateStartX}; double[] y = {-1, getHeight() - 1, getHeight() - 1, -1, -1}; if (selfIndex == mouseOveredIndex) { - g2d.setPaint(new GradientPaint(1, 1, UIConstants.HOVER_BLUE, 1, getHeight() - 1, UIConstants.HOVER_BLUE)); + g2d.setPaint(new GradientPaint(1, 1, UIConstants.HOVER_BLUE, 1, getHeight() - 1.0F, UIConstants.HOVER_BLUE)); } else { - g2d.setPaint(new GradientPaint(1, 1, UIConstants.SHADOW_GREY, 1, getHeight() - 1, UIConstants.SHADOW_GREY)); + g2d.setPaint(new GradientPaint(1, 1, UIConstants.SHADOW_GREY, 1, getHeight() - 1.0F, UIConstants.SHADOW_GREY)); } diff --git a/designer-base/src/main/java/com/fr/design/file/NodeAuthProcessor.java b/designer-base/src/main/java/com/fr/design/file/NodeAuthProcessor.java index 01c4615af..2a1c0cc94 100644 --- a/designer-base/src/main/java/com/fr/design/file/NodeAuthProcessor.java +++ b/designer-base/src/main/java/com/fr/design/file/NodeAuthProcessor.java @@ -11,6 +11,7 @@ import com.fr.stable.CoreConstants; import com.fr.stable.project.ProjectConstants; import com.fr.workspace.WorkContext; import com.fr.workspace.server.authority.AuthorityOperator; +import com.fr.workspace.server.authority.decision.DecisionOperator; import java.util.ArrayList; @@ -39,14 +40,15 @@ public class NodeAuthProcessor { authPaths.clear(); if (!WorkContext.getCurrent().isLocal()) { try { - String username = WorkContext.getCurrent().getConnection().getUserName(); - // 远程设计获取全部设计成员的权限列表 - DesignAuthority[] authorities = WorkContext.getCurrent().get(AuthorityOperator.class).getAuthorities(); + String userName = WorkContext.getCurrent().getConnection().getUserName(); + String userId = WorkContext.getCurrent().get(DecisionOperator.class).getUserIdByName(userName); + // 远程设计获取设计成员的权限列表 + DesignAuthority[] authorities = WorkContext.getCurrent().get(AuthorityOperator.class).getAuthorities(userId); DesignAuthority authority = null; if (authorities != null) { for (DesignAuthority designAuthority : authorities) { - if (ComparatorUtils.equals(designAuthority.getUsername(), username)) { + if (ComparatorUtils.equals(designAuthority.getUsername(), userName)) { authority = designAuthority; } } diff --git a/designer-base/src/main/java/com/fr/design/fun/ToolbarItemProvider.java b/designer-base/src/main/java/com/fr/design/fun/ToolbarItemProvider.java index f4add0333..0ba640b26 100644 --- a/designer-base/src/main/java/com/fr/design/fun/ToolbarItemProvider.java +++ b/designer-base/src/main/java/com/fr/design/fun/ToolbarItemProvider.java @@ -1,6 +1,8 @@ package com.fr.design.fun; +import com.fr.design.mainframe.JTemplate; import com.fr.form.ui.Widget; +import com.fr.stable.Filter; import com.fr.stable.fun.mark.Mutable; /** @@ -8,7 +10,7 @@ import com.fr.stable.fun.mark.Mutable; * @since : 8.0 * 自定义web工具栏菜单 */ -public interface ToolbarItemProvider extends Mutable { +public interface ToolbarItemProvider extends Mutable, Filter { String XML_TAG = "ToolbarItemProvider"; @@ -36,4 +38,12 @@ public interface ToolbarItemProvider extends Mutable { */ String nameForWidget(); + /** + * 模板(决策报表 or cpt)是否支持此工具栏按钮 + * JTemplate 模板 + * @return 支持返回true, 否则false + */ + @Override + boolean accept(JTemplate template); + } \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/fun/impl/AbstractToolbarItem.java b/designer-base/src/main/java/com/fr/design/fun/impl/AbstractToolbarItem.java index ec3c47bc1..49194049a 100644 --- a/designer-base/src/main/java/com/fr/design/fun/impl/AbstractToolbarItem.java +++ b/designer-base/src/main/java/com/fr/design/fun/impl/AbstractToolbarItem.java @@ -1,6 +1,9 @@ package com.fr.design.fun.impl; +import com.fr.design.file.HistoryTemplateListCache; import com.fr.design.fun.ToolbarItemProvider; +import com.fr.design.mainframe.JTemplate; +import com.fr.design.mainframe.JVirtualTemplate; import com.fr.stable.fun.impl.AbstractProvider; import com.fr.stable.fun.mark.API; @@ -10,6 +13,7 @@ import com.fr.stable.fun.mark.API; @API(level = ToolbarItemProvider.CURRENT_LEVEL) public abstract class AbstractToolbarItem extends AbstractProvider implements ToolbarItemProvider { + @Override public int currentAPILevel() { return CURRENT_LEVEL; } @@ -18,4 +22,12 @@ public abstract class AbstractToolbarItem extends AbstractProvider implements To public String mark4Provider() { return getClass().getName(); } + + @Override + public boolean accept(JTemplate jTemplate) { + if (jTemplate == null) { + jTemplate = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); + } + return jTemplate == null || jTemplate.isJWorkBook() || jTemplate instanceof JVirtualTemplate; + } } \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/gui/borders/UIFrameBorder.java b/designer-base/src/main/java/com/fr/design/gui/borders/UIFrameBorder.java index d4ff794e8..8e6bc4781 100644 --- a/designer-base/src/main/java/com/fr/design/gui/borders/UIFrameBorder.java +++ b/designer-base/src/main/java/com/fr/design/gui/borders/UIFrameBorder.java @@ -141,8 +141,8 @@ public class UIFrameBorder extends AbstractBorder implements UIResource { int spread1 = ThemeUtils.FRAME_SPREAD_DARK_DISABLED; int spread2 = ThemeUtils.FRAME_SPREAD_LIGHT_DISABLED; int y2 = y; - Color borderColor = null; - drawFirstCaption(g, borderColor, spread1, spread2, x, y2, w); + Color borderColor = isActive ? ThemeUtils.FRAME_BORDER_COLOR : ThemeUtils.FRAME_BORDER_DISABLED_COLOR; + drawFirstCaption(g, borderColor, x, y2, w); Color c2 = ColorRoutines.darken(c, 4 * spread1); drawSecondCaption(g, c2, c, spread2, x, y2, w); c2 = ColorRoutines.darken(c, 6 * spread1); @@ -257,14 +257,8 @@ public class UIFrameBorder extends AbstractBorder implements UIResource { g.drawLine(x + w - 4, y2, x + w - 4, y2); } - private void drawFirstCaption(Graphics g, Color borderColor, int spread1, int spread2, int x, int y2, int w) { - if (isActive) { - borderColor = ThemeUtils.FRAME_BORDER_COLOR; - spread1 = ThemeUtils.FRAME_SPREAD_DARK; - spread2 = ThemeUtils.FRAME_SPREAD_LIGHT; - } else { - borderColor = ThemeUtils.FRAME_BORDER_DISABLED_COLOR; - } + + private void drawFirstCaption(Graphics g, Color borderColor, int x, int y2, int w) { // always paint the semi-transparent parts // 1 // blend @@ -580,4 +574,4 @@ public class UIFrameBorder extends AbstractBorder implements UIResource { } } -} \ No newline at end of file +} diff --git a/designer-base/src/main/java/com/fr/design/gui/chart/MiddleChartComponent.java b/designer-base/src/main/java/com/fr/design/gui/chart/MiddleChartComponent.java index 01d9e7dd3..8269b8d05 100644 --- a/designer-base/src/main/java/com/fr/design/gui/chart/MiddleChartComponent.java +++ b/designer-base/src/main/java/com/fr/design/gui/chart/MiddleChartComponent.java @@ -1,7 +1,6 @@ package com.fr.design.gui.chart; import com.fr.base.chart.BaseChartCollection; -import com.fr.chartx.attr.ChartProvider; import com.fr.stable.core.PropertyChangeListener; import javax.swing.JComponent; @@ -18,7 +17,5 @@ public abstract class MiddleChartComponent extends JComponent { public abstract void reset(); - public abstract ChartProvider getEditingChart(); - public abstract void addStopEditingListener(PropertyChangeListener list); } \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/gui/frpane/CommitTabbedPane.java b/designer-base/src/main/java/com/fr/design/gui/frpane/CommitTabbedPane.java index 85dbdbe5c..afbf43c30 100644 --- a/designer-base/src/main/java/com/fr/design/gui/frpane/CommitTabbedPane.java +++ b/designer-base/src/main/java/com/fr/design/gui/frpane/CommitTabbedPane.java @@ -296,7 +296,7 @@ public class CommitTabbedPane extends JComponent implements MouseListener, Mous double[] x = {startX, startX, startX + tabWidth, startX + tabWidth, startX}; double[] y = {-1, getHeight(), getHeight(), -1, -1}; RoundRectangle2D.Double rect1 = new RoundRectangle2D.Double(startX, 1, this.getWidth(), this.getHeight(), 7, 7); - g2d.setPaint(new GradientPaint(1, 1, new Color(255, 255, 255), 1, getHeight() - 1, UIConstants.NORMAL_BACKGROUND)); + g2d.setPaint(new GradientPaint(1, 1, new Color(255, 255, 255), 1, getHeight() - 1f, UIConstants.NORMAL_BACKGROUND)); GeneralPath generalPath = new GeneralPath(Path2D.WIND_EVEN_ODD, x.length); generalPath.moveTo((float) x[0] + CORNOR_RADIUS, (float) y[0]); @@ -345,9 +345,9 @@ public class CommitTabbedPane extends JComponent implements MouseListener, Mous double[] x = {startX, startX, startX + tabWidth, startX + tabWidth, startX}; double[] y = {-1, getHeight() - 1, getHeight() - 1, -1, -1}; if (selfIndex == mouseOveredIndex) { - g2d.setPaint(new GradientPaint(1, 1, new Color(255, 255, 255), 1, getHeight() - 1, UIConstants.NORMAL_BACKGROUND)); + g2d.setPaint(new GradientPaint(1, 1, new Color(255, 255, 255), 1, getHeight() - 1f, UIConstants.NORMAL_BACKGROUND)); } else { - g2d.setPaint(new GradientPaint(1, 1, UIConstants.NORMAL_BACKGROUND, 1, getHeight() - 1, UIConstants.NORMAL_BACKGROUND)); + g2d.setPaint(new GradientPaint(1, 1, UIConstants.NORMAL_BACKGROUND, 1, getHeight() - 1f, UIConstants.NORMAL_BACKGROUND)); } diff --git a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIBasicButtonUI.java b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIBasicButtonUI.java index 185e4c18f..64db1e91d 100644 --- a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIBasicButtonUI.java +++ b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIBasicButtonUI.java @@ -321,9 +321,9 @@ public class UIBasicButtonUI extends MetalButtonUI { //harry: 画带有高光的按钮。 private void drawHighLightButton(Graphics2D g2, Color color1, Color color2, int w, int h) { - GradientPaint buttonPaint = new GradientPaint(0, 0, color1, 0, h - 1, color2); - GradientPaint buttonHighLightPaint = new GradientPaint(0, 0, new Color(1.0f, 1.0f, 1.0f, 0.6f), 0, h / 2, new Color(1.0f, 1.0f, 1.0f, 0.2f)); - GradientPaint buttonHighLightLinePaint = new GradientPaint(1, 1, new Color(1.0f, 1.0f, 1.0f, 0.8f), 0, h / 2, new Color(1.0f, 1.0f, 1.0f, 0.4f)); + GradientPaint buttonPaint = new GradientPaint(0, 0, color1, 0, h - 1f, color2); + GradientPaint buttonHighLightPaint = new GradientPaint(0, 0, new Color(1.0f, 1.0f, 1.0f, 0.6f), 0, h / 2f, new Color(1.0f, 1.0f, 1.0f, 0.2f)); + GradientPaint buttonHighLightLinePaint = new GradientPaint(1, 1, new Color(1.0f, 1.0f, 1.0f, 0.8f), 0, h / 2f, new Color(1.0f, 1.0f, 1.0f, 0.4f)); g2.setPaint(buttonPaint); g2.fillRoundRect(0, 0, w - 1, h - 1, 3, 3); g2.setPaint(buttonHighLightLinePaint);//按钮内侧高光线(内发光,0%阻塞) diff --git a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIButton.java b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIButton.java index 078bf692b..32f20ad56 100644 --- a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIButton.java +++ b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIButton.java @@ -251,7 +251,7 @@ public class UIButton extends JButton implements UIObserver, UITextComponent { protected void paintOtherBorder(Graphics g) { Graphics2D g2d = (Graphics2D) g; g2d.setStroke(borderStroke); - Shape shape = new RoundRectangle2D.Float(0.5f, 0.5f, getWidth() - 1, getHeight() - 1, UIConstants.ARC, UIConstants.ARC); + Shape shape = new RoundRectangle2D.Float(0.5f, 0.5f, getWidth() - 1f, getHeight() - 1f, UIConstants.ARC, UIConstants.ARC); g2d.setColor(borderColor); g2d.draw(shape); } diff --git a/designer-base/src/main/java/com/fr/design/gui/ibutton/UISliderButton.java b/designer-base/src/main/java/com/fr/design/gui/ibutton/UISliderButton.java index 21c5ee4b9..cc8aa9f63 100644 --- a/designer-base/src/main/java/com/fr/design/gui/ibutton/UISliderButton.java +++ b/designer-base/src/main/java/com/fr/design/gui/ibutton/UISliderButton.java @@ -232,7 +232,7 @@ public class UISliderButton extends JButton implements UIObserver { protected void paintOtherBorder(Graphics g) { Graphics2D g2d = (Graphics2D) g; g2d.setStroke(borderStroke); - Shape shape = new RoundRectangle2D.Float(0.5f, 0.5f, getWidth() - 1, getHeight() - 1, UIConstants.ARC, UIConstants.ARC); + Shape shape = new RoundRectangle2D.Float(0.5f, 0.5f, getWidth() - 1f, getHeight() - 1f, UIConstants.ARC, UIConstants.ARC); g2d.setColor(borderColor); g2d.draw(shape); } diff --git a/designer-base/src/main/java/com/fr/design/gui/ibutton/UISliderButtonUI.java b/designer-base/src/main/java/com/fr/design/gui/ibutton/UISliderButtonUI.java index 6da878d8d..6a92f5057 100644 --- a/designer-base/src/main/java/com/fr/design/gui/ibutton/UISliderButtonUI.java +++ b/designer-base/src/main/java/com/fr/design/gui/ibutton/UISliderButtonUI.java @@ -176,7 +176,7 @@ public class UISliderButtonUI extends BasicButtonUI { private void fillNormal(Graphics2D g2d, int x, int y, int width, int height, boolean isRound, int rectDirection, boolean isAuthorityEdited, boolean isPressedPainted) { GradientPaint gp; if (DesignerMode.isAuthorityEditing() && isAuthorityEdited) { - gp = new GradientPaint(1, 1, UIConstants.AUTHORITY_BLUE, 1, height - 1, UIConstants.AUTHORITY_DARK_BLUE); + gp = new GradientPaint(1, 1, UIConstants.AUTHORITY_BLUE, 1, height - 1f, UIConstants.AUTHORITY_DARK_BLUE); } else if (isPressedPainted) { gp = new GradientPaint(1, 1, UIConstants.SELECT_TAB, 1, height - 1, UIConstants.SELECT_TAB); }else{ diff --git a/designer-base/src/main/java/com/fr/design/gui/iprogressbar/ProgressDialog.java b/designer-base/src/main/java/com/fr/design/gui/iprogressbar/ProgressDialog.java index 049b868c4..a9b470a58 100644 --- a/designer-base/src/main/java/com/fr/design/gui/iprogressbar/ProgressDialog.java +++ b/designer-base/src/main/java/com/fr/design/gui/iprogressbar/ProgressDialog.java @@ -6,7 +6,6 @@ import com.fr.design.gui.ilable.UILabel; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.general.FRFont; - import javax.swing.JDialog; import javax.swing.JLabel; import javax.swing.JPanel; @@ -47,6 +46,7 @@ public class ProgressDialog extends UIDialog { progressBar.setBorderPainted(false); progressBar.setOpaque(false); progressBar.setBorder(null); + progressBar.setMaximum(1000); panel.add(progressBar, BorderLayout.CENTER); text = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Loading_Project"), JLabel.CENTER); FRFont font = FRFont.getInstance().applySize(14).applyForeground(new ColorUIResource(333334)); @@ -54,7 +54,6 @@ public class ProgressDialog extends UIDialog { panel.add(text, BorderLayout.SOUTH); panel.setVisible(true); centerDialog.getContentPane().add(panel); - } @Override @@ -72,11 +71,20 @@ public class ProgressDialog extends UIDialog { progressBar.setValue(value); } + public void setProgressMaximum(int value) { + progressBar.setMaximum(value); + } + + public int getProgressMaximum() { + return progressBar.getMaximum(); + } + @Override public void dispose() { centerDialog.dispose(); super.dispose(); } + public void updateLoadingText(String text) { this.text.setText(text); } diff --git a/designer-base/src/main/java/com/fr/design/gui/iscrollbar/UIScrollBarUI.java b/designer-base/src/main/java/com/fr/design/gui/iscrollbar/UIScrollBarUI.java index 8054a29ea..d3393054a 100644 --- a/designer-base/src/main/java/com/fr/design/gui/iscrollbar/UIScrollBarUI.java +++ b/designer-base/src/main/java/com/fr/design/gui/iscrollbar/UIScrollBarUI.java @@ -1326,9 +1326,9 @@ public class UIScrollBarUI extends ScrollBarUI implements LayoutManager, SwingCo newModel.addChangeListener(modelListener); scrollbar.repaint(); scrollbar.revalidate(); - } else if ("orientation" == propertyName) { + } else if (StringUtils.equals("orientation", propertyName)) { updateButtonDirections(); - } else if ("componentOrientation" == propertyName) { + } else if (StringUtils.equals("componentOrientation", propertyName)) { updateButtonDirections(); InputMap inputMap = getInputMap(JComponent.WHEN_FOCUSED); SwingUtilities.replaceUIInputMap(scrollbar, JComponent.WHEN_FOCUSED, inputMap); diff --git a/designer-base/src/main/java/com/fr/design/gui/ispinner/UISpinner.java b/designer-base/src/main/java/com/fr/design/gui/ispinner/UISpinner.java index ba6913a38..66a9a7575 100644 --- a/designer-base/src/main/java/com/fr/design/gui/ispinner/UISpinner.java +++ b/designer-base/src/main/java/com/fr/design/gui/ispinner/UISpinner.java @@ -9,9 +9,11 @@ import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.ibutton.UIButtonUI; import com.fr.design.gui.itextfield.UINumberField; import com.fr.design.utils.gui.GUIPaintUtils; +import com.fr.stable.CommonUtils; import com.fr.stable.Constants; import com.fr.stable.StringUtils; +import com.fr.stable.collections.utils.MathUtils; import javax.swing.*; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; @@ -109,7 +111,7 @@ public class UISpinner extends JPanel implements UIObserver, GlobalNameObserver } value = value < minValue ? minValue : value; value = value > maxValue ? maxValue : value; - if (value == this.value) { + if (CommonUtils.equals(value, this.value)) { return; } this.value = value; @@ -132,7 +134,7 @@ public class UISpinner extends JPanel implements UIObserver, GlobalNameObserver value = value < minValue ? minValue : value; value = value > maxValue ? maxValue : value; - if (value == this.value) { + if (CommonUtils.equals(value, this.value)) { return; } this.value = value; @@ -371,4 +373,4 @@ public class UISpinner extends JPanel implements UIObserver, GlobalNameObserver // jf.setSize(400, 400); // jf.setVisible(true); } -} \ No newline at end of file +} diff --git a/designer-base/src/main/java/com/fr/design/gui/ispinner/UnsignedIntUISpinner.java b/designer-base/src/main/java/com/fr/design/gui/ispinner/UnsignedIntUISpinner.java index 0a04eabf5..1515477a3 100644 --- a/designer-base/src/main/java/com/fr/design/gui/ispinner/UnsignedIntUISpinner.java +++ b/designer-base/src/main/java/com/fr/design/gui/ispinner/UnsignedIntUISpinner.java @@ -3,6 +3,9 @@ package com.fr.design.gui.ispinner; import com.fr.design.gui.itextfield.UIIntNumberField; import com.fr.design.gui.itextfield.UINumberField; +import java.awt.event.FocusEvent; +import java.awt.event.FocusListener; + /** * Created by IntelliJ IDEA. * Author : Hugh.C @@ -11,21 +14,59 @@ import com.fr.design.gui.itextfield.UINumberField; */ public class UnsignedIntUISpinner extends UISpinner { + private double minValue; + private double maxValue; public UnsignedIntUISpinner(double minValue, double maxValue, double dierta) { super(minValue, maxValue, dierta); + this.minValue = minValue; + this.maxValue = maxValue; } public UnsignedIntUISpinner(double minValue, double maxValue, double dierta, double defaultValue) { super(minValue, maxValue, dierta, defaultValue); + this.minValue = minValue; + this.maxValue = maxValue; } @Override protected UINumberField initNumberField() { - return new UIIntNumberField() { + final UIIntNumberField numberField = new UIIntNumberField() { public boolean shouldResponseChangeListener() { return false; } + + public NumberDocument createNumberDocument() { + return new NumberDocument() { + public boolean isContinueInsertWhenOverMaxOrMinValue() { + return true; + } + }; + } }; + numberField.addFocusListener(new FocusListener() { + @Override + public void focusGained(FocusEvent e) { + + } + + /** + * 失去焦点后再做范围限制、不然最小值为 100 时,输个 1 都不让.... + * @param e + */ + @Override + public void focusLost(FocusEvent e) { + double value = numberField.getValue(); + if (!isOverMaxOrMinValue(value)) { + return; + } + numberField.setValue(value < minValue ? minValue : maxValue); + } + + private boolean isOverMaxOrMinValue(double value) { + return value < minValue || value > maxValue; + } + }); + return numberField; } } \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/gui/itextfield/UIIntNumberField.java b/designer-base/src/main/java/com/fr/design/gui/itextfield/UIIntNumberField.java index 59e5e8825..37b1e74e4 100644 --- a/designer-base/src/main/java/com/fr/design/gui/itextfield/UIIntNumberField.java +++ b/designer-base/src/main/java/com/fr/design/gui/itextfield/UIIntNumberField.java @@ -1,11 +1,10 @@ package com.fr.design.gui.itextfield; -import com.fr.design.gui.itextfield.UINumberField; import javax.swing.text.AttributeSet; import javax.swing.text.BadLocationException; import javax.swing.text.PlainDocument; -import java.awt.*; +import java.awt.Toolkit; /** * Created with IntelliJ IDEA. @@ -15,11 +14,11 @@ import java.awt.*; * To change this template use File | Settings | File Templates. */ public class UIIntNumberField extends UINumberField { - public void setFieldDocument(){ - setDocument(new NumberDocument()); + public void setFieldDocument() { + setDocument(createNumberDocument()); } - class NumberDocument extends PlainDocument { + public class NumberDocument extends PlainDocument { public NumberDocument() { } @@ -33,17 +32,30 @@ public class UIIntNumberField extends UINumberField { String strNew = str.substring(0, offset) + s + str.substring(offset, getLength()); - if (isOverMaxOrMinValue(strNew)) { + if (isOverMaxOrMinValue(strNew) && !isContinueInsertWhenOverMaxOrMinValue()) { Toolkit.getDefaultToolkit().beep(); return; } - setisContentChanged(true); + setisContentChanged(true); super.insertString(offset, s, a); } + /** + * 是否继续插入输入的字符 - 当超出范围时 + * + * @return true : 继续插入输入的字符 + */ + public boolean isContinueInsertWhenOverMaxOrMinValue() { + return false; + } + private boolean isOverMaxOrMinValue( String strNew) { return (Double.parseDouble(strNew)getMaxValue()); } } + + public NumberDocument createNumberDocument() { + return new NumberDocument(); + } } \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSyntaxTextArea.java b/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSyntaxTextArea.java index 3d04602f2..30fc7b871 100644 --- a/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSyntaxTextArea.java +++ b/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSyntaxTextArea.java @@ -3016,11 +3016,6 @@ private boolean fractionalFontMetricsEnabled; return he; } - private final boolean equal(LinkGeneratorResult e1, - LinkGeneratorResult e2) { - return e1.getSourceOffset()==e2.getSourceOffset(); - } - @Override public void mouseClicked(MouseEvent e) { if (getHyperlinksEnabled() && isScanningForLinks && @@ -3080,8 +3075,7 @@ private boolean fractionalFontMetricsEnabled; isLinkAtOffset(RSyntaxTextArea.this, offs); if (newResult!=null) { // Repaint if we're at a new link now. - if (linkGeneratorResult==null || - !equal(newResult, linkGeneratorResult)) { + if (linkGeneratorResult==null || newResult.getSourceOffset() != linkGeneratorResult.getSourceOffset()) { repaint(); } linkGeneratorResult = newResult; @@ -3120,4 +3114,4 @@ private boolean fractionalFontMetricsEnabled; } -} \ No newline at end of file +} diff --git a/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rsyntaxtextarea/Style.java b/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rsyntaxtextarea/Style.java index 496537ae0..0824ceafc 100644 --- a/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rsyntaxtextarea/Style.java +++ b/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rsyntaxtextarea/Style.java @@ -9,6 +9,7 @@ */ package com.fr.design.gui.syntax.ui.rsyntaxtextarea; +import com.fr.log.FineLoggerFactory; import java.awt.Color; import java.awt.Font; import java.awt.FontMetrics; @@ -123,15 +124,15 @@ public class Style implements Cloneable { Style clone = null; try { clone = (Style)super.clone(); + clone.foreground = foreground; + clone.background = background; + clone.font = font; + clone.underline = underline; + clone.fontMetrics = fontMetrics; } catch (CloneNotSupportedException cnse) { // Never happens - cnse.printStackTrace(); - return null; + FineLoggerFactory.getLogger().error(cnse.getMessage(), cnse); + clone = null; } - clone.foreground = foreground; - clone.background = background; - clone.font = font; - clone.underline = underline; - clone.fontMetrics = fontMetrics; return clone; } @@ -193,4 +194,4 @@ public class Style implements Cloneable { } -} \ No newline at end of file +} diff --git a/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rsyntaxtextarea/SyntaxScheme.java b/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rsyntaxtextarea/SyntaxScheme.java index 621aeb545..dbaaf4c6f 100644 --- a/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rsyntaxtextarea/SyntaxScheme.java +++ b/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rsyntaxtextarea/SyntaxScheme.java @@ -9,6 +9,7 @@ */ package com.fr.design.gui.syntax.ui.rsyntaxtextarea; +import com.fr.log.FineLoggerFactory; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; @@ -121,17 +122,17 @@ public class SyntaxScheme implements Cloneable, TokenTypes { public Object clone() { SyntaxScheme shcs = null; try { - shcs = (SyntaxScheme)super.clone(); - } catch (CloneNotSupportedException cnse) { // Never happens - cnse.printStackTrace(); - return null; - } - shcs.styles = new Style[styles.length]; - for (int i=0; i or %> - else if (t.startsWith(LANG_END[language])) { + else if (currentFold != null && t.startsWith(LANG_END[language])) { int phpEnd = t.getEndOffset() - 1; currentFold.setEndOffset(phpEnd); Fold parentFold = currentFold.getParent(); @@ -400,4 +400,4 @@ public class HtmlFoldParser implements FoldParser { } -} \ No newline at end of file +} diff --git a/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/FormulaTokenMaker.java b/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/FormulaTokenMaker.java index af5b8b47a..aae721673 100644 --- a/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/FormulaTokenMaker.java +++ b/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/FormulaTokenMaker.java @@ -1,4 +1,4 @@ -/* The following code was generated by JFlex 1.4.1 on 14-12-5 上午10:55 */ +/* The following code was generated by JFlex 1.4.1 on 9/18/19 6:12 PM */ package com.fr.design.gui.syntax.ui.rsyntaxtextarea.modes; @@ -15,8 +15,8 @@ import java.io.IOException; /** * This class is a scanner generated by * JFlex 1.4.1 - * on 14-12-5 上午10:55 from the specification file - * /Users/richie/Documents/finereport/core/dev/designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/FormulaTokenMaker.flex + * on 9/18/19 6:12 PM from the specification file + * /Users/3dot141/Downloads/FolxDownload/App/jflex-1.4.1/bin/FormulaTokenMaker.flex */ public class FormulaTokenMaker extends AbstractJFlexCTokenMaker { @@ -60,28 +60,28 @@ public class FormulaTokenMaker extends AbstractJFlexCTokenMaker { private static final String ZZ_ACTION_PACKED_0 = "\3\0\1\1\2\2\1\3\2\2\1\4\17\2\2\4"+ "\1\5\1\4\1\6\4\4\1\2\1\7\1\10\2\2"+ - "\1\3\1\11\2\2\1\4\1\2\2\1\26\2\2\4"+ + "\1\3\1\11\2\2\1\4\1\2\2\1\30\2\2\4"+ "\2\12\1\13\5\12\1\14\2\12\1\2\2\15\2\3"+ "\1\16\16\2\1\17\61\2\1\0\1\20\1\21\2\22"+ "\1\23\1\6\2\10\1\24\2\2\1\15\13\2\6\1"+ - "\1\0\75\2\2\0\1\25\6\0\1\2\1\3\1\0"+ + "\1\0\77\2\2\0\1\25\6\0\1\2\1\3\1\0"+ "\1\3\1\15\1\16\2\2\1\17\11\2\1\17\16\2"+ "\1\17\3\2\1\17\2\2\1\17\14\2\1\17\10\2"+ "\1\17\17\2\1\17\1\2\1\17\1\6\1\26\1\6"+ "\3\22\1\6\2\10\1\27\2\2\1\30\10\2\4\1"+ - "\1\31\4\1\6\0\25\2\1\17\2\2\1\17\10\2"+ - "\1\17\17\2\1\17\25\2\1\17\1\2\1\17\3\2"+ + "\1\31\4\1\6\0\26\2\1\17\2\2\1\17\10\2"+ + "\1\17\17\2\1\17\25\2\1\17\1\2\1\17\6\2"+ "\10\0\1\2\1\16\1\0\4\2\1\17\6\2\1\17"+ - "\33\2\1\17\15\2\1\17\4\2\1\6\1\10\2\2"+ + "\34\2\1\17\15\2\1\17\4\2\1\6\1\10\2\2"+ "\2\30\5\2\7\1\4\0\1\31\4\0\12\2\1\17"+ - "\3\2\1\17\31\2\1\17\1\2\2\17\23\2\1\17"+ - "\1\2\2\0\1\32\2\0\1\33\27\2\1\17\6\2"+ - "\1\17\14\2\1\30\3\2\1\31\3\1\7\0\27\2"+ - "\1\17\2\2\1\17\12\2\4\0\35\2\2\1\1\31"+ - "\3\0\54\2\2\0\113\2"; + "\4\2\1\17\32\2\1\17\1\2\2\17\23\2\1\17"+ + "\2\2\2\0\1\32\2\0\1\33\27\2\1\17\7\2"+ + "\1\17\14\2\1\30\3\2\1\31\3\1\7\0\30\2"+ + "\1\17\2\2\1\17\12\2\4\0\36\2\2\1\1\31"+ + "\3\0\54\2\2\0\116\2"; private static int [] zzUnpackAction() { - int [] result = new int[869]; + int [] result = new int[887]; int offset = 0; offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result); return result; @@ -115,18 +115,18 @@ public class FormulaTokenMaker extends AbstractJFlexCTokenMaker { "\0\u0f74\0\u0fd0\0\u102c\0\u1088\0\u10e4\0\u1140\0\u119c\0\u11f8"+ "\0\u1254\0\u12b0\0\u130c\0\u1368\0\u13c4\0\u1420\0\u147c\0\u14d8"+ "\0\u1534\0\u1590\0\u15ec\0\u1648\0\u16a4\0\u1700\0\u175c\0\u17b8"+ - "\0\u1814\0\u09b4\0\u1870\0\u18cc\0\u1928\0\u1984\0\u19e0\0\u09b4"+ - "\0\u1a3c\0\u1a98\0\u1af4\0\u1b50\0\u1bac\0\u1c08\0\u1c64\0\u1cc0"+ + "\0\u1814\0\u1870\0\u18cc\0\u09b4\0\u1928\0\u1984\0\u19e0\0\u1a3c"+ + "\0\u1a98\0\u09b4\0\u1af4\0\u1b50\0\u1bac\0\u1c08\0\u1c64\0\u1cc0"+ "\0\u1d1c\0\u1d78\0\u1dd4\0\u1e30\0\u1e8c\0\u1ee8\0\u1f44\0\u1fa0"+ - "\0\u1ffc\0\u2058\0\u20b4\0\u2110\0\u216c\0\u21c8\0\u01cc\0\u2224"+ - "\0\u2280\0\u22dc\0\u2338\0\u2394\0\u23f0\0\u244c\0\u24a8\0\u2504"+ + "\0\u1ffc\0\u2058\0\u20b4\0\u2110\0\u216c\0\u21c8\0\u2224\0\u2280"+ + "\0\u01cc\0\u22dc\0\u2338\0\u2394\0\u23f0\0\u244c\0\u24a8\0\u2504"+ "\0\u2560\0\u25bc\0\u2618\0\u2674\0\u26d0\0\u272c\0\u2788\0\u27e4"+ "\0\u2840\0\u289c\0\u28f8\0\u2954\0\u29b0\0\u2a0c\0\u2a68\0\u2ac4"+ "\0\u2b20\0\u2b7c\0\u2bd8\0\u2c34\0\u2c90\0\u2cec\0\u2d48\0\u2da4"+ "\0\u2e00\0\u2e5c\0\u2eb8\0\u2f14\0\u2f70\0\u2fcc\0\u3028\0\u3084"+ "\0\u30e0\0\u313c\0\u3198\0\u31f4\0\u3250\0\u32ac\0\u3308\0\u3364"+ - "\0\u33c0\0\u09b4\0\u09b4\0\u341c\0\u3478\0\u09b4\0\u34d4\0\u3530"+ - "\0\u358c\0\u09b4\0\u35e8\0\u3644\0\u36a0\0\u36fc\0\u3758\0\u37b4"+ + "\0\u33c0\0\u341c\0\u3478\0\u09b4\0\u09b4\0\u34d4\0\u3530\0\u09b4"+ + "\0\u358c\0\u35e8\0\u3644\0\u09b4\0\u36a0\0\u36fc\0\u3758\0\u37b4"+ "\0\u3810\0\u386c\0\u38c8\0\u3924\0\u3980\0\u39dc\0\u3a38\0\u3a94"+ "\0\u3af0\0\u3b4c\0\u3ba8\0\u3c04\0\u3c60\0\u3cbc\0\u3d18\0\u3d74"+ "\0\u3dd0\0\u3e2c\0\u3e88\0\u3ee4\0\u3f40\0\u3f9c\0\u3ff8\0\u4054"+ @@ -136,9 +136,9 @@ public class FormulaTokenMaker extends AbstractJFlexCTokenMaker { "\0\u4950\0\u49ac\0\u4a08\0\u4a64\0\u4ac0\0\u4b1c\0\u4b78\0\u4bd4"+ "\0\u4c30\0\u4c8c\0\u4ce8\0\u4d44\0\u4da0\0\u4dfc\0\u4e58\0\u4eb4"+ "\0\u4f10\0\u4f6c\0\u4fc8\0\u5024\0\u5080\0\u50dc\0\u5138\0\u5194"+ - "\0\u51f0\0\u524c\0\u52a8\0\u5304\0\u5360\0\u53bc\0\u09b4\0\u5418"+ - "\0\u5474\0\u54d0\0\u552c\0\u5588\0\u55e4\0\u5640\0\u569c\0\u56f8"+ - "\0\u1b50\0\u5754\0\u1b50\0\u57b0\0\u580c\0\u5868\0\u58c4\0\u5920"+ + "\0\u51f0\0\u524c\0\u52a8\0\u5304\0\u5360\0\u53bc\0\u5418\0\u5474"+ + "\0\u54d0\0\u552c\0\u09b4\0\u5588\0\u55e4\0\u5640\0\u569c\0\u56f8"+ + "\0\u5754\0\u57b0\0\u580c\0\u5868\0\u1c08\0\u58c4\0\u1c08\0\u5920"+ "\0\u597c\0\u59d8\0\u5a34\0\u5a90\0\u5aec\0\u5b48\0\u5ba4\0\u5c00"+ "\0\u5c5c\0\u5cb8\0\u5d14\0\u5d70\0\u5dcc\0\u5e28\0\u5e84\0\u5ee0"+ "\0\u5f3c\0\u5f98\0\u5ff4\0\u6050\0\u60ac\0\u6108\0\u6164\0\u61c0"+ @@ -147,9 +147,9 @@ public class FormulaTokenMaker extends AbstractJFlexCTokenMaker { "\0\u67dc\0\u6838\0\u6894\0\u68f0\0\u694c\0\u69a8\0\u6a04\0\u6a60"+ "\0\u6abc\0\u6b18\0\u6b74\0\u6bd0\0\u6c2c\0\u6c88\0\u6ce4\0\u6d40"+ "\0\u6d9c\0\u6df8\0\u6e54\0\u6eb0\0\u6f0c\0\u6f68\0\u6fc4\0\u7020"+ - "\0\u707c\0\u70d8\0\u7134\0\u7190\0\u71ec\0\u7248\0\u72a4\0\u09b4"+ - "\0\u7300\0\u735c\0\u73b8\0\u7414\0\u7470\0\u74cc\0\u7528\0\u09b4"+ - "\0\u7584\0\u75e0\0\u763c\0\u7698\0\u76f4\0\u7750\0\u77ac\0\u7808"+ + "\0\u707c\0\u70d8\0\u7134\0\u7190\0\u71ec\0\u7248\0\u72a4\0\u7300"+ + "\0\u735c\0\u73b8\0\u7414\0\u09b4\0\u7470\0\u74cc\0\u7528\0\u7584"+ + "\0\u75e0\0\u763c\0\u7698\0\u09b4\0\u76f4\0\u7750\0\u77ac\0\u7808"+ "\0\u7864\0\u78c0\0\u791c\0\u7978\0\u79d4\0\u7a30\0\u7a8c\0\u7ae8"+ "\0\u7b44\0\u7ba0\0\u7bfc\0\u7c58\0\u7cb4\0\u7d10\0\u7d6c\0\u7dc8"+ "\0\u7e24\0\u7e80\0\u7edc\0\u7f38\0\u7f94\0\u7ff0\0\u804c\0\u80a8"+ @@ -162,8 +162,8 @@ public class FormulaTokenMaker extends AbstractJFlexCTokenMaker { "\0\u9244\0\u92a0\0\u92fc\0\u9358\0\u93b4\0\u9410\0\u946c\0\u94c8"+ "\0\u9524\0\u9580\0\u95dc\0\u9638\0\u9694\0\u96f0\0\u974c\0\u97a8"+ "\0\u9804\0\u9860\0\u98bc\0\u9918\0\u9974\0\u99d0\0\u9a2c\0\u9a88"+ - "\0\u9ae4\0\u9b40\0\u9b9c\0\u9bf8\0\u9c54\0\u9cb0\0\u9d0c\0\u7248"+ - "\0\u9d68\0\u9dc4\0\u9e20\0\u9e7c\0\u9ed8\0\u9f34\0\u9f90\0\u9fec"+ + "\0\u9ae4\0\u9b40\0\u9b9c\0\u9bf8\0\u9c54\0\u9cb0\0\u9d0c\0\u9d68"+ + "\0\u9dc4\0\u9e20\0\u9e7c\0\u9ed8\0\u9f34\0\u9f90\0\u9fec\0\u73b8"+ "\0\ua048\0\ua0a4\0\ua100\0\ua15c\0\ua1b8\0\ua214\0\ua270\0\ua2cc"+ "\0\ua328\0\ua384\0\ua3e0\0\ua43c\0\ua498\0\ua4f4\0\ua550\0\ua5ac"+ "\0\ua608\0\ua664\0\ua6c0\0\ua71c\0\ua778\0\ua7d4\0\ua830\0\ua88c"+ @@ -175,8 +175,8 @@ public class FormulaTokenMaker extends AbstractJFlexCTokenMaker { "\0\ub748\0\ub7a4\0\ub800\0\ub85c\0\ub8b8\0\ub914\0\ub970\0\ub9cc"+ "\0\uba28\0\uba84\0\ubae0\0\ubb3c\0\ubb98\0\ubbf4\0\ubc50\0\ubcac"+ "\0\ubd08\0\ubd64\0\ubdc0\0\ube1c\0\ube78\0\ubed4\0\ubf30\0\ubf8c"+ - "\0\ubfe8\0\uc044\0\uc0a0\0\u9860\0\uc0fc\0\uc158\0\uc1b4\0\uc210"+ - "\0\uc26c\0\uc2c8\0\uc324\0\uc380\0\uc3dc\0\uc438\0\uc494\0\uc4f0"+ + "\0\ubfe8\0\uc044\0\uc0a0\0\uc0fc\0\uc158\0\uc1b4\0\uc210\0\uc26c"+ + "\0\uc2c8\0\uc324\0\uc380\0\uc3dc\0\uc438\0\u9a2c\0\uc494\0\uc4f0"+ "\0\uc54c\0\uc5a8\0\uc604\0\uc660\0\uc6bc\0\uc718\0\uc774\0\uc7d0"+ "\0\uc82c\0\uc888\0\uc8e4\0\uc940\0\uc99c\0\uc9f8\0\uca54\0\ucab0"+ "\0\ucb0c\0\ucb68\0\ucbc4\0\ucc20\0\ucc7c\0\uccd8\0\ucd34\0\ucd90"+ @@ -186,38 +186,40 @@ public class FormulaTokenMaker extends AbstractJFlexCTokenMaker { "\0\ud68c\0\ud6e8\0\ud744\0\ud7a0\0\ud7fc\0\ud858\0\ud8b4\0\ud910"+ "\0\ud96c\0\ud9c8\0\uda24\0\uda80\0\udadc\0\udb38\0\udb94\0\udbf0"+ "\0\udc4c\0\udca8\0\udd04\0\udd60\0\uddbc\0\ude18\0\ude74\0\uded0"+ - "\0\u62d4\0\udf2c\0\udf88\0\udfe4\0\ue040\0\ue09c\0\ue0f8\0\ue154"+ - "\0\ue1b0\0\ue20c\0\ue268\0\ue2c4\0\ue320\0\ue37c\0\ue3d8\0\ue434"+ - "\0\ue490\0\u1b50\0\ue4ec\0\ue548\0\ue5a4\0\u0114\0\ue600\0\ue65c"+ - "\0\ue6b8\0\ue714\0\ue770\0\ue7cc\0\ue828\0\ue884\0\ue8e0\0\ue93c"+ - "\0\ue998\0\ue9f4\0\uea50\0\ueaac\0\ueb08\0\ueb64\0\uebc0\0\uec1c"+ - "\0\uec78\0\uecd4\0\ued30\0\u877c\0\ued8c\0\uede8\0\uee44\0\ueea0"+ - "\0\ueefc\0\uef58\0\uefb4\0\uf010\0\uf06c\0\uf0c8\0\uf124\0\uf180"+ - "\0\uf1dc\0\uf238\0\uf294\0\uf2f0\0\uf34c\0\uf3a8\0\uf404\0\uf460"+ - "\0\uf4bc\0\uf518\0\uf574\0\uf5d0\0\uf62c\0\uf688\0\ud464\0\uf6e4"+ - "\0\ud578\0\uf740\0\uf79c\0\uf7f8\0\uf854\0\uf8b0\0\uf90c\0\uf968"+ - "\0\uf9c4\0\ufa20\0\ufa7c\0\ufad8\0\ufb34\0\ufb90\0\ufbec\0\ufc48"+ + "\0\udf2c\0\udf88\0\udfe4\0\ue040\0\ue09c\0\ue0f8\0\ue154\0\ue1b0"+ + "\0\ue20c\0\ue268\0\ue2c4\0\ue320\0\ue37c\0\u6444\0\ue3d8\0\ue434"+ + "\0\ue490\0\ue4ec\0\ue548\0\ue5a4\0\ue600\0\ue65c\0\ue6b8\0\ue714"+ + "\0\ue770\0\ue7cc\0\ue828\0\ue884\0\ue8e0\0\ue93c\0\u1c08\0\ue998"+ + "\0\ue9f4\0\uea50\0\u0114\0\ueaac\0\ueb08\0\ueb64\0\uebc0\0\uec1c"+ + "\0\uec78\0\uecd4\0\ued30\0\ued8c\0\uede8\0\uee44\0\ueea0\0\ueefc"+ + "\0\uef58\0\uefb4\0\uf010\0\uf06c\0\uf0c8\0\uf124\0\uf180\0\uf1dc"+ + "\0\uf238\0\u8948\0\uf294\0\uf2f0\0\uf34c\0\uf3a8\0\uf404\0\uf460"+ + "\0\uf4bc\0\uf518\0\uf574\0\uf5d0\0\uf62c\0\uf688\0\uf6e4\0\uf740"+ + "\0\uf79c\0\uf7f8\0\uf854\0\uf8b0\0\uf90c\0\uf968\0\uf9c4\0\ufa20"+ + "\0\ufa7c\0\ufad8\0\ufb34\0\ufb90\0\ud8b4\0\ufbec\0\ud9c8\0\ufc48"+ "\0\ufca4\0\ufd00\0\ufd5c\0\ufdb8\0\ufe14\0\ufe70\0\ufecc\0\uff28"+ "\0\uff84\0\uffe0\1\74\1\230\1\364\1\u0150\1\u01ac\1\u0208"+ - "\0\u09b4\1\u0264\1\u02c0\1\u031c\1\u0378\1\u03d4\1\u0430\1\u048c"+ - "\1\u04e8\1\u0544\1\u05a0\1\u05fc\1\u0658\1\u06b4\1\u0710\1\u076c"+ + "\1\u0264\1\u02c0\1\u031c\1\u0378\1\u03d4\1\u0430\1\u048c\1\u04e8"+ + "\1\u0544\1\u05a0\1\u05fc\1\u0658\1\u06b4\1\u0710\1\u076c\0\u09b4"+ "\1\u07c8\1\u0824\1\u0880\1\u08dc\1\u0938\1\u0994\1\u09f0\1\u0a4c"+ "\1\u0aa8\1\u0b04\1\u0b60\1\u0bbc\1\u0c18\1\u0c74\1\u0cd0\1\u0d2c"+ "\1\u0d88\1\u0de4\1\u0e40\1\u0e9c\1\u0ef8\1\u0f54\1\u0fb0\1\u100c"+ - "\1\u1068\0\u7190\1\u10c4\1\u1120\1\u117c\1\u11d8\1\u1234\1\u1290"+ - "\1\u12ec\1\u1348\1\u13a4\1\u1400\1\u145c\1\u14b8\0\u9918\1\u1514"+ - "\1\u1570\1\u15cc\1\u1628\1\u1684\1\u16e0\1\u173c\1\u1798\1\u17f4"+ - "\1\u1850\1\u18ac\1\u1908\1\u1964\1\u19c0\1\u1a1c\1\u1a78\1\u1ad4"+ + "\1\u1068\1\u10c4\1\u1120\1\u117c\1\u11d8\1\u1234\1\u1290\1\u12ec"+ + "\1\u1348\1\u13a4\1\u1400\1\u145c\1\u14b8\1\u1514\1\u1570\1\u15cc"+ + "\0\u7300\1\u1628\1\u1684\1\u16e0\1\u173c\1\u1798\1\u17f4\1\u1850"+ + "\1\u18ac\1\u1908\1\u1964\1\u19c0\1\u1a1c\0\u9ae4\1\u1a78\1\u1ad4"+ "\1\u1b30\1\u1b8c\1\u1be8\1\u1c44\1\u1ca0\1\u1cfc\1\u1d58\1\u1db4"+ "\1\u1e10\1\u1e6c\1\u1ec8\1\u1f24\1\u1f80\1\u1fdc\1\u2038\1\u2094"+ "\1\u20f0\1\u214c\1\u21a8\1\u2204\1\u2260\1\u22bc\1\u2318\1\u2374"+ "\1\u23d0\1\u242c\1\u2488\1\u24e4\1\u2540\1\u259c\1\u25f8\1\u2654"+ "\1\u26b0\1\u270c\1\u2768\1\u27c4\1\u2820\1\u287c\1\u28d8\1\u2934"+ "\1\u2990\1\u29ec\1\u2a48\1\u2aa4\1\u2b00\1\u2b5c\1\u2bb8\1\u2c14"+ - "\1\u2c70\1\u2ccc\1\u2d28\1\u2d84\1\u2de0"; + "\1\u2c70\1\u2ccc\1\u2d28\1\u2d84\1\u2de0\1\u2e3c\1\u2e98\1\u2ef4"+ + "\1\u2f50\1\u2fac\1\u3008\1\u3064\1\u30c0\1\u311c\1\u3178\1\u31d4"+ + "\1\u3230\1\u328c\1\u32e8\1\u3344\1\u33a0\1\u33fc\1\u3458"; private static int [] zzUnpackRowMap() { - int [] result = new int[869]; + int [] result = new int[887]; int offset = 0; offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result); return result; @@ -249,2345 +251,2400 @@ public class FormulaTokenMaker extends AbstractJFlexCTokenMaker { "\2\4\1\34\1\60\1\41\1\33\1\61\1\62\1\41"+ "\1\63\1\64\1\65\1\66\1\67\1\70\1\71\1\7"+ "\1\72\1\73\1\74\1\75\1\76\1\77\1\100\1\101"+ - "\1\102\1\103\2\6\1\104\2\6\2\7\3\6\1\105"+ - "\2\7\1\34\1\41\1\106\1\107\12\110\1\111\30\110"+ - "\1\112\5\110\1\113\14\110\1\114\2\110\1\115\42\110"+ - "\12\116\1\117\30\116\1\120\22\116\1\121\2\116\1\122"+ - "\42\116\7\4\1\0\17\4\11\0\3\4\2\0\3\4"+ - "\2\0\2\4\1\0\1\4\1\0\3\4\4\0\2\4"+ - "\1\0\37\4\4\0\1\4\6\6\1\0\10\6\1\123"+ - "\6\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\17\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ - "\4\0\3\124\1\7\1\124\1\7\1\125\1\0\1\124"+ - "\1\125\3\124\1\126\4\124\1\127\4\124\11\0\1\124"+ - "\1\7\1\124\2\0\2\124\1\7\2\0\1\127\1\126"+ - "\1\130\1\124\1\0\3\124\4\0\2\124\1\0\7\124"+ - "\1\7\17\124\2\7\4\124\2\7\4\0\1\4\5\6"+ - "\1\131\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\1\6\1\132\35\6\4\0\1\4"+ - "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\13\6\1\133\2\6\1\134\12\6"+ - "\1\135\5\6\13\0\1\41\20\0\1\41\103\0\1\4"+ - "\6\6\1\0\1\6\1\136\12\6\1\137\2\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ - "\4\0\1\4\6\6\1\0\4\6\1\140\12\6\11\0"+ - "\1\4\1\6\1\141\2\0\1\142\2\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\3\6\1\143"+ - "\1\6\1\144\2\6\1\145\3\6\1\146\2\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ - "\4\0\1\4\6\6\1\0\2\6\1\147\1\6\1\150"+ - "\1\6\1\151\10\6\11\0\1\4\1\152\1\6\2\0"+ + "\1\102\1\103\1\104\1\105\1\106\2\6\2\7\3\6"+ + "\1\107\2\7\1\34\1\41\1\110\1\111\12\112\1\113"+ + "\30\112\1\114\5\112\1\115\14\112\1\116\2\112\1\117"+ + "\42\112\12\120\1\121\30\120\1\122\22\120\1\123\2\120"+ + "\1\124\42\120\7\4\1\0\17\4\11\0\3\4\2\0"+ + "\3\4\2\0\2\4\1\0\1\4\1\0\3\4\4\0"+ + "\2\4\1\0\37\4\4\0\1\4\6\6\1\0\10\6"+ + "\1\125\6\6\11\0\1\4\2\6\2\0\3\6\2\0"+ + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ + "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\17\6"+ + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ + "\37\6\4\0\3\126\1\7\1\126\1\7\1\127\1\0"+ + "\1\126\1\127\3\126\1\130\4\126\1\131\4\126\11\0"+ + "\1\126\1\7\1\126\2\0\2\126\1\7\2\0\1\131"+ + "\1\130\1\132\1\126\1\0\3\126\4\0\2\126\1\0"+ + "\7\126\1\7\17\126\2\7\4\126\2\7\4\0\1\4"+ + "\5\6\1\133\1\0\17\6\11\0\1\4\2\6\2\0"+ "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\10\6\1\153\1\6\1\154\4\6\11\0\1\4"+ - "\2\6\2\0\1\155\2\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ - "\4\0\1\4\6\6\1\0\1\6\1\156\2\6\1\147"+ - "\3\6\1\157\1\6\1\160\1\6\1\161\2\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ - "\4\0\1\4\6\6\1\0\1\6\1\162\1\6\1\163"+ - "\1\6\1\164\2\6\1\165\1\6\1\166\1\167\3\6"+ + "\1\4\4\0\2\6\1\0\1\6\1\134\35\6\4\0"+ + "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ + "\1\4\4\0\2\6\1\0\13\6\1\135\2\6\1\136"+ + "\12\6\1\137\5\6\13\0\1\41\20\0\1\41\103\0"+ + "\1\4\6\6\1\0\1\6\1\140\12\6\1\141\2\6"+ "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\1\6\1\170"+ - "\1\0\1\171\22\6\1\172\13\6\4\0\1\4\6\6"+ - "\1\0\1\6\1\173\1\6\1\174\4\6\1\175\3\6"+ - "\1\176\2\6\11\0\1\4\2\6\2\0\3\6\2\0"+ + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ + "\37\6\4\0\1\4\6\6\1\0\4\6\1\142\12\6"+ + "\11\0\1\4\1\6\1\143\2\0\1\144\2\6\2\0"+ "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\1\177"+ - "\6\6\1\147\7\6\11\0\1\4\2\6\2\0\3\6"+ + "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\3\6"+ + "\1\145\1\6\1\146\2\6\1\147\3\6\1\150\2\6"+ + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ + "\37\6\4\0\1\4\6\6\1\0\2\6\1\151\1\6"+ + "\1\152\1\6\1\153\10\6\11\0\1\4\1\154\1\6"+ + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ + "\6\6\1\0\10\6\1\155\1\6\1\156\4\6\11\0"+ + "\1\4\2\6\2\0\1\157\2\6\2\0\2\6\1\0"+ + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ + "\37\6\4\0\1\4\6\6\1\0\1\6\1\160\2\6"+ + "\1\151\3\6\1\161\1\6\1\162\1\6\1\163\2\6"+ + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ + "\37\6\4\0\1\4\6\6\1\0\1\6\1\164\1\6"+ + "\1\165\1\6\1\166\2\6\1\167\1\6\1\170\1\171"+ + "\3\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\1\6"+ + "\1\172\1\0\1\173\22\6\1\174\13\6\4\0\1\4"+ + "\6\6\1\0\1\6\1\175\1\6\1\176\4\6\1\177"+ + "\3\6\1\200\2\6\11\0\1\4\2\6\2\0\3\6"+ "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\1\6\1\200\1\6\1\201\1\202\1\203\1\6\1\204"+ - "\1\205\6\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\1\206\1\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\4\6\1\207\5\6\1\210\1\211\3\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ - "\1\4\6\6\1\0\3\6\1\147\3\6\1\212\1\213"+ - "\6\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\1\214\3\6"+ - "\1\177\1\6\1\215\1\216\1\6\1\217\5\6\11\0"+ - "\1\4\2\6\2\0\1\220\1\221\1\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\1\6"+ - "\1\222\1\0\37\6\4\0\1\4\6\6\1\0\1\6"+ - "\1\223\5\6\1\224\7\6\11\0\1\4\2\6\2\0"+ + "\1\201\6\6\1\151\7\6\11\0\1\4\2\6\2\0"+ "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\1\6\1\225\1\6\1\226\4\6\1\227\3\6"+ - "\1\230\2\6\11\0\1\4\2\6\2\0\3\6\2\0"+ + "\1\0\1\6\1\202\1\6\1\203\1\204\1\205\1\6"+ + "\1\206\1\207\6\6\11\0\1\4\2\6\2\0\3\6"+ + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ + "\4\0\1\210\1\6\1\0\37\6\4\0\1\4\6\6"+ + "\1\0\4\6\1\211\5\6\1\212\1\213\3\6\11\0"+ + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ + "\4\0\1\4\6\6\1\0\3\6\1\151\3\6\1\214"+ + "\1\215\6\6\11\0\1\4\2\6\2\0\3\6\2\0"+ + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ + "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\1\216"+ + "\3\6\1\201\1\6\1\217\1\220\1\6\1\221\5\6"+ + "\11\0\1\4\2\6\2\0\1\222\1\223\1\6\2\0"+ "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\37\6\33\0\1\231\134\0\1\41\267\0"+ - "\1\41\1\0\1\232\16\0\1\233\62\0\27\234\1\235"+ - "\3\234\1\236\4\234\1\237\2\234\1\0\70\234\34\0"+ - "\1\33\134\0\1\33\126\0\1\41\6\0\1\41\74\0"+ - "\40\45\1\240\2\45\1\241\1\242\67\45\1\4\6\6"+ - "\1\0\14\6\1\243\2\6\11\0\1\4\2\6\2\0"+ + "\1\6\1\224\1\0\37\6\4\0\1\4\6\6\1\0"+ + "\1\6\1\225\5\6\1\226\7\6\11\0\1\4\2\6"+ + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ + "\6\6\1\0\1\6\1\227\1\6\1\230\4\6\1\231"+ + "\3\6\1\232\2\6\11\0\1\4\2\6\2\0\3\6"+ + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ + "\4\0\2\6\1\0\37\6\33\0\1\233\134\0\1\41"+ + "\267\0\1\41\1\0\1\234\16\0\1\235\62\0\27\236"+ + "\1\237\3\236\1\240\4\236\1\241\2\236\1\0\70\236"+ + "\34\0\1\33\134\0\1\33\126\0\1\41\6\0\1\41"+ + "\74\0\40\45\1\242\2\45\1\243\1\244\67\45\1\4"+ + "\6\6\1\0\14\6\1\245\2\6\11\0\1\4\2\6"+ + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ + "\6\6\1\0\3\6\1\246\13\6\11\0\1\4\2\6"+ + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\3\126"+ + "\1\7\1\126\1\7\1\127\1\0\1\126\1\127\3\126"+ + "\1\130\4\126\1\131\4\126\11\0\1\126\1\7\1\247"+ + "\2\0\2\126\1\7\2\0\1\131\1\130\1\132\1\126"+ + "\1\0\3\126\4\0\2\126\1\0\7\126\1\7\17\126"+ + "\2\7\1\247\3\126\2\7\54\0\1\51\63\0\1\4"+ + "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ + "\2\0\1\250\1\6\1\0\1\6\1\0\1\4\1\6"+ + "\1\4\4\0\2\6\1\0\13\6\1\251\4\6\1\252"+ + "\16\6\4\0\1\4\5\6\1\253\1\0\17\6\11\0"+ + "\1\4\2\6\2\0\3\6\2\0\1\254\1\6\1\0"+ + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ + "\1\6\1\255\3\6\1\256\5\6\1\151\23\6\7\0"+ + "\1\132\1\0\1\132\33\0\1\132\5\0\1\132\30\0"+ + "\1\132\17\0\2\132\4\0\2\132\4\0\1\4\6\6"+ + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ + "\1\6\1\257\1\0\1\6\1\0\1\4\1\6\1\4"+ + "\4\0\2\6\1\0\1\6\1\260\3\6\1\261\6\6"+ + "\1\262\22\6\4\0\7\4\1\0\1\263\1\264\1\4"+ + "\1\265\1\4\1\266\4\4\1\267\1\270\3\4\11\0"+ + "\3\4\2\0\3\4\1\271\1\0\2\4\1\0\1\4"+ + "\1\0\3\4\4\0\2\4\1\0\37\4\4\0\1\4"+ + "\6\6\1\0\3\6\1\272\4\6\1\273\6\6\11\0"+ + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ + "\4\0\1\4\6\6\1\0\3\6\1\274\3\6\1\275"+ + "\1\276\3\6\1\277\2\6\11\0\1\4\2\6\2\0"+ "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\3\6\1\244\13\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\37\6\4\0\3\124\1\7"+ - "\1\124\1\7\1\125\1\0\1\124\1\125\3\124\1\126"+ - "\4\124\1\127\4\124\11\0\1\124\1\7\1\245\2\0"+ - "\2\124\1\7\2\0\1\127\1\126\1\130\1\124\1\0"+ - "\3\124\4\0\2\124\1\0\7\124\1\7\17\124\2\7"+ - "\1\245\3\124\2\7\54\0\1\51\63\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\1\246\1\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\13\6\1\247\4\6\1\250\16\6"+ - "\4\0\1\4\5\6\1\251\1\0\17\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\1\252\1\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\1\6"+ - "\1\253\3\6\1\254\5\6\1\147\23\6\7\0\1\130"+ - "\1\0\1\130\33\0\1\130\5\0\1\130\30\0\1\130"+ - "\17\0\2\130\4\0\2\130\4\0\1\4\6\6\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\1\6"+ - "\1\255\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\1\6\1\256\3\6\1\257\6\6\1\260"+ - "\22\6\4\0\7\4\1\0\1\261\1\262\1\4\1\263"+ - "\1\4\1\264\4\4\1\265\1\266\3\4\11\0\3\4"+ - "\2\0\3\4\1\267\1\0\2\4\1\0\1\4\1\0"+ - "\3\4\4\0\2\4\1\0\37\4\4\0\1\4\6\6"+ - "\1\0\3\6\1\270\4\6\1\271\6\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ - "\1\4\6\6\1\0\3\6\1\272\3\6\1\273\1\274"+ - "\3\6\1\275\2\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\1\6\1\276\15\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\3\6\1\277"+ - "\2\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\2\6\1\300\1\301\1\302\3\6"+ - "\1\303\2\6\1\304\1\6\1\305\1\306\20\6\4\0"+ - "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ + "\1\0\1\6\1\300\15\6\11\0\1\4\2\6\2\0"+ "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\14\6\1\307\22\6\4\0"+ - "\1\4\5\6\1\310\1\0\17\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\1\311\1\312\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\5\6\1\313"+ - "\6\6\1\314\1\315\2\6\1\316\1\6\1\317\1\6"+ - "\1\320\12\6\4\0\1\4\5\6\1\321\1\0\17\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\1\6\1\322"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\5\6\1\323\1\324\1\6\1\325\2\6\1\326"+ - "\1\327\22\6\4\0\1\4\3\6\1\304\2\6\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\10\6\1\147\26\6\4\0\1\4\6\6\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\5\6\1\330\6\6\1\331\22\6\4\0\1\4"+ - "\5\6\1\332\1\0\17\6\11\0\1\4\2\6\2\0"+ + "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\3\6"+ + "\1\301\2\6\1\0\17\6\11\0\1\4\2\6\2\0"+ "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\1\6\1\333\3\6\1\334"+ - "\6\6\1\335\22\6\4\0\1\4\5\6\1\336\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\1\6\1\337"+ - "\15\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\17\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\1\340\1\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\5\6\1\341\10\6\1\342\20\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\1\343\1\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\147\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\3\6\1\344\7\6\1\345\23\6"+ + "\1\4\4\0\2\6\1\0\2\6\1\302\1\303\1\304"+ + "\3\6\1\305\2\6\1\306\1\6\1\307\1\310\20\6"+ "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\1\6\1\346\3\6"+ - "\1\347\2\6\1\350\3\6\1\351\22\6\4\0\1\4"+ - "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\1\6\1\352\35\6\4\0\1\4"+ - "\5\6\1\353\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\10\6\1\354\26\6\4\0"+ + "\1\6\1\4\4\0\2\6\1\0\14\6\1\311\22\6"+ + "\4\0\1\4\5\6\1\312\1\0\17\6\11\0\1\4"+ + "\2\6\2\0\3\6\2\0\1\313\1\314\1\0\1\6"+ + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\5\6"+ + "\1\315\6\6\1\316\1\317\2\6\1\320\1\6\1\321"+ + "\1\6\1\322\12\6\4\0\1\4\5\6\1\323\1\0"+ + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\1\6"+ + "\1\324\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ + "\2\6\1\0\5\6\1\325\1\326\1\6\1\327\2\6"+ + "\1\330\1\331\22\6\4\0\1\4\3\6\1\306\2\6"+ + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ + "\2\6\1\0\10\6\1\151\26\6\4\0\1\4\6\6"+ + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ + "\2\6\1\0\5\6\1\332\6\6\1\333\22\6\4\0"+ + "\1\4\5\6\1\334\1\0\17\6\11\0\1\4\2\6"+ + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ + "\1\6\1\4\4\0\2\6\1\0\1\6\1\335\3\6"+ + "\1\336\6\6\1\337\22\6\4\0\1\4\5\6\1\340"+ + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ + "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\1\6"+ + "\1\341\15\6\11\0\1\4\2\6\2\0\3\6\2\0"+ + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ + "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\17\6"+ + "\11\0\1\4\2\6\2\0\3\6\2\0\1\342\1\6"+ + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ + "\1\0\5\6\1\343\10\6\1\344\20\6\4\0\1\4"+ + "\6\6\1\0\17\6\11\0\1\4\1\345\1\6\2\0"+ + "\3\6\2\0\2\6\1\0\1\151\1\0\1\4\1\6"+ + "\1\4\4\0\2\6\1\0\3\6\1\346\7\6\1\347"+ + "\23\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4"+ + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ + "\1\4\1\6\1\4\4\0\2\6\1\0\1\6\1\350"+ + "\3\6\1\351\2\6\1\352\3\6\1\353\22\6\4\0"+ "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\5\6\1\355\2\6\1\356"+ - "\3\6\1\147\22\6\4\0\1\4\5\6\1\357\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\1\6\1\360\3\6\1\361\6\6\1\362\22\6"+ - "\4\0\1\4\5\6\1\363\1\0\17\6\11\0\1\4"+ + "\1\4\4\0\2\6\1\0\1\6\1\354\35\6\4\0"+ + "\1\4\5\6\1\355\1\0\17\6\11\0\1\4\2\6"+ + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ + "\1\6\1\4\4\0\2\6\1\0\10\6\1\356\26\6"+ + "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ + "\1\6\1\4\4\0\2\6\1\0\5\6\1\357\2\6"+ + "\1\360\3\6\1\151\22\6\4\0\1\4\5\6\1\361"+ + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ + "\2\6\1\0\1\6\1\362\3\6\1\363\6\6\1\364"+ + "\22\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4"+ + "\2\6\2\0\3\6\2\0\1\365\1\6\1\0\1\6"+ + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ + "\4\0\1\4\6\6\1\0\12\6\1\366\4\6\11\0"+ + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ + "\4\0\1\4\5\6\1\367\1\0\17\6\11\0\1\4"+ "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\5\6\1\364\31\6\136\0"+ - "\1\41\134\0\1\41\12\110\1\0\30\110\1\0\5\110"+ - "\1\0\14\110\1\0\2\110\1\0\42\110\13\0\1\365"+ - "\53\0\1\366\76\0\1\367\170\0\1\370\135\0\1\371"+ - "\42\0\12\116\1\0\30\116\1\0\22\116\1\0\2\116"+ - "\1\0\42\116\13\0\1\372\53\0\1\373\133\0\1\374"+ - "\135\0\1\375\42\0\1\4\6\6\1\0\3\6\1\376"+ + "\1\4\4\0\2\6\1\0\5\6\1\370\31\6\136\0"+ + "\1\41\134\0\1\41\12\112\1\0\30\112\1\0\5\112"+ + "\1\0\14\112\1\0\2\112\1\0\42\112\13\0\1\371"+ + "\53\0\1\372\76\0\1\373\170\0\1\374\135\0\1\375"+ + "\42\0\12\120\1\0\30\120\1\0\22\120\1\0\2\120"+ + "\1\0\42\120\13\0\1\376\53\0\1\377\133\0\1\u0100"+ + "\135\0\1\u0101\42\0\1\4\6\6\1\0\3\6\1\u0102"+ "\13\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\7\124\1\0\17\124\11\0\3\124"+ - "\2\0\3\124\2\0\2\124\1\0\1\124\1\0\3\124"+ - "\4\0\2\124\1\0\37\124\4\0\3\124\1\377\1\124"+ - "\1\377\1\124\1\u0100\17\124\10\0\1\u0100\1\124\1\377"+ - "\1\124\2\0\2\124\1\377\2\0\2\124\1\0\1\124"+ - "\1\0\3\124\4\0\2\124\1\0\7\124\1\377\17\124"+ - "\2\377\4\124\2\377\4\0\7\124\1\0\12\124\1\u0101"+ - "\4\124\11\0\3\124\2\0\3\124\2\0\1\u0101\1\124"+ - "\1\0\1\124\1\0\3\124\4\0\2\124\1\0\37\124"+ - "\4\0\7\124\1\0\5\124\1\u0101\11\124\11\0\3\124"+ - "\2\0\3\124\2\0\1\124\1\u0101\1\0\1\124\1\0"+ - "\3\124\4\0\2\124\1\0\37\124\4\0\3\124\1\130"+ - "\1\124\1\130\1\u0102\1\0\1\124\1\u0102\1\u0103\2\124"+ - "\1\u0103\11\124\11\0\1\124\1\130\1\124\2\0\2\124"+ - "\1\130\2\0\1\124\1\u0103\1\0\1\u0103\1\0\3\124"+ - "\4\0\2\124\1\0\7\124\1\130\17\124\2\130\4\124"+ - "\2\130\4\0\1\4\6\6\1\0\17\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\4\6\1\u0104"+ - "\12\6\1\u0105\17\6\4\0\1\4\6\6\1\0\17\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\11\6\1\u0106\3\6\1\u0107\21\6\4\0\1\4\3\6"+ - "\1\u0108\2\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\4\6\1\u0109\6\6\1\u010a"+ - "\5\6\1\u010b\15\6\4\0\1\4\5\6\1\u010c\1\0"+ + "\1\0\37\6\4\0\7\126\1\0\17\126\11\0\3\126"+ + "\2\0\3\126\2\0\2\126\1\0\1\126\1\0\3\126"+ + "\4\0\2\126\1\0\37\126\4\0\3\126\1\u0103\1\126"+ + "\1\u0103\1\126\1\u0104\17\126\10\0\1\u0104\1\126\1\u0103"+ + "\1\126\2\0\2\126\1\u0103\2\0\2\126\1\0\1\126"+ + "\1\0\3\126\4\0\2\126\1\0\7\126\1\u0103\17\126"+ + "\2\u0103\4\126\2\u0103\4\0\7\126\1\0\12\126\1\u0105"+ + "\4\126\11\0\3\126\2\0\3\126\2\0\1\u0105\1\126"+ + "\1\0\1\126\1\0\3\126\4\0\2\126\1\0\37\126"+ + "\4\0\7\126\1\0\5\126\1\u0105\11\126\11\0\3\126"+ + "\2\0\3\126\2\0\1\126\1\u0105\1\0\1\126\1\0"+ + "\3\126\4\0\2\126\1\0\37\126\4\0\3\126\1\132"+ + "\1\126\1\132\1\u0106\1\0\1\126\1\u0106\1\u0107\2\126"+ + "\1\u0107\11\126\11\0\1\126\1\132\1\126\2\0\2\126"+ + "\1\132\2\0\1\126\1\u0107\1\0\1\u0107\1\0\3\126"+ + "\4\0\2\126\1\0\7\126\1\132\17\126\2\132\4\126"+ + "\2\132\4\0\1\4\6\6\1\0\17\6\11\0\1\4"+ + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ + "\1\4\1\6\1\4\4\0\2\6\1\0\4\6\1\u0108"+ + "\12\6\1\u0109\17\6\4\0\1\4\6\6\1\0\17\6"+ + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ + "\11\6\1\u010a\3\6\1\u010b\21\6\4\0\1\4\3\6"+ + "\1\u010c\2\6\1\0\17\6\11\0\1\4\2\6\2\0"+ + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ + "\1\4\4\0\2\6\1\0\4\6\1\u010d\6\6\1\u010e"+ + "\5\6\1\u010f\15\6\4\0\1\4\5\6\1\u0110\1\0"+ "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\1\6\1\342\35\6\4\0\1\4\6\6\1\0"+ + "\1\0\1\6\1\344\35\6\4\0\1\4\6\6\1\0"+ "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\1\6\1\256\16\6\1\147\16\6\4\0\1\4"+ - "\6\6\1\0\11\6\1\u010d\3\6\1\u010e\1\6\11\0"+ + "\1\0\1\6\1\260\16\6\1\151\16\6\4\0\1\4"+ + "\6\6\1\0\11\6\1\u0111\3\6\1\u0112\1\6\11\0"+ "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\1\6\1\u010f\1\0\12\6\1\u0110"+ - "\24\6\4\0\1\4\6\6\1\0\1\u0111\3\6\1\u0112"+ - "\4\6\1\u0113\4\6\1\u0114\11\0\1\4\2\6\2\0"+ + "\1\6\1\4\4\0\1\6\1\u0113\1\0\12\6\1\u0114"+ + "\24\6\4\0\1\4\6\6\1\0\1\u0115\3\6\1\u0116"+ + "\4\6\1\u0117\4\6\1\u0118\11\0\1\4\2\6\2\0"+ "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\13\6\1\147\1\146\2\6\11\0\1\4\2\6"+ + "\1\0\13\6\1\151\1\150\2\6\11\0\1\4\2\6"+ "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ - "\6\6\1\0\1\6\1\u0115\12\6\1\155\2\6\11\0"+ + "\6\6\1\0\1\6\1\u0119\12\6\1\157\2\6\11\0"+ "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ - "\4\0\1\4\6\6\1\0\1\6\1\u0116\2\6\1\177"+ - "\1\u0117\11\6\11\0\1\4\2\6\2\0\3\6\2\0"+ + "\4\0\1\4\6\6\1\0\1\6\1\u011a\2\6\1\201"+ + "\1\u011b\11\6\11\0\1\4\2\6\2\0\3\6\2\0"+ "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\10\6"+ - "\1\u0118\6\6\11\0\1\4\2\6\2\0\3\6\2\0"+ + "\1\u011c\6\6\11\0\1\4\2\6\2\0\3\6\2\0"+ "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\7\6"+ - "\1\u0119\7\6\11\0\1\4\2\6\2\0\3\6\2\0"+ + "\1\u011d\7\6\11\0\1\4\2\6\2\0\3\6\2\0"+ "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\11\6"+ - "\1\u011a\5\6\11\0\1\4\2\6\2\0\3\6\2\0"+ + "\1\u011e\5\6\11\0\1\4\2\6\2\0\3\6\2\0"+ "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\1\u011b"+ - "\13\6\1\u011c\2\6\11\0\1\4\2\6\2\0\3\6"+ + "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\1\u011f"+ + "\13\6\1\u0120\2\6\11\0\1\4\2\6\2\0\3\6"+ "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\1\6\1\147\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\4\6\1\u011d\12\6\11\0\1\4\2\6\2\0"+ + "\4\0\1\6\1\151\1\0\37\6\4\0\1\4\6\6"+ + "\1\0\4\6\1\u0121\12\6\11\0\1\4\2\6\2\0"+ "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\35\6\1\u0115\1\6\4\0\1\4\6\6"+ + "\2\6\1\0\35\6\1\u0119\1\6\4\0\1\4\6\6"+ "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\1\147\36\6\4\0\1\4\6\6\1\0"+ - "\16\6\1\u011e\11\0\1\4\2\6\2\0\3\6\2\0"+ + "\2\6\1\0\1\151\36\6\4\0\1\4\6\6\1\0"+ + "\16\6\1\u0122\11\0\1\4\2\6\2\0\3\6\2\0"+ "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\5\6"+ - "\1\147\11\6\11\0\1\4\2\6\2\0\3\6\2\0"+ + "\1\151\11\6\11\0\1\4\2\6\2\0\3\6\2\0"+ "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\2\6"+ - "\1\u011a\1\6\1\147\12\6\11\0\1\4\2\6\2\0"+ + "\1\u011e\1\6\1\151\12\6\11\0\1\4\2\6\2\0"+ "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\1\6\1\147\1\0\37\6\4\0\1\4"+ - "\6\6\1\0\15\6\1\u011f\1\6\11\0\1\4\2\6"+ + "\1\4\4\0\1\6\1\151\1\0\37\6\4\0\1\4"+ + "\6\6\1\0\15\6\1\u0123\1\6\11\0\1\4\2\6"+ "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\1\u0120\36\6\4\0"+ - "\1\4\6\6\1\0\4\6\1\206\12\6\11\0\1\4"+ + "\1\6\1\4\4\0\2\6\1\0\1\u0124\36\6\4\0"+ + "\1\4\6\6\1\0\4\6\1\210\12\6\11\0\1\4"+ "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\12\6\1\u0121\24\6\4\0"+ - "\1\4\6\6\1\0\11\6\1\u0122\5\6\11\0\1\4"+ + "\1\4\4\0\2\6\1\0\12\6\1\u0125\24\6\4\0"+ + "\1\4\6\6\1\0\11\6\1\u0126\5\6\11\0\1\4"+ "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\23\6\1\147"+ - "\13\6\4\0\1\4\6\6\1\0\4\6\1\u0123\10\6"+ - "\1\u0115\1\6\11\0\1\4\2\6\2\0\3\6\2\0"+ + "\1\4\1\6\1\4\4\0\2\6\1\0\23\6\1\151"+ + "\13\6\4\0\1\4\6\6\1\0\4\6\1\u0127\10\6"+ + "\1\u0119\1\6\11\0\1\4\2\6\2\0\3\6\2\0"+ "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\3\6"+ - "\1\u0124\13\6\11\0\1\4\2\6\2\0\3\6\2\0"+ + "\1\u0128\13\6\11\0\1\4\2\6\2\0\3\6\2\0"+ "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\7\6"+ - "\1\u0125\7\6\11\0\1\4\2\6\2\0\3\6\2\0"+ + "\1\u0129\7\6\11\0\1\4\2\6\2\0\3\6\2\0"+ "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\16\6"+ - "\1\u0126\11\0\1\4\2\6\2\0\1\6\1\u0127\1\6"+ + "\1\u012a\11\0\1\4\2\6\2\0\1\6\1\u012b\1\6"+ "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\5\6\1\u0128\11\6\11\0\1\4\2\6\2\0\3\6"+ + "\5\6\1\u012c\11\6\11\0\1\4\2\6\2\0\3\6"+ "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\1\u0129\13\6\1\u012a\2\6\11\0\1\4\2\6\2\0"+ + "\1\u012d\13\6\1\u012e\2\6\11\0\1\4\2\6\2\0"+ "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\3\6\1\u012b\13\6\11\0\1\4\2\6\2\0"+ + "\1\0\3\6\1\u012f\13\6\11\0\1\4\2\6\2\0"+ "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\5\6\1\147\1\6\1\u011a\7\6\11\0\1\4"+ + "\1\0\5\6\1\151\1\6\1\u011e\7\6\11\0\1\4"+ "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ - "\1\4\6\6\1\0\11\6\1\u012c\1\6\1\u012d\1\6"+ - "\1\u012e\1\u012f\11\0\1\4\2\6\2\0\1\u0130\2\6"+ + "\1\4\6\6\1\0\11\6\1\u0130\1\6\1\u0131\1\6"+ + "\1\u0132\1\u0133\11\0\1\4\2\6\2\0\1\u0134\2\6"+ "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\15\6\1\u0131\1\6\11\0\1\4\2\6\2\0\3\6"+ + "\15\6\1\u0135\1\6\11\0\1\4\2\6\2\0\3\6"+ "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\12\6\1\u0132\4\6\11\0\1\4\2\6\2\0\3\6"+ + "\12\6\1\u0136\4\6\11\0\1\4\2\6\2\0\3\6"+ "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\1\u0133\36\6\4\0\1\4\6\6"+ - "\1\0\1\u0134\3\6\1\u0135\12\6\11\0\1\4\2\6"+ + "\4\0\2\6\1\0\1\u0137\36\6\4\0\1\4\6\6"+ + "\1\0\1\u0138\3\6\1\u0139\12\6\11\0\1\4\2\6"+ "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ - "\6\6\1\0\1\147\16\6\11\0\1\4\2\6\2\0"+ + "\6\6\1\0\1\151\16\6\11\0\1\4\2\6\2\0"+ "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\3\6\1\u0136\13\6\11\0\1\4\2\6\2\0"+ + "\1\0\3\6\1\u013a\13\6\11\0\1\4\2\6\2\0"+ "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\7\6\1\u0137\7\6\11\0\1\4\2\6\2\0"+ + "\1\0\7\6\1\u013b\7\6\11\0\1\4\2\6\2\0"+ "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\16\6\1\u0114\11\0\1\4\2\6\2\0\3\6"+ + "\1\0\16\6\1\u0118\11\0\1\4\2\6\2\0\3\6"+ "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\14\6\1\u0138\2\6\11\0\1\4\2\6\2\0\3\6"+ + "\14\6\1\u013c\2\6\11\0\1\4\2\6\2\0\3\6"+ "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\10\6\1\u0139\6\6\11\0\1\4\2\6\2\0\3\6"+ + "\10\6\1\u013d\6\6\11\0\1\4\2\6\2\0\3\6"+ "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\1\u013a\3\6\1\u013b\1\u013c\1\u0123\1\u013d\2\6\1\u013e"+ - "\3\6\1\u013f\11\0\1\4\2\6\2\0\3\6\2\0"+ + "\1\u013e\3\6\1\u013f\1\u0140\1\u0127\1\u0141\2\6\1\u0142"+ + "\3\6\1\u0143\11\0\1\4\2\6\2\0\3\6\2\0"+ "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\14\6"+ - "\1\u0140\2\6\11\0\1\4\2\6\2\0\3\6\2\0"+ + "\1\u0144\2\6\11\0\1\4\2\6\2\0\3\6\2\0"+ "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\3\6"+ - "\1\u0141\13\6\11\0\1\4\2\6\2\0\3\6\2\0"+ + "\1\u0145\13\6\11\0\1\4\2\6\2\0\3\6\2\0"+ "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\3\6"+ - "\1\177\13\6\11\0\1\4\2\6\2\0\3\6\2\0"+ + "\1\201\13\6\11\0\1\4\2\6\2\0\3\6\2\0"+ "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\13\6"+ - "\1\u0120\3\6\11\0\1\4\2\6\2\0\3\6\2\0"+ + "\1\u0124\3\6\11\0\1\4\2\6\2\0\3\6\2\0"+ "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\10\6"+ - "\1\u0142\6\6\11\0\1\4\2\6\2\0\3\6\2\0"+ + "\1\u0146\6\6\11\0\1\4\2\6\2\0\3\6\2\0"+ "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\17\6"+ "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\1\u0120\36\6\4\0\1\4\6\6\1\0\1\u0143\16\6"+ + "\1\u0124\36\6\4\0\1\4\6\6\1\0\1\u0147\16\6"+ "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\37\6\4\0\1\4\6\6\1\0\3\6\1\u0144\13\6"+ + "\37\6\4\0\1\4\6\6\1\0\3\6\1\u0148\13\6"+ "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\37\6\4\0\1\4\6\6\1\0\7\6\1\u0145\7\6"+ + "\37\6\4\0\1\4\6\6\1\0\7\6\1\u0149\7\6"+ "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\37\6\4\0\1\4\6\6\1\0\10\6\1\u0146\6\6"+ + "\37\6\4\0\1\4\6\6\1\0\10\6\1\u014a\6\6"+ "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\37\6\4\0\1\4\6\6\1\0\1\6\1\u0147\15\6"+ + "\37\6\4\0\1\4\6\6\1\0\1\6\1\u014b\15\6"+ "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\37\6\4\0\1\4\6\6\1\0\6\6\1\147\10\6"+ + "\37\6\4\0\1\4\6\6\1\0\6\6\1\151\10\6"+ "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\37\6\4\0\1\4\6\6\1\0\14\6\1\u0148\2\6"+ + "\37\6\4\0\1\4\6\6\1\0\14\6\1\u014c\2\6"+ "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ "\37\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4"+ "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\1\6\1\u0149\1\0\37\6"+ - "\4\0\1\4\6\6\1\0\1\6\1\u014a\15\6\11\0"+ + "\1\4\1\6\1\4\4\0\1\6\1\u014d\1\0\37\6"+ + "\4\0\1\4\6\6\1\0\1\6\1\u014e\15\6\11\0"+ "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ - "\4\0\1\4\6\6\1\0\1\u014b\16\6\11\0\1\4"+ + "\4\0\1\4\6\6\1\0\1\u014f\16\6\11\0\1\4"+ "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ - "\1\4\6\6\1\0\1\147\3\6\1\u014c\12\6\11\0"+ + "\1\4\6\6\1\0\1\151\3\6\1\u0150\12\6\11\0"+ "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ - "\4\0\1\4\6\6\1\0\1\147\3\6\1\u014d\11\6"+ - "\1\147\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\13\6\1\u014e"+ - "\3\6\11\0\1\4\1\6\1\147\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\37\6\34\0\10\41\74\0\33\u014f\1\u0150"+ - "\7\u014f\1\0\117\u014f\1\u0151\3\u014f\1\u0150\7\u014f\1\0"+ - "\75\u014f\1\u0152\4\u014f\1\234\1\u014f\1\234\2\u014f\1\234"+ - "\4\u014f\1\234\2\u014f\1\234\3\u014f\1\u0153\4\u014f\1\234"+ - "\1\u0154\1\u0155\1\0\3\234\1\u0154\17\u014f\1\234\10\u014f"+ - "\1\u0154\17\u014f\1\u0154\1\u0152\1\u0155\4\u014f\1\u0152\4\u014f"+ - "\5\241\1\45\4\241\1\45\1\241\1\45\2\241\1\45"+ - "\4\241\1\45\2\241\1\45\3\241\1\45\4\241\2\45"+ - "\1\u0156\1\0\4\45\17\241\1\45\10\241\1\45\17\241"+ - "\2\45\1\u0156\4\241\1\45\44\241\1\u0157\3\241\1\u0158"+ - "\67\241\1\4\6\6\1\0\5\6\1\u0159\11\6\11\0"+ + "\4\0\1\4\6\6\1\0\1\151\3\6\1\u0151\11\6"+ + "\1\151\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ + "\1\0\37\6\4\0\1\4\6\6\1\0\13\6\1\u0152"+ + "\3\6\11\0\1\4\1\6\1\151\2\0\3\6\2\0"+ + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ + "\2\6\1\0\37\6\34\0\10\41\74\0\33\u0153\1\u0154"+ + "\7\u0153\1\0\117\u0153\1\u0155\3\u0153\1\u0154\7\u0153\1\0"+ + "\75\u0153\1\u0156\4\u0153\1\236\1\u0153\1\236\2\u0153\1\236"+ + "\4\u0153\1\236\2\u0153\1\236\3\u0153\1\u0157\4\u0153\1\236"+ + "\1\u0158\1\u0159\1\0\3\236\1\u0158\17\u0153\1\236\10\u0153"+ + "\1\u0158\17\u0153\1\u0158\1\u0156\1\u0159\4\u0153\1\u0156\4\u0153"+ + "\5\243\1\45\4\243\1\45\1\243\1\45\2\243\1\45"+ + "\4\243\1\45\2\243\1\45\3\243\1\45\4\243\2\45"+ + "\1\u015a\1\0\4\45\17\243\1\45\10\243\1\45\17\243"+ + "\2\45\1\u015a\4\243\1\45\44\243\1\u015b\3\243\1\u015c"+ + "\67\243\1\4\6\6\1\0\5\6\1\u015d\11\6\11\0"+ "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\1\6\1\u015a\1\0\37\6\4\0"+ - "\3\124\4\u015b\1\0\3\u015b\6\124\1\u015b\2\124\1\u015b"+ - "\2\124\11\0\1\124\1\u015b\1\124\2\0\1\124\2\u015b"+ - "\2\0\2\124\1\0\1\u015b\1\0\3\124\4\0\2\124"+ - "\1\0\1\124\2\u015b\1\124\1\u015b\2\124\1\u015b\17\124"+ - "\2\u015b\4\124\2\u015b\4\0\1\4\6\6\1\0\17\6"+ + "\1\6\1\4\4\0\1\6\1\u015e\1\0\37\6\4\0"+ + "\3\126\4\u015f\1\0\3\u015f\6\126\1\u015f\2\126\1\u015f"+ + "\2\126\11\0\1\126\1\u015f\1\126\2\0\1\126\2\u015f"+ + "\2\0\2\126\1\0\1\u015f\1\0\3\126\4\0\2\126"+ + "\1\0\1\126\2\u015f\1\126\1\u015f\2\126\1\u015f\17\126"+ + "\2\u015f\4\126\2\u015f\4\0\1\4\6\6\1\0\17\6"+ "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\14\6\1\304\22\6\4\0\1\4\6\6\1\0\17\6"+ + "\14\6\1\306\22\6\4\0\1\4\6\6\1\0\17\6"+ "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\14\6\1\u015c\22\6\4\0\1\4\6\6\1\0\17\6"+ + "\14\6\1\u0160\22\6\4\0\1\4\6\6\1\0\17\6"+ "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\20\6\1\u015d\16\6\4\0\1\4\6\6\1\0\17\6"+ + "\20\6\1\u0161\16\6\4\0\1\4\6\6\1\0\17\6"+ "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\u015e\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\13\6\1\147\1\6\1\147\21\6\4\0\1\4\6\6"+ + "\1\u0162\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ + "\13\6\1\151\1\6\1\151\21\6\4\0\1\4\6\6"+ "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\13\6\1\324\23\6\4\0\1\4\6\6"+ + "\2\6\1\0\13\6\1\326\23\6\4\0\1\4\6\6"+ "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\11\6\1\u015f\25\6\4\0\1\4\6\6"+ + "\2\6\1\0\11\6\1\u0163\25\6\4\0\1\4\6\6"+ "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\17\6\1\u011f\4\6\1\u015d\12\6\4\0"+ + "\2\6\1\0\17\6\1\u0123\4\6\1\u0161\12\6\4\0"+ "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\5\6\1\u0160\31\6\4\0"+ + "\1\4\4\0\2\6\1\0\5\6\1\u0164\31\6\4\0"+ "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\4\6\1\u015e\32\6\4\0"+ + "\1\4\4\0\2\6\1\0\4\6\1\u0162\32\6\4\0"+ "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\10\6\1\u0161\26\6\4\0"+ - "\1\4\5\6\1\u0162\1\0\17\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\1\6\1\u0163\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\13\6\1\304"+ - "\23\6\4\0\7\4\1\0\1\4\1\u0164\15\4\11\0"+ + "\1\4\4\0\2\6\1\0\10\6\1\u0165\26\6\4\0"+ + "\1\4\5\6\1\u0166\1\0\17\6\11\0\1\4\2\6"+ + "\2\0\3\6\2\0\1\6\1\u0167\1\0\1\6\1\0"+ + "\1\4\1\6\1\4\4\0\2\6\1\0\13\6\1\306"+ + "\23\6\4\0\7\4\1\0\1\4\1\u0168\15\4\11\0"+ "\3\4\2\0\3\4\2\0\2\4\1\0\1\4\1\0"+ "\3\4\4\0\2\4\1\0\37\4\4\0\7\4\1\0"+ - "\4\4\1\u0165\1\u0166\1\4\1\u0167\7\4\11\0\3\4"+ + "\4\4\1\u0169\1\u016a\1\4\1\u016b\7\4\11\0\3\4"+ "\2\0\3\4\2\0\2\4\1\0\1\4\1\0\3\4"+ "\4\0\2\4\1\0\37\4\4\0\7\4\1\0\2\4"+ - "\1\u0168\1\4\1\u0169\12\4\11\0\3\4\2\0\3\4"+ + "\1\u016c\1\4\1\u016d\12\4\11\0\3\4\2\0\3\4"+ "\2\0\2\4\1\0\1\4\1\0\3\4\4\0\2\4"+ - "\1\0\37\4\4\0\7\4\1\0\3\4\1\u016a\13\4"+ + "\1\0\37\4\4\0\7\4\1\0\3\4\1\u016e\13\4"+ "\11\0\3\4\2\0\3\4\2\0\2\4\1\0\1\4"+ "\1\0\3\4\4\0\2\4\1\0\37\4\4\0\7\4"+ - "\1\0\4\4\1\u016b\12\4\11\0\3\4\2\0\3\4"+ + "\1\0\4\4\1\u016f\12\4\11\0\3\4\2\0\3\4"+ "\2\0\2\4\1\0\1\4\1\0\3\4\4\0\2\4"+ - "\1\0\37\4\4\0\7\4\1\0\7\4\1\u016c\7\4"+ + "\1\0\37\4\4\0\7\4\1\0\7\4\1\u0170\7\4"+ "\11\0\3\4\2\0\3\4\2\0\2\4\1\0\1\4"+ - "\1\0\3\4\4\0\2\4\1\0\37\4\14\0\1\u016d"+ - "\1\u016e\1\0\1\u016f\1\0\1\u0170\4\0\1\u0171\1\u0172"+ - "\24\0\1\267\63\0\1\4\6\6\1\0\1\6\1\u0173"+ + "\1\0\3\4\4\0\2\4\1\0\37\4\14\0\1\u0171"+ + "\1\u0172\1\0\1\u0173\1\0\1\u0174\4\0\1\u0175\1\u0176"+ + "\24\0\1\271\63\0\1\4\6\6\1\0\1\6\1\u0177"+ "\15\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\12\6\1\u0140"+ + "\1\0\37\6\4\0\1\4\6\6\1\0\12\6\1\u0144"+ "\4\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\16\6\1\u013a"+ + "\1\0\37\6\4\0\1\4\6\6\1\0\16\6\1\u013e"+ "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\37\6\4\0\1\4\6\6\1\0\1\6\1\u0174\1\6"+ - "\1\u0175\6\6\1\u0176\4\6\11\0\1\4\2\6\2\0"+ + "\37\6\4\0\1\4\6\6\1\0\1\6\1\u0178\1\6"+ + "\1\u0179\6\6\1\u017a\4\6\11\0\1\4\2\6\2\0"+ "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\1\u0177\2\6\1\u0178\4\6\1\u0179\6\6\11\0"+ - "\1\4\2\6\2\0\1\6\1\u017a\1\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\1\u017b"+ + "\1\0\1\u017b\2\6\1\u017c\4\6\1\u017d\6\6\11\0"+ + "\1\4\2\6\2\0\1\6\1\u017e\1\6\2\0\2\6"+ + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\1\u017f"+ "\1\6\1\0\37\6\4\0\1\4\6\6\1\0\4\6"+ - "\1\u0123\12\6\11\0\1\4\2\6\2\0\1\6\1\u017c"+ + "\1\u0127\12\6\11\0\1\4\2\6\2\0\1\6\1\u0180"+ "\1\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\1\6\1\u017d\1\6\1\u017e\13\6\11\0\1\4"+ + "\1\0\1\6\1\u0181\1\6\1\u0182\13\6\11\0\1\4"+ + "\2\6\2\0\1\6\1\u0183\1\6\2\0\2\6\1\0"+ + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ + "\37\6\4\0\1\4\3\6\1\u0184\2\6\1\0\17\6"+ + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ + "\37\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4"+ "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ - "\1\4\3\6\1\u017f\2\6\1\0\17\6\11\0\1\4"+ + "\1\4\1\6\1\4\4\0\2\6\1\0\3\6\1\151"+ + "\33\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4"+ + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ + "\1\4\1\6\1\4\4\0\2\6\1\0\14\6\1\u0185"+ + "\22\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4"+ + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ + "\1\4\1\6\1\4\4\0\2\6\1\0\5\6\1\u0186"+ + "\31\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4"+ + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ + "\1\4\1\6\1\4\4\0\2\6\1\0\10\6\1\u0187"+ + "\26\6\4\0\1\4\3\6\1\151\2\6\1\0\17\6"+ + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ + "\37\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4"+ "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ + "\1\4\1\6\1\4\4\0\2\6\1\0\1\6\1\u0188"+ + "\35\6\4\0\1\4\5\6\1\u0189\1\0\17\6\11\0"+ + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ + "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ + "\1\6\1\4\4\0\2\6\1\0\15\6\1\u018a\21\6"+ + "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ + "\1\6\1\4\4\0\2\6\1\0\4\6\1\u018b\15\6"+ + "\1\151\14\6\4\0\1\4\6\6\1\0\17\6\11\0"+ + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\2\6"+ + "\1\u018c\16\6\1\u018d\15\6\4\0\1\4\6\6\1\0"+ + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ + "\1\0\14\6\1\u018e\22\6\4\0\1\4\6\6\1\0"+ + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ + "\1\0\10\6\1\u018f\26\6\4\0\1\4\6\6\1\0"+ + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ + "\1\0\13\6\1\u0190\3\6\1\u0110\17\6\4\0\1\4"+ + "\3\6\1\u0191\2\6\1\0\17\6\11\0\1\4\2\6"+ + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ + "\1\6\1\4\4\0\2\6\1\0\1\6\1\u0192\35\6"+ + "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ + "\2\0\3\6\2\0\1\6\1\u0193\1\0\1\6\1\0"+ "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\3\6\1\147\33\6\4\0"+ + "\3\6\2\0\1\6\1\151\1\0\1\6\1\0\1\4"+ + "\1\6\1\4\4\0\2\6\1\0\10\6\1\u0162\26\6"+ + "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ + "\1\6\1\4\4\0\2\6\1\0\14\6\1\u0194\22\6"+ + "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ + "\1\6\1\4\4\0\2\6\1\0\14\6\1\u0195\22\6"+ + "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ + "\1\6\1\4\4\0\2\6\1\0\1\6\1\u0196\35\6"+ + "\4\0\1\4\3\6\1\u0197\2\6\1\0\17\6\11\0"+ + "\1\4\2\6\2\0\3\6\2\0\1\u0198\1\u0199\1\0"+ + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ + "\3\6\1\u0190\4\6\1\u019a\2\6\1\u019b\5\6\1\u019c"+ + "\15\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4"+ + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ + "\1\4\1\6\1\4\4\0\2\6\1\0\1\6\1\u019d"+ + "\35\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4"+ + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ + "\1\4\1\6\1\4\4\0\2\6\1\0\5\6\1\u019e"+ + "\31\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4"+ + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ + "\1\4\1\6\1\4\4\0\2\6\1\0\21\6\1\u010f"+ + "\15\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4"+ + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ + "\1\4\1\6\1\4\4\0\2\6\1\0\10\6\1\u019f"+ + "\26\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4"+ + "\2\6\2\0\3\6\2\0\1\u019d\1\6\1\0\1\6"+ + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ + "\4\0\1\4\5\6\1\u01a0\1\0\17\6\11\0\1\4"+ + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ + "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\14\6\1\u0180\22\6\4\0"+ + "\1\4\4\0\2\6\1\0\4\6\1\u01a1\11\6\1\u01a2"+ + "\1\u01a3\1\u01a4\1\u01a5\15\6\4\0\1\4\3\6\1\u01a6"+ + "\2\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ + "\4\0\2\6\1\0\13\6\1\u01a7\23\6\4\0\1\4"+ + "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ + "\2\0\1\u01a8\1\6\1\0\1\6\1\0\1\4\1\6"+ + "\1\4\4\0\2\6\1\0\24\6\1\u01a9\12\6\4\0"+ "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\5\6\1\u0181\31\6\4\0"+ + "\1\4\4\0\2\6\1\0\17\6\1\u01aa\17\6\4\0"+ "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\10\6\1\u0182\26\6\4\0"+ - "\1\4\3\6\1\147\2\6\1\0\17\6\11\0\1\4"+ + "\1\4\4\0\2\6\1\0\1\6\1\u01ab\35\6\4\0"+ + "\1\4\6\6\1\0\14\6\1\u01ac\2\6\11\0\1\4"+ "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\1\6\1\u0183\35\6\4\0"+ - "\1\4\5\6\1\u0184\1\0\17\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ + "\1\4\4\0\2\6\1\0\21\6\1\u01ad\15\6\4\0"+ + "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ + "\1\4\4\0\2\6\1\0\24\6\1\151\12\6\4\0"+ + "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ + "\3\6\2\0\1\6\1\151\1\0\1\6\1\0\1\4"+ "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\15\6\1\u0185\21\6\4\0\1\4"+ + "\4\0\2\6\1\0\35\6\1\u0110\1\6\4\0\1\4"+ "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\4\6\1\u0186\15\6\1\147\14\6"+ - "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ + "\4\0\2\6\1\0\13\6\1\u01ae\23\6\4\0\1\4"+ + "\3\6\1\u01af\2\6\1\0\17\6\11\0\1\4\2\6"+ "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\2\6\1\u0187\16\6"+ - "\1\u0188\15\6\4\0\1\4\6\6\1\0\17\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\14\6"+ - "\1\u0189\22\6\4\0\1\4\6\6\1\0\17\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\10\6"+ - "\1\u018a\26\6\4\0\1\4\6\6\1\0\17\6\11\0"+ + "\1\6\1\4\4\0\2\6\1\0\1\6\1\u01b0\13\6"+ + "\1\151\21\6\4\0\1\4\6\6\1\0\17\6\11\0"+ "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\13\6"+ - "\1\u018b\3\6\1\u010c\17\6\4\0\1\4\3\6\1\u018c"+ + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\2\6"+ + "\1\u01b1\10\6\1\u0190\23\6\4\0\1\4\3\6\1\u01b2"+ "\2\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\1\6\1\u018d\35\6\4\0\1\4"+ - "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\1\6\1\u018e\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\1\6\1\147\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\10\6\1\u015e\26\6\4\0\1\4"+ - "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\14\6\1\u018f\22\6\4\0\1\4"+ - "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\14\6\1\u0190\22\6\4\0\1\4"+ - "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\1\6\1\u0191\35\6\4\0\1\4"+ - "\3\6\1\u0192\2\6\1\0\17\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\1\u0193\1\u0194\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\3\6\1\u018b"+ - "\4\6\1\u0195\2\6\1\u0196\5\6\1\u0197\15\6\4\0"+ - "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\1\6\1\u0198\35\6\4\0"+ - "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\5\6\1\u0199\31\6\4\0"+ - "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\21\6\1\u010b\15\6\4\0"+ - "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\10\6\1\u019a\26\6\4\0"+ - "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\1\u0198\1\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ - "\5\6\1\u019b\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ + "\4\0\2\6\1\0\2\6\1\u01b3\2\6\1\u01b4\1\u01b5"+ + "\5\6\1\u01b6\22\6\4\0\1\4\5\6\1\u01b7\1\0"+ + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\1\u01b8"+ + "\1\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ + "\2\6\1\0\14\6\1\u01b9\22\6\4\0\1\4\6\6"+ "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\4\6\1\u019c\11\6\1\u019d\1\u019e\1\u019f"+ - "\1\u01a0\15\6\4\0\1\4\3\6\1\u01a1\2\6\1\0"+ + "\2\6\1\0\21\6\1\u0197\15\6\4\0\1\4\6\6"+ + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ + "\1\6\1\u01ba\1\0\1\6\1\0\1\4\1\6\1\4"+ + "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\13\6\1\u01a2\23\6\4\0\1\4\6\6\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\1\u01a3"+ - "\1\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\24\6\1\u01a4\12\6\4\0\1\4\6\6"+ + "\1\0\15\6\1\u01bb\21\6\4\0\1\4\5\6\1\u01bc"+ "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\17\6\1\u01a5\17\6\4\0\1\4\6\6"+ + "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\17\6"+ + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ + "\24\6\1\u0161\12\6\4\0\1\4\6\6\1\0\17\6"+ + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ + "\5\6\1\u01bd\31\6\4\0\1\4\3\6\1\u01be\2\6"+ "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\1\6\1\u01a6\35\6\4\0\1\4\6\6"+ - "\1\0\14\6\1\u01a7\2\6\11\0\1\4\2\6\2\0"+ + "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\17\6"+ + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ + "\20\6\1\u01bf\10\6\1\151\5\6\4\0\1\4\3\6"+ + "\1\151\2\6\1\0\17\6\11\0\1\4\2\6\2\0"+ "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ + "\1\4\4\0\2\6\1\0\13\6\1\u01c0\5\6\1\151"+ + "\15\6\4\0\1\4\3\6\1\151\2\6\1\0\17\6"+ + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ + "\13\6\1\u01c1\23\6\4\0\1\4\5\6\1\u01c2\1\0"+ + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ + "\1\0\37\6\4\0\1\4\6\6\1\0\1\6\1\u01c3"+ + "\15\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ + "\1\0\37\6\4\0\1\4\5\6\1\u01c4\1\0\17\6"+ + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ + "\2\6\1\u01c5\11\6\1\u01c6\22\6\4\0\1\4\6\6"+ "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\21\6\1\u01a8\15\6\4\0\1\4\6\6"+ + "\2\6\1\0\14\6\1\u01c7\22\6\21\0\1\u01c8\141\0"+ + "\1\u01c9\177\0\1\u01ca\135\0\1\u01cb\57\0\1\u01cc\141\0"+ + "\1\u01cd\177\0\1\u01ce\135\0\1\u01cf\42\0\1\4\6\6"+ + "\1\0\4\6\1\u01d0\12\6\11\0\1\4\2\6\2\0"+ + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ + "\1\4\4\0\2\6\1\0\37\6\4\0\3\126\1\u0103"+ + "\1\126\1\u0103\1\126\1\0\5\126\1\130\4\126\1\131"+ + "\4\126\11\0\1\126\1\u0103\1\126\2\0\2\126\1\u0103"+ + "\2\0\1\131\1\130\1\0\1\126\1\0\3\126\4\0"+ + "\2\126\1\0\7\126\1\u0103\17\126\2\u0103\4\126\2\u0103"+ + "\7\0\1\u0103\1\0\1\u0103\33\0\1\u0103\5\0\1\u0103"+ + "\30\0\1\u0103\17\0\2\u0103\4\0\2\u0103\4\0\3\126"+ + "\1\u01d1\1\126\1\u01d1\1\126\1\u01d2\17\126\10\0\1\u01d2"+ + "\1\126\1\u01d1\1\126\2\0\2\126\1\u01d1\2\0\2\126"+ + "\1\0\1\126\1\0\3\126\4\0\2\126\1\0\7\126"+ + "\1\u01d1\17\126\2\u01d1\4\126\2\u01d1\4\0\1\4\6\6"+ "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\24\6\1\147\12\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\1\6\1\147\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\35\6\1\u010c\1\6\4\0\1\4\6\6\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\13\6\1\u01a9\23\6\4\0\1\4\3\6\1\u01aa"+ - "\2\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\1\6\1\u01ab\13\6\1\147\21\6"+ + "\2\6\1\0\5\6\1\u01d3\6\6\1\u01d4\22\6\4\0"+ + "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ + "\1\4\4\0\2\6\1\0\10\6\1\u01d5\26\6\4\0"+ + "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ + "\1\4\4\0\2\6\1\0\3\6\1\u01d6\12\6\1\100"+ + "\20\6\4\0\1\4\5\6\1\u01d7\1\0\17\6\11\0"+ + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\2\6\1\u01ac\10\6"+ - "\1\u018b\23\6\4\0\1\4\3\6\1\u01ad\2\6\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\2\6\1\u01ae\2\6\1\u01af\1\u01b0\5\6\1\u01b1"+ - "\22\6\4\0\1\4\5\6\1\u01b2\1\0\17\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\1\u01b3\1\6\1\0"+ + "\1\6\1\4\4\0\2\6\1\0\24\6\1\u01d8\12\6"+ + "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ + "\1\6\1\4\4\0\2\6\1\0\5\6\1\u01d3\31\6"+ + "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ + "\2\0\3\6\2\0\1\u01d9\1\6\1\0\1\6\1\0"+ + "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ + "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ + "\1\4\4\0\2\6\1\0\5\6\1\u01da\31\6\4\0"+ + "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ + "\1\4\4\0\2\6\1\0\13\6\1\151\23\6\4\0"+ + "\1\4\6\6\1\0\3\6\1\u01db\4\6\1\u01dc\6\6"+ + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ + "\37\6\4\0\1\4\6\6\1\0\7\6\1\u01dd\7\6"+ + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\14\6\1\u01b4\22\6\4\0\1\4\6\6\1\0\17\6"+ + "\37\6\4\0\1\4\6\6\1\0\1\6\1\u01de\15\6"+ "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\21\6\1\u0192\15\6\4\0\1\4\6\6\1\0\17\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\1\6\1\u01b5"+ + "\37\6\4\0\1\4\6\6\1\0\6\6\1\u01df\10\6"+ + "\11\0\1\4\2\6\2\0\1\46\2\6\2\0\2\6"+ "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ "\1\0\37\6\4\0\1\4\6\6\1\0\17\6\11\0"+ "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\15\6"+ - "\1\u01b6\21\6\4\0\1\4\5\6\1\u01b7\1\0\17\6"+ + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\1\u01e0"+ + "\36\6\4\0\1\4\6\6\1\0\12\6\1\u01e1\4\6"+ "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\37\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\24\6\1\u015d"+ - "\12\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\5\6\1\u01b8"+ - "\31\6\4\0\1\4\3\6\1\u01b9\2\6\1\0\17\6"+ + "\37\6\4\0\1\4\6\6\1\0\10\6\1\u01dc\6\6"+ "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\37\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\20\6\1\u01ba"+ - "\10\6\1\147\5\6\4\0\1\4\3\6\1\147\2\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\13\6\1\u01bb\5\6\1\147\15\6\4\0"+ - "\1\4\3\6\1\147\2\6\1\0\17\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\13\6\1\u01bc"+ - "\23\6\4\0\1\4\5\6\1\u01bd\1\0\17\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\14\6"+ - "\1\u01be\22\6\4\0\1\4\6\6\1\0\17\6\11\0"+ + "\37\6\4\0\1\4\6\6\1\0\10\6\1\u01e2\6\6"+ + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ + "\37\6\4\0\1\4\6\6\1\0\4\6\1\151\12\6"+ + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ + "\37\6\4\0\1\4\6\6\1\0\5\6\1\u01e3\11\6"+ + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ + "\37\6\4\0\1\4\6\6\1\0\1\6\1\u01e4\15\6"+ + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ + "\37\6\4\0\1\4\6\6\1\0\10\6\1\u0144\6\6"+ + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ + "\37\6\4\0\1\4\6\6\1\0\16\6\1\u01e5\11\0"+ "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\14\6"+ - "\1\u01bf\22\6\21\0\1\u01c0\141\0\1\u01c1\177\0\1\u01c2"+ - "\135\0\1\u01c3\57\0\1\u01c4\141\0\1\u01c5\177\0\1\u01c6"+ - "\135\0\1\u01c7\42\0\1\4\6\6\1\0\4\6\1\u01c8"+ - "\12\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\3\124\1\377\1\124\1\377\1\124"+ - "\1\0\5\124\1\126\4\124\1\127\4\124\11\0\1\124"+ - "\1\377\1\124\2\0\2\124\1\377\2\0\1\127\1\126"+ - "\1\0\1\124\1\0\3\124\4\0\2\124\1\0\7\124"+ - "\1\377\17\124\2\377\4\124\2\377\7\0\1\377\1\0"+ - "\1\377\33\0\1\377\5\0\1\377\30\0\1\377\17\0"+ - "\2\377\4\0\2\377\4\0\3\124\1\u01c9\1\124\1\u01c9"+ - "\1\124\1\u01ca\17\124\10\0\1\u01ca\1\124\1\u01c9\1\124"+ - "\2\0\2\124\1\u01c9\2\0\2\124\1\0\1\124\1\0"+ - "\3\124\4\0\2\124\1\0\7\124\1\u01c9\17\124\2\u01c9"+ - "\4\124\2\u01c9\4\0\1\4\6\6\1\0\17\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\5\6"+ - "\1\u01cb\6\6\1\u01cc\22\6\4\0\1\4\6\6\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\10\6\1\u01cd\26\6\4\0\1\4\6\6\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\3\6\1\u01ce\12\6\1\100\20\6\4\0\1\4"+ - "\5\6\1\u01cf\1\0\17\6\11\0\1\4\2\6\2\0"+ + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ + "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ + "\1\6\1\4\4\0\1\6\1\151\1\0\37\6\4\0"+ + "\1\4\6\6\1\0\1\6\1\u01e6\15\6\11\0\1\4"+ + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ + "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ + "\1\4\6\6\1\0\7\6\1\220\7\6\11\0\1\4"+ + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ + "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ + "\1\4\6\6\1\0\12\6\1\u01e7\4\6\11\0\1\4"+ + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ + "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ + "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ + "\1\4\4\0\1\6\1\u01e8\1\0\37\6\4\0\1\4"+ + "\6\6\1\0\17\6\11\0\1\4\1\u01e9\1\6\2\0"+ + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ + "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ + "\1\0\1\6\1\u0144\15\6\11\0\1\4\2\6\2\0"+ + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ + "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ + "\1\0\1\6\1\u01ea\15\6\11\0\1\4\2\6\2\0"+ + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ + "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ + "\1\0\10\6\1\u01eb\6\6\11\0\1\4\2\6\2\0"+ "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\24\6\1\u01d0\12\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\5\6\1\u01cb\31\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\1\u01d1\1\6\1\0\1\6\1\0\1\4\1\6\1\4"+ + "\1\151\1\6\1\0\37\6\4\0\1\4\6\6\1\0"+ + "\11\6\1\u01ec\5\6\11\0\1\4\2\6\2\0\3\6"+ + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\5\6\1\u01d2\31\6\4\0\1\4\6\6\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\13\6\1\147\23\6\4\0\1\4\6\6\1\0"+ - "\3\6\1\u01d3\4\6\1\u01d4\6\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ - "\6\6\1\0\7\6\1\u01d5\7\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ - "\6\6\1\0\1\6\1\u01d6\15\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ - "\6\6\1\0\6\6\1\u01d7\10\6\11\0\1\4\2\6"+ - "\2\0\1\46\2\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ - "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\1\6"+ + "\1\u0152\1\0\37\6\4\0\1\4\6\6\1\0\6\6"+ + "\1\u01ed\4\6\1\u01ee\3\6\11\0\1\4\2\6\2\0"+ "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\1\u01d8\36\6\4\0\1\4"+ - "\6\6\1\0\12\6\1\u01d9\4\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ - "\6\6\1\0\10\6\1\u01d4\6\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ - "\6\6\1\0\10\6\1\u01da\6\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ - "\6\6\1\0\4\6\1\147\12\6\11\0\1\4\2\6"+ + "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ + "\1\0\6\6\1\u01ef\10\6\11\0\1\4\2\6\2\0"+ + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ + "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ + "\1\0\3\6\1\u011e\13\6\11\0\1\4\2\6\2\0"+ + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ + "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ + "\1\0\1\6\1\u01f0\15\6\11\0\1\4\2\6\2\0"+ + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ + "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ + "\1\0\7\6\1\u01f1\7\6\11\0\1\4\2\6\2\0"+ + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ + "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ + "\1\6\1\u01f2\1\0\37\6\4\0\1\4\6\6\1\0"+ + "\10\6\1\u01f3\6\6\11\0\1\4\2\6\2\0\3\6"+ + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ + "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ + "\1\6\1\u01e5\3\6\1\u01f4\11\6\11\0\1\4\2\6"+ "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ - "\6\6\1\0\5\6\1\u01db\11\6\11\0\1\4\2\6"+ + "\6\6\1\0\1\6\1\u01f5\15\6\11\0\1\4\2\6"+ "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ - "\6\6\1\0\1\6\1\u01dc\15\6\11\0\1\4\2\6"+ + "\6\6\1\0\10\6\1\u01f6\6\6\11\0\1\4\2\6"+ "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ - "\6\6\1\0\10\6\1\u0140\6\6\11\0\1\4\2\6"+ + "\6\6\1\0\1\6\1\u01f7\15\6\11\0\1\4\2\6"+ "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ - "\6\6\1\0\16\6\1\u01dd\11\0\1\4\2\6\2\0"+ + "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ + "\4\0\1\u011e\1\6\1\0\37\6\4\0\1\4\6\6"+ + "\1\0\4\6\1\u01f8\12\6\11\0\1\4\2\6\2\0"+ "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\1\6\1\147\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\1\6\1\u01de\15\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\7\6\1\216\7\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\12\6\1\u01df\4\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\1\6"+ - "\1\u01e0\1\0\37\6\4\0\1\4\6\6\1\0\17\6"+ - "\11\0\1\4\1\u01e1\1\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\1\6\1\u0140"+ - "\15\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\1\6\1\u01e2"+ - "\15\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\10\6\1\u01e3"+ - "\6\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\17\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\1\147\1\6\1\0"+ - "\37\6\4\0\1\4\6\6\1\0\11\6\1\u01e4\5\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\37\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\1\6\1\u014e\1\0\37\6"+ - "\4\0\1\4\6\6\1\0\6\6\1\u01e5\10\6\11\0"+ + "\1\0\11\6\1\u01f9\5\6\11\0\1\4\2\6\2\0"+ + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ + "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ + "\1\0\3\6\1\u01fa\13\6\11\0\1\4\2\6\2\0"+ + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ + "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ + "\1\0\1\u01fb\14\6\1\u013e\1\6\11\0\1\4\2\6"+ + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ + "\1\6\1\4\4\0\2\6\1\0\26\6\1\151\10\6"+ + "\4\0\1\4\6\6\1\0\5\6\1\u01fc\11\6\11\0"+ "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ - "\4\0\1\4\6\6\1\0\6\6\1\u01e6\10\6\11\0"+ + "\4\0\1\4\6\6\1\0\11\6\1\u01fd\5\6\11\0"+ "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ - "\4\0\1\4\6\6\1\0\3\6\1\u011a\13\6\11\0"+ + "\4\0\1\4\6\6\1\0\6\6\1\223\10\6\11\0"+ "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ - "\4\0\1\4\6\6\1\0\1\6\1\u01e7\15\6\11\0"+ + "\4\0\1\4\6\6\1\0\6\6\1\u01fe\10\6\11\0"+ "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ - "\4\0\1\4\6\6\1\0\7\6\1\u01e8\7\6\11\0"+ + "\4\0\1\4\6\6\1\0\1\6\1\151\15\6\11\0"+ "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ - "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\1\6\1\u01e9\1\0\37\6\4\0"+ - "\1\4\6\6\1\0\10\6\1\u01ea\6\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ - "\1\4\6\6\1\0\1\6\1\u01dd\3\6\1\u01eb\11\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\37\6\4\0\1\4\6\6\1\0\1\6\1\u01ec\15\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\37\6\4\0\1\4\6\6\1\0\10\6\1\u01ed\6\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\37\6\4\0\1\4\6\6\1\0\1\6\1\u01ee\15\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\37\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\1\u011a\1\6\1\0\37\6"+ - "\4\0\1\4\6\6\1\0\4\6\1\u01ef\12\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ - "\4\0\1\4\6\6\1\0\11\6\1\u01f0\5\6\11\0"+ + "\4\0\1\4\6\6\1\0\11\6\1\u01ff\5\6\11\0"+ "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ - "\4\0\1\4\6\6\1\0\3\6\1\u01f1\13\6\11\0"+ + "\4\0\1\4\6\6\1\0\4\6\1\u0200\4\6\1\u01f9"+ + "\5\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ + "\1\0\37\6\4\0\1\4\6\6\1\0\7\6\1\u0201"+ + "\7\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ + "\1\0\37\6\4\0\1\4\6\6\1\0\4\6\1\u011e"+ + "\12\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ + "\1\0\37\6\4\0\1\4\6\6\1\0\17\6\11\0"+ + "\1\4\2\6\2\0\1\6\1\u0202\1\6\2\0\2\6"+ + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ + "\1\0\37\6\4\0\1\4\6\6\1\0\7\6\1\151"+ + "\7\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ + "\1\0\37\6\4\0\1\4\6\6\1\0\17\6\11\0"+ "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ - "\4\0\1\4\6\6\1\0\1\u01f2\14\6\1\u013a\1\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\26\6\1\147\10\6\4\0\1\4\6\6\1\0\5\6"+ - "\1\u01f3\11\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\11\6"+ - "\1\u01f4\5\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\6\6"+ - "\1\221\10\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\6\6"+ - "\1\u01f5\10\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\1\6"+ - "\1\147\15\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\11\6"+ - "\1\u01f6\5\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\4\6"+ - "\1\u01f7\4\6\1\u01f0\5\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\7\6\1\u01f8\7\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\4\6\1\u011a\12\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\1\6\1\u01f9"+ - "\1\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\7\6\1\147\7\6\11\0\1\4\2\6\2\0"+ + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\23\6"+ + "\1\u0203\13\6\4\0\1\4\6\6\1\0\1\u0204\12\6"+ + "\1\u0205\2\6\1\u0206\11\0\1\4\2\6\2\0\3\6"+ + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ + "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ + "\1\0\7\6\1\u01d0\27\6\4\0\1\4\6\6\1\0"+ + "\4\6\1\u0127\12\6\11\0\1\4\2\6\2\0\3\6"+ + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ + "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ + "\14\6\1\u0207\2\6\11\0\1\4\2\6\2\0\3\6"+ + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ + "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ + "\6\6\1\u0127\10\6\11\0\1\4\2\6\2\0\3\6"+ + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ + "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ + "\7\6\1\u0208\7\6\11\0\1\4\2\6\2\0\3\6"+ + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ + "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ + "\4\6\1\u0209\12\6\11\0\1\4\2\6\2\0\3\6"+ + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ + "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ + "\12\6\1\u020a\4\6\11\0\1\4\2\6\2\0\3\6"+ + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ + "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ + "\13\6\1\u01d0\3\6\11\0\1\4\2\6\2\0\3\6"+ + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ + "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ + "\3\6\1\u020b\13\6\11\0\1\4\2\6\2\0\3\6"+ + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ + "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ + "\12\6\1\u020c\4\6\11\0\1\4\2\6\2\0\3\6"+ + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ + "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\1\6"+ + "\1\u020d\1\0\37\6\4\0\1\4\6\6\1\0\14\6"+ + "\1\u0120\2\6\11\0\1\4\2\6\2\0\3\6\2\0"+ + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ + "\2\6\1\0\37\6\4\0\33\u0153\1\240\7\u0153\1\0"+ + "\120\u0153\3\236\1\u0157\4\236\3\u0153\1\0\75\u0153\1\236"+ + "\25\u0153\1\u0154\5\u0153\1\236\1\u0153\1\0\3\u0153\1\236"+ + "\30\u0153\1\236\17\u0153\2\236\5\u0153\1\236\4\u0153\33\0"+ + "\1\u0154\100\0\5\u0153\1\u0156\25\u0153\1\u0154\5\u0153\1\u0156"+ + "\1\u0153\1\0\3\u0153\1\u0156\30\u0153\1\u0156\17\u0153\2\u0156"+ + "\5\u0153\1\u0156\7\u0153\4\u020e\1\u0153\3\u020e\6\u0153\1\u020e"+ + "\2\u0153\1\u020e\6\u0153\1\240\5\u0153\1\u020e\1\u0153\1\0"+ + "\2\u0153\2\u020e\5\u0153\1\u020e\14\u0153\2\u020e\1\u0153\1\u020e"+ + "\2\u0153\1\u020e\17\u0153\2\u020e\4\u0153\2\u020e\4\u0153\3\243"+ + "\4\u020f\1\243\3\u020f\6\243\1\u020f\2\243\1\u020f\13\243"+ + "\1\u015b\1\u020f\2\243\1\u015c\1\243\2\u020f\5\243\1\u020f"+ + "\14\243\2\u020f\1\243\1\u020f\2\243\1\u020f\17\243\2\u020f"+ + "\4\243\2\u020f\47\243\1\0\70\243\1\4\6\6\1\0"+ + "\12\6\1\u013e\4\6\11\0\1\4\2\6\2\0\3\6"+ + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ + "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ + "\4\6\1\u0210\3\6\1\u0211\6\6\11\0\1\4\2\6"+ + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\3\126"+ + "\4\u015f\1\0\3\u015f\2\126\1\u0212\3\126\1\u015f\1\u0213"+ + "\1\126\1\u015f\2\126\11\0\1\126\1\u015f\1\126\2\0"+ + "\1\126\2\u015f\2\0\1\u0213\1\u0212\1\0\1\u015f\1\0"+ + "\3\126\4\0\2\126\1\0\1\126\2\u015f\1\126\1\u015f"+ + "\2\126\1\u015f\17\126\2\u015f\4\126\2\u015f\4\0\1\4"+ + "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ + "\4\0\2\6\1\0\22\6\1\u0214\14\6\4\0\1\4"+ + "\5\6\1\u019d\1\0\17\6\11\0\1\4\2\6\2\0"+ "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\23\6\1\u01fa\13\6\4\0\1\4\6\6"+ - "\1\0\1\u01fb\12\6\1\u01fc\2\6\1\u01fd\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ - "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\7\6\1\u01c8\27\6\4\0"+ - "\1\4\6\6\1\0\4\6\1\u0123\12\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ - "\1\4\6\6\1\0\14\6\1\u01fe\2\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ - "\1\4\6\6\1\0\6\6\1\u0123\10\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ - "\1\4\6\6\1\0\7\6\1\u01ff\7\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ - "\1\4\6\6\1\0\4\6\1\u0200\12\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ - "\1\4\6\6\1\0\12\6\1\u0201\4\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ - "\1\4\6\6\1\0\13\6\1\u01c8\3\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ - "\1\4\6\6\1\0\3\6\1\u0202\13\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ - "\1\4\6\6\1\0\12\6\1\u0203\4\6\11\0\1\4"+ + "\2\6\1\0\15\6\1\151\21\6\4\0\1\4\5\6"+ + "\1\u0215\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ + "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ + "\1\0\5\6\1\u019d\31\6\4\0\1\4\6\6\1\0"+ + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ + "\1\0\21\6\1\u0216\15\6\4\0\1\4\6\6\1\0"+ + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\1\6"+ + "\1\u0217\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ + "\2\6\1\0\37\6\4\0\1\4\5\6\1\u0218\1\0"+ + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ + "\1\0\37\6\4\0\7\4\1\0\2\4\1\266\14\4"+ + "\11\0\3\4\2\0\3\4\2\0\2\4\1\0\1\4"+ + "\1\0\3\4\4\0\2\4\1\0\37\4\4\0\7\4"+ + "\1\0\1\u0219\16\4\11\0\3\4\2\0\3\4\2\0"+ + "\2\4\1\0\1\4\1\0\3\4\4\0\2\4\1\0"+ + "\37\4\4\0\7\4\1\0\3\4\1\u021a\2\4\1\u021b"+ + "\10\4\11\0\3\4\2\0\3\4\2\0\2\4\1\0"+ + "\1\4\1\0\3\4\4\0\2\4\1\0\37\4\4\0"+ + "\7\4\1\0\7\4\1\u021c\7\4\11\0\3\4\2\0"+ + "\3\4\2\0\2\4\1\0\1\4\1\0\3\4\4\0"+ + "\2\4\1\0\37\4\4\0\7\4\1\0\1\u021d\3\4"+ + "\1\u016f\12\4\11\0\3\4\2\0\3\4\2\0\2\4"+ + "\1\0\1\4\1\0\3\4\4\0\2\4\1\0\37\4"+ + "\4\0\7\4\1\0\11\4\1\u021e\5\4\11\0\3\4"+ + "\2\0\3\4\2\0\2\4\1\0\1\4\1\0\3\4"+ + "\4\0\2\4\1\0\37\4\4\0\7\4\1\0\4\4"+ + "\1\u021b\12\4\11\0\3\4\2\0\3\4\2\0\2\4"+ + "\1\0\1\4\1\0\3\4\4\0\2\4\1\0\37\4"+ + "\4\0\7\4\1\0\1\u021d\16\4\11\0\3\4\2\0"+ + "\3\4\2\0\2\4\1\0\1\4\1\0\3\4\4\0"+ + "\2\4\1\0\37\4\4\0\7\4\1\0\14\4\1\u021f"+ + "\2\4\11\0\3\4\2\0\3\4\2\0\2\4\1\0"+ + "\1\4\1\0\3\4\4\0\2\4\1\0\37\4\15\0"+ + "\1\u0220\136\0\1\u0221\1\u0222\1\0\1\u0223\126\0\1\u0224"+ + "\1\0\1\u0225\132\0\1\u0226\134\0\1\u0227\136\0\1\u0228"+ + "\114\0\1\4\6\6\1\0\7\6\1\u0229\7\6\11\0"+ + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ + "\4\0\1\4\6\6\1\0\1\6\1\u022a\15\6\11\0"+ + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ + "\4\0\1\4\6\6\1\0\16\6\1\151\11\0\1\4"+ "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ - "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\1\6\1\u0204\1\0\37\6\4\0\1\4"+ - "\6\6\1\0\14\6\1\u011c\2\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\33\u014f"+ - "\1\236\7\u014f\1\0\120\u014f\3\234\1\u0153\4\234\3\u014f"+ - "\1\0\75\u014f\1\234\25\u014f\1\u0150\5\u014f\1\234\1\u014f"+ - "\1\0\3\u014f\1\234\30\u014f\1\234\17\u014f\2\234\5\u014f"+ - "\1\234\4\u014f\33\0\1\u0150\100\0\5\u014f\1\u0152\25\u014f"+ - "\1\u0150\5\u014f\1\u0152\1\u014f\1\0\3\u014f\1\u0152\30\u014f"+ - "\1\u0152\17\u014f\2\u0152\5\u014f\1\u0152\7\u014f\4\u0205\1\u014f"+ - "\3\u0205\6\u014f\1\u0205\2\u014f\1\u0205\6\u014f\1\236\5\u014f"+ - "\1\u0205\1\u014f\1\0\2\u014f\2\u0205\5\u014f\1\u0205\14\u014f"+ - "\2\u0205\1\u014f\1\u0205\2\u014f\1\u0205\17\u014f\2\u0205\4\u014f"+ - "\2\u0205\4\u014f\3\241\4\u0206\1\241\3\u0206\6\241\1\u0206"+ - "\2\241\1\u0206\13\241\1\u0157\1\u0206\2\241\1\u0158\1\241"+ - "\2\u0206\5\241\1\u0206\14\241\2\u0206\1\241\1\u0206\2\241"+ - "\1\u0206\17\241\2\u0206\4\241\2\u0206\47\241\1\0\70\241"+ - "\1\4\6\6\1\0\12\6\1\u013a\4\6\11\0\1\4"+ + "\1\4\6\6\1\0\4\6\1\u022b\12\6\11\0\1\4"+ "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ - "\1\4\6\6\1\0\4\6\1\u0207\3\6\1\u0208\6\6"+ + "\1\4\6\6\1\0\10\6\1\u022c\3\6\1\u022d\2\6"+ "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\37\6\4\0\3\124\4\u015b\1\0\3\u015b\2\124\1\u0209"+ - "\3\124\1\u015b\1\u020a\1\124\1\u015b\2\124\11\0\1\124"+ - "\1\u015b\1\124\2\0\1\124\2\u015b\2\0\1\u020a\1\u0209"+ - "\1\0\1\u015b\1\0\3\124\4\0\2\124\1\0\1\124"+ - "\2\u015b\1\124\1\u015b\2\124\1\u015b\17\124\2\u015b\4\124"+ - "\2\u015b\4\0\1\4\6\6\1\0\17\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\22\6\1\u020b"+ - "\14\6\4\0\1\4\5\6\1\u0198\1\0\17\6\11\0"+ + "\37\6\4\0\1\4\6\6\1\0\4\6\1\u022e\11\6"+ + "\1\u0208\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ + "\1\0\37\6\4\0\1\4\6\6\1\0\11\6\1\u022f"+ + "\5\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ + "\1\0\37\6\4\0\1\4\6\6\1\0\3\6\1\u0230"+ + "\13\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ + "\1\0\37\6\4\0\1\4\6\6\1\0\1\6\1\u0231"+ + "\15\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ + "\1\0\37\6\4\0\1\4\6\6\1\0\5\6\1\u0232"+ + "\11\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ + "\1\0\37\6\4\0\1\4\6\6\1\0\17\6\11\0"+ "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ - "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\15\6\1\147\21\6"+ - "\4\0\1\4\5\6\1\u020c\1\0\17\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ - "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\5\6\1\u0198\31\6\4\0"+ - "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\21\6\1\u020d\15\6\4\0"+ - "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\1\6\1\u020e\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ - "\5\6\1\u020f\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\37\6\4\0\7\4\1\0"+ - "\2\4\1\264\14\4\11\0\3\4\2\0\3\4\2\0"+ - "\2\4\1\0\1\4\1\0\3\4\4\0\2\4\1\0"+ - "\37\4\4\0\7\4\1\0\1\u0210\16\4\11\0\3\4"+ - "\2\0\3\4\2\0\2\4\1\0\1\4\1\0\3\4"+ - "\4\0\2\4\1\0\37\4\4\0\7\4\1\0\3\4"+ - "\1\u0211\2\4\1\u0212\10\4\11\0\3\4\2\0\3\4"+ - "\2\0\2\4\1\0\1\4\1\0\3\4\4\0\2\4"+ - "\1\0\37\4\4\0\7\4\1\0\7\4\1\u0213\7\4"+ - "\11\0\3\4\2\0\3\4\2\0\2\4\1\0\1\4"+ - "\1\0\3\4\4\0\2\4\1\0\37\4\4\0\7\4"+ - "\1\0\1\u0214\3\4\1\u016b\12\4\11\0\3\4\2\0"+ - "\3\4\2\0\2\4\1\0\1\4\1\0\3\4\4\0"+ - "\2\4\1\0\37\4\4\0\7\4\1\0\11\4\1\u0215"+ - "\5\4\11\0\3\4\2\0\3\4\2\0\2\4\1\0"+ - "\1\4\1\0\3\4\4\0\2\4\1\0\37\4\4\0"+ - "\7\4\1\0\4\4\1\u0212\12\4\11\0\3\4\2\0"+ - "\3\4\2\0\2\4\1\0\1\4\1\0\3\4\4\0"+ - "\2\4\1\0\37\4\4\0\7\4\1\0\1\u0214\16\4"+ - "\11\0\3\4\2\0\3\4\2\0\2\4\1\0\1\4"+ - "\1\0\3\4\4\0\2\4\1\0\37\4\4\0\7\4"+ - "\1\0\14\4\1\u0216\2\4\11\0\3\4\2\0\3\4"+ - "\2\0\2\4\1\0\1\4\1\0\3\4\4\0\2\4"+ - "\1\0\37\4\15\0\1\u0217\136\0\1\u0218\1\u0219\1\0"+ - "\1\u021a\126\0\1\u021b\1\0\1\u021c\132\0\1\u021d\134\0"+ - "\1\u021e\136\0\1\u021f\114\0\1\4\6\6\1\0\7\6"+ - "\1\u0220\7\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\1\6"+ - "\1\u0221\15\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\16\6"+ - "\1\147\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\26\6"+ + "\1\u0233\10\6\4\0\1\4\6\6\1\0\15\6\1\u0234"+ + "\1\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ + "\1\0\37\6\4\0\1\4\6\6\1\0\3\6\1\u0235"+ + "\13\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ + "\1\0\37\6\4\0\1\4\6\6\1\0\17\6\11\0"+ + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\7\6"+ + "\1\u0236\27\6\4\0\1\4\6\6\1\0\17\6\11\0"+ + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\13\6"+ + "\1\u0190\23\6\4\0\1\4\6\6\1\0\17\6\11\0"+ + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\3\6"+ + "\1\u0190\33\6\4\0\1\4\6\6\1\0\17\6\11\0"+ + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\1\6"+ + "\1\u0237\35\6\4\0\1\4\6\6\1\0\17\6\11\0"+ + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\13\6"+ + "\1\u0238\23\6\4\0\1\4\6\6\1\0\17\6\11\0"+ + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\10\6"+ + "\1\u0239\26\6\4\0\1\4\6\6\1\0\17\6\11\0"+ + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\5\6"+ + "\1\u023a\5\6\1\u023b\23\6\4\0\1\4\6\6\1\0"+ + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\4\6\1\u0222"+ - "\12\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ + "\1\0\5\6\1\u023c\31\6\4\0\1\4\6\6\1\0"+ + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\10\6\1\u0223"+ - "\3\6\1\u0224\2\6\11\0\1\4\2\6\2\0\3\6"+ + "\1\0\3\6\1\u023d\33\6\4\0\1\4\6\6\1\0"+ + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ + "\1\0\3\6\1\u023e\14\6\1\u023f\16\6\4\0\1\4"+ + "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\4\6\1\u0225\11\6\1\u01ff\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\11\6\1\u0226\5\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\3\6\1\u0227\13\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\1\6\1\u0228\15\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\5\6\1\u0229\11\6\11\0\1\4\2\6\2\0"+ + "\4\0\2\6\1\0\4\6\1\u0240\32\6\4\0\1\4"+ + "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ + "\4\0\2\6\1\0\15\6\1\u01bf\21\6\4\0\1\4"+ + "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ + "\4\0\2\6\1\0\6\6\1\151\30\6\4\0\1\4"+ + "\5\6\1\u0241\1\0\17\6\11\0\1\4\2\6\2\0"+ "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\26\6\1\u022a\10\6\4\0\1\4\6\6"+ - "\1\0\15\6\1\u022b\1\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ + "\2\6\1\0\10\6\1\u0242\26\6\4\0\1\4\6\6"+ + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ + "\2\6\1\0\14\6\1\u0162\22\6\4\0\1\4\6\6"+ + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ + "\2\6\1\0\15\6\1\u0243\21\6\4\0\1\4\6\6"+ + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ + "\1\6\1\u0244\1\0\1\6\1\0\1\4\1\6\1\4"+ + "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ + "\1\0\3\6\1\302\33\6\4\0\1\4\5\6\1\151"+ + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ + "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\17\6"+ + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ + "\13\6\1\u0162\23\6\4\0\1\4\6\6\1\0\17\6"+ + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ + "\4\6\1\u0245\6\6\1\u0246\23\6\4\0\1\4\6\6"+ + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ + "\2\6\1\0\10\6\1\u0247\26\6\4\0\1\4\6\6"+ "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\7\6\1\u022c\27\6\4\0\1\4\6\6"+ + "\2\6\1\0\4\6\1\u0248\32\6\4\0\1\4\6\6"+ "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\13\6\1\u018b\23\6\4\0\1\4\6\6"+ + "\2\6\1\0\2\6\1\u0249\34\6\4\0\1\4\6\6"+ "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\3\6\1\u018b\33\6\4\0\1\4\6\6"+ + "\2\6\1\0\10\6\1\151\26\6\4\0\1\4\6\6"+ "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\1\6\1\u022d\35\6\4\0\1\4\6\6"+ + "\2\6\1\0\3\6\1\u024a\33\6\4\0\1\4\6\6"+ "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\13\6\1\u022e\23\6\4\0\1\4\6\6"+ + "\2\6\1\0\4\6\1\u024b\32\6\4\0\1\4\6\6"+ "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\10\6\1\u022f\26\6\4\0\1\4\6\6"+ + "\2\6\1\0\10\6\1\u024c\26\6\4\0\1\4\6\6"+ + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ + "\2\6\1\0\5\6\1\u024d\31\6\4\0\1\4\5\6"+ + "\1\u024e\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ + "\4\0\2\6\1\0\37\6\4\0\1\4\5\6\1\u024f"+ + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ + "\2\6\1\0\37\6\4\0\1\4\5\6\1\u0216\1\0"+ + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\1\6"+ + "\1\u0250\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ + "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\17\6"+ + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ + "\5\6\1\u0251\31\6\4\0\1\4\6\6\1\0\17\6"+ + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ + "\14\6\1\u0252\22\6\4\0\1\4\3\6\1\u0253\2\6"+ "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\5\6\1\u0230\5\6\1\u0231\23\6\4\0"+ + "\2\6\1\0\17\6\1\u0197\5\6\1\151\11\6\4\0"+ "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\5\6\1\u0232\31\6\4\0"+ + "\1\4\4\0\2\6\1\0\13\6\1\u0254\23\6\4\0"+ "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\3\6\1\u0233\33\6\4\0"+ + "\1\4\4\0\2\6\1\0\4\6\1\u0245\32\6\4\0"+ "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\3\6\1\u0234\33\6\4\0"+ + "\1\4\4\0\2\6\1\0\6\6\1\u0162\30\6\4\0"+ "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\4\6\1\u0235\32\6\4\0"+ + "\1\4\4\0\2\6\1\0\10\6\1\u0255\26\6\4\0"+ + "\1\4\6\6\1\0\7\6\1\u0256\7\6\11\0\1\4"+ + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ + "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\15\6\1\u01ba\21\6\4\0"+ + "\1\4\4\0\2\6\1\0\15\6\1\u0257\21\6\4\0"+ "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\6\6\1\147\30\6\4\0"+ - "\1\4\5\6\1\u0236\1\0\17\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ + "\3\6\2\0\1\u0258\1\6\1\0\1\6\1\0\1\4"+ "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ - "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\10\6\1\u0237\26\6\4\0\1\4"+ - "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\14\6\1\u015e\22\6\4\0\1\4"+ - "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\15\6\1\u0238\21\6\4\0\1\4"+ - "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\1\6\1\u0239\1\0\1\6\1\0\1\4\1\6"+ + "\5\6\1\u0259\1\0\17\6\11\0\1\4\2\6\2\0"+ + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\3\6\1\300\33\6\4\0\1\4\5\6"+ - "\1\147\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ + "\2\6\1\0\10\6\1\305\26\6\4\0\1\4\6\6"+ + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ + "\1\6\1\u025a\1\0\1\6\1\0\1\4\1\6\1\4"+ "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\13\6\1\u015e\23\6\4\0\1\4\6\6\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\4\6\1\u023a\6\6\1\u023b\23\6\4\0\1\4"+ - "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\10\6\1\u023c\26\6\4\0\1\4"+ - "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\4\6\1\u023d\32\6\4\0\1\4"+ + "\1\0\1\6\1\u025b\3\6\1\u025c\31\6\4\0\1\4"+ "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\2\6\1\u023e\34\6\4\0\1\4"+ + "\4\0\2\6\1\0\14\6\1\u025d\22\6\4\0\1\4"+ "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\10\6\1\147\26\6\4\0\1\4"+ - "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\3\6\1\u023f\33\6\4\0\1\4"+ + "\4\0\2\6\1\0\4\6\1\u025e\32\6\4\0\1\4"+ + "\5\6\1\u025f\1\0\17\6\11\0\1\4\2\6\2\0"+ + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ + "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ + "\2\6\1\0\13\6\1\u0260\5\6\1\u0239\15\6\4\0"+ + "\1\4\5\6\1\u0261\1\0\17\6\11\0\1\4\2\6"+ + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\4\6\1\u0240\32\6\4\0\1\4"+ + "\4\0\2\6\1\0\13\6\1\u0262\23\6\4\0\1\4"+ "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\10\6\1\u0241\26\6\4\0\1\4"+ + "\4\0\2\6\1\0\21\6\1\151\15\6\4\0\1\4"+ "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\5\6\1\u0242\31\6\4\0\1\4"+ - "\5\6\1\u0243\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\5\6"+ - "\1\u0244\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\5\6\1\u020d"+ + "\2\0\1\u0197\1\6\1\0\1\6\1\0\1\4\1\6"+ + "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\1\6\1\u0245\1\0\1\6\1\0\1\4\1\6\1\4"+ + "\1\u0263\1\6\1\0\1\6\1\0\1\4\1\6\1\4"+ "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\5\6\1\u0246\31\6\4\0\1\4\6\6\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\14\6\1\u0247\22\6\4\0\1\4\3\6\1\u0248"+ + "\1\0\20\6\1\u0236\16\6\4\0\1\4\3\6\1\u0264"+ "\2\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\17\6\1\u0192\5\6\1\147\11\6"+ - "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\13\6\1\u0249\23\6"+ - "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\4\6\1\u023a\32\6"+ - "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\6\6\1\u015e\30\6"+ - "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\10\6\1\u024a\26\6"+ - "\4\0\1\4\6\6\1\0\7\6\1\u024b\7\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ - "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\15\6\1\u024c\21\6"+ - "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\1\u024d\1\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ - "\1\4\5\6\1\u024e\1\0\17\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ - "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\10\6\1\303\26\6\4\0\1\4"+ - "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\1\6\1\u024f\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\1\6\1\u0250\3\6\1\u0251\31\6\4\0"+ - "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\14\6\1\u0252\22\6\4\0"+ + "\4\0\2\6\1\0\20\6\1\u0265\1\u0266\15\6\4\0"+ "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\4\6\1\u0253\32\6\4\0"+ - "\1\4\5\6\1\u0254\1\0\17\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ - "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\13\6\1\u0255\5\6\1\u022f\15\6"+ - "\4\0\1\4\5\6\1\u0256\1\0\17\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ + "\1\4\4\0\2\6\1\0\14\6\1\u0267\22\6\4\0"+ "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\13\6\1\u0257\23\6\4\0"+ + "\1\4\4\0\2\6\1\0\1\6\1\u01b0\35\6\4\0"+ "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\21\6\1\147\15\6\4\0"+ + "\1\4\4\0\2\6\1\0\15\6\1\u0268\21\6\4\0"+ "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\1\u0192\1\6\1\0\1\6\1\0\1\4"+ + "\3\6\2\0\1\u0269\1\6\1\0\1\6\1\0\1\4"+ "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\1\u0258\1\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\20\6\1\u022c\16\6\4\0\1\4\3\6"+ - "\1\u0259\2\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\20\6\1\u025a\1\u025b\15\6"+ - "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\14\6\1\u025c\22\6"+ - "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\1\6\1\u01ab\35\6"+ - "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\15\6\1\u025d\21\6"+ - "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\1\u025e\1\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ - "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\25\6\1\u025f\11\6\4\0"+ - "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\17\6\1\u0260\17\6\4\0"+ - "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\13\6\1\u022c\23\6\15\0"+ - "\1\u01c1\212\0\1\u0261\66\0\1\u0262\164\0\1\u0263\70\0"+ - "\1\u01c5\212\0\1\u0264\66\0\1\u0265\164\0\1\u0266\57\0"+ - "\3\124\1\u01c9\1\124\1\u01c9\1\124\1\0\2\124\1\u0103"+ - "\2\124\1\u0103\11\124\11\0\1\124\1\u01c9\1\124\2\0"+ - "\2\124\1\u01c9\2\0\1\124\1\u0103\1\0\1\u0103\1\0"+ - "\3\124\4\0\2\124\1\0\7\124\1\u01c9\17\124\2\u01c9"+ - "\4\124\2\u01c9\7\0\1\u01c9\1\0\1\u01c9\33\0\1\u01c9"+ - "\5\0\1\u01c9\30\0\1\u01c9\17\0\2\u01c9\4\0\2\u01c9"+ - "\4\0\1\4\3\6\1\u0192\2\6\1\0\17\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ - "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ + "\4\0\2\6\1\0\10\6\1\u0237\26\6\4\0\1\4"+ + "\6\6\1\0\7\6\1\u0207\7\6\11\0\1\4\2\6"+ "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\21\6\1\u0267\15\6"+ - "\4\0\1\4\5\6\1\u0268\1\0\17\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ - "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\5\6\1\u0269\21\6\1\u026a"+ - "\7\6\4\0\1\4\3\6\1\u026b\2\6\1\0\17\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\3\6\1\u026c\10\6\1\u026d\1\u026e\21\6\4\0\1\4"+ + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\14\6\1\u026f\22\6\4\0\1\4"+ + "\4\0\2\6\1\0\25\6\1\u026a\11\6\4\0\1\4"+ "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\21\6\1\u0270\15\6\4\0\1\4"+ + "\4\0\2\6\1\0\14\6\1\u026b\22\6\4\0\1\4"+ "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\13\6\1\u0271\23\6\4\0\1\4"+ - "\6\6\1\0\16\6\1\u0272\11\0\1\4\2\6\2\0"+ + "\4\0\2\6\1\0\17\6\1\u026c\17\6\4\0\1\4"+ + "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ + "\4\0\2\6\1\0\13\6\1\u0236\23\6\15\0\1\u01c9"+ + "\212\0\1\u026d\66\0\1\u026e\164\0\1\u026f\70\0\1\u01cd"+ + "\212\0\1\u0270\66\0\1\u0271\164\0\1\u0272\57\0\3\126"+ + "\1\u01d1\1\126\1\u01d1\1\126\1\0\2\126\1\u0107\2\126"+ + "\1\u0107\11\126\11\0\1\126\1\u01d1\1\126\2\0\2\126"+ + "\1\u01d1\2\0\1\126\1\u0107\1\0\1\u0107\1\0\3\126"+ + "\4\0\2\126\1\0\7\126\1\u01d1\17\126\2\u01d1\4\126"+ + "\2\u01d1\7\0\1\u01d1\1\0\1\u01d1\33\0\1\u01d1\5\0"+ + "\1\u01d1\30\0\1\u01d1\17\0\2\u01d1\4\0\2\u01d1\4\0"+ + "\1\4\3\6\1\u0197\2\6\1\0\17\6\11\0\1\4"+ + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ + "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ + "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\1\u013a\16\6\11\0\1\4\2\6\2\0\3\6"+ + "\1\4\4\0\2\6\1\0\21\6\1\u0273\15\6\4\0"+ + "\1\4\5\6\1\u0274\1\0\17\6\11\0\1\4\2\6"+ + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ + "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\1\6\1\u0273\15\6\11\0\1\4\2\6\2\0\3\6"+ + "\4\0\2\6\1\0\5\6\1\u0275\21\6\1\u0276\7\6"+ + "\4\0\1\4\3\6\1\u0277\2\6\1\0\17\6\11\0"+ + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\3\6"+ + "\1\u0278\10\6\1\u0279\1\u027a\21\6\4\0\1\4\6\6"+ + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ + "\2\6\1\0\14\6\1\u027b\22\6\4\0\1\4\6\6"+ + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ + "\2\6\1\0\21\6\1\u027c\15\6\4\0\1\4\6\6"+ + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ + "\2\6\1\0\13\6\1\u027d\23\6\4\0\1\4\6\6"+ + "\1\0\16\6\1\u027e\11\0\1\4\2\6\2\0\3\6"+ "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\1\u0274\2\6\1\u0275\2\6\1\u0276\10\6\11\0\1\4"+ + "\1\u013e\16\6\11\0\1\4\2\6\2\0\3\6\2\0"+ + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ + "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\1\6"+ + "\1\u027f\15\6\11\0\1\4\2\6\2\0\3\6\2\0"+ + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ + "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\1\u0280"+ + "\2\6\1\u0281\2\6\1\u0282\10\6\11\0\1\4\2\6"+ + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ + "\1\6\1\4\4\0\1\6\1\u0283\1\0\37\6\4\0"+ + "\1\4\6\6\1\0\10\6\1\u0284\6\6\11\0\1\4"+ "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\1\6\1\u0277\1\0\37\6"+ - "\4\0\1\4\6\6\1\0\10\6\1\u0278\6\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\27\6"+ - "\1\u026a\7\6\4\0\1\4\6\6\1\0\3\6\1\u0279"+ - "\13\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\16\6\1\u027a"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\37\6\4\0\1\4\6\6\1\0\4\6\1\u027b\12\6"+ + "\1\4\1\6\1\4\4\0\2\6\1\0\27\6\1\u0276"+ + "\7\6\4\0\1\4\6\6\1\0\3\6\1\u0285\13\6"+ "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\37\6\4\0\1\4\6\6\1\0\1\221\16\6\11\0"+ + "\37\6\4\0\1\4\6\6\1\0\16\6\1\u0286\11\0"+ "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ - "\4\0\1\4\6\6\1\0\4\6\1\u01f7\1\6\1\u027c"+ - "\10\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\1\6"+ - "\1\u027d\1\0\37\6\4\0\1\4\6\6\1\0\14\6"+ - "\1\u011a\2\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\17\6"+ - "\11\0\1\4\1\6\1\u027e\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\5\6\1\155"+ - "\11\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\10\6\1\147"+ - "\6\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ + "\4\0\1\4\6\6\1\0\4\6\1\u0287\12\6\11\0"+ + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ + "\4\0\1\4\6\6\1\0\1\223\16\6\11\0\1\4"+ + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ + "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ + "\1\4\6\6\1\0\4\6\1\u0200\1\6\1\u0288\10\6"+ + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ + "\1\6\1\0\1\4\1\6\1\4\4\0\1\6\1\u0289"+ + "\1\0\37\6\4\0\1\4\6\6\1\0\14\6\1\u011e"+ + "\2\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ "\1\0\37\6\4\0\1\4\6\6\1\0\17\6\11\0"+ - "\1\4\2\6\2\0\2\6\1\147\2\0\2\6\1\0"+ + "\1\4\1\6\1\u028a\2\0\3\6\2\0\2\6\1\0"+ "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\37\6\4\0\1\4\6\6\1\0\7\6\1\u027f\7\6"+ + "\37\6\4\0\1\4\6\6\1\0\5\6\1\157\11\6"+ "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\37\6\4\0\1\4\6\6\1\0\4\6\1\177\12\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\37\6\4\0\1\4\6\6\1\0\1\6\1\u01c8\15\6"+ + "\37\6\4\0\1\4\6\6\1\0\10\6\1\151\6\6"+ "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ "\37\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\23\6\1\147"+ - "\13\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\1\6\1\u0280\1\0\37\6"+ + "\2\6\2\0\2\6\1\151\2\0\2\6\1\0\1\6"+ + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ + "\4\0\1\4\6\6\1\0\7\6\1\u028b\7\6\11\0"+ + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ + "\4\0\1\4\6\6\1\0\4\6\1\201\12\6\11\0"+ + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ + "\4\0\1\4\6\6\1\0\1\6\1\u01d0\15\6\11\0"+ + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ - "\2\0\1\147\2\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ - "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\1\6\1\u0111\1\0\37\6\4\0\1\4"+ - "\6\6\1\0\11\6\1\u0281\5\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ - "\6\6\1\0\7\6\1\u01db\7\6\11\0\1\4\2\6"+ "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ - "\6\6\1\0\14\6\1\u0282\2\6\11\0\1\4\2\6"+ + "\1\6\1\4\4\0\2\6\1\0\23\6\1\151\13\6"+ + "\4\0\1\4\6\6\1\0\7\6\1\u028c\7\6\11\0"+ + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ + "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ + "\1\6\1\4\4\0\1\6\1\u028d\1\0\37\6\4\0"+ + "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ + "\1\151\2\6\2\0\2\6\1\0\1\6\1\0\1\4"+ "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ - "\6\6\1\0\17\6\11\0\1\4\1\6\1\u0283\2\0"+ + "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ + "\4\0\1\6\1\u0115\1\0\37\6\4\0\1\4\6\6"+ + "\1\0\11\6\1\u028e\5\6\11\0\1\4\2\6\2\0"+ "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\1\u01e4\2\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\7\6\1\u0284\7\6\11\0\1\4\2\6\2\0\3\6"+ + "\1\0\7\6\1\u01e3\7\6\11\0\1\4\2\6\2\0"+ + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ + "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ + "\1\0\14\6\1\u028f\2\6\11\0\1\4\2\6\2\0"+ + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ + "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ + "\1\0\17\6\11\0\1\4\1\6\1\u0290\2\0\3\6"+ "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\1\u0285\16\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\10\6"+ - "\1\u0286\6\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\14\6"+ - "\1\u0287\2\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\17\6"+ - "\11\0\1\4\2\6\2\0\1\6\1\u0288\1\6\2\0"+ + "\17\6\11\0\1\4\2\6\2\0\1\u01ec\2\6\2\0"+ "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\3\6"+ - "\1\u0289\13\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\12\6"+ - "\1\u028a\4\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\6\6"+ - "\1\u028b\10\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\14\6"+ - "\1\u028c\2\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\14\6"+ - "\1\272\2\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\1\6"+ - "\1\155\15\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\3\6"+ - "\1\u0115\13\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\12\6"+ - "\1\u01e4\4\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\12\6"+ - "\1\146\4\6\11\0\1\4\2\6\2\0\3\6\2\0"+ + "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\7\6"+ + "\1\u0291\7\6\11\0\1\4\2\6\2\0\3\6\2\0"+ "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\1\6"+ - "\1\u0140\6\6\1\u028d\6\6\11\0\1\4\2\6\2\0"+ + "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\1\u0292"+ + "\16\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ + "\1\0\37\6\4\0\1\4\6\6\1\0\10\6\1\u0293"+ + "\6\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ + "\1\0\37\6\4\0\1\4\6\6\1\0\14\6\1\u0294"+ + "\2\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ + "\1\0\37\6\4\0\1\4\6\6\1\0\17\6\11\0"+ + "\1\4\2\6\2\0\1\6\1\u0295\1\6\2\0\2\6"+ + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ + "\1\0\37\6\4\0\1\4\6\6\1\0\3\6\1\u0296"+ + "\13\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ + "\1\0\37\6\4\0\1\4\6\6\1\0\12\6\1\u0297"+ + "\4\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ + "\1\0\37\6\4\0\1\4\6\6\1\0\6\6\1\u0298"+ + "\10\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ + "\1\0\37\6\4\0\1\4\6\6\1\0\14\6\1\u0299"+ + "\2\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ + "\1\0\37\6\4\0\1\4\6\6\1\0\14\6\1\274"+ + "\2\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ + "\1\0\37\6\4\0\1\4\6\6\1\0\1\6\1\157"+ + "\15\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ + "\1\0\37\6\4\0\1\4\6\6\1\0\3\6\1\u0119"+ + "\13\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ + "\1\0\37\6\4\0\1\4\6\6\1\0\12\6\1\u01ec"+ + "\4\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ + "\1\0\37\6\4\0\1\4\6\6\1\0\12\6\1\150"+ + "\4\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ + "\1\0\37\6\4\0\1\4\6\6\1\0\1\6\1\u0144"+ + "\6\6\1\u029a\6\6\11\0\1\4\2\6\2\0\3\6"+ + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ + "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ + "\10\6\1\u029b\6\6\11\0\1\4\2\6\2\0\3\6"+ + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ + "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ + "\1\0\12\6\1\151\24\6\4\0\1\4\6\6\1\0"+ + "\14\6\1\u029c\2\6\11\0\1\4\2\6\2\0\3\6"+ + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ + "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\1\151"+ + "\1\6\1\0\7\6\1\151\27\6\4\0\1\4\6\6"+ + "\1\0\6\6\1\u029d\10\6\11\0\1\4\2\6\2\0"+ "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\10\6\1\u028e\6\6\11\0\1\4\2\6\2\0"+ + "\1\0\14\6\1\u0119\2\6\11\0\1\4\2\6\2\0"+ "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\12\6\1\147\24\6\4\0\1\4\6\6"+ - "\1\0\14\6\1\u028f\2\6\11\0\1\4\2\6\2\0"+ + "\1\6\1\u013e\1\0\37\6\4\0\1\4\6\6\1\0"+ + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\1\u0256"+ + "\1\6\1\0\37\6\4\0\3\u0153\4\236\1\u0153\3\236"+ + "\6\u0153\1\236\2\u0153\1\236\6\u0153\1\240\5\u0153\1\236"+ + "\1\u0153\1\0\2\u0153\2\236\5\u0153\1\236\14\u0153\2\236"+ + "\1\u0153\1\236\2\u0153\1\236\17\u0153\2\236\4\u0153\2\236"+ + "\4\u0153\3\243\4\45\1\243\3\45\6\243\1\45\2\243"+ + "\1\45\13\243\1\u015b\1\45\2\243\1\u015c\1\243\2\45"+ + "\5\243\1\45\14\243\2\45\1\243\1\45\2\243\1\45"+ + "\17\243\2\45\4\243\2\45\4\243\1\4\6\6\1\0"+ + "\10\6\1\u011e\6\6\11\0\1\4\2\6\2\0\3\6"+ + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ + "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ + "\13\6\1\u029e\3\6\11\0\1\4\2\6\2\0\3\6"+ + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ + "\4\0\2\6\1\0\37\6\4\0\7\126\1\0\12\126"+ + "\1\u029f\4\126\11\0\3\126\2\0\3\126\2\0\1\u029f"+ + "\1\126\1\0\1\126\1\0\3\126\4\0\2\126\1\0"+ + "\37\126\4\0\7\126\1\0\5\126\1\u029f\11\126\11\0"+ + "\3\126\2\0\3\126\2\0\1\126\1\u029f\1\0\1\126"+ + "\1\0\3\126\4\0\2\126\1\0\37\126\4\0\1\4"+ + "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ + "\2\0\1\u0240\1\6\1\0\1\6\1\0\1\4\1\6"+ + "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ + "\2\6\1\0\10\6\1\u02a0\26\6\4\0\1\4\6\6"+ + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ + "\2\6\1\0\1\6\1\u0162\35\6\4\0\1\4\3\6"+ + "\1\302\2\6\1\0\17\6\11\0\1\4\2\6\2\0"+ "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\1\147\1\6\1\0\7\6\1\147\27\6\4\0\1\4"+ - "\6\6\1\0\6\6\1\u0290\10\6\11\0\1\4\2\6"+ + "\2\6\1\0\3\6\1\u02a1\7\6\1\u0246\1\6\1\u02a2"+ + "\21\6\4\0\7\4\1\0\3\4\1\u021a\13\4\11\0"+ + "\3\4\2\0\3\4\2\0\2\4\1\0\1\4\1\0"+ + "\3\4\4\0\2\4\1\0\37\4\4\0\7\4\1\0"+ + "\2\4\1\u02a3\14\4\11\0\3\4\2\0\3\4\2\0"+ + "\2\4\1\0\1\4\1\0\3\4\4\0\2\4\1\0"+ + "\37\4\4\0\7\4\1\0\1\4\1\u02a3\15\4\11\0"+ + "\3\4\2\0\3\4\2\0\2\4\1\0\1\4\1\0"+ + "\3\4\4\0\2\4\1\0\37\4\4\0\7\4\1\0"+ + "\10\4\1\u02a4\6\4\11\0\3\4\2\0\3\4\2\0"+ + "\2\4\1\0\1\4\1\0\3\4\4\0\2\4\1\0"+ + "\37\4\4\0\7\4\1\0\1\4\1\u021a\15\4\11\0"+ + "\3\4\2\0\3\4\2\0\2\4\1\0\1\4\1\0"+ + "\3\4\4\0\2\4\1\0\37\4\4\0\7\4\1\0"+ + "\5\4\1\u02a5\11\4\11\0\3\4\2\0\3\4\2\0"+ + "\2\4\1\0\1\4\1\0\3\4\4\0\2\4\1\0"+ + "\37\4\4\0\7\4\1\0\15\4\1\u02a6\1\4\11\0"+ + "\3\4\2\0\3\4\2\0\2\4\1\0\1\4\1\0"+ + "\3\4\4\0\2\4\1\0\37\4\16\0\1\u0174\131\0"+ + "\1\u02a7\136\0\1\u02a8\2\0\1\u02a9\134\0\1\u02aa\124\0"+ + "\1\u02ab\3\0\1\u0227\140\0\1\u02ac\126\0\1\u02a9\127\0"+ + "\1\u02ab\147\0\1\u02ad\107\0\1\4\6\6\1\0\14\6"+ + "\1\u02ae\2\6\11\0\1\4\2\6\2\0\3\6\2\0"+ + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ + "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\5\6"+ + "\1\u02af\11\6\11\0\1\4\2\6\2\0\3\6\2\0"+ + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ + "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\11\6"+ + "\1\151\5\6\11\0\1\4\2\6\2\0\3\6\2\0"+ + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ + "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\12\6"+ + "\1\u02b0\4\6\11\0\1\4\2\6\2\0\3\6\2\0"+ + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ + "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\17\6"+ + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ + "\1\6\1\0\1\4\1\6\1\4\4\0\1\6\1\u013e"+ + "\1\0\12\6\1\151\24\6\4\0\1\4\6\6\1\0"+ + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\1\6"+ + "\1\u02b1\1\0\37\6\4\0\1\4\6\6\1\0\17\6"+ + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ + "\1\6\1\0\1\4\1\6\1\4\4\0\1\6\1\u027e"+ + "\1\0\37\6\4\0\1\4\6\6\1\0\4\6\1\u02b2"+ + "\12\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ + "\1\0\37\6\4\0\1\4\6\6\1\0\17\6\11\0"+ + "\1\4\1\6\1\151\2\0\3\6\2\0\2\6\1\0"+ + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ + "\37\6\4\0\1\4\6\6\1\0\1\6\1\u02b3\15\6"+ + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ + "\37\6\4\0\1\4\6\6\1\0\1\u02b4\16\6\11\0"+ + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ + "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ - "\6\6\1\0\14\6\1\u0115\2\6\11\0\1\4\2\6"+ + "\1\6\1\4\4\0\1\u02b5\1\6\1\0\37\6\4\0"+ + "\1\4\6\6\1\0\16\6\1\u0208\11\0\1\4\2\6"+ "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\1\6\1\u013a\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\1\u024b\1\6\1\0\37\6\4\0\3\u014f\4\234\1\u014f"+ - "\3\234\6\u014f\1\234\2\u014f\1\234\6\u014f\1\236\5\u014f"+ - "\1\234\1\u014f\1\0\2\u014f\2\234\5\u014f\1\234\14\u014f"+ - "\2\234\1\u014f\1\234\2\u014f\1\234\17\u014f\2\234\4\u014f"+ - "\2\234\4\u014f\3\241\4\45\1\241\3\45\6\241\1\45"+ - "\2\241\1\45\13\241\1\u0157\1\45\2\241\1\u0158\1\241"+ - "\2\45\5\241\1\45\14\241\2\45\1\241\1\45\2\241"+ - "\1\45\17\241\2\45\4\241\2\45\4\241\1\4\6\6"+ - "\1\0\10\6\1\u011a\6\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\13\6\1\u0291\3\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\37\6\4\0\7\124\1\0"+ - "\12\124\1\u0292\4\124\11\0\3\124\2\0\3\124\2\0"+ - "\1\u0292\1\124\1\0\1\124\1\0\3\124\4\0\2\124"+ - "\1\0\37\124\4\0\7\124\1\0\5\124\1\u0292\11\124"+ - "\11\0\3\124\2\0\3\124\2\0\1\124\1\u0292\1\0"+ - "\1\124\1\0\3\124\4\0\2\124\1\0\37\124\4\0"+ - "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\1\u0235\1\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ + "\4\0\2\6\1\0\11\6\1\151\25\6\4\0\1\4"+ "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\10\6\1\u0293\26\6\4\0\1\4"+ + "\4\0\2\6\1\0\6\6\2\151\27\6\4\0\1\4"+ "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\1\6\1\u015e\35\6\4\0\1\4"+ - "\3\6\1\300\2\6\1\0\17\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ + "\4\0\2\6\1\0\1\6\1\u02b6\35\6\4\0\1\4"+ "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\3\6\1\u0294\7\6\1\u023b\1\6"+ - "\1\u0295\21\6\4\0\7\4\1\0\3\4\1\u0211\13\4"+ - "\11\0\3\4\2\0\3\4\2\0\2\4\1\0\1\4"+ - "\1\0\3\4\4\0\2\4\1\0\37\4\4\0\7\4"+ - "\1\0\2\4\1\u0296\14\4\11\0\3\4\2\0\3\4"+ - "\2\0\2\4\1\0\1\4\1\0\3\4\4\0\2\4"+ - "\1\0\37\4\4\0\7\4\1\0\1\4\1\u0296\15\4"+ - "\11\0\3\4\2\0\3\4\2\0\2\4\1\0\1\4"+ - "\1\0\3\4\4\0\2\4\1\0\37\4\4\0\7\4"+ - "\1\0\10\4\1\u0297\6\4\11\0\3\4\2\0\3\4"+ - "\2\0\2\4\1\0\1\4\1\0\3\4\4\0\2\4"+ - "\1\0\37\4\4\0\7\4\1\0\1\4\1\u0211\15\4"+ - "\11\0\3\4\2\0\3\4\2\0\2\4\1\0\1\4"+ - "\1\0\3\4\4\0\2\4\1\0\37\4\4\0\7\4"+ - "\1\0\5\4\1\u0298\11\4\11\0\3\4\2\0\3\4"+ - "\2\0\2\4\1\0\1\4\1\0\3\4\4\0\2\4"+ - "\1\0\37\4\4\0\7\4\1\0\15\4\1\u0299\1\4"+ - "\11\0\3\4\2\0\3\4\2\0\2\4\1\0\1\4"+ - "\1\0\3\4\4\0\2\4\1\0\37\4\16\0\1\u0170"+ - "\131\0\1\u029a\136\0\1\u029b\2\0\1\u029c\134\0\1\u029d"+ - "\124\0\1\u029e\3\0\1\u021e\140\0\1\u029f\126\0\1\u029c"+ - "\127\0\1\u029e\147\0\1\u02a0\107\0\1\4\6\6\1\0"+ - "\14\6\1\u02a1\2\6\11\0\1\4\2\6\2\0\3\6"+ + "\4\0\2\6\1\0\20\6\1\u02b7\16\6\4\0\1\4"+ + "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\5\6\1\u02a2\11\6\11\0\1\4\2\6\2\0\3\6"+ + "\4\0\2\6\1\0\5\6\1\u0162\31\6\4\0\1\4"+ + "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\11\6\1\147\5\6\11\0\1\4\2\6\2\0\3\6"+ + "\4\0\2\6\1\0\13\6\1\306\23\6\4\0\1\4"+ + "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\12\6\1\u02a3\4\6\11\0\1\4\2\6\2\0\3\6"+ + "\4\0\2\6\1\0\15\6\1\u02b8\21\6\4\0\1\4"+ + "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\1\6"+ - "\1\u013a\1\0\12\6\1\147\24\6\4\0\1\4\6\6"+ + "\4\0\2\6\1\0\22\6\1\151\14\6\4\0\1\4"+ + "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ + "\4\0\2\6\1\0\10\6\1\u02b9\26\6\4\0\1\4"+ + "\5\6\1\u0236\1\0\17\6\11\0\1\4\2\6\2\0"+ + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ + "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\1\6\1\u02a4\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\1\6"+ - "\1\u0272\1\0\37\6\4\0\1\4\6\6\1\0\4\6"+ - "\1\u02a5\12\6\11\0\1\4\2\6\2\0\3\6\2\0"+ + "\2\6\1\0\16\6\1\151\20\6\4\0\1\4\6\6"+ + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\17\6"+ - "\11\0\1\4\1\6\1\147\2\0\3\6\2\0\2\6"+ + "\2\6\1\0\15\6\1\u010c\21\6\4\0\1\4\6\6"+ + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ + "\2\6\1\0\4\6\1\u02ba\32\6\4\0\1\4\6\6"+ + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ + "\2\6\1\0\14\6\1\u02bb\22\6\4\0\1\4\6\6"+ + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ + "\2\6\1\0\5\6\1\u02bc\31\6\4\0\1\4\6\6"+ + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ + "\2\6\1\0\1\6\1\353\35\6\4\0\1\4\5\6"+ + "\1\344\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ + "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\1\6\1\u02a6"+ - "\15\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ + "\1\0\1\6\1\u02bd\35\6\4\0\1\4\6\6\1\0"+ + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\1\u02a7\16\6"+ + "\1\0\14\6\1\u0110\22\6\4\0\1\4\6\6\1\0"+ + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ + "\1\0\3\6\1\u02be\33\6\4\0\1\4\6\6\1\0"+ + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\1\u02bf"+ + "\1\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ + "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\17\6"+ "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ + "\1\6\1\u02c0\35\6\4\0\1\4\6\6\1\0\17\6"+ + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ + "\10\6\1\u0217\26\6\4\0\1\4\6\6\1\0\17\6"+ + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ + "\10\6\1\u02c1\26\6\4\0\1\4\6\6\1\0\17\6"+ + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ + "\31\6\1\u02c2\5\6\4\0\1\4\6\6\1\0\17\6"+ + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ + "\1\6\1\u02c3\35\6\4\0\1\4\6\6\1\0\17\6"+ + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ + "\16\6\1\u0240\20\6\4\0\1\4\6\6\1\0\17\6"+ + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ + "\1\6\1\u02c4\35\6\4\0\1\4\6\6\1\0\17\6"+ + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ + "\2\6\1\u02c5\34\6\4\0\1\4\3\6\1\u02c6\2\6"+ + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ + "\2\6\1\0\37\6\4\0\1\4\3\6\1\u02c7\2\6"+ + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ + "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\1\u02c8"+ + "\16\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ + "\1\0\37\6\4\0\1\4\6\6\1\0\17\6\11\0"+ + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\5\6"+ + "\1\151\31\6\4\0\1\4\6\6\1\0\17\6\11\0"+ + "\1\4\2\6\2\0\3\6\2\0\1\6\1\344\1\0"+ + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ "\37\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4"+ "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\1\u02a8\1\6\1\0\37\6"+ + "\1\4\1\6\1\4\4\0\2\6\1\0\31\6\1\u02c9"+ + "\5\6\4\0\1\4\5\6\1\u02ca\1\0\17\6\11\0"+ + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\11\6\1\147\25\6"+ + "\1\6\1\4\4\0\2\6\1\0\11\6\1\151\3\6"+ + "\1\u0197\21\6\4\0\1\4\6\6\1\0\17\6\11\0"+ + "\1\4\2\6\2\0\3\6\2\0\1\u02cb\1\6\1\0"+ + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ + "\37\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4"+ + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ + "\1\4\1\6\1\4\4\0\2\6\1\0\13\6\1\u02cc"+ + "\23\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4"+ + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ + "\1\4\1\6\1\4\4\0\2\6\1\0\15\6\1\u0273"+ + "\21\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4"+ + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ + "\1\4\1\6\1\4\4\0\2\6\1\0\31\6\1\151"+ + "\5\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4"+ + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ + "\1\4\1\6\1\4\4\0\2\6\1\0\15\6\1\u02cd"+ + "\21\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4"+ + "\2\6\2\0\3\6\2\0\1\6\1\u02ce\1\0\1\6"+ + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\6\6\2\147\27\6"+ + "\1\6\1\4\4\0\2\6\1\0\4\6\1\151\32\6"+ "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\1\6\1\u02a9\35\6"+ + "\1\6\1\4\4\0\2\6\1\0\3\6\1\u02cf\33\6"+ "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ + "\2\0\3\6\2\0\1\260\1\6\1\0\1\6\1\0"+ + "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ + "\1\4\5\6\1\u019d\1\0\17\6\11\0\1\4\2\6"+ "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\20\6\1\u02aa\16\6"+ + "\1\6\1\4\4\0\2\6\1\0\5\6\1\u02d0\31\6"+ "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\5\6\1\u015e\31\6"+ + "\1\6\1\4\4\0\2\6\1\0\5\6\1\u02d1\31\6"+ "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\13\6\1\304\23\6"+ + "\1\6\1\4\4\0\2\6\1\0\1\6\1\u0110\35\6"+ "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\15\6\1\u02ab\21\6"+ + "\1\6\1\4\4\0\2\6\1\0\6\6\1\u0255\30\6"+ "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\22\6\1\147\14\6"+ - "\4\0\1\4\5\6\1\u022c\1\0\17\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ - "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\16\6\1\147\20\6\4\0"+ - "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\15\6\1\u0108\21\6\4\0"+ - "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\4\6\1\u02ac\32\6\4\0"+ - "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\14\6\1\u02ad\22\6\4\0"+ - "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\5\6\1\u02ae\31\6\4\0"+ - "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\1\6\1\351\35\6\4\0"+ - "\1\4\5\6\1\342\1\0\17\6\11\0\1\4\2\6"+ + "\1\6\1\4\4\0\2\6\1\0\15\6\1\u0197\21\6"+ + "\4\0\1\4\3\6\1\u02d2\2\6\1\0\17\6\11\0"+ + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ + "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ - "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\1\6\1\u02af\35\6\4\0\1\4"+ - "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\14\6\1\u010c\22\6\4\0\1\4"+ + "\1\6\1\4\4\0\2\6\1\0\21\6\1\u0239\15\6"+ + "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ + "\1\6\1\4\4\0\2\6\1\0\6\6\1\u02d3\30\6"+ + "\36\0\1\u02d4\117\0\1\u01c9\51\0\1\u026d\44\0\1\u026f"+ + "\1\u02d5\4\u026f\1\u02d5\17\u026f\3\u02d5\1\u026f\1\u02d5\2\0"+ + "\2\u02d5\1\0\2\u026f\2\0\3\u026f\1\0\1\u02d5\2\u026f"+ + "\1\u02d5\1\u026f\1\0\1\u02d5\1\u026f\5\u02d5\2\u026f\1\u02d5"+ + "\37\u026f\2\0\1\u02d5\33\0\1\u02d6\117\0\1\u01cd\51\0"+ + "\1\u0270\44\0\1\u0272\1\u02d7\4\u0272\1\u02d7\17\u0272\3\u02d7"+ + "\1\u0272\1\u02d7\2\0\2\u02d7\1\0\2\u0272\2\0\3\u0272"+ + "\1\0\1\u02d7\2\u0272\1\u02d7\1\u0272\1\0\1\u02d7\1\u0272"+ + "\5\u02d7\2\u0272\1\u02d7\37\u0272\2\0\1\u02d7\1\0\1\4"+ "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\3\6\1\u02b0\33\6\4\0\1\4"+ - "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\1\u02b1\1\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\1\6\1\u02b2\35\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\10\6\1\u020e\26\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\10\6\1\u02b3\26\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\31\6\1\u02b4\5\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\1\6\1\u02b5\35\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\16\6\1\u0235\20\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\1\6\1\u02b6\35\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\2\6\1\u02b7\34\6\4\0\1\4\3\6"+ - "\1\u02b8\2\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\3\6"+ - "\1\u02b9\2\6\1\0\17\6\11\0\1\4\2\6\2\0"+ + "\4\0\2\6\1\0\1\6\1\344\35\6\4\0\1\4"+ + "\5\6\1\302\1\0\17\6\11\0\1\4\2\6\2\0"+ "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\1\u02ba\16\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\5\6\1\147\31\6\4\0\1\4\6\6\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\1\6"+ - "\1\342\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ + "\2\6\1\0\1\u02d8\1\0\1\4\1\6\1\4\4\0"+ "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\17\6"+ "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\31\6\1\u02bb\5\6\4\0\1\4\5\6\1\u02bc\1\0"+ + "\30\6\1\u01e9\6\6\4\0\1\4\5\6\1\u02d9\1\0"+ "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\17\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\11\6"+ - "\1\147\3\6\1\u0192\21\6\4\0\1\4\6\6\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\1\u02bd"+ + "\1\0\14\6\1\u02da\22\6\4\0\1\4\6\6\1\0"+ + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\1\u02db"+ "\1\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\17\6"+ "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\13\6\1\u02be\23\6\4\0\1\4\6\6\1\0\17\6"+ + "\13\6\1\u02dc\23\6\4\0\1\4\6\6\1\0\17\6"+ "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\15\6\1\u0267\21\6\4\0\1\4\6\6\1\0\17\6"+ + "\5\6\1\u02dd\31\6\4\0\1\4\6\6\1\0\17\6"+ "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\31\6\1\147\5\6\4\0\1\4\6\6\1\0\17\6"+ + "\15\6\1\u02ba\21\6\4\0\1\4\6\6\1\0\17\6"+ + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ + "\2\6\1\u0161\34\6\4\0\1\4\5\6\1\u0237\1\0"+ + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ + "\1\0\37\6\4\0\1\4\6\6\1\0\14\6\1\157"+ + "\2\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ + "\1\0\37\6\4\0\1\4\6\6\1\0\1\6\1\223"+ + "\15\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ + "\1\0\37\6\4\0\1\4\6\6\1\0\1\6\1\u02de"+ + "\1\6\1\u02df\13\6\11\0\1\4\2\6\2\0\3\6"+ + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ + "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ + "\4\6\1\u02e0\12\6\11\0\1\4\2\6\2\0\3\6"+ + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ + "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ + "\12\6\1\u02e1\4\6\11\0\1\4\2\6\2\0\3\6"+ + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ + "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ + "\10\6\1\u02e2\6\6\11\0\1\4\2\6\2\0\3\6"+ + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ + "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ + "\2\6\1\u02e3\14\6\11\0\1\4\2\6\2\0\3\6"+ + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ + "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\1\6"+ + "\1\u028e\1\0\37\6\4\0\1\4\6\6\1\0\17\6"+ + "\11\0\1\4\2\6\2\0\1\6\1\u0124\1\6\2\0"+ + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ + "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\1\6"+ + "\1\u0207\15\6\11\0\1\4\2\6\2\0\3\6\2\0"+ + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ + "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\3\6"+ + "\1\u02e4\13\6\11\0\1\4\2\6\2\0\3\6\2\0"+ + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ + "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\17\6"+ "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\15\6\1\u02bf\21\6\4\0\1\4\6\6\1\0\17\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\1\6\1\u02c0"+ + "\12\6\1\u02e5\24\6\4\0\1\4\6\6\1\0\10\6"+ + "\1\u02e6\6\6\11\0\1\4\2\6\2\0\3\6\2\0"+ + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ + "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\17\6"+ + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ + "\1\6\1\0\1\4\1\6\1\4\4\0\1\6\1\u02e7"+ + "\1\0\37\6\4\0\1\4\6\6\1\0\1\6\1\u02e8"+ + "\15\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ + "\1\0\37\6\4\0\1\4\6\6\1\0\3\6\1\u02e9"+ + "\13\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ + "\1\0\37\6\4\0\1\4\6\6\1\0\11\6\1\u013e"+ + "\5\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ + "\1\0\37\6\4\0\1\4\6\6\1\0\13\6\1\151"+ + "\3\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ + "\1\0\37\6\4\0\1\4\6\6\1\0\6\6\1\u02ea"+ + "\10\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ + "\1\0\37\6\4\0\1\4\6\6\1\0\1\u02eb\11\6"+ + "\1\u0290\4\6\11\0\1\4\2\6\2\0\3\6\2\0"+ + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ + "\2\6\1\0\36\6\1\151\4\0\1\4\6\6\1\0"+ + "\12\6\1\u0142\4\6\11\0\1\4\2\6\2\0\3\6"+ + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ + "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ + "\4\6\1\223\12\6\11\0\1\4\2\6\2\0\3\6"+ + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ + "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ + "\1\6\1\u02ec\15\6\11\0\1\4\2\6\2\0\3\6"+ + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ + "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ + "\4\6\1\u02ed\12\6\11\0\1\4\2\6\2\0\3\6"+ + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ + "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ + "\5\6\1\210\11\6\11\0\1\4\2\6\2\0\3\6"+ + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ + "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ + "\5\6\1\u02ee\11\6\11\0\1\4\2\6\2\0\3\6"+ + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ + "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\1\6"+ + "\1\u02ef\1\0\37\6\4\0\1\4\6\6\1\0\7\6"+ + "\1\u029b\7\6\11\0\1\4\2\6\2\0\3\6\2\0"+ + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ + "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\17\6"+ + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ + "\1\6\1\0\1\4\1\6\1\4\4\0\1\6\1\u02f0"+ + "\1\0\37\6\4\0\1\4\6\6\1\0\15\6\1\u013e"+ + "\1\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ + "\1\0\37\6\4\0\1\4\6\6\1\0\1\6\1\u02f1"+ + "\15\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ + "\1\0\37\6\4\0\1\4\6\6\1\0\1\6\1\u02f2"+ + "\15\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ "\1\0\37\6\4\0\1\4\6\6\1\0\17\6\11\0"+ "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\4\6"+ - "\1\147\32\6\4\0\1\4\6\6\1\0\17\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\3\6"+ - "\1\u02c1\33\6\4\0\1\4\6\6\1\0\17\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\1\256\1\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\37\6\4\0\1\4\5\6\1\u0198\1\0\17\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\5\6"+ - "\1\u02c2\31\6\4\0\1\4\6\6\1\0\17\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\5\6"+ - "\1\u02c3\31\6\4\0\1\4\6\6\1\0\17\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\1\6"+ - "\1\u010c\35\6\4\0\1\4\6\6\1\0\17\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\6\6"+ - "\1\u024a\30\6\4\0\1\4\6\6\1\0\17\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\15\6"+ - "\1\u0192\21\6\4\0\1\4\3\6\1\u02c4\2\6\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\17\6\11\0"+ + "\1\u02f3\21\6\4\0\1\4\6\6\1\0\17\6\11\0"+ "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\6\6"+ - "\1\u02c5\30\6\36\0\1\u02c6\117\0\1\u01c1\51\0\1\u0261"+ - "\44\0\1\u0263\1\u02c7\4\u0263\1\u02c7\17\u0263\3\u02c7\1\u0263"+ - "\1\u02c7\2\0\2\u02c7\1\0\2\u0263\2\0\3\u0263\1\0"+ - "\1\u02c7\2\u0263\1\u02c7\1\u0263\1\0\1\u02c7\1\u0263\5\u02c7"+ - "\2\u0263\1\u02c7\37\u0263\2\0\1\u02c7\33\0\1\u02c8\117\0"+ - "\1\u01c5\51\0\1\u0264\44\0\1\u0266\1\u02c9\4\u0266\1\u02c9"+ - "\17\u0266\3\u02c9\1\u0266\1\u02c9\2\0\2\u02c9\1\0\2\u0266"+ - "\2\0\3\u0266\1\0\1\u02c9\2\u0266\1\u02c9\1\u0266\1\0"+ - "\1\u02c9\1\u0266\5\u02c9\2\u0266\1\u02c9\37\u0266\2\0\1\u02c9"+ - "\1\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\1\6\1\342\35\6"+ - "\4\0\1\4\5\6\1\300\1\0\17\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ - "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\u02ca\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\14\6"+ + "\1\u02f4\22\6\4\0\1\4\6\6\1\0\17\6\11\0"+ + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\11\6"+ + "\1\u02f5\25\6\4\0\7\4\1\0\7\4\1\u02a3\7\4"+ + "\11\0\3\4\2\0\3\4\2\0\2\4\1\0\1\4"+ + "\1\0\3\4\4\0\2\4\1\0\37\4\4\0\7\4"+ + "\1\0\12\4\1\u02f6\4\4\11\0\3\4\2\0\3\4"+ + "\2\0\2\4\1\0\1\4\1\0\3\4\4\0\2\4"+ + "\1\0\37\4\4\0\7\4\1\0\16\4\1\u02f7\11\0"+ + "\3\4\2\0\3\4\2\0\2\4\1\0\1\4\1\0"+ + "\3\4\4\0\2\4\1\0\37\4\17\0\1\u02a8\132\0"+ + "\1\u02f8\132\0\1\u02f8\142\0\1\u02f9\124\0\1\u02a8\137\0"+ + "\1\u02fa\143\0\1\u02fb\106\0\1\4\6\6\1\0\7\6"+ + "\1\u02fc\7\6\11\0\1\4\2\6\2\0\3\6\2\0"+ "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\30\6\1\u01e1\6\6\4\0\1\4\5\6"+ - "\1\u02cb\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\14\6\1\u02cc\22\6\4\0\1\4"+ - "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\1\u02cd\1\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ + "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\14\6"+ + "\1\u02fd\2\6\11\0\1\4\2\6\2\0\3\6\2\0"+ "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\13\6\1\u02ce\23\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ + "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\17\6"+ + "\11\0\1\4\2\6\2\0\1\6\1\u02fe\1\6\2\0"+ "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\5\6\1\u02cf\31\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ + "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\1\6"+ + "\1\u02ff\15\6\11\0\1\4\2\6\2\0\3\6\2\0"+ "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\15\6\1\u02ac\21\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ + "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\14\6"+ + "\1\u01c3\2\6\11\0\1\4\2\6\2\0\3\6\2\0"+ "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\2\6\1\u015d\34\6\4\0\1\4\5\6"+ - "\1\u022d\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\14\6\1\155\2\6\11\0\1\4\2\6\2\0\3\6"+ + "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\1\u0300"+ + "\5\6\1\151\10\6\11\0\1\4\2\6\2\0\3\6"+ "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\1\6\1\221\15\6\11\0\1\4\2\6\2\0\3\6"+ + "\14\6\1\u022d\2\6\11\0\1\4\2\6\2\0\3\6"+ "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\1\6\1\u02d0\1\6\1\u02d1\13\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ - "\6\6\1\0\4\6\1\u02d2\12\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ - "\6\6\1\0\12\6\1\u02d3\4\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ - "\6\6\1\0\10\6\1\u02d4\6\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ - "\6\6\1\0\2\6\1\u02d5\14\6\11\0\1\4\2\6"+ + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\1\6"+ + "\1\u0301\1\0\37\6\4\0\1\4\6\6\1\0\17\6"+ + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ + "\17\6\1\u0197\17\6\4\0\1\4\5\6\1\u0302\1\0"+ + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ + "\1\0\37\6\4\0\1\4\6\6\1\0\17\6\11\0"+ + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\14\6"+ + "\1\u0303\22\6\4\0\1\4\5\6\1\u0304\1\0\17\6"+ + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ + "\37\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4"+ + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ + "\1\4\1\6\1\4\4\0\2\6\1\0\13\6\1\u0305"+ + "\23\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4"+ + "\2\6\2\0\3\6\2\0\1\u0198\1\6\1\0\1\6"+ + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ + "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ + "\1\6\1\4\4\0\2\6\1\0\15\6\1\u0306\21\6"+ + "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ + "\2\0\3\6\2\0\1\6\1\u0307\1\0\1\6\1\0"+ + "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ + "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ + "\3\6\2\0\1\6\1\326\1\0\1\6\1\0\1\4"+ "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\1\6\1\u0281\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\1\6\1\u0120"+ - "\1\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\1\6\1\u01fe\15\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\3\6\1\u02d6\13\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\12\6\1\u02d7\24\6\4\0\1\4\6\6"+ - "\1\0\10\6\1\u02d8\6\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\1\6\1\u02d9\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\3\6\1\u02da\13\6\11\0\1\4\2\6\2\0\3\6"+ + "\4\0\2\6\1\0\10\6\1\u0308\26\6\4\0\1\4"+ + "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\11\6\1\u013a\5\6\11\0\1\4\2\6\2\0\3\6"+ + "\4\0\2\6\1\0\3\6\1\u0309\33\6\4\0\1\4"+ + "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\13\6\1\147\3\6\11\0\1\4\2\6\2\0\3\6"+ + "\4\0\2\6\1\0\20\6\1\151\16\6\4\0\1\4"+ + "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\6\6\1\u02db\10\6\11\0\1\4\2\6\2\0\3\6"+ + "\4\0\2\6\1\0\4\6\1\u0197\32\6\4\0\1\4"+ + "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\1\u02dc\11\6\1\u0283\4\6\11\0\1\4\2\6\2\0"+ + "\4\0\2\6\1\0\13\6\1\302\23\6\4\0\1\4"+ + "\5\6\1\u030a\1\0\17\6\11\0\1\4\2\6\2\0"+ "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\36\6\1\147\4\0\1\4"+ - "\6\6\1\0\12\6\1\u013e\4\6\11\0\1\4\2\6"+ + "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\3\6"+ + "\1\u030b\2\6\1\0\17\6\11\0\1\4\2\6\2\0"+ + "\3\6\2\0\1\u02c2\1\6\1\0\1\6\1\0\1\4"+ + "\1\6\1\4\4\0\2\6\1\0\36\6\1\151\4\0"+ + "\1\4\5\6\1\u02d9\1\0\17\6\11\0\1\4\2\6"+ "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ - "\6\6\1\0\4\6\1\221\12\6\11\0\1\4\2\6"+ + "\6\6\1\0\1\6\1\u02de\15\6\11\0\1\4\2\6"+ "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ - "\6\6\1\0\1\6\1\u02dd\15\6\11\0\1\4\2\6"+ + "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ + "\4\0\2\6\1\0\5\6\1\u030c\31\6\4\0\1\4"+ + "\3\6\1\u030d\2\6\1\0\17\6\11\0\1\4\2\6"+ "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ - "\6\6\1\0\4\6\1\u02de\12\6\11\0\1\4\2\6"+ + "\1\6\1\4\4\0\2\6\1\0\3\6\1\151\33\6"+ + "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ - "\6\6\1\0\5\6\1\206\11\6\11\0\1\4\2\6"+ + "\1\6\1\4\4\0\2\6\1\0\2\6\1\u030e\34\6"+ + "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ - "\6\6\1\0\5\6\1\u02df\11\6\11\0\1\4\2\6"+ + "\1\6\1\4\4\0\2\6\1\0\1\6\1\u01c2\35\6"+ + "\4\0\1\4\5\6\1\u030f\1\0\17\6\11\0\1\4"+ + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ + "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ + "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ + "\1\4\4\0\2\6\1\0\1\6\1\u0310\35\6\4\0"+ + "\1\4\5\6\1\u0311\1\0\17\6\11\0\1\4\2\6"+ "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\1\6\1\u02e0\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\7\6\1\u028e\7\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\1\6\1\u02e1\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\15\6\1\u013a\1\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\1\6\1\u02e2\15\6\11\0\1\4\2\6\2\0\3\6"+ + "\4\0\2\6\1\0\10\6\1\u02d1\26\6\4\0\1\4"+ + "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\1\6\1\u02e3\15\6\11\0\1\4\2\6\2\0\3\6"+ + "\4\0\2\6\1\0\15\6\1\u0312\21\6\4\0\1\4"+ + "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\15\6\1\u02e4\21\6\4\0\1\4\6\6\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\14\6\1\u02e5\22\6\4\0\1\4\6\6\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\11\6\1\u02e6\25\6\4\0\7\4\1\0\7\4"+ - "\1\u0296\7\4\11\0\3\4\2\0\3\4\2\0\2\4"+ - "\1\0\1\4\1\0\3\4\4\0\2\4\1\0\37\4"+ - "\4\0\7\4\1\0\12\4\1\u02e7\4\4\11\0\3\4"+ - "\2\0\3\4\2\0\2\4\1\0\1\4\1\0\3\4"+ - "\4\0\2\4\1\0\37\4\4\0\7\4\1\0\16\4"+ - "\1\u02e8\11\0\3\4\2\0\3\4\2\0\2\4\1\0"+ - "\1\4\1\0\3\4\4\0\2\4\1\0\37\4\17\0"+ - "\1\u029b\132\0\1\u02e9\132\0\1\u02e9\142\0\1\u02ea\124\0"+ - "\1\u029b\137\0\1\u02eb\143\0\1\u02ec\106\0\1\4\6\6"+ - "\1\0\7\6\1\u02ed\7\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\14\6\1\u02ee\2\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\1\6\1\u02ef"+ - "\1\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\1\6\1\u02f0\15\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\14\6\1\u02f1\2\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\1\u02f2\5\6\1\147\10\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ - "\6\6\1\0\14\6\1\u0224\2\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ + "\4\0\2\6\1\0\1\6\1\u025b\35\6\4\0\1\4"+ "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\1\6\1\u02f3\1\0\37\6\4\0\1\4\6\6"+ + "\4\0\2\6\1\0\15\6\1\u0313\21\6\36\0\1\u026f"+ + "\133\0\1\u0272\101\0\1\4\6\6\1\0\17\6\11\0"+ + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\11\6"+ + "\1\u0314\7\6\1\u0315\1\u0316\14\6\4\0\1\4\6\6"+ "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\17\6\1\u0192\17\6\4\0\1\4\5\6"+ - "\1\u02f4\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ + "\1\6\1\u0317\1\0\1\6\1\0\1\4\1\6\1\4"+ "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\14\6\1\u02f5\22\6\4\0\1\4\6\6\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\13\6\1\u02f6\23\6\4\0\1\4\6\6\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\1\u0193"+ - "\1\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\17\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\15\6\1\u02f7\21\6\4\0\1\4\6\6\1\0\17\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\1\6\1\u02f8"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ + "\1\0\1\151\1\0\1\4\1\6\1\4\4\0\2\6"+ "\1\0\37\6\4\0\1\4\6\6\1\0\17\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\1\6\1\324\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\37\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\10\6\1\u02f9"+ - "\26\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\3\6\1\u02fa"+ - "\33\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\20\6\1\147"+ - "\16\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\4\6\1\u0192"+ - "\32\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\13\6\1\300"+ - "\23\6\4\0\1\4\5\6\1\u02fb\1\0\17\6\11\0"+ "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ - "\4\0\1\4\3\6\1\u02fc\2\6\1\0\17\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\1\u02b4\1\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\36\6\1\147\4\0\1\4\5\6\1\u02cb\1\0\17\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\37\6\4\0\1\4\6\6\1\0\1\6\1\u02d0\15\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\37\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\5\6\1\u02fd"+ - "\31\6\4\0\1\4\3\6\1\u02fe\2\6\1\0\17\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\3\6\1\147\33\6\4\0\1\4\6\6\1\0\17\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\2\6\1\u02ff\34\6\4\0\1\4\6\6\1\0\17\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\1\6\1\u0300\35\6\4\0\1\4\5\6\1\u0301\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\17\6\11\0"+ + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\2\6"+ + "\1\u0318\34\6\4\0\1\4\6\6\1\0\17\6\11\0"+ "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\1\6"+ - "\1\u0302\35\6\4\0\1\4\5\6\1\u0303\1\0\17\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\37\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\10\6\1\u02c3"+ - "\26\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\15\6\1\u0304"+ - "\21\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4"+ + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\11\6"+ + "\1\u0314\7\6\1\u0315\1\u0316\1\6\1\u0319\12\6\4\0"+ + "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ + "\1\4\4\0\2\6\1\0\13\6\1\u010e\23\6\4\0"+ + "\1\4\6\6\1\0\5\6\1\u031a\11\6\11\0\1\4"+ "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\1\6\1\u0250"+ - "\35\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4"+ + "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ + "\1\4\6\6\1\0\2\6\1\151\14\6\11\0\1\4"+ "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\15\6\1\u0305"+ - "\21\6\36\0\1\u0263\133\0\1\u0266\101\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\11\6\1\u0306\7\6\1\u0307\1\u0308\14\6"+ - "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\1\6\1\u0309\1\0\1\6\1\0"+ "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ - "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\147\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ + "\1\4\6\6\1\0\16\6\1\u031b\11\0\1\4\2\6"+ + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ + "\1\6\1\4\4\0\2\6\1\0\1\u031c\11\6\1\u031d"+ + "\10\6\1\u031e\13\6\4\0\1\4\6\6\1\0\17\6"+ + "\11\0\1\4\2\6\2\0\1\6\1\u031f\1\6\2\0"+ "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\2\6\1\u030a\34\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ + "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\4\6"+ + "\1\u0116\12\6\11\0\1\4\2\6\2\0\3\6\2\0"+ "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\11\6\1\u0306\7\6\1\u0307\1\u0308\1\6"+ - "\1\u030b\12\6\4\0\1\4\6\6\1\0\17\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\13\6"+ - "\1\u010a\23\6\4\0\1\4\6\6\1\0\5\6\1\u030c"+ - "\11\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\2\6\1\147"+ - "\14\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ + "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\16\6"+ + "\1\u031b\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\16\6\1\u030d"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\1\u030e\11\6\1\u030f\10\6\1\u0310\13\6\4\0\1\4"+ - "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\1\6"+ - "\1\u0311\1\6\2\0\2\6\1\0\1\6\1\0\1\4"+ + "\1\0\12\6\1\u031d\10\6\1\u031e\13\6\4\0\1\4"+ + "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ + "\4\0\2\6\1\0\33\6\1\u013e\3\6\4\0\1\4"+ + "\6\6\1\0\13\6\1\u013e\3\6\11\0\1\4\2\6"+ + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ - "\6\6\1\0\4\6\1\u0112\12\6\11\0\1\4\2\6"+ + "\6\6\1\0\2\6\1\u0152\14\6\11\0\1\4\2\6"+ "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ - "\6\6\1\0\16\6\1\u030d\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\12\6\1\u030f\10\6\1\u0310"+ - "\13\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\33\6\1\u013a"+ - "\3\6\4\0\1\4\6\6\1\0\13\6\1\u013a\3\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\37\6\4\0\1\4\6\6\1\0\2\6\1\u014e\14\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\37\6\4\0\1\4\6\6\1\0\10\6\1\u0226\6\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\37\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\1\6\1\u0312\1\0\37\6"+ - "\4\0\1\4\6\6\1\0\1\6\1\u014e\15\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ - "\4\0\1\4\6\6\1\0\10\6\1\u0313\6\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ - "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ + "\6\6\1\0\10\6\1\u022f\6\6\11\0\1\4\2\6"+ "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\1\6\1\u0314\1\0\37\6\4\0"+ - "\1\4\6\6\1\0\15\6\1\147\1\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ - "\1\4\6\6\1\0\14\6\1\161\2\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ - "\1\4\6\6\1\0\1\6\1\u0315\15\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ - "\1\4\6\6\1\0\3\6\1\u0316\13\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ - "\1\4\6\6\1\0\7\6\1\u0317\7\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ - "\1\4\6\6\1\0\7\6\1\u0318\7\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ - "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\5\6\1\u0253\31\6\4\0"+ - "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ + "\6\6\1\0\11\6\1\u0320\5\6\11\0\1\4\2\6"+ + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ + "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ + "\4\0\1\6\1\u0321\1\0\37\6\4\0\1\4\6\6"+ + "\1\0\1\6\1\u0152\15\6\11\0\1\4\2\6\2\0"+ "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\32\6\1\u0192\4\6\4\0"+ - "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ + "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ + "\1\0\10\6\1\u0322\6\6\11\0\1\4\2\6\2\0"+ "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\20\6\1\u0192\16\6\4\0"+ - "\7\4\1\0\1\u0212\16\4\11\0\3\4\2\0\3\4"+ - "\2\0\2\4\1\0\1\4\1\0\3\4\4\0\2\4"+ - "\1\0\37\4\4\0\7\4\1\0\14\4\1\u0296\2\4"+ - "\11\0\3\4\2\0\3\4\2\0\2\4\1\0\1\4"+ - "\1\0\3\4\4\0\2\4\1\0\37\4\23\0\1\u02e9"+ - "\136\0\1\u0319\137\0\1\u031a\105\0\1\4\6\6\1\0"+ - "\11\6\1\u031b\5\6\11\0\1\4\2\6\2\0\3\6"+ + "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ + "\1\6\1\u0323\1\0\37\6\4\0\1\4\6\6\1\0"+ + "\15\6\1\151\1\6\11\0\1\4\2\6\2\0\3\6"+ "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\12\6\1\u0120\24\6\4\0\1\4\6\6\1\0"+ - "\5\6\1\u013a\11\6\11\0\1\4\2\6\2\0\3\6"+ + "\14\6\1\163\2\6\11\0\1\4\2\6\2\0\3\6"+ "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\15\6\1\u0120\1\6\11\0\1\4\2\6\2\0\3\6"+ + "\1\6\1\u0324\15\6\11\0\1\4\2\6\2\0\3\6"+ "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\7\6\1\u01fe\7\6\11\0\1\4\2\6\2\0\3\6"+ + "\3\6\1\u0325\13\6\11\0\1\4\2\6\2\0\3\6"+ "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\14\6\1\u031c\2\6\11\0\1\4\2\6\2\0\3\6"+ + "\7\6\1\u0326\7\6\11\0\1\4\2\6\2\0\3\6"+ "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\1\6\1\u031d\15\6\11\0\1\4\2\6\2\0\3\6"+ + "\7\6\1\u0327\7\6\11\0\1\4\2\6\2\0\3\6"+ "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\10\6\1\u031e\26\6\4\0\1\4\6\6\1\0"+ + "\1\0\5\6\1\u025e\31\6\4\0\1\4\6\6\1\0"+ "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\15\6\1\u031f\21\6\4\0\1\4\6\6\1\0"+ + "\1\0\32\6\1\u0197\4\6\4\0\1\4\6\6\1\0"+ "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\17\6\1\147\17\6\4\0\1\4\5\6\1\u0320"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\17\6"+ + "\1\0\20\6\1\u0197\16\6\4\0\7\4\1\0\1\u021b"+ + "\16\4\11\0\3\4\2\0\3\4\2\0\2\4\1\0"+ + "\1\4\1\0\3\4\4\0\2\4\1\0\37\4\4\0"+ + "\7\4\1\0\14\4\1\u02a3\2\4\11\0\3\4\2\0"+ + "\3\4\2\0\2\4\1\0\1\4\1\0\3\4\4\0"+ + "\2\4\1\0\37\4\23\0\1\u02f8\136\0\1\u0328\137\0"+ + "\1\u0329\105\0\1\4\6\6\1\0\11\6\1\u032a\5\6"+ + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ + "\37\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4"+ + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ + "\1\4\1\6\1\4\4\0\2\6\1\0\12\6\1\u0124"+ + "\24\6\4\0\1\4\6\6\1\0\5\6\1\u013e\11\6"+ "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\1\6\1\253\35\6\4\0\1\4\6\6\1\0\17\6"+ + "\37\6\4\0\1\4\6\6\1\0\15\6\1\u0124\1\6"+ "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\4\6\1\u0321\32\6\4\0\1\4\5\6\1\u01ba\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\17\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\15\6"+ - "\1\u0322\21\6\4\0\1\4\6\6\1\0\17\6\11\0"+ + "\37\6\4\0\1\4\6\6\1\0\14\6\1\u032b\2\6"+ + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ + "\37\6\4\0\1\4\6\6\1\0\1\6\1\u032c\15\6"+ + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ + "\37\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4"+ + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ + "\1\4\1\6\1\4\4\0\2\6\1\0\10\6\1\u032d"+ + "\26\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4"+ + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ + "\1\4\1\6\1\4\4\0\2\6\1\0\15\6\1\u032e"+ + "\21\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4"+ + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ + "\1\4\1\6\1\4\4\0\2\6\1\0\4\6\1\u032f"+ + "\32\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4"+ + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ + "\1\4\1\6\1\4\4\0\2\6\1\0\17\6\1\151"+ + "\17\6\4\0\1\4\5\6\1\u0330\1\0\17\6\11\0"+ "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\5\6"+ - "\1\u0323\31\6\4\0\1\4\6\6\1\0\17\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\u01ba"+ "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\1\6\1\u0324\35\6"+ + "\1\6\1\4\4\0\2\6\1\0\1\6\1\255\35\6"+ "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\1\6\1\u0192\1\0\1\6\1\0"+ + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ + "\1\6\1\4\4\0\2\6\1\0\4\6\1\u0331\32\6"+ + "\4\0\1\4\5\6\1\u01bf\1\0\17\6\11\0\1\4"+ + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\10\6\1\u022d\26\6\4\0"+ - "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\17\6\1\u015d\17\6\4\0"+ - "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\11\6\1\u015d\25\6\4\0"+ + "\1\4\4\0\2\6\1\0\15\6\1\u0332\21\6\4\0"+ "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\10\6\1\u0325\26\6\4\0"+ + "\1\4\4\0\2\6\1\0\5\6\1\u0333\31\6\4\0"+ "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\14\6\1\u0326\22\6\4\0"+ - "\1\4\5\6\1\u0327\1\0\17\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ - "\5\6\1\324\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ + "\3\6\2\0\2\6\1\0\1\u01bf\1\0\1\4\1\6"+ "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\5\6\1\u0328\31\6\4\0\1\4\6\6"+ + "\2\6\1\0\1\6\1\u0334\35\6\4\0\1\4\6\6"+ "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\1\u0329\1\6\1\0\1\6\1\0\1\4\1\6\1\4"+ + "\1\6\1\u0197\1\0\1\6\1\0\1\4\1\6\1\4"+ "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\15\6\1\u032a\21\6\4\0\1\4\3\6\1\u032b"+ - "\2\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\5\6\1\u032c"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\17\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\1\6\1\u032d"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\10\6\1\u032e"+ - "\6\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ + "\1\0\17\6\1\u0161\17\6\4\0\1\4\6\6\1\0"+ + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\1\6\1\u032f"+ - "\15\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ + "\1\0\11\6\1\u0161\25\6\4\0\1\4\6\6\1\0"+ + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\1\6\1\206"+ - "\15\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ + "\1\0\10\6\1\u0335\26\6\4\0\1\4\6\6\1\0"+ + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\12\6\1\u0330"+ - "\4\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ + "\1\0\14\6\1\u0336\22\6\4\0\1\4\5\6\1\u0337"+ + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ + "\2\6\1\0\37\6\4\0\1\4\5\6\1\326\1\0"+ + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\1\u0331\16\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ + "\1\0\37\6\4\0\1\4\6\6\1\0\17\6\11\0"+ + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\5\6"+ + "\1\u0338\31\6\4\0\1\4\6\6\1\0\17\6\11\0"+ + "\1\4\2\6\2\0\3\6\2\0\1\u0339\1\6\1\0"+ "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ "\37\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4"+ "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\1\u0115\36\6"+ + "\1\4\1\6\1\4\4\0\2\6\1\0\15\6\1\u033a"+ + "\21\6\4\0\1\4\3\6\1\u033b\2\6\1\0\17\6"+ + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ + "\37\6\4\0\1\4\5\6\1\u033c\1\0\17\6\11\0"+ + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\1\u0332\36\6\4\0"+ - "\1\4\6\6\1\0\4\6\1\u0331\12\6\11\0\1\4"+ + "\1\6\1\4\4\0\1\6\1\u033d\1\0\37\6\4\0"+ + "\1\4\6\6\1\0\10\6\1\u033e\6\6\11\0\1\4"+ "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ - "\1\4\6\6\1\0\10\6\1\u0115\6\6\11\0\1\4"+ + "\1\4\6\6\1\0\1\6\1\u033f\15\6\11\0\1\4"+ "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ - "\1\4\1\u0333\5\6\1\0\1\u0334\16\6\11\0\1\4"+ + "\1\4\6\6\1\0\1\6\1\210\15\6\11\0\1\4"+ "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ - "\1\4\6\6\1\0\14\6\1\u028e\2\6\11\0\1\4"+ + "\1\4\6\6\1\0\12\6\1\u0340\4\6\11\0\1\4"+ "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\14\0"+ - "\1\u029c\147\0\1\u02e9\107\0\1\4\6\6\1\0\17\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\1\u01fe\1\6"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\17\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\1\6\1\u0335\1\0"+ - "\37\6\4\0\1\4\6\6\1\0\1\u0336\16\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ - "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\1\6\1\u02c3\35\6"+ - "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\13\6\1\u032b\23\6"+ - "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\6\6\1\u022d\30\6"+ - "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\24\6\1\u0337\12\6"+ - "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ + "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ + "\1\4\6\6\1\0\1\u0341\16\6\11\0\1\4\2\6"+ "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\24\6\1\u010c\12\6"+ - "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ + "\6\6\1\0\3\6\1\u0342\13\6\11\0\1\4\2\6"+ "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\15\6\1\u0338\21\6"+ - "\4\0\1\4\3\6\1\u0339\2\6\1\0\17\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\34\6"+ - "\1\u033a\2\6\4\0\1\4\6\6\1\0\17\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\5\6"+ - "\1\u010c\31\6\4\0\1\4\3\6\1\u033b\2\6\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\17\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\13\6"+ - "\1\u026f\23\6\4\0\1\4\6\6\1\0\17\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\1\6"+ - "\1\u033c\35\6\4\0\1\4\6\6\1\0\17\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\1\6"+ - "\1\147\35\6\4\0\1\4\6\6\1\0\17\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\1\6"+ - "\1\u025e\35\6\4\0\1\4\5\6\1\u033d\1\0\17\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\37\6\4\0\1\4\6\6\1\0\14\6\1\147\2\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\37\6\4\0\1\4\6\6\1\0\4\6\1\u0279\12\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\37\6\4\0\1\4\6\6\1\0\1\6\1\u033e\15\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\37\6\4\0\1\4\6\6\1\0\14\6\1\u033f\2\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\37\6\4\0\1\4\6\6\1\0\14\6\1\u0203\2\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\37\6\4\0\1\4\6\6\1\0\1\6\1\u0340\15\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\37\6\4\0\1\4\6\6\1\0\10\6\1\u0341\6\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\37\6\4\0\1\4\6\6\1\0\1\6\1\u0342\15\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\37\6\4\0\1\4\6\6\1\0\14\6\1\u0343\2\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\37\6\4\0\1\4\6\6\1\0\14\6\1\u0344\2\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\37\6\4\0\1\4\5\6\1\u0345\1\0\17\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ - "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ + "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ + "\4\0\2\6\1\0\1\u0119\36\6\4\0\1\4\6\6"+ + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ + "\2\6\1\0\1\u0343\36\6\4\0\1\4\6\6\1\0"+ + "\4\6\1\u0341\12\6\11\0\1\4\2\6\2\0\3\6"+ + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ + "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ + "\10\6\1\u0119\6\6\11\0\1\4\2\6\2\0\3\6"+ + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ + "\4\0\2\6\1\0\37\6\4\0\1\4\1\u0344\5\6"+ + "\1\0\1\u0345\16\6\11\0\1\4\2\6\2\0\3\6"+ + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ + "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ + "\14\6\1\u029b\2\6\11\0\1\4\2\6\2\0\3\6"+ + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ + "\4\0\2\6\1\0\37\6\14\0\1\u02a9\147\0\1\u02f8"+ + "\107\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\1\6\1\u0346\35\6"+ - "\4\0\1\4\5\6\1\u0347\1\0\17\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ - "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\5\6\1\u0348\31\6\4\0"+ + "\1\6\1\4\4\0\1\u0207\1\6\1\0\37\6\4\0"+ "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\1\6\1\u0349\35\6\4\0"+ - "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ + "\1\4\4\0\1\6\1\u0346\1\0\37\6\4\0\1\4"+ + "\6\6\1\0\1\u0347\16\6\11\0\1\4\2\6\2\0"+ "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\10\6\1\u034a\26\6\4\0"+ - "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ + "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ + "\2\6\1\0\1\6\1\u02d1\35\6\4\0\1\4\6\6"+ + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ + "\2\6\1\0\14\6\1\u0348\22\6\4\0\1\4\6\6"+ + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ + "\2\6\1\0\13\6\1\u033b\23\6\4\0\1\4\6\6"+ + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ + "\2\6\1\0\6\6\1\u0237\30\6\4\0\1\4\6\6"+ + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ + "\2\6\1\0\24\6\1\u0349\12\6\4\0\1\4\6\6"+ + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ + "\2\6\1\0\24\6\1\u0110\12\6\4\0\1\4\6\6"+ + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ + "\2\6\1\0\15\6\1\u034a\21\6\4\0\1\4\3\6"+ + "\1\u034b\2\6\1\0\17\6\11\0\1\4\2\6\2\0"+ "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\25\6\1\147\11\6\4\0"+ + "\1\4\4\0\2\6\1\0\34\6\1\u034c\2\6\4\0"+ "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\26\6\1\147\10\6\4\0"+ - "\1\4\6\6\1\0\7\6\1\u034b\7\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ - "\1\4\6\6\1\0\1\6\1\u0115\15\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ - "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\1\6\1\u034c\1\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ - "\1\4\6\6\1\0\13\6\1\u034d\3\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ - "\1\4\6\6\1\0\2\6\1\u034e\3\6\1\147\10\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\37\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4"+ - "\2\6\2\0\1\220\2\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ - "\4\0\1\4\5\6\1\u010c\1\0\17\6\11\0\1\4"+ + "\1\4\4\0\2\6\1\0\5\6\1\u0110\31\6\4\0"+ + "\1\4\3\6\1\u034d\2\6\1\0\17\6\11\0\1\4"+ "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\u034f\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\3\6\1\147\33\6\4\0"+ - "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\20\6\1\u0350\16\6\4\0"+ - "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\2\6\1\u0351\34\6\4\0"+ + "\1\4\4\0\2\6\1\0\13\6\1\u027b\23\6\4\0"+ "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\16\6\1\306\20\6\4\0"+ + "\1\4\4\0\2\6\1\0\1\6\1\u034e\35\6\4\0"+ "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\15\6\1\u015d\21\6\4\0"+ + "\1\4\4\0\2\6\1\0\1\6\1\151\35\6\4\0"+ "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\1\6\1\u0120\1\0\37\6\4\0\1\4"+ + "\1\4\4\0\2\6\1\0\1\6\1\u0269\35\6\4\0"+ + "\1\4\5\6\1\u034f\1\0\17\6\11\0\1\4\2\6"+ + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ + "\6\6\1\0\14\6\1\151\2\6\11\0\1\4\2\6"+ + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ + "\6\6\1\0\4\6\1\u0285\12\6\11\0\1\4\2\6"+ + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ + "\6\6\1\0\1\6\1\u0350\15\6\11\0\1\4\2\6"+ + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ + "\6\6\1\0\14\6\1\u0351\2\6\11\0\1\4\2\6"+ + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ + "\6\6\1\0\14\6\1\u020c\2\6\11\0\1\4\2\6"+ + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ + "\6\6\1\0\6\6\1\u013e\10\6\11\0\1\4\2\6"+ + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ + "\6\6\1\0\1\6\1\u0352\15\6\11\0\1\4\2\6"+ + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ + "\6\6\1\0\10\6\1\u0353\6\6\11\0\1\4\2\6"+ + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ + "\6\6\1\0\1\6\1\u0354\15\6\11\0\1\4\2\6"+ + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ + "\6\6\1\0\14\6\1\u0355\2\6\11\0\1\4\2\6"+ + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ + "\6\6\1\0\14\6\1\u0356\2\6\11\0\1\4\2\6"+ + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\1\6\1\u0352\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\14\6\1\u0353\2\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\3\6\1\u0354\13\6\11\0\1\4\2\6\2\0"+ + "\4\0\2\6\1\0\3\6\1\u0197\33\6\4\0\1\4"+ + "\5\6\1\u0357\1\0\17\6\11\0\1\4\2\6\2\0"+ "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\14\6\1\u0355\22\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\1\6\1\u0356\35\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\15\6\1\u0357\21\6\4\0\1\4\6\6"+ - "\1\0\3\6\1\u0358\13\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\7\6\1\u0359\7\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\1\6\1\u0116\15\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ + "\2\6\1\0\1\6\1\u0358\35\6\4\0\1\4\5\6"+ + "\1\u0359\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ + "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ + "\1\0\5\6\1\u035a\31\6\4\0\1\4\6\6\1\0"+ + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ + "\1\0\1\6\1\u035b\35\6\4\0\1\4\6\6\1\0"+ + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ + "\1\0\10\6\1\u035c\26\6\4\0\1\4\6\6\1\0"+ + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ + "\1\0\25\6\1\151\11\6\4\0\1\4\6\6\1\0"+ + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ + "\1\0\26\6\1\151\10\6\4\0\1\4\6\6\1\0"+ + "\7\6\1\u035d\7\6\11\0\1\4\2\6\2\0\3\6"+ + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ + "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ + "\1\6\1\u0119\15\6\11\0\1\4\2\6\2\0\3\6"+ + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ + "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ + "\17\6\11\0\1\4\2\6\2\0\1\6\1\u035e\1\6"+ + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ + "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ + "\13\6\1\u035f\3\6\11\0\1\4\2\6\2\0\3\6"+ + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ + "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ + "\2\6\1\u0360\3\6\1\151\10\6\11\0\1\4\2\6"+ + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ + "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\1\222"+ + "\2\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\5\6"+ - "\1\u0162\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ + "\1\u0110\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ + "\1\0\1\u0361\1\0\1\4\1\6\1\4\4\0\2\6"+ + "\1\0\3\6\1\151\33\6\4\0\1\4\6\6\1\0"+ + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ + "\1\0\20\6\1\u0362\16\6\4\0\1\4\6\6\1\0"+ + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ + "\1\0\2\6\1\u0363\34\6\4\0\1\4\6\6\1\0"+ + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\10\6\1\u035a\26\6\4\0\1\4\6\6\1\0"+ + "\1\0\16\6\1\310\20\6\4\0\1\4\6\6\1\0"+ "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\14\6\1\u035b\22\6\4\0\1\4\6\6\1\0"+ + "\1\0\15\6\1\u0161\21\6\4\0\1\4\6\6\1\0"+ "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\1\6"+ - "\1\u035c\1\0\37\6\4\0\1\4\6\6\1\0\17\6"+ + "\1\u0124\1\0\37\6\4\0\1\4\6\6\1\0\17\6"+ "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\1\6\1\u035d"+ + "\1\6\1\0\1\4\1\6\1\4\4\0\1\6\1\u0364"+ + "\1\0\37\6\4\0\1\4\6\6\1\0\14\6\1\u0365"+ + "\2\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ + "\1\0\37\6\4\0\1\4\6\6\1\0\3\6\1\u0366"+ + "\13\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ "\1\0\37\6\4\0\1\4\6\6\1\0\17\6\11\0"+ "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\15\6"+ - "\1\u035e\21\6\4\0\1\4\6\6\1\0\17\6\11\0"+ + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\14\6"+ + "\1\u0367\22\6\4\0\1\4\6\6\1\0\17\6\11\0"+ + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\1\6"+ + "\1\u0368\35\6\4\0\1\4\6\6\1\0\17\6\11\0"+ "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\15\6"+ - "\1\u035f\21\6\4\0\1\4\6\6\1\0\5\6\1\u0273"+ - "\11\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ + "\1\u0369\21\6\4\0\1\4\6\6\1\0\3\6\1\u036a"+ + "\13\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ + "\1\0\37\6\4\0\1\4\6\6\1\0\7\6\1\u036b"+ + "\7\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ + "\1\0\37\6\4\0\1\4\6\6\1\0\1\6\1\u011a"+ + "\15\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\16\6\1\u0360"+ + "\1\0\37\6\4\0\1\4\5\6\1\u0166\1\0\17\6"+ "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ "\37\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4"+ "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\21\6\1\u0361"+ - "\15\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\1\6\1\u0268\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ - "\4\0\1\4\6\6\1\0\1\6\1\u0362\15\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ - "\4\0\1\4\5\6\1\u0363\1\0\17\6\11\0\1\4"+ + "\1\4\1\6\1\4\4\0\2\6\1\0\10\6\1\u036c"+ + "\26\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4"+ "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ - "\1\4\6\6\1\0\4\6\1\u0364\12\6\11\0\1\4"+ + "\1\4\1\6\1\4\4\0\2\6\1\0\14\6\1\u036d"+ + "\22\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4"+ "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ + "\1\4\1\6\1\4\4\0\1\6\1\u036e\1\0\37\6"+ + "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ + "\1\6\1\4\4\0\1\6\1\u036f\1\0\37\6\4\0"+ "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\13\6\1\u0365\23\6\4\0"+ + "\1\4\4\0\2\6\1\0\15\6\1\u0370\21\6\4\0"+ "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\1\6\1\221\1\0\37\6\4\0\1\4"+ + "\1\4\4\0\2\6\1\0\15\6\1\u0371\21\6\4\0"+ + "\1\4\6\6\1\0\5\6\1\u027f\11\6\11\0\1\4"+ + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ + "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ + "\1\4\6\6\1\0\16\6\1\u0372\11\0\1\4\2\6"+ + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ + "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ + "\4\0\2\6\1\0\21\6\1\u0373\15\6\4\0\1\4"+ "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ + "\2\0\1\6\1\u0274\1\0\1\6\1\0\1\4\1\6"+ + "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ + "\1\0\1\6\1\u0374\15\6\11\0\1\4\2\6\2\0"+ + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ + "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\5\6"+ + "\1\u0375\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ + "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ + "\4\6\1\u0376\12\6\11\0\1\4\2\6\2\0\3\6"+ "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\15\6\1\300\21\6\4\0"; + "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ + "\1\0\13\6\1\u0377\23\6\4\0\1\4\6\6\1\0"+ + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\1\6"+ + "\1\223\1\0\37\6\4\0\1\4\6\6\1\0\17\6"+ + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ + "\15\6\1\302\21\6\4\0"; private static int [] zzUnpackTrans() { - int [] result = new int[77372]; + int [] result = new int[79028]; int offset = 0; offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result); return result; @@ -2626,16 +2683,16 @@ public class FormulaTokenMaker extends AbstractJFlexCTokenMaker { private static final String ZZ_ATTRIBUTE_PACKED_0 = "\3\0\30\1\1\11\4\1\1\11\2\1\1\11\11\1"+ - "\1\11\1\1\1\11\31\1\1\11\5\1\1\11\110\1"+ + "\1\11\1\1\1\11\33\1\1\11\5\1\1\11\110\1"+ "\1\0\2\11\2\1\1\11\3\1\1\11\24\1\1\0"+ - "\75\1\2\0\1\11\6\0\2\1\1\0\117\1\1\11"+ - "\7\1\1\11\24\1\6\0\115\1\10\0\2\1\1\0"+ - "\114\1\4\0\1\1\4\0\101\1\2\0\1\1\2\0"+ - "\64\1\7\0\45\1\4\0\37\1\1\11\3\0\54\1"+ - "\2\0\113\1"; + "\77\1\2\0\1\11\6\0\2\1\1\0\117\1\1\11"+ + "\7\1\1\11\24\1\6\0\121\1\10\0\2\1\1\0"+ + "\115\1\4\0\1\1\4\0\104\1\2\0\1\1\2\0"+ + "\65\1\7\0\46\1\4\0\40\1\1\11\3\0\54\1"+ + "\2\0\116\1"; private static int [] zzUnpackAttribute() { - int [] result = new int[869]; + int [] result = new int[887]; int offset = 0; offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result); return result; @@ -3203,15 +3260,15 @@ public class FormulaTokenMaker extends AbstractJFlexCTokenMaker { case EOL_COMMENT: { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken; } - case 870: break; + case 888: break; case YYINITIAL: { addNullToken(); return firstToken; } - case 871: break; + case 889: break; case MLC: { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; } - case 872: break; + case 890: break; default: return null; } diff --git a/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/MakefileTokenMaker.java b/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/MakefileTokenMaker.java index f556cc5b7..30b4b6d85 100644 --- a/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/MakefileTokenMaker.java +++ b/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/MakefileTokenMaker.java @@ -10,12 +10,13 @@ */ package com.fr.design.gui.syntax.ui.rsyntaxtextarea.modes; -import java.io.*; +import com.fr.design.gui.syntax.ui.rsyntaxtextarea.AbstractJFlexTokenMaker; +import com.fr.design.gui.syntax.ui.rsyntaxtextarea.Token; +import com.fr.design.gui.syntax.ui.rsyntaxtextarea.TokenImpl; +import java.io.IOException; import java.util.Stack; import javax.swing.text.Segment; -import com.fr.design.gui.syntax.ui.rsyntaxtextarea.*; - /** * Scanner for makefiles.

@@ -762,8 +763,8 @@ public final void yybegin(int newState) { { addToken(Token.LITERAL_CHAR); } case 25: break; - case 12: - { if (!varDepths.empty() && varDepths.peek()==Boolean.TRUE) { + case 12: + { if (!varDepths.empty() && Boolean.TRUE.equals(varDepths.peek())) { varDepths.pop(); if (varDepths.empty()) { addToken(start,zzStartRead, Token.VARIABLE); yybegin(YYINITIAL); @@ -771,8 +772,8 @@ public final void yybegin(int newState) { } } case 26: break; - case 11: - { if (!varDepths.empty() && varDepths.peek()==Boolean.FALSE) { + case 11: + { if (!varDepths.empty() && Boolean.FALSE.equals(varDepths.peek())) { varDepths.pop(); if (varDepths.empty()) { addToken(start,zzStartRead, Token.VARIABLE); yybegin(YYINITIAL); @@ -864,4 +865,4 @@ public final void yybegin(int newState) { } -} \ No newline at end of file +} diff --git a/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rtextarea/RTextAreaBase.java b/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rtextarea/RTextAreaBase.java index 334d34255..01c9238c6 100644 --- a/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rtextarea/RTextAreaBase.java +++ b/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rtextarea/RTextAreaBase.java @@ -723,37 +723,13 @@ int currentCaretY; // Used to know when to rehighlight current line. // If we're wrapping lines we need to check the actual y-coordinate // of the caret, not just the line number, since a single logical // line can span multiple physical lines. - if (getLineWrap()) { - try { - Rectangle temp = modelToView(dot); - if (temp!=null) { - currentCaretY = temp.y; - } - } catch (BadLocationException ble) { - ble.printStackTrace(); // Should never happen. + try { + Rectangle temp = modelToView(dot); + if (temp != null) { + currentCaretY = temp.y; } - } - - // No line wrap - we can simply check the line number (quicker). - else { -// Document doc = getDocument(); -// if (doc!=null) { -// Element map = doc.getDefaultRootElement(); -// int caretLine = map.getElementIndex(dot); -// Rectangle alloc = ((RTextAreaUI)getUI()). -// getVisibleEditorRect(); -// if (alloc!=null) -// currentCaretY = alloc.y + caretLine*lineHeight; -// } -// Modified for code folding requirements -try { - Rectangle temp = modelToView(dot); - if (temp!=null) { - currentCaretY = temp.y; - } -} catch (BadLocationException ble) { - ble.printStackTrace(); // Should never happen. -} + } catch (BadLocationException ble) { + ble.printStackTrace(); // Should never happen. } // Repaint current line (to fill in entire highlight), and old line @@ -1211,4 +1187,4 @@ try { } -} \ No newline at end of file +} diff --git a/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rtextarea/SearchEngine.java b/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rtextarea/SearchEngine.java index 23cf92964..3bda042ce 100644 --- a/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rtextarea/SearchEngine.java +++ b/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rtextarea/SearchEngine.java @@ -25,6 +25,7 @@ import javax.swing.text.Caret; import com.fr.design.gui.syntax.ui.rsyntaxtextarea.DocumentRange; import com.fr.design.gui.syntax.ui.rsyntaxtextarea.RSyntaxTextArea; import com.fr.design.gui.syntax.ui.rsyntaxtextarea.folding.FoldManager; +import org.jetbrains.annotations.NotNull; /** @@ -174,6 +175,7 @@ public class SearchEngine { * @param forward Whether we're searching forward or backward. * @return The character sequence. */ + @NotNull private static CharSequence getFindInCharSequence(RTextArea textArea, int start, boolean forward) { RDocument doc = (RDocument)textArea.getDocument(); @@ -752,7 +754,6 @@ public class SearchEngine { int start = makeMarkAndDotEqual(textArea, forward); CharSequence findIn = getFindInCharSequence(textArea, start, forward); - if (findIn==null) return new SearchResult(); int markAllCount = 0; if (context.getMarkAll()) { @@ -1014,4 +1015,4 @@ public class SearchEngine { } -} \ No newline at end of file +} diff --git a/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rtextarea/VolatileImageBackgroundPainterStrategy.java b/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rtextarea/VolatileImageBackgroundPainterStrategy.java index c7be420de..f08ab22c3 100644 --- a/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rtextarea/VolatileImageBackgroundPainterStrategy.java +++ b/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rtextarea/VolatileImageBackgroundPainterStrategy.java @@ -103,6 +103,9 @@ public class VolatileImageBackgroundPainterStrategy } finally { tracker.removeImage(i, 1); } + if(bgImage == null) { + continue; + } bgImage.getGraphics().drawImage(i, 0,0, null); tracker.addImage(bgImage, 0); try { @@ -114,7 +117,7 @@ public class VolatileImageBackgroundPainterStrategy } finally { tracker.removeImage(bgImage, 0); } - } while (bgImage.contentsLost()); + } while (bgImage != null && bgImage.contentsLost()); } // End of if (master!=null). else { bgImage = null; @@ -137,4 +140,4 @@ public class VolatileImageBackgroundPainterStrategy } -} \ No newline at end of file +} diff --git a/designer-base/src/main/java/com/fr/design/icon/BorderIcon.java b/designer-base/src/main/java/com/fr/design/icon/BorderIcon.java index 9d5e71305..3afc423be 100644 --- a/designer-base/src/main/java/com/fr/design/icon/BorderIcon.java +++ b/designer-base/src/main/java/com/fr/design/icon/BorderIcon.java @@ -1,5 +1,6 @@ package com.fr.design.icon; +import com.fr.stable.AssistUtils; import java.awt.Color; import java.awt.Component; import java.awt.Graphics; @@ -43,13 +44,13 @@ public class BorderIcon implements Icon { if (lineStyle == Constants.LINE_MEDIUM || lineStyle == Constants.LINE_THICK) { lineStyle = Constants.LINE_MEDIUM; - if (x1 == x2) { - if (x1 == y1) { + if (AssistUtils.equals(x1, x2)) { + if (AssistUtils.equals(x1, y1)) { GraphHelper.drawLine(g, x1, y1 - 1, x2, y2 + 1, lineStyle); } else { GraphHelper.drawLine(g, x1, y1, x2, y2 + 1, lineStyle); } - } else if (y1 == y2) { + } else if (AssistUtils.equals(y1, y2)) { GraphHelper.drawLine(g, x1, y1, x2 + 1, y2, lineStyle); } } else if (lineStyle == Constants.LINE_THIN @@ -57,7 +58,7 @@ public class BorderIcon implements Icon { GraphHelper.drawLine(g, x1, y1, x2, y2, lineStyle); } else { lineStyle = Constants.LINE_DOT; - if (y1 == x2 && x2 == y2) { + if (AssistUtils.equals(y1, x2) && AssistUtils.equals(x2, y2)) { GraphHelper.drawLine(g, x1, y1, x2 + 1, y2, lineStyle); } else { GraphHelper.drawLine(g, x1, y1, x2, y2, lineStyle); diff --git a/designer-base/src/main/java/com/fr/design/icon/LockIcon.java b/designer-base/src/main/java/com/fr/design/icon/LockIcon.java index ee54b6ea8..7ebffbdb7 100644 --- a/designer-base/src/main/java/com/fr/design/icon/LockIcon.java +++ b/designer-base/src/main/java/com/fr/design/icon/LockIcon.java @@ -35,7 +35,7 @@ public class LockIcon extends ImageIcon { } @Override - public void paintIcon(Component c, Graphics g, int x, int y) { + public synchronized void paintIcon(Component c, Graphics g, int x, int y) { if (mainImage != null) { g.drawImage(mainImage, x, y, c); } diff --git a/designer-base/src/main/java/com/fr/design/icon/WarningIcon.java b/designer-base/src/main/java/com/fr/design/icon/WarningIcon.java index d70d62225..50b70ccec 100644 --- a/designer-base/src/main/java/com/fr/design/icon/WarningIcon.java +++ b/designer-base/src/main/java/com/fr/design/icon/WarningIcon.java @@ -37,7 +37,7 @@ public class WarningIcon extends ImageIcon { } @Override - public void paintIcon(Component c, Graphics g, int x, int y) { + public synchronized void paintIcon(Component c, Graphics g, int x, int y) { if (mainImage != null) { g.drawImage(mainImage, x, y, c); } diff --git a/designer-base/src/main/java/com/fr/design/layout/FRGUIPaneFactory.java b/designer-base/src/main/java/com/fr/design/layout/FRGUIPaneFactory.java index 38097c2d9..90a5bc958 100644 --- a/designer-base/src/main/java/com/fr/design/layout/FRGUIPaneFactory.java +++ b/designer-base/src/main/java/com/fr/design/layout/FRGUIPaneFactory.java @@ -3,6 +3,7 @@ package com.fr.design.layout; import com.fr.design.border.UITitledBorder; import com.fr.design.gui.ilable.UILabel; +import com.fr.stable.AssistUtils; import javax.swing.BorderFactory; import javax.swing.BoxLayout; import javax.swing.Icon; @@ -562,9 +563,9 @@ public class FRGUIPaneFactory { float i = Math.abs((((int) m + (int) (m + 1)) / WIDTHABS_PARA_F) - m); float j = Math.abs((((int) n + (int) (n + 1)) / WIDTHABS_PARA_F) - n); float x = i > j ? i : j; - if (x == i) { + if (AssistUtils.equals(x, i)) { w = Math.round(m) * WIDTH_PARA_INT - WIDTH_OFFSET_M; - } else if (x == j) { + } else if (AssistUtils.equals(x, j)) { w = Math.round(n) * WIDTH_PARA_INT - WIDTH_OFFSET_N; } return w; diff --git a/designer-base/src/main/java/com/fr/design/layout/TableLayout.java b/designer-base/src/main/java/com/fr/design/layout/TableLayout.java index b812263c6..f8134be1f 100644 --- a/designer-base/src/main/java/com/fr/design/layout/TableLayout.java +++ b/designer-base/src/main/java/com/fr/design/layout/TableLayout.java @@ -1,6 +1,9 @@ package com.fr.design.layout; +import com.fr.stable.AssistUtils; +import com.fr.general.GeneralUtils; +import com.fr.stable.CommonUtils; import java.awt.Component; import java.awt.ComponentOrientation; import java.awt.Container; @@ -12,8 +15,6 @@ import java.lang.reflect.Method; import java.util.LinkedList; import java.util.ListIterator; -import com.fr.general.GeneralUtils; - /** *

TableLayout is a layout manager that is more powerful than GridBagLayout @@ -322,7 +323,6 @@ public class TableLayout implements LayoutManager2, Serializable { public static final double MINIMUM = -3.0; - //****************************************************************************** //** Constructors *** //****************************************************************************** @@ -399,17 +399,17 @@ public class TableLayout implements LayoutManager2, Serializable { // Make sure rows and columns are valid for (int counter = 0; counter < crSpec[C].length; counter++) if ((crSpec[C][counter] < 0.0) && - (crSpec[C][counter] != FILL) && - (crSpec[C][counter] != PREFERRED) && - (crSpec[C][counter] != MINIMUM)) { + !AssistUtils.equals(crSpec[C][counter], FILL) && + !AssistUtils.equals(crSpec[C][counter], PREFERRED) && + !AssistUtils.equals(crSpec[C][counter], MINIMUM)) { crSpec[C][counter] = 0.0; } for (int counter = 0; counter < crSpec[R].length; counter++) if ((crSpec[R][counter] < 0.0) && - (crSpec[R][counter] != FILL) && - (crSpec[R][counter] != PREFERRED) && - (crSpec[R][counter] != MINIMUM)) { + !AssistUtils.equals(crSpec[R][counter], FILL) && + !AssistUtils.equals(crSpec[R][counter], PREFERRED) && + !AssistUtils.equals(crSpec[R][counter], MINIMUM)) { crSpec[R][counter] = 0.0; } @@ -556,9 +556,9 @@ public class TableLayout implements LayoutManager2, Serializable { // Make sure rows are valid for (int counter = 0; counter < crSpec[z].length; counter++) if ((crSpec[z][counter] < 0.0) && - (crSpec[z][counter] != FILL) && - (crSpec[z][counter] != PREFERRED) && - (crSpec[z][counter] != MINIMUM)) { + !AssistUtils.equals(crSpec[z][counter], FILL) && + !AssistUtils.equals(crSpec[z][counter], PREFERRED) && + !AssistUtils.equals(crSpec[z][counter], MINIMUM)) { crSpec[z][counter] = 0.0; } @@ -641,9 +641,9 @@ public class TableLayout implements LayoutManager2, Serializable { protected void setCr(int z, int i, double size) { // Make sure size is valid if ((size < 0.0) && - (size != FILL) && - (size != PREFERRED) && - (size != MINIMUM)) { + !AssistUtils.equals(size, FILL) && + !AssistUtils.equals(size, PREFERRED) && + !AssistUtils.equals(size, MINIMUM)) { size = 0.0; } @@ -853,9 +853,9 @@ public class TableLayout implements LayoutManager2, Serializable { // Make sure row size is valid if ((size < 0.0) && - (size != FILL) && - (size != PREFERRED) && - (size != MINIMUM)) { + (!CommonUtils.equals(size, FILL)) && + (!CommonUtils.equals(size, PREFERRED)) && + (!CommonUtils.equals(size, MINIMUM))) { size = 0.0; } @@ -1177,7 +1177,7 @@ public class TableLayout implements LayoutManager2, Serializable { int numCr = crSpec[z].length; for (int counter = 0; counter < numCr; counter++) - if ((crSpec[z][counter] >= 1.0) || (crSpec[z][counter] == 0.0)) { + if ((crSpec[z][counter] >= 1.0) || CommonUtils.equals(crSpec[z][counter], 0.0)) { crSize[z][counter] = (int) (crSpec[z][counter] + 0.5); availableSize -= crSize[z][counter]; } @@ -1229,7 +1229,7 @@ public class TableLayout implements LayoutManager2, Serializable { int numCr = crSpec[z].length; for (int counter = 0; counter < numCr; counter++) - if (crSpec[z][counter] == FILL) + if (CommonUtils.equals(crSpec[z][counter], FILL)) numFillSize++; // If numFillSize is zero, the if statement below will always evaluate to @@ -1241,7 +1241,7 @@ public class TableLayout implements LayoutManager2, Serializable { // Assign "fill" cells equal amounts of the remaining space for (int counter = 0; counter < numCr; counter++) - if (crSpec[z][counter] == FILL) { + if (CommonUtils.equals(crSpec[z][counter], FILL)) { crSize[z][counter] = availableSize / numFillSize; slackSize -= crSize[z][counter]; } @@ -1249,7 +1249,7 @@ public class TableLayout implements LayoutManager2, Serializable { // Assign one pixel of slack to each FILL cr, starting at the last one, // until all slack has been consumed for (int counter = numCr - 1; (counter >= 0) && (slackSize > 0); counter--) { - if (crSpec[z][counter] == FILL) { + if (CommonUtils.equals(crSpec[z][counter], FILL)) { crSize[z][counter]++; slackSize--; } @@ -1299,7 +1299,7 @@ public class TableLayout implements LayoutManager2, Serializable { // Address every cr for (int counter = 0; counter < numCr; counter++) // Is the current cr a preferred/minimum (based on typeOfSize) size - if (crSpec[z][counter] == typeOfSize) { + if (CommonUtils.equals(crSpec[z][counter], typeOfSize)) { // Assume a maximum width of zero int maxSize = 0; @@ -1319,7 +1319,7 @@ public class TableLayout implements LayoutManager2, Serializable { // the current component occupies if ((entry.cr1[z] <= counter) && (entry.cr2[z] >= counter)) { // Setup size and number of adjustable crs - Dimension p = (typeOfSize == PREFERRED) ? + Dimension p = CommonUtils.equals(typeOfSize, PREFERRED) ? entry.component.getPreferredSize() : entry.component.getMinimumSize(); @@ -1328,23 +1328,23 @@ public class TableLayout implements LayoutManager2, Serializable { int numAdjustable = 0; // Calculate for preferred size - if (typeOfSize == PREFERRED) + if (CommonUtils.equals(typeOfSize, PREFERRED)) // Consider all crs this component occupies for (int entryCr = entry.cr1[z]; entryCr <= entry.cr2[z]; entryCr++) { // Subtract absolute, relative, and minumum cr // sizes, which have already been calculated if ((crSpec[z][entryCr] >= 0.0) || - (crSpec[z][entryCr] == MINIMUM)) { + CommonUtils.equals(crSpec[z][entryCr], MINIMUM)) { size -= crSize[z][entryCr]; } // Count preferred/min width columns - else if (crSpec[z][entryCr] == PREFERRED) + else if (CommonUtils.equals(crSpec[z][entryCr], PREFERRED)) numAdjustable++; - // Skip any component that occupies a fill cr - // because the fill should fulfill the size - // requirements - else if (crSpec[z][entryCr] == FILL) + // Skip any component that occupies a fill cr + // because the fill should fulfill the size + // requirements + else if (CommonUtils.equals(crSpec[z][entryCr], FILL)) continue nextComponent; } // Calculate for minimum size @@ -1357,14 +1357,14 @@ public class TableLayout implements LayoutManager2, Serializable { if (crSpec[z][entryCr] >= 0.0) size -= crSize[z][entryCr]; // Count preferred/min width columns - else if ((crSpec[z][entryCr] == PREFERRED) || - (crSpec[z][entryCr] == MINIMUM)) { + else if (CommonUtils.equals(crSpec[z][entryCr], PREFERRED) || + CommonUtils.equals(crSpec[z][entryCr], MINIMUM)) { numAdjustable++; } // Skip any component that occupies a fill cr // because the fill should fulfill the size // requirements - else if (crSpec[z][entryCr] == FILL) + else if (CommonUtils.equals(crSpec[z][entryCr], FILL)) continue nextComponent; } @@ -1692,7 +1692,7 @@ public class TableLayout implements LayoutManager2, Serializable { Dimension prefMinSize[] = new Dimension[numEntry]; for (int i = 0; i < numEntry; i++) - prefMinSize[i] = (typeOfSize == PREFERRED) ? + prefMinSize[i] = CommonUtils.equals(typeOfSize, PREFERRED) ? entryList[i].component.getPreferredSize() : entryList[i].component.getMinimumSize(); @@ -1807,8 +1807,8 @@ public class TableLayout implements LayoutManager2, Serializable { for (counter = entry.cr1[z]; counter <= entry.cr2[z]; counter++) if (crSpec[z][counter] >= 1.0) scalableSize -= crSpec[z][counter]; - else if ((crSpec[z][counter] == PREFERRED) || - (crSpec[z][counter] == MINIMUM)) { + else if (AssistUtils.equals(crSpec[z][counter], PREFERRED) || + AssistUtils.equals(crSpec[z][counter], MINIMUM)) { scalableSize -= crPrefMin[counter]; } @@ -1824,13 +1824,13 @@ public class TableLayout implements LayoutManager2, Serializable { // Add scaled size to relativeWidth relativeSize += crSpec[z][counter]; // Cr is fill - else if ((crSpec[z][counter] == FILL) && (fillSizeRatio != 0.0)) + else if (AssistUtils.equals(crSpec[z][counter], FILL) && !AssistUtils.equals(fillSizeRatio, 0.0)) // Add fill size to relativeWidth relativeSize += fillSizeRatio; } // Determine the total scaled size as estimated by this component - if (relativeSize == 0) + if (AssistUtils.equals(relativeSize, 0)) temp = 0; else temp = (int) (scalableSize / relativeSize + 0.5); @@ -1851,8 +1851,8 @@ public class TableLayout implements LayoutManager2, Serializable { if (crSpec[z][counter] >= 1.0) totalSize += (int) (crSpec[z][counter] + 0.5); // Is the current cr a preferred/minimum size - else if ((crSpec[z][counter] == PREFERRED) || - (crSpec[z][counter] == MINIMUM)) { + else if (AssistUtils.equals(crSpec[z][counter], PREFERRED) || + AssistUtils.equals(crSpec[z][counter], MINIMUM)) { // Add preferred/minimum width totalSize += crPrefMin[counter]; } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java index bb63a5726..01cc002f9 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java @@ -63,6 +63,7 @@ import com.fr.start.OemHandler; import com.fr.workspace.WorkContext; import com.fr.workspace.Workspace; import com.fr.workspace.connect.WorkspaceConnectionInfo; +import org.jetbrains.annotations.Nullable; import javax.swing.Icon; import javax.swing.JComponent; @@ -169,6 +170,7 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta private WindowAdapter windowAdapter = new WindowAdapter() { + @Override public void windowOpened(WindowEvent e) { } @@ -194,6 +196,7 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta private JComponent closeButton = new JComponent() { + @Override protected void paintComponent(Graphics g) { g.setColor(UIConstants.NORMAL_BACKGROUND); @@ -205,6 +208,7 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta private MouseListener closeMouseListener = new MouseAdapter() { + @Override public void mousePressed(MouseEvent e) { closeMode = UIConstants.CLOSE_PRESS_AUTHORITY; @@ -212,6 +216,7 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta closeButton.repaint(); } + @Override public void mouseExited(MouseEvent e) { closeMode = UIConstants.CLOSE_OF_AUTHORITY; @@ -219,6 +224,7 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta closeButton.repaint(); } + @Override public void mouseMoved(MouseEvent e) { closeMode = UIConstants.CLOSE_OVER_AUTHORITY; @@ -226,12 +232,14 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta closeButton.repaint(); } + @Override public void mouseReleased(MouseEvent e) { if (DesignModeContext.isAuthorityEditing()) { closeAuthorityEditing(); } } + @Override public void mouseEntered(MouseEvent e) { closeMode = UIConstants.CLOSE_OVER_AUTHORITY; @@ -255,6 +263,7 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta basePane.setLayout(new BorderLayout()); toolbarPane = new JPanel() { + @Override public Dimension getPreferredSize() { Dimension dim = super.getPreferredSize(); @@ -266,7 +275,8 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta JPanel eastPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); eastPane.add(ad.createLargeToolbar(), BorderLayout.WEST); eastCenterPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - eastCenterPane.add(combineUp = combineUpTooBar(null), BorderLayout.NORTH); + combineUpTooBar(); + eastCenterPane.add(combineUp, BorderLayout.NORTH); JPanel panel = FRGUIPaneFactory.createBorderLayout_S_Pane(); panel.add(newWorkBookPane = ad.getNewTemplatePane(), BorderLayout.WEST); panel.add(MutilTempalteTabPane.getInstance(), BorderLayout.CENTER); @@ -300,6 +310,7 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta this.addComponentListener(new ComponentAdapter() { + @Override public void componentResized(ComponentEvent e) { reCalculateFrameSize(); @@ -316,14 +327,14 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta initMenuPane(); this.progressDialog = new ProgressDialog(this); } - + public void resizeFrame() { - + HistoryTemplateListPane.getInstance().getCurrentEditingTemplate().setComposite(); reCalculateFrameSize(); HistoryTemplateListPane.getInstance().getCurrentEditingTemplate().doResize(); } - + public void closeAuthorityEditing() { DesignModeContext.switchTo(com.fr.design.base.mode.DesignerMode.NORMAL); WestRegionContainerPane.getInstance().replaceDownPane( @@ -333,7 +344,7 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta HistoryTemplateListCache.getInstance().getCurrentEditingTemplate().getToolBarMenuDockPlus()); needToAddAuhtorityPaint(); refreshDottedLine(); - fireAuthorityStateToNomal(); + fireAuthorityStateToNormal(); EventDispatcher.fire(DesignAuthorityEventType.StopEdit, DesignerFrame.this); } @@ -603,13 +614,13 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta /** * 退出权限编辑时,将所有的做过权限编辑的状态,作为一个状态赋给报、报表主体 */ - private void fireAuthorityStateToNomal() { + private void fireAuthorityStateToNormal() { java.util.List> opendedTemplate = HistoryTemplateListPane.getInstance().getHistoryList(); - for (int i = 0; i < opendedTemplate.size(); i++) { + for (JTemplate jTemplate : opendedTemplate) { // 如果在权限编辑时做过操作,则将做过的操作作为一个整体状态赋给正在报表 - if (opendedTemplate.get(i).isDoSomethingInAuthority()) { - opendedTemplate.get(i).fireAuthorityStateToNomal(); + if (jTemplate.isDoSomethingInAuthority()) { + jTemplate.fireAuthorityStateToNomal(); } } } @@ -619,31 +630,47 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta this.closeMode = closeMode; } - private UIToolbar combineUpTooBar(JComponent[] toolbar4Form) { - + /** + * 创建上工具栏 + */ + private void combineUpTooBar() { combineUp = new UIToolbar(FlowLayout.LEFT); combineUp.setBorder(new MatteBorder(new Insets(0, LEFT_ALIGN_GAP, 1, 0), UIConstants.LINE_COLOR)); combineUp.setLayout(new FlowLayout(FlowLayout.LEFT, 5, 2)); + setUpUpToolBar(null); + + } + + /** + * 重置上工具栏 + */ + private void resetCombineUpTooBar(JComponent[] toolbar4Form) { + combineUp.removeAll(); + setUpUpToolBar(toolbar4Form); + } + + /** + * 填充上工具栏的中的工具 + * + * @param toolbar4Form 目标组件 + */ + private void setUpUpToolBar(@Nullable JComponent[] toolbar4Form) { UIButton[] fixButtons = ad.createUp(); - for (int i = 0; i < fixButtons.length; i++) { - combineUp.add(fixButtons[i]); + for (UIButton fixButton : fixButtons) { + combineUp.add(fixButton); } if (!DesignerMode.isAuthorityEditing()) { combineUp.addSeparator(new Dimension(2, 16)); if (toolbar4Form != null) { - for (int i = 0; i < toolbar4Form.length; i++) { - combineUp.add(toolbar4Form[i]); + for (JComponent jComponent : toolbar4Form) { + combineUp.add(jComponent); } } } - //添加分享按钮 addShareButton(); - //添加插件中的按钮 addExtraButtons(); - - return combineUp; } private void addExtraButtons() { @@ -655,8 +682,8 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta UIButton[] extraButtons = jt.createExtraButtons(); - for (int i = 0; i < extraButtons.length; i++) { - combineUp.add(extraButtons[i]); + for (UIButton extraButton : extraButtons) { + combineUp.add(extraButton); } if (extraButtons.length > 0) { combineUp.addSeparator(new Dimension(2, 16)); @@ -672,8 +699,8 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta combineUp.addSeparator(new Dimension(2, 16)); UIButton[] shareButtons = jt.createShareButton(); - for (int i = 0; i < shareButtons.length; i++) { - combineUp.add(shareButtons[i]); + for (UIButton shareButton : shareButtons) { + combineUp.add(shareButton); } } @@ -710,25 +737,20 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta DesignState designState = new DesignState(plus); MenuManager.getInstance().setMenus4Designer(designState); - if (menuBar != null) { - menuPane.remove(menuBar); - } - menuPane.add(menuBar = ad.createJMenuBar(plus), BorderLayout.CENTER); - - if (combineUp != null) { - eastCenterPane.remove(combineUp); - combineUp = null; + if (menuBar == null) { + menuPane.add(menuBar = ad.createJMenuBar(plus), BorderLayout.CENTER); + } else { + ad.resetJMenuBar(menuBar, plus); } - // 保存撤销那些按钮的面板 - eastCenterPane.add(combineUp = combineUpTooBar(ad.resetUpToolBar(plus)), BorderLayout.NORTH); - - if (toolbarComponent != null) { - toolbarPane.remove(toolbarComponent); - } + resetCombineUpTooBar(ad.resetUpToolBar(plus)); // 颜色,字体那些按钮的工具栏 - toolbarPane.add(toolbarComponent = ad.resetToolBar(toolbarComponent, plus), BorderLayout.CENTER); + if (toolbarComponent == null) { + toolbarPane.add(toolbarComponent = ad.resetToolBar(null, plus), BorderLayout.CENTER); + } else { + ad.resetToolBar(toolbarComponent, plus); + } this.checkToolbarMenuEnable(); this.validate(); @@ -751,7 +773,7 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta Set extraShortCuts = ExtraDesignClassManager.getInstance().getExtraShortCuts(); for (ShortCut shortCut : extraShortCuts) { if (shortCut instanceof AbstractTemplateTreeShortCutProvider) { - ((AbstractTemplateTreeShortCutProvider) shortCut).notifyFromAuhtorityChange(DesignerMode.isAuthorityEditing()); + shortCut.notifyFromAuhtorityChange(DesignerMode.isAuthorityEditing()); } } } @@ -949,6 +971,7 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta * * @param e 事件 */ + @Override public void targetModified(TargetModifiedEvent e) { this.checkToolbarMenuEnable(); @@ -959,6 +982,7 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta * * @param jt 模板 */ + @Override public void templateClosed(JTemplate jt) { } @@ -968,6 +992,7 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta * * @param jt 模板 */ + @Override public void templateOpened(JTemplate jt) { } @@ -977,6 +1002,7 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta * * @param jt 模板 */ + @Override public void templateSaved(JTemplate jt) { this.checkToolbarMenuEnable(); diff --git a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java index b48433c5c..ff831160b 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java @@ -210,15 +210,17 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt /** * 添加VcsAction + * * @param toolbarDef */ private void addVcsAction(ToolBarDef toolbarDef) { if (VcsHelper.getInstance().needInit()) { vcsAction = new VcsAction(); - if (FineClusterConfig.getInstance().isCluster()) { - vcsAction.setName(Toolkit.i18nText("Fine-Design_Vcs_NotSupportRemote")); - } else { + + if (WorkContext.getCurrent().isLocal()) { vcsAction.setName(Toolkit.i18nText("Fine-Design_Vcs_Title")); + } else { + vcsAction.setName(Toolkit.i18nText("Fine-Design_Vcs_NotSupportRemote")); } toolbarDef.addShortCut(vcsAction); @@ -367,8 +369,6 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt } - - if (WorkContext.getCurrent() != null) { if (!WorkContext.getCurrent().isLocal()) { //当前环境为远程环境时 @@ -532,7 +532,7 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt String oldName = fnf.getName(); String suffix = fnf.isDirectory() ? StringUtils.EMPTY : oldName.substring(oldName.lastIndexOf(CoreConstants.DOT), oldName.length()); - oldName = oldName.replace(suffix, StringUtils.EMPTY); + oldName = StringUtils.replaceLast(oldName, suffix, StringUtils.EMPTY); this.setLayout(new BorderLayout()); this.setModal(true); @@ -651,7 +651,7 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt String oldName = fnf.getName(); String suffix = fnf.isDirectory() ? StringUtils.EMPTY : oldName.substring(oldName.lastIndexOf(CoreConstants.DOT), oldName.length()); - oldName = oldName.replaceAll(suffix, StringUtils.EMPTY); + oldName = StringUtils.replaceLast(oldName, suffix, StringUtils.EMPTY); // 输入为空或者没有修改 if (ComparatorUtils.equals(userInput, oldName)) { diff --git a/designer-base/src/main/java/com/fr/design/mainframe/JTemplateFactory.java b/designer-base/src/main/java/com/fr/design/mainframe/JTemplateFactory.java index 1c6866535..c6a6f4a0d 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/JTemplateFactory.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/JTemplateFactory.java @@ -60,4 +60,4 @@ public final class JTemplateFactory { ALL_APP.remove(app); } } -} +} \ No newline at end of file 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 8a739f54f..262dbe6d5 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 @@ -47,20 +47,20 @@ import com.fr.design.gui.imenu.UIMenu; import com.fr.design.gui.imenu.UIMenuBar; import com.fr.design.gui.itoolbar.UILargeToolbar; import com.fr.design.gui.itoolbar.UIToolbar; +import com.fr.design.locale.impl.SupportLocaleImpl; import com.fr.design.mainframe.JTemplate; import com.fr.design.mainframe.ToolBarNewTemplatePane; import com.fr.design.menu.MenuDef; import com.fr.design.menu.SeparatorDef; import com.fr.design.menu.ShortCut; import com.fr.design.menu.ToolBarDef; -import com.fr.design.update.actions.SoftwareUpdateAction; import com.fr.design.remote.action.RemoteDesignAuthManagerAction; +import com.fr.design.update.actions.SoftwareUpdateAction; import com.fr.design.utils.ThemeUtils; import com.fr.general.ComparatorUtils; import com.fr.general.GeneralContext; import com.fr.general.locale.LocaleAction; import com.fr.general.locale.LocaleCenter; -import com.fr.design.locale.impl.SupportLocaleImpl; import com.fr.log.FineLoggerFactory; import com.fr.plugin.context.PluginContext; import com.fr.plugin.context.PluginRuntime; @@ -72,6 +72,7 @@ import com.fr.stable.ArrayUtils; import com.fr.stable.StringUtils; import com.fr.start.OemHandler; import com.fr.workspace.WorkContext; +import org.jetbrains.annotations.Nullable; import javax.swing.JComponent; import javax.swing.JMenuBar; @@ -197,14 +198,30 @@ public abstract class ToolBarMenuDock { */ public final JMenuBar createJMenuBar(ToolBarMenuDockPlus plus) { UIMenuBar jMenuBar = new UIMenuBar() { + private Dimension dim; + @Override public Dimension getPreferredSize() { - Dimension dim = super.getPreferredSize(); - dim.height = MENUBAR_HEIGHT; + if (dim == null) { + dim = super.getPreferredSize(); + dim.height = MENUBAR_HEIGHT; + } return dim; } }; + resetJMenuBar(jMenuBar, plus); + return jMenuBar; + } + + /** + * 重置菜单栏 + * + * @param jMenuBar 当前菜单栏 + * @param plus 对象 + */ + public final void resetJMenuBar(JMenuBar jMenuBar, ToolBarMenuDockPlus plus) { + jMenuBar.removeAll(); this.menus = menus(plus); try { OemProcessor oemProcessor = OemHandler.findOem(); @@ -218,13 +235,12 @@ public abstract class ToolBarMenuDock { FineLoggerFactory.getLogger().error(e.getMessage(), e); this.menus = menus(plus); } - for (int i = 0; i < menus.length; i++) { - menus[i].setHasRecMenu(true); - UIMenu subMenu = menus[i].createJMenu(); + for (MenuDef menu : menus) { + menu.setHasRecMenu(true); + UIMenu subMenu = menu.createJMenu(); jMenuBar.add(subMenu); - menus[i].updateMenu(); + menu.updateMenu(); } - return jMenuBar; } ////////////////////////////////////////////////////////////////////////////////////////// @@ -585,7 +601,7 @@ public abstract class ToolBarMenuDock { * @param plus 对象 * @return 工具栏 */ - public JComponent resetToolBar(JComponent toolbarComponent, ToolBarMenuDockPlus plus) { + public JComponent resetToolBar(@Nullable JComponent toolbarComponent, ToolBarMenuDockPlus plus) { ToolBarDef[] plusToolBarDefs = plus.toolbars4Target(); UIToolbar toolBar; if (toolbarComponent instanceof UIToolbar) { @@ -599,8 +615,7 @@ public abstract class ToolBarMenuDock { toolBarDef = new ToolBarDef(); if (plusToolBarDefs != null) { - for (int i = 0; i < plusToolBarDefs.length; i++) { - ToolBarDef def = plusToolBarDefs[i]; + for (ToolBarDef def : plusToolBarDefs) { for (int di = 0, dlen = def.getShortCutCount(); di < dlen; di++) { toolBarDef.addShortCut(def.getShortCut(di)); } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/toolbar/UpdateActionManager.java b/designer-base/src/main/java/com/fr/design/mainframe/toolbar/UpdateActionManager.java index 7f6ec1eb7..5a1b9de6c 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/toolbar/UpdateActionManager.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/toolbar/UpdateActionManager.java @@ -13,6 +13,8 @@ import com.fr.general.ComparatorUtils; import com.fr.general.GeneralUtils; import com.fr.log.FineLoggerFactory; import com.fr.stable.StableUtils; +import com.fr.value.NotNullLazyValue; +import org.jetbrains.annotations.NotNull; import javax.swing.*; import java.util.HashMap; @@ -36,6 +38,22 @@ public class UpdateActionManager { private static boolean isRegisterIndexSearchTextTask = false; + private boolean afterStartup = false; + + private NotNullLazyValue isCacheValid = new NotNullLazyValue() { + @NotNull + @Override + protected Boolean compute() { + // 缓存是否有效。 + // 注意:开发工程版本为不是安装版本, + // 索引只会出现在首次启动。 + return ComparatorUtils.equals(GeneralUtils.readBuildNO(), AlphaFineConfigManager.getInstance().getCacheBuildNO()); + } + }; + + private ExecutorService searchPool = Executors + .newSingleThreadExecutor(new NamedThreadFactory("IndexAlphaFineSearchText", true)); + /** * 限制初始化 */ @@ -78,35 +96,27 @@ public class UpdateActionManager { * 1.首次索引或缓存失效的时候(更新版本会使缓存失效),会将索引缓存存到env.xml, * 下次直接加载。 * 2.需要重新索引,则等待设计器初始化完毕之后单线程运行索引任务。 + * 3.集中索引结束之后,每次添加为增量索引。 * * @param paneClass 面板类名 * @param updateAction 待处理的updateAction */ public void dealWithSearchText(String paneClass, UpdateAction updateAction) { Map actionSearchTextCache = AlphaFineConfigManager.getInstance().getActionSearchTextCache(); - if (!cacheValid() - || actionSearchTextCache.isEmpty() - || !actionSearchTextCache.containsKey(paneClass)) { - if (!updateActionsIndexCache.containsKey(paneClass)) { - updateActionsIndexCache.put(paneClass, updateAction); - } - registerIndexSearchTextTask(); - } else { + if (isCacheValid.getValue() && actionSearchTextCache.containsKey(paneClass)) { updateAction.setSearchText(actionSearchTextCache.get(paneClass)); + } else { + if (afterStartup) { + incrementIndexSearchTextTask(paneClass, updateAction); + } else { + if (!updateActionsIndexCache.containsKey(paneClass)) { + updateActionsIndexCache.put(paneClass, updateAction); + } + registerIndexSearchTextTask(); + } } } - /** - * 缓存是否有效。 - * 注意:开发工程版本为不是安装版本, - * 索引只会出现在首次启动。 - * - * @return true有效,false失效 - */ - private boolean cacheValid() { - return ComparatorUtils.equals(GeneralUtils.readBuildNO(), AlphaFineConfigManager.getInstance().getCacheBuildNO()); - } - /** * 由于是UI线程不考虑并发问题 */ @@ -116,26 +126,30 @@ public class UpdateActionManager { } isRegisterIndexSearchTextTask = true; // 没有缓存或者缓存失效的时候,等待设计器启动之后开始索引任务 - EventDispatcher.listen(DesignerLaunchStatus.OPEN_LAST_FILE_COMPLETE, new Listener() { + EventDispatcher.listen(DesignerLaunchStatus.STARTUP_COMPLETE, new Listener() { @Override public void on(Event event, Null param) { - // 使用单线程索引 - ExecutorService es = Executors.newSingleThreadExecutor(new NamedThreadFactory("IndexAlphaFineSearchText")); + afterStartup = true; for (Map.Entry cache : updateActionsIndexCache.entrySet()) { - es.execute(new IndexTask(cache.getKey(), cache.getValue())); + searchPool.execute(new IndexTask(cache.getKey(), cache.getValue())); } - updateActionsIndexCache = null; - es.shutdown(); + updateActionsIndexCache.clear(); // 标记一下缓存版本 AlphaFineConfigManager.getInstance().setCacheBuildNO(GeneralUtils.readBuildNO()); } }); } + private void incrementIndexSearchTextTask(String key, UpdateAction action) { + searchPool.execute(new IndexTask(key, action)); + // 标记一下缓存版本 + AlphaFineConfigManager.getInstance().setCacheBuildNO(GeneralUtils.readBuildNO()); + } + /** * 索引任务 */ - class IndexTask implements Runnable { + static class IndexTask implements Runnable { private String className; private UpdateAction updateAction; diff --git a/designer-base/src/main/java/com/fr/design/mainframe/toolbar/UpdateActionModel.java b/designer-base/src/main/java/com/fr/design/mainframe/toolbar/UpdateActionModel.java index cb16c62ee..e3af1bcba 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/toolbar/UpdateActionModel.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/toolbar/UpdateActionModel.java @@ -32,15 +32,22 @@ public class UpdateActionModel { * @param action */ private void setSearchKey(String parentName, UpdateAction action) { - StringBuffer buffer = new StringBuffer(); if (actionName == null) { return; } - buffer.append(parentName).append(SEPARATOR).append(PinyinHelper.convertToPinyinString(parentName, "", PinyinFormat.WITHOUT_TONE)) - .append(SEPARATOR).append(PinyinHelper.getShortPinyin(parentName)).append(SEPARATOR) - .append(actionName).append(SEPARATOR).append(PinyinHelper.convertToPinyinString(actionName, "", PinyinFormat.WITHOUT_TONE)) - .append(SEPARATOR).append(PinyinHelper.getShortPinyin(actionName)).append(action.getSearchText()); - this.searchKey = buffer.toString().toLowerCase(); + String buffer = parentName + + SEPARATOR + + PinyinHelper.convertToPinyinString(parentName, "", PinyinFormat.WITHOUT_TONE) + + SEPARATOR + + PinyinHelper.getShortPinyin(parentName) + + SEPARATOR + + actionName + + SEPARATOR + + PinyinHelper.convertToPinyinString(actionName, "", PinyinFormat.WITHOUT_TONE) + + SEPARATOR + + PinyinHelper.getShortPinyin(actionName) + + action.getSearchText(); + this.searchKey = buffer.toLowerCase(); } /** diff --git a/designer-base/src/main/java/com/fr/design/mainframe/vcs/common/VcsHelper.java b/designer-base/src/main/java/com/fr/design/mainframe/vcs/common/VcsHelper.java index 0b3213ac5..4f447eaef 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/vcs/common/VcsHelper.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/vcs/common/VcsHelper.java @@ -20,6 +20,7 @@ import com.fr.stable.project.ProjectConstants; import com.fr.workspace.WorkContext; import com.fr.workspace.server.vcs.VcsOperator; import com.fr.workspace.server.vcs.filesystem.VcsFileSystem; +import com.fr.workspace.server.vcs.git.config.GcConfig; import javax.swing.Icon; import javax.swing.border.EmptyBorder; @@ -146,6 +147,9 @@ public class VcsHelper implements JTemplateActionListener { if (needDeleteVersion(oldEntity)) { operator.deleteVersion(oldEntity.getFilename(), oldEntity.getVersion()); } + if (GcConfig.getInstance().isGcEnable()) { + operator.gc(); + } } }).start(); diff --git a/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/FileVersionCellEditor.java b/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/FileVersionCellEditor.java index 125d4bc4e..bf5b8ba45 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/FileVersionCellEditor.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/FileVersionCellEditor.java @@ -10,6 +10,7 @@ import com.fr.design.mainframe.vcs.common.VcsCacheFileNodeFile; import com.fr.file.filetree.FileNode; import com.fr.general.ComparatorUtils; import com.fr.report.entity.VcsEntity; +import com.fr.stable.AssistUtils; import com.fr.stable.StringUtils; import com.fr.workspace.WorkContext; import com.fr.workspace.server.vcs.VcsOperator; @@ -67,7 +68,7 @@ public class FileVersionCellEditor extends AbstractCellEditor implements TableCe } double height = editor.getPreferredSize().getHeight(); - if (table.getRowHeight(row) != height) { + if (!AssistUtils.equals(table.getRowHeight(row), height)) { table.setRowHeight(row, (int) height + VcsHelper.OFFSET); } return editor; diff --git a/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/FileVersionCellRender.java b/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/FileVersionCellRender.java index 40fa02c1f..d97e1efb1 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/FileVersionCellRender.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/FileVersionCellRender.java @@ -2,6 +2,7 @@ package com.fr.design.mainframe.vcs.ui; import com.fr.design.mainframe.vcs.common.VcsHelper; import com.fr.report.entity.VcsEntity; +import com.fr.stable.AssistUtils; import javax.swing.JPanel; import javax.swing.JTable; @@ -34,7 +35,7 @@ public class FileVersionCellRender implements TableCellRenderer { editor.setBackground(isSelected ? TABLE_SELECT_BACKGROUND : TREE_BACKGROUND); double height = editor.getPreferredSize().getHeight(); - if (table.getRowHeight(row) != height) { + if (!AssistUtils.equals(table.getRowHeight(row), height)) { table.setRowHeight(row, (int) height + VcsHelper.OFFSET); } return editor; diff --git a/designer-base/src/main/java/com/fr/design/remote/action/RemoteDesignAuthManagerAction.java b/designer-base/src/main/java/com/fr/design/remote/action/RemoteDesignAuthManagerAction.java index ff96907a7..63929685d 100644 --- a/designer-base/src/main/java/com/fr/design/remote/action/RemoteDesignAuthManagerAction.java +++ b/designer-base/src/main/java/com/fr/design/remote/action/RemoteDesignAuthManagerAction.java @@ -9,6 +9,7 @@ import com.fr.design.mainframe.DesignerContext; import com.fr.design.remote.ui.AuthorityManagerPane; import com.fr.log.FineLoggerFactory; import com.fr.report.DesignAuthority; +import com.fr.stable.ArrayUtils; import com.fr.workspace.WorkContext; import com.fr.workspace.server.authority.AuthorityOperator; @@ -22,6 +23,7 @@ public class RemoteDesignAuthManagerAction extends UpdateAction { public RemoteDesignAuthManagerAction() { this.setName(Toolkit.i18nText("Fine-Design_Basic_Remote_Design_Authority_Manager")); + // 远程设计权限管理 this.setSmallIcon(BaseUtils.readIcon("com/fr/design/remote/images/icon_Remote_Design_Auth_Manager_normal@1x.png")); } @@ -36,9 +38,13 @@ public class RemoteDesignAuthManagerAction extends UpdateAction { if (!WorkContext.getCurrent().isLocal()) { try { // 远程设计获取全部设计成员的权限列表 - DesignAuthority[] authorities = WorkContext.getCurrent().get(AuthorityOperator.class).getAuthorities(); - if (authorities != null && authorities.length != 0) { - managerPane.populate(authorities); + DesignAuthority[] userAuthorities = WorkContext.getCurrent().get(AuthorityOperator.class).getUserAuthorities(); + DesignAuthority[] customAuthorities = WorkContext.getCurrent().get(AuthorityOperator.class).getCustomRoleAuthorities(); + if (userAuthorities != null && userAuthorities.length != 0) { + managerPane.populateByUser(userAuthorities); + } + if (customAuthorities != null && customAuthorities.length != 0) { + managerPane.populateByCustom(customAuthorities); } } catch (Exception exception) { FineLoggerFactory.getLogger().error(exception.getMessage(), exception); @@ -49,7 +55,9 @@ public class RemoteDesignAuthManagerAction extends UpdateAction { @Override public void doOk() { - DesignAuthority[] authorities = managerPane.update(); + DesignAuthority[] userAuthorities = managerPane.updateByUser(); + DesignAuthority[] customRoleAuthorities = managerPane.updateByCustom(); + DesignAuthority[] authorities = ArrayUtils.addAll(userAuthorities, customRoleAuthorities); if (!WorkContext.getCurrent().isLocal()) { boolean success = false; try { diff --git a/designer-base/src/main/java/com/fr/design/remote/constants/MemberIcon.java b/designer-base/src/main/java/com/fr/design/remote/constants/MemberIcon.java new file mode 100644 index 000000000..ccf1e66fd --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/remote/constants/MemberIcon.java @@ -0,0 +1,14 @@ +package com.fr.design.remote.constants; + +/** + * @author Lucian.Chen + * @version 10.0 + * Created by Lucian.Chen on 2019/9/23 + */ +public class MemberIcon { + + public static final String CUSTOM_ROLE_ICON = "com/fr/design/remote/images/icon_Custom_Role_normal@1x.png"; + + public static final String USER_ICON = "com/fr/design/remote/images/icon_Member_normal@1x.png"; + +} diff --git a/designer-base/src/main/java/com/fr/design/remote/ui/AuthorityListControlPane.java b/designer-base/src/main/java/com/fr/design/remote/ui/AbstractListControlPane.java similarity index 89% rename from designer-base/src/main/java/com/fr/design/remote/ui/AuthorityListControlPane.java rename to designer-base/src/main/java/com/fr/design/remote/ui/AbstractListControlPane.java index 1d027ac8a..c41e4800a 100644 --- a/designer-base/src/main/java/com/fr/design/remote/ui/AuthorityListControlPane.java +++ b/designer-base/src/main/java/com/fr/design/remote/ui/AbstractListControlPane.java @@ -40,10 +40,15 @@ import java.awt.event.ActionEvent; import java.util.ArrayList; import java.util.List; -public class AuthorityListControlPane extends BasicPane { +/** + * 左侧面板的基类 + * @author Lucian.Chen + * @version 10.0 + * Created by Lucian.Chen on 2019/9/19 + */ +public abstract class AbstractListControlPane extends BasicPane { - - private static final String LIST_NAME = "AuthorityListControlPaneList"; + private static final String LIST_NAME = "AbstractListControlPane"; private static final String UNSELECTED_EDITOR_NAME = "UNSELECTED"; private static final String SELECTED_EDITOR_NAME = "SELECTED"; @@ -68,7 +73,7 @@ public class AuthorityListControlPane extends BasicPane { private UIToolbar toolBar; - public AuthorityListControlPane() { + public AbstractListControlPane() { super(); initComponentPane(); } @@ -76,13 +81,8 @@ public class AuthorityListControlPane extends BasicPane { private void initComponentPane() { this.setLayout(FRGUIPaneFactory.createBorderLayout()); - this.authorityCreators = new RemoteDesignAuthorityCreator[]{ - new RemoteDesignAuthorityCreator( - Toolkit.i18nText("Fine-Design_Basic_Remote_Design_User"), - BaseUtils.readIcon("com/fr/design/remote/images/icon_Member_normal@1x.png"), - DesignAuthority.class, - AuthorityEditorPane.class) - }; + this.authorityCreators = getAuthorityCreators(); + editorCtrl = new ListEditorControlPane(); // 左侧列表面板 @@ -107,6 +107,7 @@ public class AuthorityListControlPane extends BasicPane { checkButtonEnabled(); } + protected abstract RemoteDesignAuthorityCreator[] getAuthorityCreators(); private void initLeftToolbar(JPanel leftPane) { shortCuts = createShortcuts(); @@ -139,17 +140,19 @@ public class AuthorityListControlPane extends BasicPane { if (hasInvalid()) { return; } - AuthorityListControlPane.this.editorCtrl.update(); - AuthorityListControlPane.this.editorCtrl.populate(); - AuthorityListControlPane.this.checkButtonEnabled(); + AbstractListControlPane.this.editorCtrl.update(); + AbstractListControlPane.this.editorCtrl.populate(); + AbstractListControlPane.this.checkButtonEnabled(); } } }); } + protected abstract AuthorityListCellRenderer getAuthorityListCellRender(); + private AuthorityList createList() { AuthorityList list = new AuthorityList(new DefaultListModel()); - list.setCellRenderer(new AuthorityListCellRenderer()); + list.setCellRenderer(getAuthorityListCellRender()); return list; } @@ -168,7 +171,9 @@ public class AuthorityListControlPane extends BasicPane { this.editorCtrl.update(); DefaultListModel listModel = (DefaultListModel) this.authorityList.getModel(); for (int i = 0, len = listModel.getSize(); i < len; i++) { - res.add((DesignAuthority) listModel.getElementAt(i)); + DesignAuthority authority = (DesignAuthority) listModel.getElementAt(i); +// authority.setRoleType(RoleType.USER); + res.add(authority); } return res.toArray(new DesignAuthority[res.size()]); } @@ -315,7 +320,7 @@ public class AuthorityListControlPane extends BasicPane { public void checkEnable() { this.shortCut.setEnabled(authorityList.getModel() .getSize() > 0 - && AuthorityListControlPane.this.authorityList.getSelectedIndex() != -1); + && AbstractListControlPane.this.authorityList.getSelectedIndex() != -1); } } @@ -356,13 +361,13 @@ public class AuthorityListControlPane extends BasicPane { } private boolean hasInvalid() { - int idx = AuthorityListControlPane.this.getInValidIndex(); + int idx = AbstractListControlPane.this.getInValidIndex(); if (authorityList.getSelectedIndex() != idx) { try { checkValid(); } catch (Exception exp) { FineLoggerFactory.getLogger().error(exp.getMessage(), exp); - JOptionPane.showMessageDialog(AuthorityListControlPane.this, exp.getMessage()); + JOptionPane.showMessageDialog(AbstractListControlPane.this, exp.getMessage()); authorityList.setSelectedIndex(idx); return true; } @@ -442,7 +447,7 @@ public class AuthorityListControlPane extends BasicPane { } public void populate() { - authority = AuthorityListControlPane.this.authorityList.getSelectedValue(); + authority = AbstractListControlPane.this.authorityList.getSelectedValue(); if (authority == null) { return; @@ -485,6 +490,10 @@ public class AuthorityListControlPane extends BasicPane { } } + protected abstract AbstractManagerPane getManagerPane(); + + protected abstract String getKey(); + /** * 选择按钮 */ @@ -498,17 +507,17 @@ public class AuthorityListControlPane extends BasicPane { @Override public void actionPerformed(ActionEvent e) { - final UserManagerPane userManagerPane = new UserManagerPane(); - BasicDialog dialog = userManagerPane.showWindow(SwingUtilities.getWindowAncestor(AuthorityListControlPane.this)); + final AbstractManagerPane managerPane = getManagerPane(); + BasicDialog dialog = managerPane.showWindow(SwingUtilities.getWindowAncestor(AbstractListControlPane.this)); // 刷新用户管理面板展示信息 - final DesignAuthority[] authorities = AuthorityListControlPane.this.update(); + final DesignAuthority[] authorities = AbstractListControlPane.this.update(); dialog.addDialogActionListener(new DialogActionAdapter() { @Override public void doOk() { // 获取添加的用户到权限编辑面板 - List members = userManagerPane.update(); + List members = managerPane.update(); List oldAuthorities = new ArrayList<>(); @@ -529,6 +538,7 @@ public class AuthorityListControlPane extends BasicPane { authority.setUsername(member.getUsername()); authority.setUserId(member.getUserId()); authority.setRealName(member.getRealName()); + authority.setRoleType(member.getRoleType()); addAuthority(authority, getModel().getSize()); } @@ -543,9 +553,11 @@ public class AuthorityListControlPane extends BasicPane { m.setUserId(authority.getUserId()); m.setRealName(authority.getRealName()); m.setSelected(true); + m.setRoleType(authority.getRoleType()); + m.setAuthority(true); members.add(m); } - userManagerPane.populate(members); + managerPane.populate(members); dialog.setModal(true); dialog.setVisible(true); @@ -567,7 +579,7 @@ public class AuthorityListControlPane extends BasicPane { public void actionPerformed(ActionEvent evt) { doBeforeRemove(); if (GUICoreUtils.removeJListSelectedNodes(SwingUtilities - .getWindowAncestor(AuthorityListControlPane.this), authorityList)) { + .getWindowAncestor(AbstractListControlPane.this), authorityList, getKey())) { checkButtonEnabled(); doAfterRemove(); } diff --git a/designer-base/src/main/java/com/fr/design/remote/ui/AbstractManagerPane.java b/designer-base/src/main/java/com/fr/design/remote/ui/AbstractManagerPane.java new file mode 100644 index 000000000..1b8b71dc4 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/remote/ui/AbstractManagerPane.java @@ -0,0 +1,440 @@ +package com.fr.design.remote.ui; + +import com.fr.base.BaseUtils; +import com.fr.design.constants.LayoutConstants; +import com.fr.design.dialog.BasicPane; +import com.fr.design.gui.ibutton.UIButton; +import com.fr.design.gui.icontainer.UIScrollPane; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.gui.itextfield.UITextField; +import com.fr.design.i18n.Toolkit; +import com.fr.design.layout.TableLayout; +import com.fr.design.layout.TableLayoutHelper; +import com.fr.design.remote.ui.list.AddedMemberList; +import com.fr.design.remote.ui.list.AddedMemberListCellRender; +import com.fr.design.remote.ui.list.AddingMemberList; +import com.fr.design.remote.ui.list.AddingMemberListCellRender; +import com.fr.design.remote.ui.list.MemberListSelectedChangeListener; +import com.fr.stable.StringUtils; +import com.fr.third.guava.collect.ImmutableList; +import com.fr.workspace.WorkContext; +import com.fr.workspace.server.authority.RemoteDesignMember; + +import javax.swing.BorderFactory; +import javax.swing.DefaultListModel; +import javax.swing.JPanel; +import javax.swing.JViewport; +import javax.swing.ListSelectionModel; +import javax.swing.SwingWorker; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Component; +import java.awt.Dimension; +import java.awt.FlowLayout; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.AdjustmentEvent; +import java.awt.event.AdjustmentListener; +import java.awt.event.KeyAdapter; +import java.awt.event.KeyEvent; +import java.awt.event.MouseWheelEvent; +import java.awt.event.MouseWheelListener; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.List; + + +/** + * 选择设计角色、用户面板的基类 + * @author yaohwu + */ +public abstract class AbstractManagerPane extends BasicPane { + + /** + * 每页个数 + */ + private static final int DEFAULT_NUM_EACH_PAGE = 50; + + /** + * 获取的决策平台用户 + */ + private final List addingMembers = new ArrayList<>(); + /** + * 添加到设计的决策平台用户 + */ + private List addedMembers = new ArrayList<>(); + + /** + * 决策平台用户列表model + */ + private DefaultListModel addingListModel = new DefaultListModel<>(); + /** + * 搜索输入框 + */ + private UITextField keyField = new UITextField(); + /** + * 搜索按钮 + */ + private UIButton keyButton = new UIButton(); + + /** + * 搜索按钮绑定事件 + */ + private ActionListener keyButtonActionListener = new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + searchAddingMembers(keyWord); + } + }; + + /** + * 输入框绑定事件 + */ + private KeyAdapter keyFieldKeyListener = new KeyAdapter() { + + @Override + public void keyPressed(KeyEvent e) { + // 判断按下的键是否是回车键 + // 对话框回车键绑定的是对话框的确定按钮 + if (e.getKeyCode() == KeyEvent.VK_ENTER) { + searchAddingMembers(keyWord); + // has been processed + e.consume(); + } + } + }; + /** + * 添加到设计的决策用户计数标签 + */ + private UILabel countLabel = new UILabel(); + /** + * 添加到设计的决策用户计数标签 + */ + private DefaultListModel addedListModel; + + + /** + * 左侧列表变动事件 + */ + private MemberListSelectedChangeListener addingListChangeListener = new MemberListSelectedChangeListener() { + @Override + public void selectedChange() { + sync2AddedMembersFromAdding(); + // 刷新右侧列表显示 + addToAddedMemberList(); + } + }; + + /** + * 右侧列表变动事件 + */ + private MemberListSelectedChangeListener addedListChangeListener = new MemberListSelectedChangeListener() { + @Override + public void selectedChange() { + addingList.revalidate(); + addingList.repaint(); + resetAddedMembers(); + sync2AddedMembersFormAdded(); + // 不需要重复更新右侧列表显示 但是更新一下计数显示 + countLabel.setText( + Toolkit.i18nText("Fine-Design_Basic_Remote_Design_Selected_Member_Count", + String.valueOf(addedMembers.size()) + ) + ); + // 刷新左侧列表显示 + addToMemberList(); + } + }; + + + /** + * 已经添加的用户列表 + */ + private AddedMemberList addedList; + /** + * 待添加的用户列表 + */ + private AddingMemberList addingList; + + /** + * 搜索关键字 + */ + private String keyWord; + + /** + * 搜索关键词变更监听 + */ + private transient DocumentListener documentListener = new DocumentListener() { + @Override + public void insertUpdate(DocumentEvent e) { + keyWord = keyField.getText(); + } + + @Override + public void removeUpdate(DocumentEvent e) { + keyWord = keyField.getText(); + } + + @Override + public void changedUpdate(DocumentEvent e) { + keyWord = keyField.getText(); + } + }; + + /** + * 当前分页计数 + */ + private int pageNum = 1; + + + public AbstractManagerPane() { + this.setBorder(BorderFactory.createEmptyBorder(0, 4, 0, 4)); + this.setLayout(new BorderLayout()); + this.add( + TableLayoutHelper.createCommonTableLayoutPane( + new Component[][]{ + new Component[]{createLeftPanel(), createRightPanel()} + }, + new double[]{TableLayout.FILL}, + new double[]{TableLayout.FILL, TableLayout.FILL}, + LayoutConstants.VGAP_LARGE + ), + BorderLayout.CENTER); + } + + public void populate(List addedMembers) { + + // 已选信息 + resetAddedMembers(); + this.addedMembers.addAll(addedMembers); + + // 刷新右侧面板 + addToAddedMemberList(); + + // 刷新左侧展示信息 + addToMemberList(); + } + + + @Override + protected String title4PopupWindow() { + // 选择设计用户 + return Toolkit.i18nText("Fine-Design_Basic_Remote_Design_Choose_User"); + } + + protected abstract JPanel leftPanel(); + + private JPanel createLeftPanel() { + JPanel content = leftPanel(); + + // 搜索 + JPanel searchPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 5)); + searchPanel.setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 5)); + keyField.setPreferredSize(new Dimension(270, 20)); + keyField.requestFocus(); + keyField.addKeyListener(keyFieldKeyListener); + keyField.getDocument().addDocumentListener(documentListener); + keyButton.setIcon(BaseUtils.readIcon("com/fr/design/images/buttonicon/user_search_normal.png")); + keyButton.setToolTipText(Toolkit.i18nText("Fine-Design_Basic_Remote_Design_Search")); + keyButton.addActionListener(keyButtonActionListener); + searchPanel.add(keyField); + searchPanel.add(keyButton); + + // 内容列表 + addingListModel = new DefaultListModel<>(); + addingList = new AddingMemberList(addingListModel); + addingList.setCellRenderer(getAddingMemberListCellRender()); + addingList.addSelectedChangeListener(addingListChangeListener); + resetMembers(); + addToMemberList(); + searchAddingMembers(StringUtils.EMPTY); + final UIScrollPane listPane = new UIScrollPane(addingList); + listPane.addMouseWheelListener(new MouseWheelListener() { + @Override + public void mouseWheelMoved(MouseWheelEvent e) { + JViewport vp = listPane.getViewport(); + if (vp.getView().getHeight() <= vp.getHeight() + vp.getViewPosition().y) { + loadMoreAddingMembers(keyWord, DEFAULT_NUM_EACH_PAGE); + } + } + }); + listPane.getVerticalScrollBar().addAdjustmentListener(new AdjustmentListener() { + @Override + public void adjustmentValueChanged(AdjustmentEvent e) { + JViewport vp = listPane.getViewport(); + if (vp.getView().getHeight() <= vp.getHeight() + vp.getViewPosition().y && e.getValueIsAdjusting()) { + loadMoreAddingMembers(keyWord, DEFAULT_NUM_EACH_PAGE); + } + } + }); + listPane.setBorder(BorderFactory.createEmptyBorder()); + + content.add(searchPanel, BorderLayout.NORTH); + content.add(listPane, BorderLayout.CENTER); + return content; + } + + protected abstract AddingMemberListCellRender getAddingMemberListCellRender(); + + protected abstract AddedMemberListCellRender getAddedMemberListCellRender(); + + protected abstract JPanel rightPanel(); + + private JPanel createRightPanel() { + JPanel content = rightPanel(); + + // 计数 + countLabel.setText( + // 已选择{}人 + Toolkit.i18nText("Fine-Design_Basic_Remote_Design_Selected_Member_Count", + String.valueOf(addedMembers.size())) + ); + countLabel.setBorder(BorderFactory.createEmptyBorder(7, 12, 8, 0)); + countLabel.setForeground(new Color(0x8F8F92)); + + addedListModel = new DefaultListModel<>(); + addedList = new AddedMemberList(addedListModel); + addedList.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); + addedList.setCellRenderer(getAddedMemberListCellRender()); + addedList.addSelectedChangeListener(addedListChangeListener); + resetAddedMembers(); + addToAddedMemberList(); + UIScrollPane listPane = new UIScrollPane(addedList); + listPane.setBorder(BorderFactory.createEmptyBorder()); + + content.add(countLabel, BorderLayout.NORTH); + content.add(listPane, BorderLayout.CENTER); + return content; + + } + + + private void addToMemberList() { + addingListModel.clear(); + for (RemoteDesignMember member : addingMembers) { + // 如果包含在右侧列表中,那么左侧列表默认选中 + if (addedMembers.contains(member)) { + member.setAuthority(true); + member.setSelected(true); + } else { + member.setAuthority(false); + member.setSelected(false); + } + addingListModel.addElement(member); + } + addingList.revalidate(); + addingList.repaint(); + } + + private void addToAddedMemberList() { + addedListModel.clear(); + for (RemoteDesignMember member : addedMembers) { + addedListModel.addElement(member); + } + addedList.revalidate(); + addedList.repaint(); + countLabel.setText( + Toolkit.i18nText("Fine-Design_Basic_Remote_Design_Selected_Member_Count", + String.valueOf(addedMembers.size()) + )); + } + + private void resetMembers() { + addingMembers.clear(); + addingMembers.add(RemoteDesignMember.DEFAULT_MEMBER); + } + + private void resetAddedMembers() { + addedMembers.clear(); + } + + protected abstract Collection getMembers(String userName, String keyWord); + + protected abstract Collection getMembers(String userName, String keyWord, int pageNum, int count); + + private void searchAddingMembers(final String keyword) { + + final SwingWorker getMemberWorker = new SwingWorker, Void>() { + @Override + protected List doInBackground() { + String username = WorkContext.getCurrent().getConnection().getUserName(); + synchronized (addingMembers) { + addingMembers.clear(); + Collection more = getMembers(username, keyword); + pageNum = 1; + if (!more.isEmpty()) { + addingMembers.addAll(more); + if (more.size() >= DEFAULT_NUM_EACH_PAGE) { + addingMembers.add(RemoteDesignMember.DEFAULT_MEMBER); + } + } + } + return addingMembers; + } + + @Override + protected void done() { + addToMemberList(); + } + }; + getMemberWorker.execute(); + } + + private void loadMoreAddingMembers(final String keyword, final int count) { + + final SwingWorker loadMoreWorker = new SwingWorker, Void>() { + @Override + protected List doInBackground() { + + String username = WorkContext.getCurrent().getConnection().getUserName(); + synchronized (addingMembers) { + addingMembers.remove(RemoteDesignMember.DEFAULT_MEMBER); + Collection more = getMembers(username, keyword, pageNum + 1, count); + if (!more.isEmpty()) { + pageNum += 1; + addingMembers.addAll(more); + addingMembers.add(RemoteDesignMember.DEFAULT_MEMBER); + } + } + return addingMembers; + } + + @Override + protected void done() { + addToMemberList(); + } + }; + loadMoreWorker.execute(); + } + + + private void sync2AddedMembersFromAdding() { + RemoteDesignMember[] members = new RemoteDesignMember[addingListModel.getSize()]; + // shallow copy + addingListModel.copyInto(members); + for (RemoteDesignMember member : members) { + + if (!member.isSelected()) { + addedMembers.remove(member); + } + if (member.isSelected() && !addedMembers.contains(member)) { + addedMembers.add(member); + } + } + } + + private void sync2AddedMembersFormAdded() { + RemoteDesignMember[] members = new RemoteDesignMember[addedListModel.getSize()]; + // shallow copy + addedListModel.copyInto(members); + addedMembers.addAll(Arrays.asList(members)); + } + + + public ImmutableList update() { + return ImmutableList.copyOf(addedMembers); + } +} diff --git a/designer-base/src/main/java/com/fr/design/remote/ui/AuthorityEditorPane.java b/designer-base/src/main/java/com/fr/design/remote/ui/AuthorityEditorPane.java index eaa96f330..26fc0c28a 100644 --- a/designer-base/src/main/java/com/fr/design/remote/ui/AuthorityEditorPane.java +++ b/designer-base/src/main/java/com/fr/design/remote/ui/AuthorityEditorPane.java @@ -19,12 +19,15 @@ import java.awt.BorderLayout; import java.util.ArrayList; import java.util.List; +/** + * 右面板 + */ public class AuthorityEditorPane extends BasicBeanPane { private FileAuthorityTree tree = new FileAuthorityTree(); - + // 模板设计权限配置 public AuthorityEditorPane() { this.setLayout(FRGUIPaneFactory.createBorderLayout()); this.setBorder( @@ -47,6 +50,7 @@ public class AuthorityEditorPane extends BasicBeanPane { @Override protected String title4PopupWindow() { + // 编辑文件权限 return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Remote_Design_Configure_Authority"); } diff --git a/designer-base/src/main/java/com/fr/design/remote/ui/AuthorityListCustomRolePane.java b/designer-base/src/main/java/com/fr/design/remote/ui/AuthorityListCustomRolePane.java new file mode 100644 index 000000000..3ae6a097b --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/remote/ui/AuthorityListCustomRolePane.java @@ -0,0 +1,38 @@ +package com.fr.design.remote.ui; + +import com.fr.base.BaseUtils; +import com.fr.design.i18n.Toolkit; +import com.fr.design.remote.RemoteDesignAuthorityCreator; +import com.fr.design.remote.ui.list.AuthorityListCellRenderer; +import com.fr.design.remote.ui.list.cell.AuthorityCustomRoleListCellRender; +import com.fr.report.DesignAuthority; + +public class AuthorityListCustomRolePane extends AbstractListControlPane { + + @Override + protected RemoteDesignAuthorityCreator[] getAuthorityCreators() { + return new RemoteDesignAuthorityCreator[]{ + new RemoteDesignAuthorityCreator( + // 远程设计用户 + Toolkit.i18nText("Fine-Design_Basic_Remote_Design_Custom"), + BaseUtils.readIcon("com/fr/design/remote/images/icon_Member_normal@1x.png"), + DesignAuthority.class, + AuthorityEditorPane.class) + }; + } + + @Override + protected AuthorityListCellRenderer getAuthorityListCellRender() { + return new AuthorityCustomRoleListCellRender(); + } + + @Override + protected AbstractManagerPane getManagerPane() { + return new CustomRoleManagerPane(); + } + + @Override + protected String getKey() { + return "Fine-Design_Basic_Utils_Are_You_Sure_To_Delete_The_Role_And_Its_Design_Authorities"; + } +} \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/remote/ui/AuthorityListUserPane.java b/designer-base/src/main/java/com/fr/design/remote/ui/AuthorityListUserPane.java new file mode 100644 index 000000000..ccc85049a --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/remote/ui/AuthorityListUserPane.java @@ -0,0 +1,38 @@ +package com.fr.design.remote.ui; + +import com.fr.base.BaseUtils; +import com.fr.design.i18n.Toolkit; +import com.fr.design.remote.RemoteDesignAuthorityCreator; +import com.fr.design.remote.ui.list.AuthorityListCellRenderer; +import com.fr.design.remote.ui.list.cell.AuthorityUserListCellRender; +import com.fr.report.DesignAuthority; + +public class AuthorityListUserPane extends AbstractListControlPane { + + @Override + protected RemoteDesignAuthorityCreator[] getAuthorityCreators() { + return new RemoteDesignAuthorityCreator[]{ + new RemoteDesignAuthorityCreator( + // 远程设计用户 + Toolkit.i18nText("Fine-Design_Basic_Remote_Design_User"), + BaseUtils.readIcon("com/fr/design/remote/images/icon_Member_normal@1x.png"), + DesignAuthority.class, + AuthorityEditorPane.class) + }; + } + + @Override + protected AuthorityListCellRenderer getAuthorityListCellRender() { + return new AuthorityUserListCellRender(); + } + + @Override + protected AbstractManagerPane getManagerPane() { + return new UserManagerPane(); + } + + @Override + protected String getKey() { + return "Fine-Design_Basic_Utils_Are_You_Sure_To_Delete_The_User_And_Its_Design_Authorities"; + } +} \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/remote/ui/AuthorityManagerPane.java b/designer-base/src/main/java/com/fr/design/remote/ui/AuthorityManagerPane.java index 7dbf8ed4e..2e68cd27a 100644 --- a/designer-base/src/main/java/com/fr/design/remote/ui/AuthorityManagerPane.java +++ b/designer-base/src/main/java/com/fr/design/remote/ui/AuthorityManagerPane.java @@ -1,36 +1,51 @@ package com.fr.design.remote.ui; import com.fr.design.dialog.BasicPane; +import com.fr.design.gui.frpane.UITabbedPane; import com.fr.design.i18n.Toolkit; +import com.fr.design.layout.FRGUIPaneFactory; import com.fr.report.DesignAuthority; -import javax.swing.BorderFactory; import java.awt.BorderLayout; public class AuthorityManagerPane extends BasicPane { - private AuthorityListControlPane list; - + private AuthorityListUserPane userList = new AuthorityListUserPane(); + private AuthorityListCustomRolePane roleList = new AuthorityListCustomRolePane(); public AuthorityManagerPane() { - this.setLayout(new BorderLayout()); - this.setBorder(BorderFactory.createEmptyBorder()); - list = new AuthorityListControlPane(); - this.add(list, BorderLayout.CENTER); - } + this.setLayout(FRGUIPaneFactory.createBorderLayout()); + + //Tabbed Pane + UITabbedPane tabbedPane = new UITabbedPane(); + this.add(tabbedPane, BorderLayout.CENTER); + tabbedPane.addTab(Toolkit.i18nText("Fine-Design_Basic_User"), userList); + tabbedPane.addTab(Toolkit.i18nText("Fine-Design_Basic_Role"), roleList); + + } @Override protected String title4PopupWindow() { + // 远程设计权限管理 return Toolkit.i18nText("Fine-Design_Basic_Remote_Design_Authority_Manager"); } - public void populate(DesignAuthority[] authorities) { - list.populate(authorities); + public void populateByUser(DesignAuthority[] authorities) { + userList.populate(authorities); } - public DesignAuthority[] update() { - return list.update(); + public void populateByCustom(DesignAuthority[] authorities) { + roleList.populate(authorities); } + + public DesignAuthority[] updateByUser() { + return userList.update(); + } + + public DesignAuthority[] updateByCustom() { + return roleList.update(); + } + } diff --git a/designer-base/src/main/java/com/fr/design/remote/ui/CustomRoleManagerPane.java b/designer-base/src/main/java/com/fr/design/remote/ui/CustomRoleManagerPane.java new file mode 100644 index 000000000..eeedd6eca --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/remote/ui/CustomRoleManagerPane.java @@ -0,0 +1,83 @@ +package com.fr.design.remote.ui; + +import com.fr.design.border.UITitledBorder; +import com.fr.design.i18n.Toolkit; +import com.fr.design.remote.ui.list.AddedMemberListCellRender; +import com.fr.design.remote.ui.list.AddingMemberListCellRender; +import com.fr.design.remote.ui.list.cell.AddedCustomRoleListCellRender; +import com.fr.design.remote.ui.list.cell.AddingCustomRoleListCellRender; +import com.fr.workspace.WorkContext; +import com.fr.workspace.server.authority.RemoteDesignMember; +import com.fr.workspace.server.authority.decision.DecisionOperator; + +import javax.swing.BorderFactory; +import javax.swing.JPanel; +import javax.swing.border.EmptyBorder; +import java.awt.BorderLayout; +import java.util.Collection; + + +/** + * 选择设计角色 + */ +public class CustomRoleManagerPane extends AbstractManagerPane { + + @Override + protected String title4PopupWindow() { + // 选择设计角色 + return Toolkit.i18nText("Fine-Design_Basic_Remote_Design_Choose_Custom"); + } + + @Override + protected JPanel rightPanel(){ + JPanel content = new JPanel(new BorderLayout()); + + content.setBorder( + BorderFactory.createCompoundBorder( + new EmptyBorder(6, 0, 0, 0), + UITitledBorder.createBorderWithTitle( + // 已选择的设计角色 + Toolkit.i18nText("Fine-Design_Basic_Remote_Design_Selected_Custom"), + 4 + ) + ) + ); + return content; + } + + @Override + protected JPanel leftPanel(){ + JPanel content = new JPanel(new BorderLayout()); + + content.setBorder( + BorderFactory.createCompoundBorder( + new EmptyBorder(6, 0, 0, 0), + UITitledBorder.createBorderWithTitle( + // 决策系统角色 + Toolkit.i18nText("Fine-Design_Basic_Remote_Design_Decision_Custom"), + 4) + ) + ); + return content; + } + + @Override + protected AddingMemberListCellRender getAddingMemberListCellRender() { + return new AddingCustomRoleListCellRender(); + } + + @Override + protected AddedMemberListCellRender getAddedMemberListCellRender() { + return new AddedCustomRoleListCellRender(); + } + + @Override + protected Collection getMembers(String userName, String keyWord){ + return WorkContext.getCurrent().get(DecisionOperator.class).getCustoms(userName, keyWord); + } + + @Override + protected Collection getMembers(String userName, String keyWord, int pageNum, int count){ + return WorkContext.getCurrent().get(DecisionOperator.class).getCustoms(userName, keyWord, pageNum, count); + } +} diff --git a/designer-base/src/main/java/com/fr/design/remote/ui/UserManagerPane.java b/designer-base/src/main/java/com/fr/design/remote/ui/UserManagerPane.java index 8b8688e99..900f98031 100644 --- a/designer-base/src/main/java/com/fr/design/remote/ui/UserManagerPane.java +++ b/designer-base/src/main/java/com/fr/design/remote/ui/UserManagerPane.java @@ -1,450 +1,83 @@ package com.fr.design.remote.ui; -import com.fr.base.BaseUtils; import com.fr.design.border.UITitledBorder; -import com.fr.design.constants.LayoutConstants; -import com.fr.design.dialog.BasicPane; -import com.fr.design.gui.ibutton.UIButton; -import com.fr.design.gui.icontainer.UIScrollPane; -import com.fr.design.gui.ilable.UILabel; -import com.fr.design.gui.itextfield.UITextField; import com.fr.design.i18n.Toolkit; -import com.fr.design.layout.TableLayout; -import com.fr.design.layout.TableLayoutHelper; -import com.fr.design.remote.ui.list.AddedMemberList; import com.fr.design.remote.ui.list.AddedMemberListCellRender; -import com.fr.design.remote.ui.list.AddingMemberList; import com.fr.design.remote.ui.list.AddingMemberListCellRender; -import com.fr.design.remote.ui.list.MemberListSelectedChangeListener; -import com.fr.stable.StringUtils; -import com.fr.third.guava.collect.ImmutableList; +import com.fr.design.remote.ui.list.cell.AddedUserListCellRender; +import com.fr.design.remote.ui.list.cell.AddingUserListCellRender; import com.fr.workspace.WorkContext; import com.fr.workspace.server.authority.RemoteDesignMember; import com.fr.workspace.server.authority.decision.DecisionOperator; import javax.swing.BorderFactory; -import javax.swing.DefaultListModel; import javax.swing.JPanel; -import javax.swing.JViewport; -import javax.swing.ListSelectionModel; -import javax.swing.SwingWorker; import javax.swing.border.EmptyBorder; -import javax.swing.event.DocumentEvent; -import javax.swing.event.DocumentListener; import java.awt.BorderLayout; -import java.awt.Color; -import java.awt.Component; -import java.awt.Dimension; -import java.awt.FlowLayout; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.AdjustmentEvent; -import java.awt.event.AdjustmentListener; -import java.awt.event.KeyAdapter; -import java.awt.event.KeyEvent; -import java.awt.event.MouseWheelEvent; -import java.awt.event.MouseWheelListener; -import java.util.ArrayList; -import java.util.Arrays; import java.util.Collection; -import java.util.List; /** - * @author yaohwu + * 选择设计用户 */ -public class UserManagerPane extends BasicPane { - - /** - * 每页个数 - */ - private static final int DEFAULT_NUM_EACH_PAGE = 50; - - /** - * 获取的决策平台成员 - */ - private final List addingMembers = new ArrayList<>(); - /** - * 添加到设计的决策平台成员 - */ - private List addedMembers = new ArrayList<>(); - - /** - * 决策平台成员列表model - */ - private DefaultListModel addingListModel = new DefaultListModel<>(); - /** - * 搜索输入框 - */ - private UITextField keyField = new UITextField(); - /** - * 搜索按钮 - */ - private UIButton keyButton = new UIButton(); - - /** - * 搜索按钮绑定事件 - */ - private ActionListener keyButtonActionListener = new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - searchAddingMembers(keyWord); - } - }; - - /** - * 输入框绑定事件 - */ - private KeyAdapter keyFieldKeyListener = new KeyAdapter() { - - @Override - public void keyPressed(KeyEvent e) { - // 判断按下的键是否是回车键 - // 对话框回车键绑定的是对话框的确定按钮 - if (e.getKeyCode() == KeyEvent.VK_ENTER) { - searchAddingMembers(keyWord); - // has been processed - e.consume(); - } - } - }; - /** - * 添加到设计的决策成员计数标签 - */ - private UILabel countLabel = new UILabel(); - /** - * 添加到设计的决策成员计数标签 - */ - private DefaultListModel addedListModel; - - - /** - * 左侧列表变动事件 - */ - private MemberListSelectedChangeListener addingListChangeListener = new MemberListSelectedChangeListener() { - @Override - public void selectedChange() { - // 右侧列表发生变化后,将右侧列表中选中但是在左侧列表中没有的成员添加进来,同时移除取消选中的 - sync2AddedMembersFromAdding(); - // 刷新右侧列表显示 - addToAddedMemberList(); - } - }; - - /** - * 右侧列表变动事件 - */ - private MemberListSelectedChangeListener addedListChangeListener = new MemberListSelectedChangeListener() { - @Override - public void selectedChange() { - addingList.revalidate(); - addingList.repaint(); - resetAddedMembers(); - sync2AddedMembersFormAdded(); - // 不需要重复更新右侧列表显示 但是更新一下计数显示 - countLabel.setText( - Toolkit.i18nText("Fine-Design_Basic_Remote_Design_Selected_Member_Count", - String.valueOf(addedMembers.size()) - ) - ); - // 刷新左侧列表显示 - addToMemberList(); - - } - }; - - - /** - * 已经添加的成员列表 - */ - private AddedMemberList addedList; - /** - * 待添加的成员列表 - */ - private AddingMemberList addingList; - - /** - * 搜索关键字 - */ - private String keyWord; - - /** - * 搜索关键词变更监听 - */ - private transient DocumentListener documentListener = new DocumentListener() { - @Override - public void insertUpdate(DocumentEvent e) { - keyWord = keyField.getText(); - } - - @Override - public void removeUpdate(DocumentEvent e) { - keyWord = keyField.getText(); - } - - @Override - public void changedUpdate(DocumentEvent e) { - keyWord = keyField.getText(); - } - }; - - /** - * 当前分页计数 - */ - private int pageNum = 1; - - - public UserManagerPane() { - this.setBorder(BorderFactory.createEmptyBorder(0, 4, 0, 4)); - this.setLayout(new BorderLayout()); - this.add( - TableLayoutHelper.createCommonTableLayoutPane( - new Component[][]{ - new Component[]{createLeftPanel(), createRightPanel()} - }, - new double[]{TableLayout.FILL}, - new double[]{TableLayout.FILL, TableLayout.FILL}, - LayoutConstants.VGAP_LARGE - ), - BorderLayout.CENTER); - } - - public void populate(List addedMembers) { - - // 已选信息 - resetAddedMembers(); - this.addedMembers.addAll(addedMembers); - - // 刷新右侧面板 - addToAddedMemberList(); - - // 刷新左侧展示信息 - addToMemberList(); - } - +public class UserManagerPane extends AbstractManagerPane { @Override protected String title4PopupWindow() { - return Toolkit.i18nText("Fine-Design_Basic_Remote_Design_Choose_Member"); + // 选择设计用户 + return Toolkit.i18nText("Fine-Design_Basic_Remote_Design_Choose_User"); } - private JPanel createLeftPanel() { + @Override + protected JPanel rightPanel(){ JPanel content = new JPanel(new BorderLayout()); content.setBorder( BorderFactory.createCompoundBorder( new EmptyBorder(6, 0, 0, 0), UITitledBorder.createBorderWithTitle( - Toolkit.i18nText("Fine-Design_Basic_Remote_Design_Decision_Member"), - 4) + // 已选择的设计用户 + Toolkit.i18nText("Fine-Design_Basic_Remote_Design_Selected_User"), + 4 + ) ) ); - - // 搜索 - JPanel searchPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 5)); - searchPanel.setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 5)); - keyField.setPreferredSize(new Dimension(270, 20)); - keyField.requestFocus(); - keyField.addKeyListener(keyFieldKeyListener); - keyField.getDocument().addDocumentListener(documentListener); - keyButton.setIcon(BaseUtils.readIcon("com/fr/design/images/buttonicon/user_search_normal.png")); - keyButton.setToolTipText(Toolkit.i18nText("Fine-Design_Basic_Remote_Design_Search")); - keyButton.addActionListener(keyButtonActionListener); - searchPanel.add(keyField); - searchPanel.add(keyButton); - - // 内容列表 - addingListModel = new DefaultListModel<>(); - addingList = new AddingMemberList(addingListModel); - addingList.setCellRenderer(new AddingMemberListCellRender()); - addingList.addSelectedChangeListener(addingListChangeListener); - resetMembers(); - addToMemberList(); - searchAddingMembers(StringUtils.EMPTY); - final UIScrollPane listPane = new UIScrollPane(addingList); - listPane.addMouseWheelListener(new MouseWheelListener() { - @Override - public void mouseWheelMoved(MouseWheelEvent e) { - JViewport vp = listPane.getViewport(); - if (vp.getView().getHeight() <= vp.getHeight() + vp.getViewPosition().y) { - loadMoreAddingMembers(keyWord, DEFAULT_NUM_EACH_PAGE); - } - } - }); - listPane.getVerticalScrollBar().addAdjustmentListener(new AdjustmentListener() { - @Override - public void adjustmentValueChanged(AdjustmentEvent e) { - JViewport vp = listPane.getViewport(); - if (vp.getView().getHeight() <= vp.getHeight() + vp.getViewPosition().y && e.getValueIsAdjusting()) { - loadMoreAddingMembers(keyWord, DEFAULT_NUM_EACH_PAGE); - } - } - }); - listPane.setBorder(BorderFactory.createEmptyBorder()); - - content.add(searchPanel, BorderLayout.NORTH); - content.add(listPane, BorderLayout.CENTER); return content; } - - private JPanel createRightPanel() { + @Override + protected JPanel leftPanel(){ JPanel content = new JPanel(new BorderLayout()); content.setBorder( BorderFactory.createCompoundBorder( new EmptyBorder(6, 0, 0, 0), UITitledBorder.createBorderWithTitle( - Toolkit.i18nText("Fine-Design_Basic_Remote_Design_Selected_Member"), - 4 - ) + // 决策系统用户 + Toolkit.i18nText("Fine-Design_Basic_Remote_Design_Decision_User"), + 4) ) ); - - // 计数 - countLabel.setText( - Toolkit.i18nText("Fine-Design_Basic_Remote_Design_Selected_Member_Count", - String.valueOf(addedMembers.size())) - ); - countLabel.setBorder(BorderFactory.createEmptyBorder(7, 12, 8, 0)); - countLabel.setForeground(new Color(0x8F8F92)); - - addedListModel = new DefaultListModel<>(); - addedList = new AddedMemberList(addedListModel); - addedList.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); - addedList.setCellRenderer(new AddedMemberListCellRender()); - addedList.addSelectedChangeListener(addedListChangeListener); - resetAddedMembers(); - addToAddedMemberList(); - UIScrollPane listPane = new UIScrollPane(addedList); - listPane.setBorder(BorderFactory.createEmptyBorder()); - - content.add(countLabel, BorderLayout.NORTH); - content.add(listPane, BorderLayout.CENTER); return content; - } - - private void addToMemberList() { - addingListModel.clear(); - for (RemoteDesignMember member : addingMembers) { - // 如果包含在右侧列表中,那么左侧列表默认选中 - if (addedMembers.contains(member)) { - member.setSelected(true); - } else { - member.setSelected(false); - } - addingListModel.addElement(member); - } - addingList.revalidate(); - addingList.repaint(); - } - - private void addToAddedMemberList() { - addedListModel.clear(); - for (RemoteDesignMember member : addedMembers) { - addedListModel.addElement(member); - } - addedList.revalidate(); - addedList.repaint(); - countLabel.setText( - Toolkit.i18nText("Fine-Design_Basic_Remote_Design_Selected_Member_Count", - String.valueOf(addedMembers.size()) - )); - } - - private void resetMembers() { - addingMembers.clear(); - addingMembers.add(RemoteDesignMember.DEFAULT_MEMBER); - } - - private void resetAddedMembers() { - addedMembers.clear(); - } - - - private void searchAddingMembers(final String keyword) { - - final SwingWorker getMemberWorker = new SwingWorker, Void>() { - @Override - protected List doInBackground() { - String username = WorkContext.getCurrent().getConnection().getUserName(); - synchronized (addingMembers) { - addingMembers.clear(); - Collection more = WorkContext.getCurrent().get(DecisionOperator.class).getMembers(username, keyword); - pageNum = 1; - if (!more.isEmpty()) { - addingMembers.addAll(more); - if (more.size() >= DEFAULT_NUM_EACH_PAGE) { - addingMembers.add(RemoteDesignMember.DEFAULT_MEMBER); - } - } - } - return addingMembers; - } - - @Override - protected void done() { - addToMemberList(); - } - }; - getMemberWorker.execute(); - } - - private void loadMoreAddingMembers(final String keyword, final int count) { - - final SwingWorker loadMoreWorker = new SwingWorker, Void>() { - @Override - protected List doInBackground() { - - String username = WorkContext.getCurrent().getConnection().getUserName(); - synchronized (addingMembers) { - addingMembers.remove(RemoteDesignMember.DEFAULT_MEMBER); - Collection more = - WorkContext.getCurrent().get(DecisionOperator.class).getMembers(username, keyword, pageNum + 1, count); - if (!more.isEmpty()) { - pageNum += 1; - addingMembers.addAll(more); - addingMembers.add(RemoteDesignMember.DEFAULT_MEMBER); - } - } - return addingMembers; - } - - @Override - protected void done() { - addToMemberList(); - } - }; - loadMoreWorker.execute(); + @Override + protected AddingMemberListCellRender getAddingMemberListCellRender() { + return new AddingUserListCellRender(); } - - private void sync2AddedMembersFromAdding() { - RemoteDesignMember[] members = new RemoteDesignMember[addingListModel.getSize()]; - // shallow copy - addingListModel.copyInto(members); - for (RemoteDesignMember member : members) { - - if (!member.isSelected()) { - addedMembers.remove(member); - } - if (member.isSelected() && !addedMembers.contains(member)) { - addedMembers.add(member); - } - } + @Override + protected AddedMemberListCellRender getAddedMemberListCellRender() { + return new AddedUserListCellRender(); } - private void sync2AddedMembersFormAdded() { - RemoteDesignMember[] members = new RemoteDesignMember[addedListModel.getSize()]; - // shallow copy - addedListModel.copyInto(members); - addedMembers.addAll(Arrays.asList(members)); + @Override + protected Collection getMembers(String userName, String keyWord){ + return WorkContext.getCurrent().get(DecisionOperator.class).getMembers(userName, keyWord); } - - public ImmutableList update() { - return ImmutableList.copyOf(addedMembers); + @Override + protected Collection getMembers(String userName, String keyWord, int pageNum, int count){ + return WorkContext.getCurrent().get(DecisionOperator.class).getMembers(userName, keyWord, pageNum, count); } -} +} \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/remote/ui/list/AddedMemberList.java b/designer-base/src/main/java/com/fr/design/remote/ui/list/AddedMemberList.java index 2d95dce4b..5c2b39e6d 100644 --- a/designer-base/src/main/java/com/fr/design/remote/ui/list/AddedMemberList.java +++ b/designer-base/src/main/java/com/fr/design/remote/ui/list/AddedMemberList.java @@ -1,8 +1,12 @@ package com.fr.design.remote.ui.list; +import com.fr.design.i18n.Toolkit; +import com.fr.design.mainframe.DesignerContext; +import com.fr.report.constant.RoleType; import com.fr.workspace.server.authority.RemoteDesignMember; import javax.swing.DefaultListModel; +import javax.swing.JOptionPane; import java.util.Vector; public class AddedMemberList extends MemberList { @@ -27,8 +31,21 @@ public class AddedMemberList extends MemberList { protected void displaySelected() { RemoteDesignMember member = getSelectedValue(); if (member != null) { - member.setSelected(!member.isSelected()); - ((DefaultListModel) getModel()).removeElement(member); + String keyTitle = member.getRoleType() == RoleType.CUSTOM ? + "Fine-Design_Basic_Utils_Are_You_Sure_To_Delete_The_Role_And_Its_Design_Authorities" : + "Fine-Design_Basic_Utils_Are_You_Sure_To_Delete_The_User_And_Its_Design_Authorities"; + if (member.isSelected() && member.hasAuthority()){ + int val = JOptionPane.showConfirmDialog(DesignerContext.getDesignerFrame(), Toolkit.i18nText(keyTitle), + Toolkit.i18nText("Fine-Design_Basic_Remove"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE); + if (val == JOptionPane.OK_OPTION) { + member.setSelected(!member.isSelected()); + ((DefaultListModel) getModel()).removeElement(member); + } + } + else { + member.setSelected(!member.isSelected()); + ((DefaultListModel) getModel()).removeElement(member); + } } revalidate(); repaint(); diff --git a/designer-base/src/main/java/com/fr/design/remote/ui/list/AddedMemberListCellRender.java b/designer-base/src/main/java/com/fr/design/remote/ui/list/AddedMemberListCellRender.java index f29378f62..74dba29fa 100644 --- a/designer-base/src/main/java/com/fr/design/remote/ui/list/AddedMemberListCellRender.java +++ b/designer-base/src/main/java/com/fr/design/remote/ui/list/AddedMemberListCellRender.java @@ -1,11 +1,11 @@ package com.fr.design.remote.ui.list; -import com.fr.base.BaseUtils; import com.fr.design.gui.ilable.UILabel; import com.fr.design.remote.button.IconButton; import com.fr.workspace.server.authority.RemoteDesignMember; import javax.swing.BorderFactory; +import javax.swing.Icon; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.ListCellRenderer; @@ -13,7 +13,7 @@ import java.awt.Component; import java.awt.Dimension; import java.awt.FlowLayout; -public class AddedMemberListCellRender extends JPanel implements ListCellRenderer { +public abstract class AddedMemberListCellRender extends JPanel implements ListCellRenderer { private UILabel label; @@ -25,7 +25,7 @@ public class AddedMemberListCellRender extends JPanel implements ListCellRendere label = new UILabel(); label.setPreferredSize(new Dimension(264, 20)); this.setPreferredSize(new Dimension(this.getPreferredSize().width, 25)); - label.setIcon(BaseUtils.readIcon("com/fr/design/remote/images/icon_Member_normal@1x.png")); + label.setIcon(getMemberIcon()); this.add(label); this.add(new IconButton()); @@ -33,7 +33,7 @@ public class AddedMemberListCellRender extends JPanel implements ListCellRendere @Override public Component getListCellRendererComponent(JList list, RemoteDesignMember member, int index, boolean isSelected, boolean cellHasFocus) { - this.setLabelText(member.getRealName() + "(" + member.getUsername() + ")"); + this.setLabelText(getMemberName(member)); return this; } @@ -41,4 +41,8 @@ public class AddedMemberListCellRender extends JPanel implements ListCellRendere label.setText(name); } + protected abstract Icon getMemberIcon(); + + protected abstract String getMemberName(RemoteDesignMember member); + } diff --git a/designer-base/src/main/java/com/fr/design/remote/ui/list/AddingMemberList.java b/designer-base/src/main/java/com/fr/design/remote/ui/list/AddingMemberList.java index 649907d05..ea748816f 100644 --- a/designer-base/src/main/java/com/fr/design/remote/ui/list/AddingMemberList.java +++ b/designer-base/src/main/java/com/fr/design/remote/ui/list/AddingMemberList.java @@ -1,13 +1,16 @@ package com.fr.design.remote.ui.list; +import com.fr.design.i18n.Toolkit; +import com.fr.design.mainframe.DesignerContext; +import com.fr.report.constant.RoleType; import com.fr.workspace.server.authority.RemoteDesignMember; import javax.swing.DefaultListModel; +import javax.swing.JOptionPane; import java.util.Vector; public class AddingMemberList extends MemberList { - public AddingMemberList() { super(); } @@ -29,7 +32,21 @@ public class AddingMemberList extends MemberList { @Override protected void displaySelected() { RemoteDesignMember member = getSelectedValue(); - member.setSelected(!member.isSelected()); + if (member != null) { + String keyTitle = member.getRoleType() == RoleType.CUSTOM ? + "Fine-Design_Basic_Utils_Are_You_Sure_To_Delete_The_Role_And_Its_Design_Authorities" : + "Fine-Design_Basic_Utils_Are_You_Sure_To_Delete_The_User_And_Its_Design_Authorities"; + if (member.isSelected() && member.hasAuthority()){ + int val = JOptionPane.showConfirmDialog(DesignerContext.getDesignerFrame(), Toolkit.i18nText(keyTitle), + Toolkit.i18nText("Fine-Design_Basic_Remove"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE); + if (val == JOptionPane.OK_OPTION) { + member.setSelected(!member.isSelected()); + } + } + else { + member.setSelected(!member.isSelected()); + } + } revalidate(); repaint(); fireSelectedChange(); diff --git a/designer-base/src/main/java/com/fr/design/remote/ui/list/AddingMemberListCellRender.java b/designer-base/src/main/java/com/fr/design/remote/ui/list/AddingMemberListCellRender.java index b2ca3f812..d25702780 100644 --- a/designer-base/src/main/java/com/fr/design/remote/ui/list/AddingMemberListCellRender.java +++ b/designer-base/src/main/java/com/fr/design/remote/ui/list/AddingMemberListCellRender.java @@ -1,11 +1,11 @@ package com.fr.design.remote.ui.list; -import com.fr.base.BaseUtils; import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.gui.ilable.UILabel; import com.fr.workspace.server.authority.RemoteDesignMember; import javax.swing.BorderFactory; +import javax.swing.Icon; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.ListCellRenderer; @@ -14,7 +14,7 @@ import java.awt.Component; import java.awt.Dimension; import java.awt.FlowLayout; -public class AddingMemberListCellRender extends JPanel implements ListCellRenderer { +public abstract class AddingMemberListCellRender extends JPanel implements ListCellRenderer { private UILabel label; private UICheckBox check; @@ -27,7 +27,7 @@ public class AddingMemberListCellRender extends JPanel implements ListCellRender label = new UILabel(); label.setPreferredSize(new Dimension(260, 20)); this.setPreferredSize(new Dimension(this.getPreferredSize().width, 25)); - label.setIcon(BaseUtils.readIcon("com/fr/design/remote/images/icon_Member_normal@1x.png")); + label.setIcon(getMemberIcon()); check = new UICheckBox(); check.setSelected(false); @@ -46,7 +46,7 @@ public class AddingMemberListCellRender extends JPanel implements ListCellRender check.setVisible(false); fixLoadingDisplay(); } else { - this.setLabelText(member.getRealName() + "(" + member.getUsername() + ")"); + this.setLabelText(getMemberName(member)); check.setVisible(true); check.setSelected(member.isSelected()); recoveryCommonDisplay(); @@ -64,7 +64,11 @@ public class AddingMemberListCellRender extends JPanel implements ListCellRender } private void recoveryCommonDisplay() { - label.setIcon(BaseUtils.readIcon("com/fr/design/remote/images/icon_Member_normal@1x.png")); + label.setIcon(getMemberIcon()); label.setHorizontalAlignment(SwingConstants.LEFT); } + + protected abstract Icon getMemberIcon(); + + protected abstract String getMemberName(RemoteDesignMember member); } diff --git a/designer-base/src/main/java/com/fr/design/remote/ui/list/AuthorityListCellRenderer.java b/designer-base/src/main/java/com/fr/design/remote/ui/list/AuthorityListCellRenderer.java index 4cd9c69f9..506c86664 100644 --- a/designer-base/src/main/java/com/fr/design/remote/ui/list/AuthorityListCellRenderer.java +++ b/designer-base/src/main/java/com/fr/design/remote/ui/list/AuthorityListCellRenderer.java @@ -1,9 +1,9 @@ package com.fr.design.remote.ui.list; -import com.fr.base.BaseUtils; import com.fr.report.DesignAuthority; import sun.swing.DefaultLookup; +import javax.swing.Icon; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.ListCellRenderer; @@ -12,7 +12,7 @@ import javax.swing.border.EmptyBorder; import java.awt.Color; import java.awt.Component; -public class AuthorityListCellRenderer extends +public abstract class AuthorityListCellRenderer extends JLabel implements ListCellRenderer { /** @@ -81,8 +81,8 @@ public class AuthorityListCellRenderer extends } setBorder(border); - this.setIcon(BaseUtils.readIcon("com/fr/design/remote/images/icon_Member_normal@1x.png")); - this.setText(authority.getRealName() + "(" + authority.getUsername() + ")"); + this.setIcon(getMemberIcon()); + this.setText(getMemberName(authority)); return this; } @@ -126,4 +126,8 @@ public class AuthorityListCellRenderer extends p.isOpaque(); return !colorMatch && super.isOpaque(); } + + protected abstract Icon getMemberIcon(); + + protected abstract String getMemberName(DesignAuthority authority); } \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/remote/ui/list/cell/AddedCustomRoleListCellRender.java b/designer-base/src/main/java/com/fr/design/remote/ui/list/cell/AddedCustomRoleListCellRender.java new file mode 100644 index 000000000..9680f6336 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/remote/ui/list/cell/AddedCustomRoleListCellRender.java @@ -0,0 +1,25 @@ +package com.fr.design.remote.ui.list.cell; + +import com.fr.base.BaseUtils; +import com.fr.design.remote.constants.MemberIcon; +import com.fr.design.remote.ui.list.AddedMemberListCellRender; +import com.fr.workspace.server.authority.RemoteDesignMember; + +import javax.swing.Icon; + +/** + * @author Lucian.Chen + * @version 10.0 + * Created by Lucian.Chen on 2019/9/19 + */ +public class AddedCustomRoleListCellRender extends AddedMemberListCellRender { + @Override + protected Icon getMemberIcon() { + return BaseUtils.readIcon(MemberIcon.CUSTOM_ROLE_ICON); + } + + @Override + protected String getMemberName(RemoteDesignMember member) { + return member.getUsername(); + } +} \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/remote/ui/list/cell/AddedUserListCellRender.java b/designer-base/src/main/java/com/fr/design/remote/ui/list/cell/AddedUserListCellRender.java new file mode 100644 index 000000000..2a78e2a03 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/remote/ui/list/cell/AddedUserListCellRender.java @@ -0,0 +1,25 @@ +package com.fr.design.remote.ui.list.cell; + +import com.fr.base.BaseUtils; +import com.fr.design.remote.constants.MemberIcon; +import com.fr.design.remote.ui.list.AddedMemberListCellRender; +import com.fr.workspace.server.authority.RemoteDesignMember; + +import javax.swing.Icon; + +/** + * @author Lucian.Chen + * @version 10.0 + * Created by Lucian.Chen on 2019/9/19 + */ +public class AddedUserListCellRender extends AddedMemberListCellRender { + @Override + protected Icon getMemberIcon() { + return BaseUtils.readIcon(MemberIcon.USER_ICON); + } + + @Override + protected String getMemberName(RemoteDesignMember member) { + return member.getRealName() + "(" + member.getUsername() + ")"; + } +} diff --git a/designer-base/src/main/java/com/fr/design/remote/ui/list/cell/AddingCustomRoleListCellRender.java b/designer-base/src/main/java/com/fr/design/remote/ui/list/cell/AddingCustomRoleListCellRender.java new file mode 100644 index 000000000..fa51f201e --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/remote/ui/list/cell/AddingCustomRoleListCellRender.java @@ -0,0 +1,25 @@ +package com.fr.design.remote.ui.list.cell; + +import com.fr.base.BaseUtils; +import com.fr.design.remote.constants.MemberIcon; +import com.fr.design.remote.ui.list.AddingMemberListCellRender; +import com.fr.workspace.server.authority.RemoteDesignMember; + +import javax.swing.Icon; + +/** + * @author Lucian.Chen + * @version 10.0 + * Created by Lucian.Chen on 2019/9/19 + */ +public class AddingCustomRoleListCellRender extends AddingMemberListCellRender { + @Override + protected Icon getMemberIcon() { + return BaseUtils.readIcon(MemberIcon.CUSTOM_ROLE_ICON); + } + + @Override + protected String getMemberName(RemoteDesignMember member) { + return member.getUsername(); + } +} \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/remote/ui/list/cell/AddingUserListCellRender.java b/designer-base/src/main/java/com/fr/design/remote/ui/list/cell/AddingUserListCellRender.java new file mode 100644 index 000000000..1df731afc --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/remote/ui/list/cell/AddingUserListCellRender.java @@ -0,0 +1,25 @@ +package com.fr.design.remote.ui.list.cell; + +import com.fr.base.BaseUtils; +import com.fr.design.remote.constants.MemberIcon; +import com.fr.design.remote.ui.list.AddingMemberListCellRender; +import com.fr.workspace.server.authority.RemoteDesignMember; + +import javax.swing.Icon; + +/** + * @author Lucian.Chen + * @version 10.0 + * Created by Lucian.Chen on 2019/9/19 + */ +public class AddingUserListCellRender extends AddingMemberListCellRender { + @Override + protected Icon getMemberIcon() { + return BaseUtils.readIcon(MemberIcon.USER_ICON); + } + + @Override + protected String getMemberName(RemoteDesignMember member) { + return member.getRealName() + "(" + member.getUsername() + ")"; + } +} diff --git a/designer-base/src/main/java/com/fr/design/remote/ui/list/cell/AuthorityCustomRoleListCellRender.java b/designer-base/src/main/java/com/fr/design/remote/ui/list/cell/AuthorityCustomRoleListCellRender.java new file mode 100644 index 000000000..ece2a8a2c --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/remote/ui/list/cell/AuthorityCustomRoleListCellRender.java @@ -0,0 +1,25 @@ +package com.fr.design.remote.ui.list.cell; + +import com.fr.base.BaseUtils; +import com.fr.design.remote.constants.MemberIcon; +import com.fr.design.remote.ui.list.AuthorityListCellRenderer; +import com.fr.report.DesignAuthority; + +import javax.swing.Icon; + +/** + * @author Lucian.Chen + * @version 10.0 + * Created by Lucian.Chen on 2019/9/19 + */ +public class AuthorityCustomRoleListCellRender extends AuthorityListCellRenderer { + @Override + protected Icon getMemberIcon() { + return BaseUtils.readIcon(MemberIcon.CUSTOM_ROLE_ICON); + } + + @Override + protected String getMemberName(DesignAuthority authority) { + return authority.getUsername(); + } +} diff --git a/designer-base/src/main/java/com/fr/design/remote/ui/list/cell/AuthorityUserListCellRender.java b/designer-base/src/main/java/com/fr/design/remote/ui/list/cell/AuthorityUserListCellRender.java new file mode 100644 index 000000000..9b04a4441 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/remote/ui/list/cell/AuthorityUserListCellRender.java @@ -0,0 +1,25 @@ +package com.fr.design.remote.ui.list.cell; + +import com.fr.base.BaseUtils; +import com.fr.design.remote.constants.MemberIcon; +import com.fr.design.remote.ui.list.AuthorityListCellRenderer; +import com.fr.report.DesignAuthority; + +import javax.swing.Icon; + +/** + * @author Lucian.Chen + * @version 10.0 + * Created by Lucian.Chen on 2019/9/19 + */ +public class AuthorityUserListCellRender extends AuthorityListCellRenderer { + @Override + protected Icon getMemberIcon() { + return BaseUtils.readIcon(MemberIcon.USER_ICON); + } + + @Override + protected String getMemberName(DesignAuthority authority) { + return authority.getRealName() + "(" + authority.getUsername() + ")"; + } +} diff --git a/designer-base/src/main/java/com/fr/design/report/WatermarkPane.java b/designer-base/src/main/java/com/fr/design/report/WatermarkPane.java index 40fe942d2..a7f78e117 100644 --- a/designer-base/src/main/java/com/fr/design/report/WatermarkPane.java +++ b/designer-base/src/main/java/com/fr/design/report/WatermarkPane.java @@ -113,8 +113,8 @@ public class WatermarkPane extends BasicPane { formulaPane = new TinyFormulaPane(); fontSizeComboBox = new UIComboBox(FRFontPane.FONT_SIZES); fontSizeComboBox.setEditable(true); - horizontalGapSpinner = new UnsignedIntUISpinner(0, Integer.MAX_VALUE, 1, 200); - verticalGapSpinner = new UnsignedIntUISpinner(0, Integer.MAX_VALUE, 1, 100); + horizontalGapSpinner = new UnsignedIntUISpinner(100, Integer.MAX_VALUE, 1, 200); + verticalGapSpinner = new UnsignedIntUISpinner(50, Integer.MAX_VALUE, 1, 100); horizontalGapSpinner.setPreferredSize(SPINNER_DIMENSION); verticalGapSpinner.setPreferredSize(SPINNER_DIMENSION); JPanel fontSizeTypePane = new JPanel(new BorderLayout(10,0)); diff --git a/designer-base/src/main/java/com/fr/design/style/background/gradient/GradientBar.java b/designer-base/src/main/java/com/fr/design/style/background/gradient/GradientBar.java index 2ce1a0bc3..b197a3d39 100644 --- a/designer-base/src/main/java/com/fr/design/style/background/gradient/GradientBar.java +++ b/designer-base/src/main/java/com/fr/design/style/background/gradient/GradientBar.java @@ -29,6 +29,7 @@ import com.fr.design.style.color.ColorSelectConfigManager; import com.fr.design.style.color.ColorSelectDetailPane; import com.fr.design.style.color.ColorSelectDialog; import com.fr.design.style.color.ColorSelectable; +import com.fr.stable.AssistUtils; /** * TODO:面板缩放的功能没有考虑(就是尾值过大,导致超过界面显示的情况),原来的那个实现完全是个BUG。要缩放的情况也比较少,就干脆以后弄吧 @@ -217,7 +218,7 @@ public class GradientBar extends JComponent implements UIObserver,ColorSelectabl * @return 同上 */ public boolean isOriginalPlace() { - return startLabel.getValue() == min && endLabel.getValue() == max; + return AssistUtils.equals(startLabel.getValue(), min) && AssistUtils.equals(endLabel.getValue(), max); } /** diff --git a/designer-base/src/main/java/com/fr/design/ui/util/EdtInvocationManager.java b/designer-base/src/main/java/com/fr/design/ui/util/EdtInvocationManager.java new file mode 100644 index 000000000..321806821 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/ui/util/EdtInvocationManager.java @@ -0,0 +1,49 @@ +package com.fr.design.ui.util; + +import org.jetbrains.annotations.NotNull; + +import javax.swing.SwingUtilities; +import java.lang.reflect.InvocationTargetException; + +/** + * 事件分发线程管理器。用于管理用户线程 + * + * @author vito + * @version 10.0 + * Created by vito on 2019/9/16 + */ +public abstract class EdtInvocationManager { + @NotNull + private static EdtInvocationManager ourInstance = new SwingEdtInvocationManager(); + + public abstract boolean isEventDispatchThread(); + + public abstract void invokeLater(@NotNull Runnable task); + + public abstract void invokeAndWait(@NotNull Runnable task) throws InvocationTargetException, InterruptedException; + + @NotNull + public static EdtInvocationManager getInstance() { + return ourInstance; + } + + /** + * The default {@link EdtInvocationManager} implementation which works with the EDT via SwingUtilities. + */ + private static class SwingEdtInvocationManager extends EdtInvocationManager { + @Override + public boolean isEventDispatchThread() { + return SwingUtilities.isEventDispatchThread(); + } + + @Override + public void invokeLater(@NotNull Runnable task) { + SwingUtilities.invokeLater(task); + } + + @Override + public void invokeAndWait(@NotNull Runnable task) throws InvocationTargetException, InterruptedException { + SwingUtilities.invokeAndWait(task); + } + } +} diff --git a/designer-base/src/main/java/com/fr/design/ui/util/GraphicsConfig.java b/designer-base/src/main/java/com/fr/design/ui/util/GraphicsConfig.java new file mode 100644 index 000000000..316b6ac24 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/ui/util/GraphicsConfig.java @@ -0,0 +1,77 @@ +package com.fr.design.ui.util; + +import org.jetbrains.annotations.NotNull; + +import java.awt.*; +import java.util.Map; + +/** + * 图形渲染配置 + * + * @author vito + * @version 10.0 + * Created by vito on 2019/9/18 + */ +public class GraphicsConfig { + private final Graphics2D myG; + private final Map myHints; + private final Composite myComposite; + private final Stroke myStroke; + + public GraphicsConfig(@NotNull Graphics g) { + myG = (Graphics2D) g; + myHints = (Map) myG.getRenderingHints().clone(); + myComposite = myG.getComposite(); + myStroke = myG.getStroke(); + } + + public GraphicsConfig setAntialiasing(boolean on) { + myG.setRenderingHint(RenderingHints.KEY_ANTIALIASING, on ? RenderingHints.VALUE_ANTIALIAS_ON : RenderingHints.VALUE_ANTIALIAS_OFF); + return this; + } + + public GraphicsConfig setAlpha(float alpha) { + myG.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha)); + return this; + } + + public GraphicsConfig setRenderingHint(RenderingHints.Key hintKey, Object hintValue) { + myG.setRenderingHint(hintKey, hintValue); + return this; + } + + public Graphics2D getG() { + return myG; + } + + public GraphicsConfig setComposite(Composite composite) { + myG.setComposite(composite); + return this; + } + + public GraphicsConfig setStroke(Stroke stroke) { + myG.setStroke(stroke); + return this; + } + + public GraphicsConfig setupAAPainting() { + return setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON) + .setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_NORMALIZE); + } + + public GraphicsConfig disableAAPainting() { + return setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF) + .setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_DEFAULT); + } + + public GraphicsConfig paintWithAlpha(float alpha) { + assert 0.0f <= alpha && alpha <= 1.0f : "alpha should be in range 0.0f .. 1.0f"; + return setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha)); + } + + public void restore() { + myG.setRenderingHints(myHints); + myG.setComposite(myComposite); + myG.setStroke(myStroke); + } +} diff --git a/designer-base/src/main/java/com/fr/design/ui/util/UIUtil.java b/designer-base/src/main/java/com/fr/design/ui/util/UIUtil.java new file mode 100644 index 000000000..b7583d0dd --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/ui/util/UIUtil.java @@ -0,0 +1,55 @@ +package com.fr.design.ui.util; + +import com.fr.log.FineLoggerFactory; +import org.jetbrains.annotations.NotNull; + +import javax.swing.SwingUtilities; + +/** + * 一些常用的 GUI 工具。 + *

+ * 为什么提供 invokeLaterIfNeeded 和 invokeAndWaitIfNeeded这样的方法? + * 因为 swing 渲染 UI 是单线程的,如果直接使用 + * {@link SwingUtilities#invokeLater(Runnable)},当 invokeLater 方法 + * 嵌套的时候,Runnable 会被放到事件循环队列的末尾,从而变成异步而非立即执行, + * 这是一处坑点。invokeLaterIfNeeded 的行为,当处于事件分发线程(EDT), + * 则直接运行,当处于其他线程,则使用 EDT 来执行。 + *

+ * 方法{@link SwingUtilities#invokeAndWait(Runnable)},也有一个注意点, + * 不允许在事件分发线程(EDT)中调用,否则抛错,所以也有必要加上判断 EDT 的逻辑。 + * + * @author vito + * @version 10.0 + * Created by vito on 2019/9/16 + */ +public class UIUtil { + /** + * 在 AWT 线程上立即调用runnable,否则使用 {@link SwingUtilities#invokeLater(Runnable)} 代替。 + * + * @param runnable 等待调用的 runnable + */ + public static void invokeLaterIfNeeded(@NotNull Runnable runnable) { + if (EdtInvocationManager.getInstance().isEventDispatchThread()) { + runnable.run(); + } else { + EdtInvocationManager.getInstance().invokeLater(runnable); + } + } + + /** + * 在 AWT 线程上立即调用runnable,否则使用 {@link SwingUtilities#invokeAndWait(Runnable)} 代替。 + * + * @param runnable 等待调用的 runnable + */ + public static void invokeAndWaitIfNeeded(@NotNull Runnable runnable) { + if (EdtInvocationManager.getInstance().isEventDispatchThread()) { + runnable.run(); + } else { + try { + EdtInvocationManager.getInstance().invokeAndWait(runnable); + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } + } + } +} diff --git a/designer-base/src/main/java/com/fr/design/update/actions/FileDownloader.java b/designer-base/src/main/java/com/fr/design/update/actions/FileDownloader.java deleted file mode 100644 index 328da27a0..000000000 --- a/designer-base/src/main/java/com/fr/design/update/actions/FileDownloader.java +++ /dev/null @@ -1,118 +0,0 @@ -package com.fr.design.update.actions; - -import com.fr.design.update.domain.UpdateConstants; -import com.fr.locale.InterProviderFactory; -import com.fr.log.FineLoggerFactory; -import com.fr.design.update.domain.DownloadItem; -import com.fr.stable.ArrayUtils; -import com.fr.stable.StableUtils; - -import javax.swing.JOptionPane; -import javax.swing.SwingWorker; -import java.io.File; -import java.io.FileOutputStream; -import java.io.InputStream; -import java.net.URL; -import java.net.URLConnection; -import java.util.concurrent.ExecutionException; - -/** - * Created by XINZAI on 2018/8/21. - */ -public abstract class FileDownloader extends SwingWorker { - private static final int REPEAT_DOWNLOAD_TIMES = 3; - private DownloadItem[] files; - private String saveDir; - //已经完成的大小 - private long completeSize; - - public FileDownloader(DownloadItem[] files, String saveDir) { - this.files = files; - this.saveDir = saveDir; - } - - @Override - protected Boolean doInBackground() throws Exception { - if (ArrayUtils.isNotEmpty(files)) { - setCompleteSize(0L); - for (DownloadItem item : files) { - for (int i = 0; i < REPEAT_DOWNLOAD_TIMES; i++) { - item.setTotalLength(0); - item.setDownloadLength(0); - download(item); - if (item.getTotalLength() == item.getDownloadLength()) { - break; - } - } - if (item.getTotalLength() != item.getDownloadLength()) { - JOptionPane.showMessageDialog(null, - com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Updater_Download_Failed"), - InterProviderFactory.getProvider().getLocText("Fine-Design_Updater_Alert"), JOptionPane.ERROR_MESSAGE); - return false; - } else { - item.setDownloadLength(0); - completeSize += item.getTotalLength(); - } - } - } - return true; - } - - @Override - protected void done() { - boolean success = false; - try { - success = get(); - } catch (InterruptedException e) { - FineLoggerFactory.getLogger().error(e.getMessage(), e); - Thread.currentThread().interrupt(); - } catch (ExecutionException e) { - FineLoggerFactory.getLogger().error(e.getMessage(), e); - } - if (success) { - onDownloadSuccess(); - } else { - onDownloadFailed(); - } - } - - private void download(DownloadItem item) throws Exception { - URL url = new URL(item.getUrl()); - URLConnection connection = url.openConnection(); - int total = connection.getContentLength(); - item.setTotalLength(total); - File tempFile = new File(StableUtils.pathJoin(saveDir, item.getName())); - StableUtils.makesureFileExist(tempFile); - try ( InputStream reader = connection.getInputStream(); - FileOutputStream writer = new FileOutputStream(tempFile)) { - byte[] buffer = new byte[UpdateConstants.BYTE]; - int bytesRead = 0; - int totalBytesRead = 0; - while ((bytesRead = reader.read(buffer)) != -1) { - writer.write(buffer, 0, bytesRead); - buffer = new byte[UpdateConstants.BYTE]; - totalBytesRead += bytesRead; - item.setDownloadLength(totalBytesRead); - publish(item); - } - } - } - - /** - * 下载成功 - */ - public abstract void onDownloadSuccess(); - - /** - * 下载失败 - */ - public abstract void onDownloadFailed(); - - public long getCompleteSize() { - return completeSize; - } - - public void setCompleteSize(long completeSize) { - this.completeSize = completeSize; - } -} \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/update/actions/FileProcess.java b/designer-base/src/main/java/com/fr/design/update/actions/FileProcess.java new file mode 100644 index 000000000..2ed0801dc --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/update/actions/FileProcess.java @@ -0,0 +1,55 @@ +package com.fr.design.update.actions; + +import com.fr.decision.update.info.UpdateCallBack; +import com.fr.decision.update.UpdateExecutor; +import com.fr.log.FineLoggerFactory; + +import javax.swing.*; +import java.util.concurrent.ExecutionException; + +/** + * @author Bryant + * @version 10.0 + * Created by Bryant on 2019-09-12 + */ +public abstract class FileProcess extends SwingWorker { + + private UpdateCallBack callBack; + + public FileProcess(UpdateCallBack callBack) { + this.callBack = callBack; + } + + @Override + protected Boolean doInBackground() throws Exception { + return UpdateExecutor.getInstance().execute(callBack); + } + + @Override + protected void done() { + boolean success = false; + try { + success = get(); + } catch (InterruptedException e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + Thread.currentThread().interrupt(); + } catch (ExecutionException e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } + if (success) { + onDownloadSuccess(); + } else { + onDownloadFailed(); + } + } + + /** + * 下载成功 + */ + public abstract void onDownloadSuccess(); + + /** + * 下载失败 + */ + public abstract void onDownloadFailed(); +} diff --git a/designer-base/src/main/java/com/fr/design/update/domain/DownloadItem.java b/designer-base/src/main/java/com/fr/design/update/domain/DownloadItem.java deleted file mode 100644 index 220f2602d..000000000 --- a/designer-base/src/main/java/com/fr/design/update/domain/DownloadItem.java +++ /dev/null @@ -1,102 +0,0 @@ -package com.fr.design.update.domain; - -import com.fr.general.ComparatorUtils; -import com.fr.json.JSONObject; - -import java.util.Date; - -/** - * Created by XINZAI on 2018/8/21. - */ -public class DownloadItem { - - //显示为百分比 - private static final int PERCENTAGE_RATIO = 100; - //显示kB - private static final int BYTETOKB_RATIO = 1000; - - private String name; - private String url; - private long size; - - private int totalLength; - private int downloadLength; - - public DownloadItem(JSONObject json) { - this(json.optString("name"), json.optString("url"), json.optLong("size")); - } - - public DownloadItem(String name, String url, long size) { - this.name = name; - this.url = url; - this.size = size; - } - - public String getName() { - return name; - } - - public String getUrl() { - return url + "?v=" + new Date().getTime(); - } - - - public long getSize() { - return size; - } - - public void setSize(long size) { - this.size = size; - } - - public int getTotalLength() { - return totalLength; - } - - public int getDownloadLength() { - return downloadLength; - } - - public void setTotalLength(int totalLength) { - this.totalLength = totalLength; - } - - public void setDownloadLength(int downloadLength) { - this.downloadLength = downloadLength; - } - - public int getProgressValue() { - return (int) ((downloadLength / (double) totalLength) * PERCENTAGE_RATIO); - } - - public String getProgressString() { - return downloadLength / BYTETOKB_RATIO + "KB/" + totalLength / BYTETOKB_RATIO + "KB"; - } - - /** - * 转化为字符串 - * - * @return 字符串 - */ - @Override - public String toString() { - return "name:" + name + ";download:" + getProgressString(); - } - - @Override - public boolean equals(Object obj) { - return obj instanceof DownloadItem - && ComparatorUtils.equals(((DownloadItem) obj).name, name) - && ComparatorUtils.equals(((DownloadItem) obj).url, url); - } - - /** - * 返回一个hash码 - * - * @return hash码 - */ - @Override - public int hashCode() { - return name.hashCode(); - } -} \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/update/ui/dialog/RestoreResultDialog.java b/designer-base/src/main/java/com/fr/design/update/ui/dialog/RestoreResultDialog.java index df1626193..0e83ff12f 100644 --- a/designer-base/src/main/java/com/fr/design/update/ui/dialog/RestoreResultDialog.java +++ b/designer-base/src/main/java/com/fr/design/update/ui/dialog/RestoreResultDialog.java @@ -12,6 +12,7 @@ import com.fr.stable.StableUtils; import com.fr.stable.StringUtils; import com.fr.stable.project.ProjectConstants; + import javax.swing.AbstractAction; import javax.swing.BorderFactory; import javax.swing.JDialog; diff --git a/designer-base/src/main/java/com/fr/design/update/ui/dialog/UpdateMainDialog.java b/designer-base/src/main/java/com/fr/design/update/ui/dialog/UpdateMainDialog.java index cdce0a657..c7eceb050 100644 --- a/designer-base/src/main/java/com/fr/design/update/ui/dialog/UpdateMainDialog.java +++ b/designer-base/src/main/java/com/fr/design/update/ui/dialog/UpdateMainDialog.java @@ -1,5 +1,7 @@ package com.fr.design.update.ui.dialog; +import com.fr.decision.update.info.UpdateCallBack; +import com.fr.decision.update.info.UpdateProgressCallBack; import com.fr.design.RestartHelper; import com.fr.design.constants.LayoutConstants; import com.fr.design.dialog.UIDialog; @@ -10,8 +12,7 @@ import com.fr.design.gui.itextfield.UITextField; import com.fr.design.layout.TableLayout; import com.fr.design.layout.TableLayoutHelper; import com.fr.design.mainframe.DesignerContext; -import com.fr.design.update.actions.FileDownloader; -import com.fr.design.update.domain.DownloadItem; +import com.fr.design.update.actions.FileProcess; import com.fr.design.update.domain.UpdateConstants; import com.fr.design.update.domain.UpdateInfoCachePropertyManager; import com.fr.design.update.factory.DirectoryOperationFactory; @@ -27,7 +28,6 @@ import com.fr.general.ComparatorUtils; import com.fr.general.DateUtils; import com.fr.general.GeneralContext; import com.fr.general.GeneralUtils; -import com.fr.general.IOUtils; import com.fr.general.SiteCenter; import com.fr.general.http.HttpClient; import com.fr.general.http.HttpToolbox; @@ -39,18 +39,10 @@ import com.fr.stable.EncodeConstants; import com.fr.stable.ProductConstants; import com.fr.stable.StableUtils; import com.fr.stable.StringUtils; -import com.fr.stable.project.ProjectConstants; -import com.fr.third.org.apache.commons.codec.digest.DigestUtils; import com.fr.workspace.WorkContext; import com.sun.java.swing.plaf.motif.MotifProgressBarUI; -import javax.swing.BorderFactory; -import javax.swing.JPanel; -import javax.swing.JProgressBar; -import javax.swing.RowSorter; -import javax.swing.SortOrder; -import javax.swing.SwingConstants; -import javax.swing.SwingWorker; +import javax.swing.*; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import javax.swing.table.TableRowSorter; @@ -67,19 +59,14 @@ import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; -import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.text.ParsePosition; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; -import java.util.HashMap; -import java.util.HashSet; import java.util.List; import java.util.Locale; -import java.util.Map; -import java.util.Set; import java.util.concurrent.ExecutionException; /** @@ -107,7 +94,6 @@ public class UpdateMainDialog extends UIDialog { private static final SimpleDateFormat CHANGELOG_FORMAT = new SimpleDateFormat("M/d/y, h:m:s a", Locale.ENGLISH); private static final SimpleDateFormat UPDATE_INFO_TABLE_FORMAT = new SimpleDateFormat("yyyy.MM.dd"); - private Set downloadItems = new HashSet(); private JSONObject downloadFileConfig; //最新版本标签 private LoadingLabel loadingLabel; @@ -166,14 +152,12 @@ public class UpdateMainDialog extends UIDialog { public void setAutoUpdateAfterInit() { autoUpdateAfterInit = true; } - private void initUpdateActionPane() { double[] rowUpdateSubContentPaneSize = {UPDATE_CONTENT_PANE_ROW_SIZE, TableLayout.PREFERRED, UPDATE_CONTENT_PANE_ROW_SIZE}; double[] rowUpdateContentPaneSize = {TableLayout.PREFERRED}; double[] columnUpdateSubContentPaneProgressSize = {TableLayout.FILL, TableLayout.PREFERRED}; double[] columnUpdateSubContentPaneSize = {UPDATE_CONTENT_PANE_COLUMN_SIZE, TableLayout.FILL, TableLayout.PREFERRED}; JPanel progressBarPane = new JPanel(new BorderLayout()); - progressBar = new JProgressBar(); progressBar.setUI(new MotifProgressBarUI()); progressBar.setForeground(UpdateConstants.BAR_COLOR); @@ -601,62 +585,6 @@ public class UpdateMainDialog extends UIDialog { } break; } - - initMapWithInfo(downloadFileConfig); - } - - public void initMapWithInfo(JSONObject result) { - addJarNameToMap(result, "designer"); - addJarNameToMap(result, "server"); - } - - private void addJarNameToMap(JSONObject result, String category) { - JSONArray jsonArray = result.optJSONArray(category); - if (jsonArray != null) { - for (int i = 0, len = jsonArray.length(); i < len; i++) { - JSONObject jo = jsonArray.optJSONObject(i); - String downloadName = jo.optString("name"); - String downloadUrl = jo.optString("url"); - long downloadSize = jo.optLong("size"); - if (ComparatorUtils.equals(category, "server")) { - File currentJAR = new File(StableUtils.pathJoin(WorkContext.getCurrent().getPath(), ProjectConstants.LIB_NAME, downloadName)); - String currentMD5 = getCurrentJarMD5(currentJAR); - String downloadMD5 = jo.optString("md5"); - boolean exist = currentJAR.exists() && ComparatorUtils.equals(currentJAR.length(), downloadSize) && ComparatorUtils.equals(currentMD5, downloadMD5); - if (exist) { - // 如果jar包存在且MD5值和大小与oss上的一致 不下载 - continue; - } - } - downloadItems.add(new DownloadItem(downloadName, downloadUrl, downloadSize)); - } - } - } - - /** - * 获取当前jar的md5 - * - * @param currentJAR - * @return - */ - private String getCurrentJarMD5(File currentJAR) { - String md5 = StringUtils.EMPTY; - FileInputStream input = null; - try { - input = new FileInputStream(currentJAR); - md5 = DigestUtils.md5Hex(input); - } catch (Exception ignore) { - - } finally { - if (input != null) { - try { - input.close(); - } catch (IOException e) { - FineLoggerFactory.getLogger().error(e.getMessage(), e); - } - } - } - return md5; } /** @@ -669,31 +597,19 @@ public class UpdateMainDialog extends UIDialog { if (updateSuccessful) { RestartHelper.restart(); } else { + progressBar.setVisible(true); + UpdateCallBack callBack = new UpdateProgressCallBack(progressBar); deletePreviousPropertyFile(); updateButton.setEnabled(false); - progressBar.setVisible(true); updateLabel.setVisible(false); - - new FileDownloader( - downloadItems.toArray(new DownloadItem[downloadItems.size()]), - StableUtils.pathJoin(StableUtils.getInstallHome(), UpdateConstants.DOWNLOAD_DIR)) { - @Override - protected void process(java.util.List chunks) { - DownloadItem fileInfo = chunks.get(chunks.size() - 1); - progressBar.setString(fileInfo.getName() + " " + fileInfo.getProgressString()); - progressBar.setValue(fileInfo.getProgressValue()); - } - + new FileProcess(callBack) { @Override public void onDownloadSuccess() { updateButton.setEnabled(true); progressBar.setVisible(false); - backup(); - putNewFiles(); updateSuccessful = true; updateButton.setText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Updater_Restart_Designer")); } - @Override public void onDownloadFailed() { progressBar.setVisible(false); @@ -719,109 +635,12 @@ public class UpdateMainDialog extends UIDialog { } } - /** - * JAR包更新的时候备份老的jar包,包括设计器相关的和服务器相关的几个 - */ - private void backup() { - String installHome = StableUtils.getInstallHome(); - //jar包备份文件的目录为"backup/"+jar包当前版本号 - String todayBackupDir = StableUtils.pathJoin(installHome, getBackupDirectory(), (GeneralUtils.readBuildNO())); - backupFilesFromInstallEnv(installHome, todayBackupDir, getJARList4Server()); - backupFilesFromInstallLib(installHome, todayBackupDir, getJARList4Designer()); - jarCurrentLabel.setText(downloadFileConfig.optString("buildNO")); - } - - private void backupFilesFromInstallEnv(String installHome, String todayBackupDir, List files) { - for (String file : files) { - try { - IOUtils.copy( - new File(StableUtils.pathJoin(installHome, UpdateConstants.APPS_FOLDER_NAME, ProductConstants.getAppFolderName(), ProjectConstants.WEBINF_NAME, ProjectConstants.LIB_NAME, file)), - new File(StableUtils.pathJoin(todayBackupDir))); - } catch (IOException e) { - FineLoggerFactory.getLogger().error(e.getMessage()); - } - } - } - - private void backupFilesFromInstallLib(String installHome, String todayBackupDir, List files) { - for (String file : files) { - try { - IOUtils.copy( - new File(StableUtils.pathJoin(installHome, ProjectConstants.LIB_NAME, file)), - new File(StableUtils.pathJoin(todayBackupDir))); - } catch (IOException e) { - FineLoggerFactory.getLogger().error(e.getMessage()); - } - } - } - - private void putNewFiles() { - Map map = new HashMap(); - java.util.List list = new ArrayList(); - String installHome = StableUtils.getInstallHome(); - putNewFilesToInstallLib(installHome, getDownLoadJAR4Designer(), map, list); - putNewFilesToInstallEnv(installHome, getDownLoadJAR4Server(), map, list); - RestartHelper.saveFilesWhichToMove(map); - RestartHelper.saveFilesWhichToDelete(list.toArray(new String[list.size()])); - } - - private void putNewFilesToInstallLib(String installHome, String[] files, Map map, java.util.List list) { - for (String file : files) { - map.put(StableUtils.pathJoin(installHome, UpdateConstants.DOWNLOAD_DIR, file), - StableUtils.pathJoin(installHome, ProjectConstants.LIB_NAME, file)); - list.add(StableUtils.pathJoin(installHome, ProjectConstants.LIB_NAME, file)); - } - } - - private void putNewFilesToInstallEnv(String installHome, String[] files, Map map, java.util.List list) { - for (String file : files) { - map.put(StableUtils.pathJoin(installHome, UpdateConstants.DOWNLOAD_DIR, file), - StableUtils.pathJoin(installHome, UpdateConstants.APPS_FOLDER_NAME, ProductConstants.getAppFolderName(), ProjectConstants.WEBINF_NAME, ProjectConstants.LIB_NAME, file)); - list.add(StableUtils.pathJoin(installHome, UpdateConstants.APPS_FOLDER_NAME, ProductConstants.getAppFolderName(), ProjectConstants.WEBINF_NAME, ProjectConstants.LIB_NAME, file)); - } - } //获取备份目录 private String getBackupDirectory() { return UpdateConstants.DESIGNER_BACKUP_DIR; } - //获取服务器jar包列表 - private List getJARList4Server() { - return UpdateConstants.JARS_FOR_SERVER_X; - } - - //获取设计器jar包列表 - private List getJARList4Designer() { - return UpdateConstants.JARS_FOR_DESIGNER_X; - } - - //获取服务器jar包下载列表 - private String[] getDownLoadJAR4Server() { - ArrayList jarList = new ArrayList(); - List serverItems = getJARList4Server(); - for (DownloadItem downloadItem : downloadItems) { - String downloadItemName = downloadItem.getName(); - if (serverItems.contains(downloadItemName)) { - jarList.add(downloadItemName); - } - } - return jarList.toArray(new String[jarList.size()]); - } - - //获取设计器jar包下载列表 - private String[] getDownLoadJAR4Designer() { - ArrayList jarList = new ArrayList(); - List designerJarItems = getJARList4Designer(); - for (DownloadItem downloadItem : downloadItems) { - String downloadItemName = downloadItem.getName(); - if (designerJarItems.contains(downloadItemName)) { - jarList.add(downloadItemName); - } - } - return jarList.toArray(new String[jarList.size()]); - } - //获取更新日志缓存配置文件名 private String getUpdateCacheConfig() { return UpdateConstants.UPDATE_CACHE_CONFIG_X; 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 c8c0561c9..12fc96e96 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 @@ -31,6 +31,7 @@ import com.fr.design.style.color.ColorFactory; import com.fr.design.style.color.ColorSelectBox; import com.fr.design.style.color.ColorSelectable; import com.fr.general.FRFont; +import com.fr.stable.AssistUtils; import com.fr.stable.Constants; import com.fr.stable.OperatingSystem; import com.fr.stable.StringUtils; @@ -728,12 +729,16 @@ public final class GUICoreUtils { * @return 布尔值 */ public static boolean removeJListSelectedNodes(Window ancestorWindow, JList nodeList) { + return removeJListSelectedNodes(ancestorWindow, nodeList, "Fine-Design_Basic_Utils_Are_You_Sure_To_Remove_The_Selected_Item"); + } + + public static boolean removeJListSelectedNodes(Window ancestorWindow, JList nodeList, String key) { int selectedIndex = nodeList.getSelectedIndex(); if (selectedIndex == -1) { return false; } - int returnVal = JOptionPane.showConfirmDialog(ancestorWindow, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Utils_Are_You_Sure_To_Remove_The_Selected_Item") + "?", com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Remove"), + int returnVal = JOptionPane.showConfirmDialog(ancestorWindow, com.fr.design.i18n.Toolkit.i18nText(key), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Remove"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE); if (returnVal == JOptionPane.OK_OPTION) { int minSelectedIndex = nodeList.getMinSelectionIndex(); @@ -890,10 +895,10 @@ public final class GUICoreUtils { * @return 同上 */ public static boolean isTheSameRect(Rectangle oneRect, Rectangle otherRect) { - return oneRect.getX() == otherRect.getX() - && oneRect.getY() == otherRect.getY() - && oneRect.getWidth() == otherRect.getWidth() - && oneRect.getHeight() == otherRect.getHeight(); + return AssistUtils.equals(oneRect.getX(), otherRect.getX()) + && AssistUtils.equals(oneRect.getY(), otherRect.getY()) + && AssistUtils.equals(oneRect.getWidth(), otherRect.getWidth()) + && AssistUtils.equals(oneRect.getHeight(), otherRect.getHeight()); } /** diff --git a/designer-base/src/main/java/com/fr/design/widget/component/NumberEditorValidatePane.java b/designer-base/src/main/java/com/fr/design/widget/component/NumberEditorValidatePane.java index 42bcfae0a..72a199a5b 100644 --- a/designer-base/src/main/java/com/fr/design/widget/component/NumberEditorValidatePane.java +++ b/designer-base/src/main/java/com/fr/design/widget/component/NumberEditorValidatePane.java @@ -9,6 +9,7 @@ import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.layout.TableLayout; import com.fr.design.layout.TableLayoutHelper; import com.fr.form.ui.NumberEditor; +import com.fr.stable.AssistUtils; import com.fr.stable.StringUtils; import javax.swing.BorderFactory; @@ -226,7 +227,7 @@ public class NumberEditorValidatePane extends JPanel { } allowNegativeCheckBox.setSelected(e.isAllowNegative()); - if (e.getMaxValue() == Double.MAX_VALUE) { + if (AssistUtils.equals(e.getMaxValue(),Double.MAX_VALUE)) { setMaxValueCheckBox.setSelected(false); maxValueSpinner.setValue(Double.MAX_VALUE); maxValueSpinner.setEnabled(false); @@ -236,7 +237,7 @@ public class NumberEditorValidatePane extends JPanel { maxValueSpinner.setValue(e.getMaxValue()); } - if (e.getMinValue() == -Double.MAX_VALUE) { + if (AssistUtils.equals(e.getMinValue(),-Double.MAX_VALUE)) { setMinValueCheckBox.setSelected(false); minValueSpinner.setValue(-Double.MAX_VALUE); minValueSpinner.setEnabled(false); diff --git a/designer-base/src/main/java/com/fr/design/write/submit/DBManipulationPane.java b/designer-base/src/main/java/com/fr/design/write/submit/DBManipulationPane.java index 6692155dc..c28f70e5f 100644 --- a/designer-base/src/main/java/com/fr/design/write/submit/DBManipulationPane.java +++ b/designer-base/src/main/java/com/fr/design/write/submit/DBManipulationPane.java @@ -633,9 +633,6 @@ public class DBManipulationPane extends BasicBeanPane { for (int i = 0; i < len; i++) { currentColumnNames[i] = new ColumnName(colNames[i]); } - if (currentColumnNames == null) { - currentColumnNames = new ColumnName[0]; - } return currentColumnNames; } @@ -701,7 +698,7 @@ public class DBManipulationPane extends BasicBeanPane { } else { dmlConfigComboBox.setSelectedIndex(0); } - jobs = new NameSubmitJob[dmlConfig == null ? 0 : dmlConfig.getSubmitJobCount()]; + jobs = new NameSubmitJob[dmlConfig.getSubmitJobCount()]; for (int i = 0; i < jobs.length; i++) { jobs[i] = dmlConfig.getSubmitJob(i); } diff --git a/designer-base/src/main/java/com/fr/start/BaseDesigner.java b/designer-base/src/main/java/com/fr/start/BaseDesigner.java index 05d41a1e7..37c668971 100644 --- a/designer-base/src/main/java/com/fr/start/BaseDesigner.java +++ b/designer-base/src/main/java/com/fr/start/BaseDesigner.java @@ -5,25 +5,28 @@ package com.fr.start; import com.fr.design.DesignerEnvManager; import com.fr.design.ExtraDesignClassManager; +import com.fr.design.constants.DesignerLaunchStatus; import com.fr.design.file.HistoryTemplateListPane; import com.fr.design.file.MutilTempalteTabPane; import com.fr.design.file.TemplateTreePane; import com.fr.design.fun.DesignerStartOpenFileProcessor; -import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.DesignerFrame; import com.fr.design.mainframe.toolbar.ToolBarMenuDock; +import com.fr.design.ui.util.UIUtil; import com.fr.design.utils.DesignUtils; +import com.fr.event.Event; import com.fr.event.EventDispatcher; +import com.fr.event.Listener; +import com.fr.event.Null; import com.fr.file.FILE; import com.fr.file.FILEFactory; import com.fr.file.FileFILE; import com.fr.general.ComparatorUtils; import com.fr.log.FineLoggerFactory; -import com.fr.module.ModuleEvent; import com.fr.stable.OperatingSystem; -import java.awt.Window; +import java.awt.*; import java.io.File; import java.lang.reflect.Method; @@ -31,45 +34,73 @@ import java.lang.reflect.Method; * The main class of Report Designer. */ public abstract class BaseDesigner extends ToolBarMenuDock { - + private static final int LOAD_TREE_MAXNUM = 10; - + private final String[] args; public BaseDesigner(String[] args) { - + this.args = args; init(); } - + private void init() { + prepare(); // 初始化look and feel.这个在预加载之前执行是因为lookAndFeel里的东西,预加载时也要用到 DesignUtils.initLookAndFeel(); // 初始化Log Handler DesignerEnvManager.loadLogSetting(); createDesignerFrame(); } - + + /** + * 准备一些订阅 + */ + private void prepare() { + EventDispatcher.listen(DesignerLaunchStatus.DESIGNER_INIT_COMPLETE, new Listener() { + @Override + public void on(Event event, Null param) { + UIUtil.invokeLaterIfNeeded(new Runnable() { + @Override + public void run() { + + // 打开上次的文件 + showDesignerFrame(false); + DesignerLaunchStatus.setStatus(DesignerLaunchStatus.OPEN_LAST_FILE_COMPLETE); + } + }); + } + }); + EventDispatcher.listen(DesignerLaunchStatus.STARTUP_COMPLETE, new Listener() { + @Override + public void on(Event event, Null param) { + collectUserInformation(); + } + }); + } + public void show() { - collectUserInformation(); - showDesignerFrame(false); - + UIUtil.invokeLaterIfNeeded(new Runnable() { + @Override + public void run() { + refreshTemplateTree(); + } + }); + } + + private void refreshTemplateTree() { //TODO: 2019-06-14 这里有啥作用? DesignerContext.getDesignerFrame().refreshEnv(); for (int i = 0; !TemplateTreePane.getInstance().getTemplateFileTree().isTemplateShowing() && i < LOAD_TREE_MAXNUM; i++) { TemplateTreePane.getInstance().getTemplateFileTree().refresh(); } - DesignerContext.getDesignerFrame().setVisible(true); - DesignerContext.getDesignerFrame().resizeFrame(); } - private void createDesignerFrame() { - new DesignerFrame(this); } - - + private void showDesignerFrame(boolean isException) { try { FILE file = null; @@ -94,8 +125,7 @@ public abstract class BaseDesigner extends ToolBarMenuDock { } } } else { - file = FILEFactory.createFILE(FILEFactory.ENV_PREFIX - + DesignerEnvManager.getEnvManager().getLastOpenFile()); + file = FILEFactory.createFILE(FILEFactory.ENV_PREFIX + DesignerEnvManager.getEnvManager().getLastOpenFile()); } DesignerFrame df = DesignerContext.getDesignerFrame(); isException = openFile(df, isException, file); @@ -134,7 +164,7 @@ public abstract class BaseDesigner extends ToolBarMenuDock { df.getSelectedJTemplate().requestGridFocus(); return isException; } - + private void enableFullScreenMode(Window window) { String className = "com.apple.eawt.FullScreenUtilities"; String methodName = "setWindowCanFullScreen"; diff --git a/designer-base/src/main/java/com/fr/start/server/FineEmbedServerActivator.java b/designer-base/src/main/java/com/fr/start/server/FineEmbedServerActivator.java index 0955c16e5..12aebd231 100644 --- a/designer-base/src/main/java/com/fr/start/server/FineEmbedServerActivator.java +++ b/designer-base/src/main/java/com/fr/start/server/FineEmbedServerActivator.java @@ -38,7 +38,7 @@ public class FineEmbedServerActivator extends Activator { } catch (LifecycleException e) { FineLoggerFactory.getLogger().error(e.getMessage(), e); - }finally { + } finally { FineEmbedServerMonitor.getInstance().setComplete(); } } @@ -86,7 +86,7 @@ public class FineEmbedServerActivator extends Activator { private void stopSpring() { - AnnotationConfigWebApplicationContext context = ModuleRole.ServerRoot.getSingleton(AnnotationConfigWebApplicationContext.class); + AnnotationConfigWebApplicationContext context = ModuleRole.ServerRoot.findSingleton(AnnotationConfigWebApplicationContext.class); if (context != null) { context.stop(); context.destroy(); diff --git a/designer-base/src/main/java/com/fr/start/server/FineEmbedServerMonitor.java b/designer-base/src/main/java/com/fr/start/server/FineEmbedServerMonitor.java index 75b11bc3b..078372183 100644 --- a/designer-base/src/main/java/com/fr/start/server/FineEmbedServerMonitor.java +++ b/designer-base/src/main/java/com/fr/start/server/FineEmbedServerMonitor.java @@ -1,25 +1,32 @@ package com.fr.start.server; import com.fr.concurrent.NamedThreadFactory; +import com.fr.design.gui.iprogressbar.ProgressDialog; import com.fr.design.mainframe.DesignerContext; import com.fr.event.Event; import com.fr.event.EventDispatcher; import com.fr.event.Listener; import com.fr.event.Null; -import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; /** * 内置服务器启动监视器 - * Created by zack on 2018/8/21. + * + * @author zack + * @date 2018/8/21 */ public class FineEmbedServerMonitor { private int progress; - private static final int COMPLETE = 100;//启动完成 - private static final int STEP = 5;//随便设置一个假的进度条 - private static final int STEP_HEARTBEAT = 2000;//2秒更新进度 + private static final int STEP = 1; + /** + * 40ms更新进度 + */ + private static final int STEP_HEARTBEAT = 40; private static volatile FineEmbedServerMonitor monitor; + private static ProgressDialog progressBar = DesignerContext.getDesignerFrame().getProgressDialog(); private FineEmbedServerMonitor() { } @@ -46,7 +53,7 @@ public class FineEmbedServerMonitor { } public int getProgress() { - if (progress == COMPLETE) { + if (progress == progressBar.getProgressMaximum()) { return progress; } else { progress += STEP; @@ -55,7 +62,7 @@ public class FineEmbedServerMonitor { } public void setComplete() { - this.progress = COMPLETE; + this.progress = progressBar.getProgressMaximum(); } public void reset() { @@ -63,30 +70,28 @@ public class FineEmbedServerMonitor { } public boolean isComplete() { - return this.progress == COMPLETE; + return this.progress >= progressBar.getProgressMaximum(); } public void monitor() { - ExecutorService service = Executors.newSingleThreadExecutor(new NamedThreadFactory("FineEmbedServerMonitor")); - service.submit(new Runnable() { - + final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1, + new NamedThreadFactory("FineEmbedServerMonitor")); + scheduler.scheduleAtFixedRate(new Runnable() { @Override public void run() { - while (!isComplete()) { - if (!DesignerContext.getDesignerFrame().getProgressDialog().isVisible()) { - DesignerContext.getDesignerFrame().showProgressDialog(); - DesignerContext.getDesignerFrame().getProgressDialog().updateLoadingText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Loading_Embed_Server")); - } - DesignerContext.getDesignerFrame().updateProgress(getProgress()); - try { - Thread.sleep(STEP_HEARTBEAT); - } catch (InterruptedException ignore) { - Thread.currentThread().interrupt(); - } + if (isComplete()) { + scheduler.shutdown(); + DesignerContext.getDesignerFrame().hideProgressDialog(); + return; } - DesignerContext.getDesignerFrame().hideProgressDialog(); + if (!DesignerContext.getDesignerFrame().getProgressDialog().isVisible()) { + DesignerContext.getDesignerFrame().showProgressDialog(); + DesignerContext.getDesignerFrame().getProgressDialog() + .updateLoadingText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Loading_Embed_Server")); + } + DesignerContext.getDesignerFrame().updateProgress(getProgress()); } - }); - service.shutdown(); + }, 0, STEP_HEARTBEAT, TimeUnit.MILLISECONDS); + } } diff --git a/designer-base/src/main/java/com/fr/start/server/ServerManageFrame.java b/designer-base/src/main/java/com/fr/start/server/ServerManageFrame.java index ff183b754..289a32426 100644 --- a/designer-base/src/main/java/com/fr/start/server/ServerManageFrame.java +++ b/designer-base/src/main/java/com/fr/start/server/ServerManageFrame.java @@ -5,18 +5,12 @@ import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.itextfield.UITextField; import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.utils.DesignUtils; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.log.FineLoggerFactory; -import javax.swing.BorderFactory; -import javax.swing.JFrame; -import javax.swing.JPanel; -import javax.swing.SwingConstants; -import java.awt.BorderLayout; -import java.awt.Dimension; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; +import javax.swing.*; +import java.awt.*; +import java.awt.event.*; /** * 内置Tomcat服务器管理界面 @@ -46,7 +40,6 @@ public class ServerManageFrame extends JFrame { private ServerManageFrame() { - DesignUtils.initLookAndFeel(); this.setIconImage(BaseUtils.readImage("/com/fr/base/images/oem/trayStarted.png")); JPanel contentPane = (JPanel) this.getContentPane(); diff --git a/designer-base/src/main/java/com/fr/start/server/ServerTray.java b/designer-base/src/main/java/com/fr/start/server/ServerTray.java index f6dede295..2b3713c0f 100644 --- a/designer-base/src/main/java/com/fr/start/server/ServerTray.java +++ b/designer-base/src/main/java/com/fr/start/server/ServerTray.java @@ -1,6 +1,7 @@ package com.fr.start.server; import com.fr.base.BaseUtils; +import com.fr.design.ui.util.UIUtil; import com.fr.event.Event; import com.fr.event.EventDispatcher; import com.fr.event.ListenerAdaptor; @@ -85,6 +86,7 @@ public class ServerTray { //创建退出菜单监听器 ActionListener exitListener = new ActionListener() { + @Override public void actionPerformed(ActionEvent e) { exit(); @@ -177,7 +179,13 @@ public class ServerTray { } public static void init() { - if (INSTANCE == null) - INSTANCE = new ServerTray(); + UIUtil.invokeLaterIfNeeded(new Runnable() { + @Override + public void run() { + if (INSTANCE == null) { + INSTANCE = new ServerTray(); + } + } + }); } } \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/FormulaTokenMaker.flex b/designer-base/src/main/resources/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/FormulaTokenMaker.flex index 724e6b5de..f73852366 100644 --- a/designer-base/src/main/resources/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/FormulaTokenMaker.flex +++ b/designer-base/src/main/resources/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/FormulaTokenMaker.flex @@ -578,7 +578,13 @@ FunctionNames = "ABS"| "YEAR"| "year"| "YEARDELTA"| - "yeardelta" + "yeardelta"| + "SUMPRECISE"| + "sumprecise"| + "QUERY"| + "query"| + "WEBIMAGE"| + "webimage" %state MLC diff --git a/designer-base/src/main/resources/com/fr/design/remote/images/icon_Custom_Role_normal@1x.png b/designer-base/src/main/resources/com/fr/design/remote/images/icon_Custom_Role_normal@1x.png new file mode 100644 index 000000000..67c53fff5 Binary files /dev/null and b/designer-base/src/main/resources/com/fr/design/remote/images/icon_Custom_Role_normal@1x.png differ diff --git a/designer-base/src/main/resources/com/fr/design/remote/images/icon_Custom_Role_normal@2x.png b/designer-base/src/main/resources/com/fr/design/remote/images/icon_Custom_Role_normal@2x.png new file mode 100644 index 000000000..d6a631bd5 Binary files /dev/null and b/designer-base/src/main/resources/com/fr/design/remote/images/icon_Custom_Role_normal@2x.png differ diff --git a/designer-base/src/test/java/com/fr/design/ExtraDesignClassManagerTest.java b/designer-base/src/test/java/com/fr/design/ExtraDesignClassManagerTest.java new file mode 100644 index 000000000..89f4ee1b2 --- /dev/null +++ b/designer-base/src/test/java/com/fr/design/ExtraDesignClassManagerTest.java @@ -0,0 +1,70 @@ +package com.fr.design; + +import com.fr.config.dao.DaoContext; +import com.fr.config.dao.impl.LocalClassHelperDao; +import com.fr.config.dao.impl.LocalEntityDao; +import com.fr.config.dao.impl.LocalXmlEntityDao; +import com.fr.design.fun.ToolbarItemProvider; +import com.fr.design.gui.core.WidgetOption; +import com.fr.design.mainframe.JTemplate; +import com.fr.design.mainframe.JVirtualTemplate; +import com.fr.general.ModuleContext; +import com.fr.log.FineLoggerFactory; +import com.fr.report.restriction.CellCountRestriction; +import com.fr.report.restriction.ReportRestrictionScene; +import com.fr.restriction.Restrictions; +import com.fr.stable.Filter; +import com.fr.stable.module.Module; +import junit.framework.TestCase; +import org.easymock.EasyMock; +import org.junit.Assert; + +import java.util.HashSet; +import java.util.Set; + +/** + * @author zack + * @version 10.0 + * Created by zack on 2019/9/17 + */ +public class ExtraDesignClassManagerTest extends TestCase { + @Override + protected void setUp() throws Exception { + DaoContext.setEntityDao(new LocalEntityDao()); + DaoContext.setClassHelperDao(new LocalClassHelperDao()); + DaoContext.setXmlEntityDao(new LocalXmlEntityDao()); + ModuleContext.startModule(Module.PAGE_MODULE); + Restrictions.register(ReportRestrictionScene.CELL_COUNT, new CellCountRestriction()); + } + + public void testGetWebOption() { + try { + final JTemplate jTemplate = new JVirtualTemplate(null); + ToolbarItemProvider item = EasyMock.mock(ToolbarItemProvider.class); + ToolbarItemProvider item1 = EasyMock.mock(ToolbarItemProvider.class); + EasyMock.expect(item.accept(jTemplate)).andReturn(false).anyTimes(); + EasyMock.expect(item.classForWidget()).andReturn(null).anyTimes(); + EasyMock.expect(item.iconPathForWidget()).andReturn("").anyTimes(); + EasyMock.expect(item.nameForWidget()).andReturn("1").anyTimes(); + EasyMock.expect(item1.accept(jTemplate)).andReturn(true).anyTimes(); + EasyMock.expect(item1.classForWidget()).andReturn(null).anyTimes(); + EasyMock.expect(item1.iconPathForWidget()).andReturn("").anyTimes(); + EasyMock.expect(item1.nameForWidget()).andReturn("2").anyTimes(); + EasyMock.replay(item); + EasyMock.replay(item1); + + Set set = new HashSet<>(); + set.add(item); + set.add(item1); + WidgetOption[] widgetOptions = ExtraDesignClassManager.getInstance().getWebWidgetOptions(set, new Filter() { + @Override + public boolean accept(ToolbarItemProvider toolbarItemProvider) { + return toolbarItemProvider.accept(jTemplate); + } + }); + Assert.assertEquals(1, widgetOptions.length); + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } + } +} \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/design/ChartTypeInterfaceManager.java b/designer-chart/src/main/java/com/fr/design/ChartTypeInterfaceManager.java index 8c3f56ae0..b9950256f 100644 --- a/designer-chart/src/main/java/com/fr/design/ChartTypeInterfaceManager.java +++ b/designer-chart/src/main/java/com/fr/design/ChartTypeInterfaceManager.java @@ -1,31 +1,33 @@ package com.fr.design; import com.fr.chart.base.ChartConstants; -import com.fr.chart.base.ChartInternationalNameContentBean; +import com.fr.chart.chartattr.Chart; import com.fr.chart.chartattr.Plot; import com.fr.chart.charttypes.ChartTypeManager; +import com.fr.chart.fun.ChartTypeProvider; import com.fr.chartx.attr.ChartProvider; +import com.fr.common.annotations.Compatible; import com.fr.design.beans.BasicBeanPane; import com.fr.design.beans.FurtherBasicBeanPane; -import com.fr.design.chart.fun.IndependentChartUIProvider; +import com.fr.design.chart.fun.ChartTypeUIProvider; import com.fr.design.chart.gui.ChartWidgetOption; -import com.fr.design.chartinterface.AreaIndependentChartInterface; -import com.fr.design.chartinterface.BarIndependentChartInterface; -import com.fr.design.chartinterface.BubbleIndependentChartInterface; -import com.fr.design.chartinterface.ColumnIndependentChartInterface; -import com.fr.design.chartinterface.CustomIndependentChartInterface; -import com.fr.design.chartinterface.DonutIndependentChartInterface; -import com.fr.design.chartinterface.FunnelIndependentChartInterface; -import com.fr.design.chartinterface.GanttIndependentChartInterface; -import com.fr.design.chartinterface.GisMapIndependentChartInterface; -import com.fr.design.chartinterface.LineIndependentChartInterface; -import com.fr.design.chartinterface.MapIndependentChartInterface; -import com.fr.design.chartinterface.MeterIndependentChartInterface; -import com.fr.design.chartinterface.PieIndependentChartInterface; -import com.fr.design.chartinterface.RadarIndependentChartInterface; -import com.fr.design.chartinterface.RangeIndependentChartInterface; -import com.fr.design.chartinterface.StockIndependentChartInterface; -import com.fr.design.chartinterface.XYScatterIndependentChartInterface; +import com.fr.design.type.ui.AreaChartTypeUI; +import com.fr.design.type.ui.BarChartTypeUI; +import com.fr.design.type.ui.BubbleChartTypeUI; +import com.fr.design.type.ui.ColumnChartTypeUI; +import com.fr.design.type.ui.CustomChartTypeUI; +import com.fr.design.type.ui.DonutChartTypeUI; +import com.fr.design.type.ui.FunnelChartTypeUI; +import com.fr.design.type.ui.GanttChartTypeUI; +import com.fr.design.type.ui.GisMapChartTypeUI; +import com.fr.design.type.ui.LineChartTypeUI; +import com.fr.design.type.ui.MapChartTypeUI; +import com.fr.design.type.ui.MeterChartTypeUI; +import com.fr.design.type.ui.PieChartTypeUI; +import com.fr.design.type.ui.RadarChartTypeUI; +import com.fr.design.type.ui.RangeChartTypeUI; +import com.fr.design.type.ui.StockChartTypeUI; +import com.fr.design.type.ui.XYScatterChartTypeUI; import com.fr.design.condition.ConditionAttributesPane; import com.fr.design.gui.core.WidgetOption; import com.fr.design.gui.frpane.AttributeChangeListener; @@ -38,10 +40,13 @@ import com.fr.design.mainframe.chart.gui.data.report.AbstractReportDataContentPa import com.fr.design.mainframe.chart.gui.data.table.AbstractTableDataContentPane; import com.fr.design.mainframe.chart.gui.type.AbstractChartTypePane; import com.fr.design.module.DesignModuleFactory; +import com.fr.extended.chart.AbstractChart; import com.fr.form.ui.ChartEditor; import com.fr.general.GeneralContext; import com.fr.general.IOUtils; +import com.fr.invoke.Reflect; import com.fr.locale.InterProviderFactory; +import com.fr.log.FineLoggerFactory; import com.fr.plugin.chart.PiePlot4VanChart; import com.fr.plugin.chart.area.VanChartAreaPlot; import com.fr.plugin.chart.bubble.VanChartBubblePlot; @@ -111,16 +116,16 @@ public class ChartTypeInterfaceManager implements ExtraChartDesignClassManagerPr private static ChartTypeInterfaceManager classManager = new ChartTypeInterfaceManager(); - - private static LinkedHashMap> chartTypeInterfaces = - new LinkedHashMap>(); + + private static LinkedHashMap> chartTypeInterfaces = + new LinkedHashMap>(); private static Map idAndPriorityMap = new HashMap(); public static final String TYPE_PANE_DEFAULT_TITLE = "DEFAULT_NAME"; public synchronized static ChartTypeInterfaceManager getInstance() { - + return classManager; } @@ -153,21 +158,21 @@ public class ChartTypeInterfaceManager implements ExtraChartDesignClassManagerPr } }); } - + public static WidgetOption[] initWidgetOption() { - ChartInternationalNameContentBean[] typeName = ChartTypeManager.getInstance().getAllChartBaseNames(); - ChartWidgetOption[] child = new ChartWidgetOption[typeName.length]; + String[] chartIDs = ChartTypeManager.getInstance().getAllChartIDs(); + ChartWidgetOption[] child = new ChartWidgetOption[chartIDs.length]; int index = 0; - for (ChartInternationalNameContentBean bean : typeName) { - String plotID = bean.getChartID(); - ChartProvider[] rowChart = ChartTypeManager.getInstance().getChartTypes(plotID); - if (ArrayUtils.isEmpty(rowChart) && !ChartTypeManager.innerChart(plotID)) { + for (String chartID : chartIDs) { + ChartProvider[] rowChart = ChartTypeManager.getInstance().getChartTypes(chartID); + if (ArrayUtils.isEmpty(rowChart) && !ChartTypeManager.innerChart(chartID)) { continue; } - String iconPath = ChartTypeInterfaceManager.getInstance().getIconPath(plotID); + String name = ChartTypeInterfaceManager.getInstance().getName(chartID); + String iconPath = ChartTypeInterfaceManager.getInstance().getIconPath(chartID); Icon icon = IOUtils.readIcon(iconPath); - child[index] = new ChartWidgetOption(InterProviderFactory.getProvider().getLocText(bean.getName()), icon, ChartEditor.class, plotID); + child[index] = new ChartWidgetOption(name, icon, ChartEditor.class, chartID); index++; } @@ -196,40 +201,40 @@ public class ChartTypeInterfaceManager implements ExtraChartDesignClassManagerPr addChartTypeInterface(VAN_CHART_PRIORITY, VanChartGanttPlot.VAN_CHART_GANTT_PLOT_ID, new GanttIndependentVanChartInterface()); addChartTypeInterface(VAN_CHART_PRIORITY, VanChartStructurePlot.STRUCTURE_PLOT_ID, new StructureIndependentVanChartInterface()); } - - + + private static void readDefault() { - addChartTypeInterface(DEPRECATED_CHART_PRIORITY, ChartConstants.COLUMN_CHART, new ColumnIndependentChartInterface()); - addChartTypeInterface(DEPRECATED_CHART_PRIORITY, ChartConstants.LINE_CHART, new LineIndependentChartInterface()); - addChartTypeInterface(DEPRECATED_CHART_PRIORITY, ChartConstants.BAR_CHART, new BarIndependentChartInterface()); - addChartTypeInterface(DEPRECATED_CHART_PRIORITY, ChartConstants.PIE_CHART, new PieIndependentChartInterface()); - addChartTypeInterface(DEPRECATED_CHART_PRIORITY, ChartConstants.AREA_CHART, new AreaIndependentChartInterface()); - addChartTypeInterface(DEPRECATED_CHART_PRIORITY, ChartConstants.SCATTER_CHART, new XYScatterIndependentChartInterface()); - addChartTypeInterface(DEPRECATED_CHART_PRIORITY, ChartConstants.BUBBLE_CHART, new BubbleIndependentChartInterface()); - addChartTypeInterface(DEPRECATED_CHART_PRIORITY, ChartConstants.RADAR_CHART, new RadarIndependentChartInterface()); - addChartTypeInterface(DEPRECATED_CHART_PRIORITY, ChartConstants.STOCK_CHART, new StockIndependentChartInterface()); - addChartTypeInterface(DEPRECATED_CHART_PRIORITY, ChartConstants.METER_CHART, new MeterIndependentChartInterface()); - addChartTypeInterface(DEPRECATED_CHART_PRIORITY, ChartConstants.RANGE_CHART, new RangeIndependentChartInterface()); - addChartTypeInterface(DEPRECATED_CHART_PRIORITY, ChartConstants.CUSTOM_CHART, new CustomIndependentChartInterface()); - addChartTypeInterface(DEPRECATED_CHART_PRIORITY, ChartConstants.GANTT_CHART, new GanttIndependentChartInterface()); - addChartTypeInterface(DEPRECATED_CHART_PRIORITY, ChartConstants.DONUT_CHART, new DonutIndependentChartInterface()); - addChartTypeInterface(DEPRECATED_CHART_PRIORITY, ChartConstants.MAP_CHART, new MapIndependentChartInterface()); - addChartTypeInterface(DEPRECATED_CHART_PRIORITY, ChartConstants.GIS_CHAER, new GisMapIndependentChartInterface()); - addChartTypeInterface(DEPRECATED_CHART_PRIORITY, ChartConstants.FUNNEL_CHART, new FunnelIndependentChartInterface()); - } - - private static void addChartTypeInterface(String priority, String plotID, IndependentChartUIProvider provider) { - + addChartTypeInterface(DEPRECATED_CHART_PRIORITY, ChartConstants.COLUMN_CHART, new ColumnChartTypeUI()); + addChartTypeInterface(DEPRECATED_CHART_PRIORITY, ChartConstants.LINE_CHART, new LineChartTypeUI()); + addChartTypeInterface(DEPRECATED_CHART_PRIORITY, ChartConstants.BAR_CHART, new BarChartTypeUI()); + addChartTypeInterface(DEPRECATED_CHART_PRIORITY, ChartConstants.PIE_CHART, new PieChartTypeUI()); + addChartTypeInterface(DEPRECATED_CHART_PRIORITY, ChartConstants.AREA_CHART, new AreaChartTypeUI()); + addChartTypeInterface(DEPRECATED_CHART_PRIORITY, ChartConstants.SCATTER_CHART, new XYScatterChartTypeUI()); + addChartTypeInterface(DEPRECATED_CHART_PRIORITY, ChartConstants.BUBBLE_CHART, new BubbleChartTypeUI()); + addChartTypeInterface(DEPRECATED_CHART_PRIORITY, ChartConstants.RADAR_CHART, new RadarChartTypeUI()); + addChartTypeInterface(DEPRECATED_CHART_PRIORITY, ChartConstants.STOCK_CHART, new StockChartTypeUI()); + addChartTypeInterface(DEPRECATED_CHART_PRIORITY, ChartConstants.METER_CHART, new MeterChartTypeUI()); + addChartTypeInterface(DEPRECATED_CHART_PRIORITY, ChartConstants.RANGE_CHART, new RangeChartTypeUI()); + addChartTypeInterface(DEPRECATED_CHART_PRIORITY, ChartConstants.CUSTOM_CHART, new CustomChartTypeUI()); + addChartTypeInterface(DEPRECATED_CHART_PRIORITY, ChartConstants.GANTT_CHART, new GanttChartTypeUI()); + addChartTypeInterface(DEPRECATED_CHART_PRIORITY, ChartConstants.DONUT_CHART, new DonutChartTypeUI()); + addChartTypeInterface(DEPRECATED_CHART_PRIORITY, ChartConstants.MAP_CHART, new MapChartTypeUI()); + addChartTypeInterface(DEPRECATED_CHART_PRIORITY, ChartConstants.GIS_CHAER, new GisMapChartTypeUI()); + addChartTypeInterface(DEPRECATED_CHART_PRIORITY, ChartConstants.FUNNEL_CHART, new FunnelChartTypeUI()); + } + + private static void addChartTypeInterface(String priority, String plotID, ChartTypeUIProvider provider) { + if (chartTypeInterfaces != null) { if (!chartTypeInterfaces.containsKey(priority)) { //新建一个具体图表列表 - CloseableContainedMap chartUIList - = new CloseableContainedMap(LinkedHashMap.class); + CloseableContainedMap chartUIList + = new CloseableContainedMap(LinkedHashMap.class); chartUIList.put(plotID, provider); chartTypeInterfaces.put(priority, chartUIList); } else { - Map chartUIList = chartTypeInterfaces.get(priority); + Map chartUIList = chartTypeInterfaces.get(priority); if (!chartUIList.containsKey(plotID)) { chartUIList.put(plotID, provider); } @@ -238,7 +243,7 @@ public class ChartTypeInterfaceManager implements ExtraChartDesignClassManagerPr } } - private IndependentChartUIProvider getChartTypeInterface(String plotID) { + private ChartTypeUIProvider getChartTypeInterface(String plotID) { if (idAndPriorityMap.containsKey(plotID)) { String priority = idAndPriorityMap.get(plotID); if (chartTypeInterfaces.containsKey(priority)) { @@ -247,14 +252,14 @@ public class ChartTypeInterfaceManager implements ExtraChartDesignClassManagerPr } return null; } - + /** * 把所有的pane加到list里 * * @param paneList pane容器 */ public void addPlotTypePaneList(List> paneList, Map>> allChartTypePane) { - + List priorityList = getPriorityInOrder(); for (Integer aPriorityList : priorityList) { String priority = String.valueOf(aPriorityList); @@ -267,70 +272,39 @@ public class ChartTypeInterfaceManager implements ExtraChartDesignClassManagerPr if (chartTypeInterfaces != null && chartTypeInterfaces.containsKey(priority)) { - Map chartUIList = chartTypeInterfaces.get(priority); + Map chartUIList = chartTypeInterfaces.get(priority); - Iterator> iterator = chartUIList.entrySet().iterator(); + Iterator> iterator = chartUIList.entrySet().iterator(); while (iterator.hasNext()) { - Map.Entry entry = iterator.next(); - String plotID = entry.getKey(); - - AbstractChartTypePane pane = entry.getValue().getPlotTypePane(); - if (AssistUtils.equals(pane.title4PopupWindow(), TYPE_PANE_DEFAULT_TITLE)) { - continue; + try { + Map.Entry entry = iterator.next(); + String plotID = entry.getKey(); + + AbstractChartTypePane pane = entry.getValue().getPlotTypePane(); + if (AssistUtils.equals(pane.title4PopupWindow(), TYPE_PANE_DEFAULT_TITLE)) { + continue; + } + pane.reLayout(plotID); + paneList.add(pane); + + if (allChartTypePane.get(priority) == null) { + allChartTypePane.put(priority, new LinkedHashMap>()); + } + allChartTypePane.get(priority).put(plotID, pane); + } catch (Throwable e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); } - pane.setPlotID(plotID); - paneList.add(pane); - - if (allChartTypePane.get(priority) == null) { - allChartTypePane.put(priority, new LinkedHashMap>()); - } - allChartTypePane.get(priority).put(plotID, pane); } } } - private String getChartName(String plotID, IndependentChartUIProvider provider) { - String name = provider.getPlotTypeTitle4PopupWindow(); - if (StringUtils.isEmpty(name)) { - name = ChartTypeManager.getInstance().getChartName(plotID); - } - return name; - } - + @Compatible public String getTitle4PopupWindow(String plotID) { - IndependentChartUIProvider provider = getChartTypeInterface(plotID); - if (provider != null) { - return provider.getPlotTypeTitle4PopupWindow(); - } - return StringUtils.EMPTY; + return getName(plotID); } - - /** - * 获取指定图表的标题 - */ - public String getTitle4PopupWindow(String priority, String plotID) { - - if (chartTypeInterfaces != null && chartTypeInterfaces.containsKey(priority) && chartTypeInterfaces.get(priority).containsKey(plotID)) { - IndependentChartUIProvider provider = chartTypeInterfaces.get(priority).get(plotID); - return getChartName(plotID, provider); - } - - //兼容老的插件 - if (chartTypeInterfaces != null) { - Iterator iterator = chartTypeInterfaces.entrySet().iterator(); - while (iterator.hasNext()) { - Map.Entry entry = (Map.Entry) iterator.next(); - String defaultPriority = (String) entry.getKey(); - if (chartTypeInterfaces.get(defaultPriority).containsKey(plotID)) { - return getChartName(plotID, chartTypeInterfaces.get(defaultPriority).get(plotID)); - } - } - } - return StringUtils.EMPTY; - } - + private List getPriorityInOrder() { - + List priorityList = new ArrayList(); if (chartTypeInterfaces != null) { Iterator iterator = chartTypeInterfaces.entrySet().iterator(); @@ -346,93 +320,214 @@ public class ChartTypeInterfaceManager implements ExtraChartDesignClassManagerPr public String getIconPath(String plotID) { if (chartTypeInterfaces != null) { - IndependentChartUIProvider provider = getChartTypeInterface(plotID); + ChartTypeUIProvider provider = getChartTypeInterface(plotID); if (provider != null) { return provider.getIconPath(); } } return StringUtils.EMPTY; } - + + public String[] getDemoImagePath(String chartID) { + + if (chartTypeInterfaces != null) { + ChartTypeUIProvider provider = getChartTypeInterface(chartID); + if (provider != null) { + String[] result = null; + try { + result = provider.getDemoImagePath(); + } catch (Throwable e) { + //do nothing + } + return ArrayUtils.isEmpty(result) ? getCompatibleDemoImagePath(chartID) : result; + } + } + + return new String[0]; + } + + private String[] getCompatibleDemoImagePath(String chartID) { + String[] result = null; + try { + //AbstractIndependentChartsProvider + ChartTypeProvider chartTypeProvider = Reflect.on(ChartTypeManager.getInstanceWithCheck()).call("getChartType", chartID).get(); + result = new String[]{ + Reflect.on(chartTypeProvider).call("getChartImagePath").get() + }; + + if (ArrayUtils.isNotEmpty(result)) { + return result; + } + } catch (Exception e) { + //do nothing + } + + try { + //兼容 图表类型选择界面会调到这边 + ChartProvider[] charts = ChartTypeManager.getInstanceWithCheck().getChartTypes(chartID); + result = new String[charts.length]; + for (int i = 0; i < charts.length; i++) { + //Chart && AbstractChart + ChartProvider chart = charts[i]; + if (!(chart instanceof AbstractChart)) {//扩展图表 + chart = Reflect.on(chart).field("subChart").get(); + } + result[i] = Reflect.on(chart).call("demoImagePath").get(); + } + + if (ArrayUtils.isNotEmpty(result)) { + return result; + } + } catch (Exception e) { + //do nothing + } + + return new String[]{getIconPath(chartID)}; + } + + public String[] getSubName(String chartID) { + if (chartTypeInterfaces != null) { + ChartTypeUIProvider provider = getChartTypeInterface(chartID); + if (provider != null) { + String[] subNames = null; + try { + subNames = provider.getSubName(); + } catch (Throwable throwable) { + //do nothing + } + return ArrayUtils.isEmpty(subNames) ? getCompatibleSubName(chartID, provider) : subNames; + } + } + return new String[0]; + } + + //兼容 + private String[] getCompatibleSubName(String chartID, ChartTypeUIProvider provider) { + ChartProvider[] chartProviders = ChartTypeManager.getInstanceWithCheck().getChartTypes(chartID); + + if (chartProviders.length == 1) { + return new String[]{getName(chartID)}; + } + String[] result = new String[chartProviders.length]; + for (int i = 0; i < chartProviders.length; i++) { + if (chartProviders[i] instanceof Chart) { + //Chart && AbstractChart + result[i] = ((Chart) chartProviders[i]).getChartName(); + } + } + return result; + } + + public String getName(String chartID) { + if (chartTypeInterfaces != null) { + ChartTypeUIProvider provider = getChartTypeInterface(chartID); + if (provider != null) { + String name = null; + try { + name = provider.getName(); + } catch (Throwable throwable) { + //do nothing + } + + return StringUtils.isEmpty(name) ? getCompatibleName(chartID, provider) : name; + } + } + return StringUtils.EMPTY; + } + + //兼容 + private static String getCompatibleName(String chartID, ChartTypeUIProvider provider) { + + String result = null; + try { + //AbstractIndependentChartsProvider + ChartTypeProvider chartTypeProvider = Reflect.on(ChartTypeManager.getInstanceWithCheck()).call("getChartType", chartID).get(); + result = Reflect.on(chartTypeProvider).call("getChartName").get();//国际化的key + result = InterProviderFactory.getProvider().getLocText(result); + if (StringUtils.isNotEmpty(result)) { + return result; + } + } catch (Exception e) { + //do nothing + } + + + try { + ChartProvider chartProvider = ChartTypeManager.getInstanceWithCheck().getChartTypes(chartID)[0]; + if (chartProvider instanceof Chart) { + //AbstractExtendedChartUIProvider + result = ((Chart) chartProvider).getChartName(); + } + if (StringUtils.isNotEmpty(result) && !"Charts".equals(result)) { + return result; + } + + } catch (Exception e) { + //do nothing + } + + return provider.getPlotTypePane().title4PopupWindow(); + } + public ChartDataPane getChartDataPane(String plotID, AttributeChangeListener listener) { - IndependentChartUIProvider provider = getChartTypeInterface(plotID); + ChartTypeUIProvider provider = getChartTypeInterface(plotID); if (provider != null) { return provider.getChartDataPane(listener); } return new ChartDataPane(listener); } - - /** - * 获取对应ID的图表数量 - * - */ - private int getChartSize(String key) { - - if (chartTypeInterfaces != null && chartTypeInterfaces.containsKey(key)) { - return chartTypeInterfaces.get(key).size(); - } - return 0; - } - + public AbstractChartAttrPane[] getAttrPaneArray(String plotID, AttributeChangeListener listener) { - IndependentChartUIProvider provider = getChartTypeInterface(plotID); + ChartTypeUIProvider provider = getChartTypeInterface(plotID); if (provider != null) { return provider.getAttrPaneArray(listener); } return new AbstractChartAttrPane[0]; - + } - + public AbstractTableDataContentPane getTableDataSourcePane(Plot plot, ChartDataPane parent) { - IndependentChartUIProvider provider = getChartTypeInterface(plot.getPlotID()); + ChartTypeUIProvider provider = getChartTypeInterface(plot.getPlotID()); if (provider != null) { return provider.getTableDataSourcePane(plot, parent); } return null; } - + public AbstractReportDataContentPane getReportDataSourcePane(Plot plot, ChartDataPane parent) { - IndependentChartUIProvider provider = getChartTypeInterface(plot.getPlotID()); + ChartTypeUIProvider provider = getChartTypeInterface(plot.getPlotID()); if (provider != null) { return provider.getReportDataSourcePane(plot, parent); } return null; } - - private boolean plotInChart(String plotID, String priority) { - - return chartTypeInterfaces != null - && chartTypeInterfaces.containsKey(priority) - && chartTypeInterfaces.get(priority).containsKey(plotID); - } - - + public ConditionAttributesPane getPlotConditionPane(Plot plot) { - IndependentChartUIProvider provider = getChartTypeInterface(plot.getPlotID()); + ChartTypeUIProvider provider = getChartTypeInterface(plot.getPlotID()); if (provider != null) { return provider.getPlotConditionPane(plot); } return null; } - + public BasicBeanPane getPlotSeriesPane(ChartStylePane parent, Plot plot) { - IndependentChartUIProvider provider = getChartTypeInterface(plot.getPlotID()); + ChartTypeUIProvider provider = getChartTypeInterface(plot.getPlotID()); if (provider != null) { return provider.getPlotSeriesPane(parent, plot); } return null; } - + /** * 是否使用默认的界面,为了避免界面来回切换 * @@ -441,18 +536,18 @@ public class ChartTypeInterfaceManager implements ExtraChartDesignClassManagerPr */ public boolean isUseDefaultPane(String plotID) { - IndependentChartUIProvider provider = getChartTypeInterface(plotID); + ChartTypeUIProvider provider = getChartTypeInterface(plotID); if (provider != null) { return provider.isUseDefaultPane(); } - + return true; } public boolean needChartChangePane(ChartProvider chart) { if (chart != null) { String chartID = chart.getID(); - IndependentChartUIProvider provider = getChartTypeInterface(chartID); + ChartTypeUIProvider provider = getChartTypeInterface(chartID); if (provider != null) { return provider.needChartChangePane(); } @@ -460,48 +555,54 @@ public class ChartTypeInterfaceManager implements ExtraChartDesignClassManagerPr return true; } - + @Override public void mount(PluginSingleInjection injection) { - - if (isIndependentChartUIProvider(injection)) { + + if (isChartTypeUIProvider(injection)) { + String id = injection.getAttribute("chartID"); + if (StringUtils.isEmpty(id)) { + id = injection.getAttribute("plotID"); + } String priority = injection.getAttribute("priority", DEFAULT_PRIORITY); - String plotID = injection.getAttribute("plotID"); - IndependentChartUIProvider instance = (IndependentChartUIProvider) injection.getObject(); - addChartTypeInterface(priority, plotID, instance); + ChartTypeUIProvider instance = (ChartTypeUIProvider) injection.getObject(); + addChartTypeInterface(priority, id, instance); } } - - + + @Override public void demount(PluginSingleInjection injection) { - - if (isIndependentChartUIProvider(injection)) { + + if (isChartTypeUIProvider(injection)) { String priority = injection.getAttribute("priority", DEFAULT_PRIORITY); - String plotID = injection.getAttribute("plotID"); - removeChartTypeInterface(priority, plotID); + String id = injection.getAttribute("chartID"); + if (StringUtils.isEmpty(id)) { + id = injection.getAttribute("plotID"); + } + removeChartTypeInterface(priority, id); } } - + private void removeChartTypeInterface(String priority, String plotID) { - + if (chartTypeInterfaces != null) { if (chartTypeInterfaces.containsKey(priority)) { - Map chartUIList = chartTypeInterfaces.get(priority); + Map chartUIList = chartTypeInterfaces.get(priority); chartUIList.remove(plotID); } } } - - - private boolean isIndependentChartUIProvider(PluginSingleInjection injection) { - - return !(injection == null || injection.getObject() == null) && IndependentChartUIProvider.XML_TAG.equals(injection.getName()) && injection.getObject() instanceof IndependentChartUIProvider; + + + private boolean isChartTypeUIProvider(PluginSingleInjection injection) { + + return !(injection == null || injection.getObject() == null) && (ChartTypeUIProvider.XML_TAG.equals(injection.getName()) || ChartTypeUIProvider.OLD_TAG.equals(injection.getName())) && injection.getObject() instanceof ChartTypeUIProvider; } public ChartEditPane getChartEditPane(String plotID) { - IndependentChartUIProvider provider = getChartTypeInterface(plotID); + ChartTypeUIProvider provider = getChartTypeInterface(plotID); if (provider != null) { return provider.getChartEditPane(plotID); } @@ -509,7 +610,7 @@ public class ChartTypeInterfaceManager implements ExtraChartDesignClassManagerPr } public ChartsConfigPane getChartConfigPane(String plotID) { - IndependentChartUIProvider provider = getChartTypeInterface(plotID); + ChartTypeUIProvider provider = getChartTypeInterface(plotID); if (provider != null) { return provider.getChartConfigPane(plotID); } diff --git a/designer-chart/src/main/java/com/fr/design/chart/ChartDesignerActivator.java b/designer-chart/src/main/java/com/fr/design/chart/ChartDesignerActivator.java index 2034f4591..c3213c10b 100644 --- a/designer-chart/src/main/java/com/fr/design/chart/ChartDesignerActivator.java +++ b/designer-chart/src/main/java/com/fr/design/chart/ChartDesignerActivator.java @@ -4,7 +4,6 @@ import com.fr.chart.chartattr.ChartCollection; import com.fr.design.ChartTypeInterfaceManager; import com.fr.design.actions.core.ActionFactory; import com.fr.design.chart.gui.ChartComponent; -import com.fr.design.constants.DesignerLaunchStatus; import com.fr.design.file.HistoryTemplateListPane; import com.fr.design.mainframe.ChartPropertyPane; import com.fr.design.module.ChartEmptyDataStyleAction; @@ -54,8 +53,6 @@ public class ChartDesignerActivator extends Activator implements Prepare { DesignImageEvent.registerDefaultCallbackEvent(HistoryTemplateListPane.getInstance()); DesignImageEvent.registerDownloadSourcesEvent(new DownloadOnlineSourcesHelper()); - DesignerLaunchStatus.setStatus(DesignerLaunchStatus.DESIGNER_INIT_COMPLETE); - ChartTypeInterfaceManager.addPluginChangedListener(); } diff --git a/designer-chart/src/main/java/com/fr/design/chart/ChartTypePane.java b/designer-chart/src/main/java/com/fr/design/chart/ChartTypePane.java index 599a70915..0eb70fd12 100644 --- a/designer-chart/src/main/java/com/fr/design/chart/ChartTypePane.java +++ b/designer-chart/src/main/java/com/fr/design/chart/ChartTypePane.java @@ -3,15 +3,15 @@ package com.fr.design.chart; * the Pane of the Chart */ -import com.fr.chart.base.ChartInternationalNameContentBean; import com.fr.chart.chartattr.ChartCollection; import com.fr.chart.charttypes.ChartTypeManager; import com.fr.chartx.attr.ChartProvider; +import com.fr.design.ChartTypeInterfaceManager; import com.fr.design.gui.ilable.UILabel; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.utils.gui.GUICoreUtils; -import com.fr.locale.InterProviderFactory; import com.fr.log.FineLoggerFactory; +import com.fr.stable.StringUtils; import javax.swing.BorderFactory; import javax.swing.DefaultListCellRenderer; @@ -28,29 +28,7 @@ import java.awt.Component; public class ChartTypePane extends ChartCommonWizardPane { private static final long serialVersionUID = -1175602484968520546L; - private ChartInternationalNameContentBean[] typeName = ChartTypeManager.getInstanceWithCheck().getAllChartBaseNames(); - private ChartProvider[][] charts4Icon = null; - - { - charts4Icon = new ChartProvider[this.typeName.length][]; - for (int i = 0; i < this.typeName.length; i++) { - ChartProvider[] rowCharts = ChartTypeManager.getInstanceWithCheck().getChartTypes(this.typeName[i].getChartID()); - int rowChartsCount = rowCharts.length; - charts4Icon[i] = new ChartProvider[rowChartsCount]; - for (int j = 0; j < rowChartsCount; j++) { - try { - charts4Icon[i][j] = (ChartProvider) rowCharts[j].clone(); - //todo@shinerefactor 老图表也是提供一张图片 这边就不用setTitle(null) 然后实时去画 -// charts4Icon[i][j].setTitle(null); -// if(charts4Icon[i][j].getPlot() != null){ -// charts4Icon[i][j].getPlot().setLegend(null); -// } - } catch (CloneNotSupportedException e) { - FineLoggerFactory.getLogger().error(e.getMessage(), e); - } - } - } - } + private String[] chartIDs = ChartTypeManager.getInstanceWithCheck().getAllChartIDs(); private JList mainTypeList = null; private JList iconViewList = null; @@ -61,8 +39,8 @@ public class ChartTypePane extends ChartCommonWizardPane { DefaultListModel defaultListModel = new DefaultListModel(); mainTypeList = new JList(defaultListModel); - for (int i = 0; i < typeName.length; i++) { - defaultListModel.insertElementAt(InterProviderFactory.getProvider().getLocText(typeName[i].getName()), i); + for (int i = 0; i < chartIDs.length; i++) { + defaultListModel.insertElementAt(ChartTypeInterfaceManager.getInstance().getName(chartIDs[i]), i); } mainTypeList.addListSelectionListener(listSelectionListener); @@ -115,11 +93,15 @@ public class ChartTypePane extends ChartCommonWizardPane { protected ListSelectionListener listSelectionListener = new ListSelectionListener() { public void valueChanged(ListSelectionEvent e) { int main_index = mainTypeList.getSelectedIndex(); - ChartProvider[] sub_charts = ChartTypePane.this.charts4Icon[main_index]; + String id = ChartTypePane.this.chartIDs[main_index]; + + String[] demoImagePath = ChartTypeInterfaceManager.getInstance().getDemoImagePath(id); + String[] subName = ChartTypeInterfaceManager.getInstance().getSubName(id); + ChartTypePane.this.iconListModel.clear(); - for (int i = 0; i < sub_charts.length; i++) { - String ImagePath = sub_charts[i].demoImagePath(); - String chartName = sub_charts[i].getChartName(); + for (int i = 0, len = subName.length; i < len; i++) { + String ImagePath = demoImagePath.length > i ? demoImagePath[i] : StringUtils.EMPTY; + String chartName = subName[i]; ChartTypePane.this.iconListModel.addElement(new ChartIcon(ImagePath, chartName)); } iconViewList.setSelectedIndex(0); @@ -143,7 +125,7 @@ public class ChartTypePane extends ChartCommonWizardPane { ChartProvider chart4Update = cc.getSelectedChartProvider(); if (chart4Update == null) { - String plotID = typeName[mainTypeList.getSelectedIndex()].getChartID(); + String plotID = this.chartIDs[mainTypeList.getSelectedIndex()]; ChartProvider chart = ChartTypeManager.getInstance().getChartTypes(plotID)[iconViewList.getSelectedIndex()]; try { chart4Update = (ChartProvider) chart.clone(); diff --git a/designer-chart/src/main/java/com/fr/design/chart/fun/ChartTypeUIProvider.java b/designer-chart/src/main/java/com/fr/design/chart/fun/ChartTypeUIProvider.java new file mode 100644 index 000000000..9db47e431 --- /dev/null +++ b/designer-chart/src/main/java/com/fr/design/chart/fun/ChartTypeUIProvider.java @@ -0,0 +1,141 @@ +package com.fr.design.chart.fun; + +import com.fr.chart.chartattr.Plot; +import com.fr.design.beans.BasicBeanPane; +import com.fr.design.condition.ConditionAttributesPane; +import com.fr.design.gui.frpane.AttributeChangeListener; +import com.fr.design.mainframe.chart.AbstractChartAttrPane; +import com.fr.design.mainframe.chart.ChartEditPane; +import com.fr.design.mainframe.chart.ChartsConfigPane; +import com.fr.design.mainframe.chart.gui.ChartDataPane; +import com.fr.design.mainframe.chart.gui.ChartStylePane; +import com.fr.design.mainframe.chart.gui.data.report.AbstractReportDataContentPane; +import com.fr.design.mainframe.chart.gui.data.table.AbstractTableDataContentPane; +import com.fr.design.mainframe.chart.gui.type.AbstractChartTypePane; +import com.fr.plugin.injectable.SpecialLevel; +import com.fr.stable.fun.Level; + +/** + * Created by eason on 14/12/29. + * + * @since 8.0 + * 自定义 图表类型 界面接口 + */ +public interface ChartTypeUIProvider extends Level { + + String XML_TAG = "ChartTypeUIProvider"; + + String OLD_TAG = SpecialLevel.IndependentChartUIProvider.getTagName(); + + int CURRENT_API_LEVEL = 3; + + /** + * 图表 类型定义界面类型,就是属性表的第一个界面 + * 可以返回null 代表没有 图表类型切换界面 + * + * @return 图表的类型定义界面类型 + */ + AbstractChartTypePane getPlotTypePane(); + + /** + * 图表 数据配置界面 即属性表的第二个界面 + * 可以返回null 代表没有数据配置界面 + */ + ChartDataPane getChartDataPane(AttributeChangeListener listener); + + /** + * 图表 属性界面数组 其他样式界面数组 + * 可以返回空数组 代表没有其他样式界面 + * + * @return 属性界面 + */ + AbstractChartAttrPane[] getAttrPaneArray(AttributeChangeListener listener); + + /** + * 图表 名称 + * eg:柱形图 + * + * @return 图表 名称 + */ + String getName(); + + /** + * 图表 名称 + * 柱形图 堆积柱形图 等 + * + * @return 图表 名称 + */ + String[] getSubName(); + + /** + * 图表 demo图片路径 + * 400*225 + * 1.图表选择界面的图的路径 原样渲染 + * 2.图表属性第一个界面 类型界面 缩放渲染 + * + * @return demo图片路径 + */ + String[] getDemoImagePath(); + + /** + * 小图标路径 + * 表单 工具栏 图表小图标 + * 16*16 + * + * @return 图标路径 + */ + String getIconPath(); + + + //todo:把下面这些接口删除 + @Deprecated + boolean needChartChangePane(); + + /** + * 数据集数据源的界面 + * + * @return 数据集数据源的界面 + */ + @Deprecated + AbstractTableDataContentPane getTableDataSourcePane(Plot plot, ChartDataPane parent); + + + /** + * 单元格数据源的界面 + * + * @return 单元格数据源的界面 + */ + @Deprecated + AbstractReportDataContentPane getReportDataSourcePane(Plot plot, ChartDataPane parent); + + /** + * 条件属性界面 + * + * @return 条件属性界面 + */ + @Deprecated + ConditionAttributesPane getPlotConditionPane(Plot plot); + + /** + * 系列界面 + * + * @return 系列界面 + */ + @Deprecated + BasicBeanPane getPlotSeriesPane(ChartStylePane parent, Plot plot); + + /** + * 是否使用默认的界面,为了避免界面来回切换 + * + * @return 是否使用默认的界面 + */ + @Deprecated + boolean isUseDefaultPane(); + + @Deprecated + ChartEditPane getChartEditPane(String plotID); + + @Deprecated + ChartsConfigPane getChartConfigPane(String plotID); + +} \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/design/chart/fun/IndependentChartUIProvider.java b/designer-chart/src/main/java/com/fr/design/chart/fun/IndependentChartUIProvider.java index 4872da46b..88a14c090 100644 --- a/designer-chart/src/main/java/com/fr/design/chart/fun/IndependentChartUIProvider.java +++ b/designer-chart/src/main/java/com/fr/design/chart/fun/IndependentChartUIProvider.java @@ -1,102 +1,11 @@ package com.fr.design.chart.fun; -import com.fr.chart.chartattr.Plot; -import com.fr.design.beans.BasicBeanPane; -import com.fr.design.condition.ConditionAttributesPane; -import com.fr.design.gui.frpane.AttributeChangeListener; -import com.fr.design.mainframe.chart.AbstractChartAttrPane; -import com.fr.design.mainframe.chart.ChartEditPane; -import com.fr.design.mainframe.chart.ChartsConfigPane; -import com.fr.design.mainframe.chart.gui.ChartDataPane; -import com.fr.design.mainframe.chart.gui.ChartStylePane; -import com.fr.design.mainframe.chart.gui.data.report.AbstractReportDataContentPane; -import com.fr.design.mainframe.chart.gui.data.table.AbstractTableDataContentPane; -import com.fr.design.mainframe.chart.gui.type.AbstractChartTypePane; -import com.fr.plugin.injectable.SpecialLevel; -import com.fr.stable.fun.Level; +import com.fr.common.annotations.Compatible; /** - * Created by eason on 14/12/29. - * - * @since 8.0 - * 自定义图表类型设设计界面接口 + * Created by shine on 2019/09/05. */ -public interface IndependentChartUIProvider extends Level { - - String XML_TAG = SpecialLevel.IndependentChartUIProvider.getTagName(); +@Compatible +public interface IndependentChartUIProvider extends ChartTypeUIProvider { - int CURRENT_API_LEVEL = 3; - - boolean needChartChangePane(); - - /** - * 图表的类型定义界面类型,就是属性表的第一个界面 - * - * @return 图表的类型定义界面类型 - */ - AbstractChartTypePane getPlotTypePane(); - - /** - * 数据集数据源的界面 - * - * @return 数据集数据源的界面 - */ - AbstractTableDataContentPane getTableDataSourcePane(Plot plot, ChartDataPane parent); - - - /** - * 单元格数据源的界面 - * - * @return 单元格数据源的界面 - */ - AbstractReportDataContentPane getReportDataSourcePane(Plot plot, ChartDataPane parent); - - /** - * 条件属性界面 - * - * @return 条件属性界面 - */ - ConditionAttributesPane getPlotConditionPane(Plot plot); - - /** - * 系列界面 - * - * @return 系列界面 - */ - BasicBeanPane getPlotSeriesPane(ChartStylePane parent, Plot plot); - - - /** - * 图表的属性界面数组 - * - * @return 属性界面 - */ - AbstractChartAttrPane[] getAttrPaneArray(AttributeChangeListener listener); - - ChartDataPane getChartDataPane(AttributeChangeListener listener); - - /** - * 是否使用默认的界面,为了避免界面来回切换 - * - * @return 是否使用默认的界面 - */ - boolean isUseDefaultPane(); - - /** - * 图标路径 - * - * @return 图标路径 - */ - String getIconPath(); - - /** - * plot面板的标题 - */ - String getPlotTypeTitle4PopupWindow(); - - ChartEditPane getChartEditPane(String plotID); - - - ChartsConfigPane getChartConfigPane(String plotID); - -} \ No newline at end of file +} diff --git a/designer-chart/src/main/java/com/fr/design/chart/fun/impl/AbstractChartTypeUI.java b/designer-chart/src/main/java/com/fr/design/chart/fun/impl/AbstractChartTypeUI.java new file mode 100644 index 000000000..289505aa0 --- /dev/null +++ b/designer-chart/src/main/java/com/fr/design/chart/fun/impl/AbstractChartTypeUI.java @@ -0,0 +1,93 @@ +package com.fr.design.chart.fun.impl; + +import com.fr.chart.chartattr.Plot; +import com.fr.design.beans.BasicBeanPane; +import com.fr.design.chart.fun.ChartTypeUIProvider; +import com.fr.design.chartx.impl.AbstractDataPane; +import com.fr.design.chartx.impl.AbstractOtherPane; +import com.fr.design.chartx.impl.DefaultTypePane; +import com.fr.design.condition.ConditionAttributesPane; +import com.fr.design.gui.frpane.AttributeChangeListener; +import com.fr.design.mainframe.chart.ChartEditPane; +import com.fr.design.mainframe.chart.ChartsConfigPane; +import com.fr.design.mainframe.chart.gui.ChartDataPane; +import com.fr.design.mainframe.chart.gui.ChartStylePane; +import com.fr.design.mainframe.chart.gui.data.report.AbstractReportDataContentPane; +import com.fr.design.mainframe.chart.gui.data.table.AbstractTableDataContentPane; +import com.fr.design.mainframe.chart.gui.type.AbstractChartTypePane; +import com.fr.stable.fun.impl.AbstractProvider; +import com.fr.stable.fun.mark.API; + +/** + * Created by shine on 2019/09/03. + */ +@API(level = ChartTypeUIProvider.CURRENT_API_LEVEL) +public abstract class AbstractChartTypeUI extends AbstractProvider implements ChartTypeUIProvider { + + @Override + public AbstractChartTypePane getPlotTypePane() { + return new DefaultTypePane(); + } + + @Override + public abstract AbstractDataPane getChartDataPane(AttributeChangeListener listener); + + @Override + public abstract AbstractOtherPane[] getAttrPaneArray(AttributeChangeListener listener); + + @Override + public String[] getSubName() { + return new String[]{getName()}; + } + + @Override + public int currentAPILevel() { + return CURRENT_API_LEVEL; + } + + @Override + public String mark4Provider() { + return getClass().getName(); + } + + @Override + public boolean needChartChangePane() { + return false; + } + + @Override + public AbstractTableDataContentPane getTableDataSourcePane(Plot plot, ChartDataPane parent) { + return null; + } + + @Override + public AbstractReportDataContentPane getReportDataSourcePane(Plot plot, ChartDataPane parent) { + return null; + } + + @Override + public boolean isUseDefaultPane() { + return false; + } + + @Override + public ChartEditPane getChartEditPane(String plotID) { + return new ChartEditPane(); + } + + @Override + public ConditionAttributesPane getPlotConditionPane(Plot plot) { + return null; + } + + @Override + public BasicBeanPane getPlotSeriesPane(ChartStylePane parent, Plot plot) { + return null; + } + + @Override + public ChartsConfigPane getChartConfigPane(String plotID) { + return null; + } + +} \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/design/chart/fun/impl/AbstractIndependentChartUI.java b/designer-chart/src/main/java/com/fr/design/chart/fun/impl/AbstractIndependentChartUI.java deleted file mode 100644 index 848fc4436..000000000 --- a/designer-chart/src/main/java/com/fr/design/chart/fun/impl/AbstractIndependentChartUI.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.fr.design.chart.fun.impl; - -import com.fr.chart.chartattr.Plot; -import com.fr.design.beans.BasicBeanPane; -import com.fr.design.chart.fun.IndependentChartUIProvider; -import com.fr.design.chart.series.SeriesCondition.DataSeriesConditionPane; -import com.fr.design.condition.ConditionAttributesPane; -import com.fr.design.gui.frpane.AttributeChangeListener; -import com.fr.design.mainframe.chart.AbstractChartAttrPane; -import com.fr.design.mainframe.chart.ChartEditPane; -import com.fr.design.mainframe.chart.ChartsConfigPane; -import com.fr.design.mainframe.chart.gui.ChartDataPane; -import com.fr.design.mainframe.chart.gui.ChartStylePane; -import com.fr.general.ComparatorUtils; -import com.fr.stable.StableUtils; - - -/** - * Created by eason on 15/4/23. - */ -@Deprecated -public abstract class AbstractIndependentChartUI implements IndependentChartUIProvider { - - @Override - public int currentAPILevel() { - return -1; - } - - public AbstractChartAttrPane[] getAttrPaneArray(AttributeChangeListener listener){ - return new AbstractChartAttrPane[0]; - } - - public ChartDataPane getChartDataPane(AttributeChangeListener listener){ - return new ChartDataPane(listener); - } - - /** - * 是否使用默认的界面,为了避免界面来回切换 - * @return 是否使用默认的界面 - */ - public boolean isUseDefaultPane(){ - return true; - } - - public BasicBeanPane getPlotSeriesPane(ChartStylePane parent, Plot plot){ - return getPlotSeriesPane(); - } - - public BasicBeanPane getPlotSeriesPane(){ - return null; - } - - public boolean equals(Object obj) { - return obj != null && ComparatorUtils.equals(obj.getClass(), this.getClass()); - } - - public ConditionAttributesPane getPlotConditionPane(Plot plot){ - return new DataSeriesConditionPane(); - } - - public ChartEditPane getChartEditPane(String plotID){ return StableUtils.construct(ChartEditPane.class);} - - public ChartsConfigPane getChartConfigPane(String plotID){return null;} - - -} \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/design/chart/fun/impl/AbstractIndependentChartUIWithAPILevel.java b/designer-chart/src/main/java/com/fr/design/chart/fun/impl/AbstractIndependentChartUIWithAPILevel.java index cbf988cf8..f6a1b20fc 100644 --- a/designer-chart/src/main/java/com/fr/design/chart/fun/impl/AbstractIndependentChartUIWithAPILevel.java +++ b/designer-chart/src/main/java/com/fr/design/chart/fun/impl/AbstractIndependentChartUIWithAPILevel.java @@ -2,7 +2,7 @@ package com.fr.design.chart.fun.impl; import com.fr.chart.chartattr.Plot; import com.fr.design.beans.BasicBeanPane; -import com.fr.design.chart.fun.IndependentChartUIProvider; +import com.fr.design.chart.fun.ChartTypeUIProvider; import com.fr.design.chart.series.SeriesCondition.DataSeriesConditionPane; import com.fr.design.condition.ConditionAttributesPane; import com.fr.design.gui.frpane.AttributeChangeListener; @@ -17,7 +17,7 @@ import com.fr.stable.StableUtils; /** * Created by Mitisky on 16/3/7. */ -public abstract class AbstractIndependentChartUIWithAPILevel implements IndependentChartUIProvider { +public abstract class AbstractIndependentChartUIWithAPILevel implements ChartTypeUIProvider { //这个不能改,是做兼容用的 //2016.10.14-11.24号的8.0jar因为改了这个为3,不会提示5.26号之前的插件更新 private static final int OLD_PLUGIN_LEVEL = -2; @@ -29,27 +29,33 @@ public abstract class AbstractIndependentChartUIWithAPILevel implements Independ return OLD_PLUGIN_LEVEL; } - public AbstractChartAttrPane[] getAttrPaneArray(AttributeChangeListener listener){ + public AbstractChartAttrPane[] getAttrPaneArray(AttributeChangeListener listener) { return new AbstractChartAttrPane[0]; } - public ChartDataPane getChartDataPane(AttributeChangeListener listener){ + public ChartDataPane getChartDataPane(AttributeChangeListener listener) { return new ChartDataPane(listener); } + @Override + public String[] getSubName() { + return new String[]{getName()}; + } + /** * 是否使用默认的界面,为了避免界面来回切换 + * * @return 是否使用默认的界面 */ - public boolean isUseDefaultPane(){ + public boolean isUseDefaultPane() { return true; } - public BasicBeanPane getPlotSeriesPane(ChartStylePane parent, Plot plot){ + public BasicBeanPane getPlotSeriesPane(ChartStylePane parent, Plot plot) { return getPlotSeriesPane(); } - public BasicBeanPane getPlotSeriesPane(){ + public BasicBeanPane getPlotSeriesPane() { return null; } @@ -62,19 +68,15 @@ public abstract class AbstractIndependentChartUIWithAPILevel implements Independ return true; } - public ConditionAttributesPane getPlotConditionPane(Plot plot){ + public ConditionAttributesPane getPlotConditionPane(Plot plot) { return new DataSeriesConditionPane(); } - /** - * plot面板的标题 - * 插件兼容 - */ - public String getPlotTypeTitle4PopupWindow(){ - return getPlotTypePane().title4PopupWindow(); + public ChartEditPane getChartEditPane(String plotID) { + return StableUtils.construct(ChartEditPane.class); } - public ChartEditPane getChartEditPane(String plotID){ return StableUtils.construct(ChartEditPane.class);} - - public ChartsConfigPane getChartConfigPane(String plotID){return null;} + public ChartsConfigPane getChartConfigPane(String plotID) { + return null; + } } diff --git a/designer-chart/src/main/java/com/fr/design/chart/fun/impl/AbstractIndependentChartsUI.java b/designer-chart/src/main/java/com/fr/design/chart/fun/impl/AbstractIndependentChartsUI.java index 19244a3fd..649210f38 100644 --- a/designer-chart/src/main/java/com/fr/design/chart/fun/impl/AbstractIndependentChartsUI.java +++ b/designer-chart/src/main/java/com/fr/design/chart/fun/impl/AbstractIndependentChartsUI.java @@ -3,7 +3,7 @@ package com.fr.design.chart.fun.impl; import com.fr.chart.chartattr.Plot; import com.fr.design.ChartTypeInterfaceManager; import com.fr.design.beans.BasicBeanPane; -import com.fr.design.chart.fun.IndependentChartUIProvider; +import com.fr.design.chart.fun.ChartTypeUIProvider; import com.fr.design.condition.ConditionAttributesPane; import com.fr.design.gui.frpane.AttributeChangeListener; import com.fr.design.mainframe.chart.AbstractChartAttrPane; @@ -26,8 +26,19 @@ import com.fr.stable.fun.mark.API; * 用户使用第三方图表需要继承的面板抽象类 */ -@API(level = IndependentChartUIProvider.CURRENT_API_LEVEL) -public abstract class AbstractIndependentChartsUI extends AbstractProvider implements IndependentChartUIProvider { +@Deprecated +@API(level = ChartTypeUIProvider.CURRENT_API_LEVEL) +public abstract class AbstractIndependentChartsUI extends AbstractProvider implements ChartTypeUIProvider { + + @Override + public String getName() { + return null; + } + + @Override + public String[] getSubName() { + return new String[0]; + } public String mark4Provider() { return getClass().getName(); @@ -96,16 +107,6 @@ public abstract class AbstractIndependentChartsUI extends AbstractProvider imple return "com/fr/design/images/form/toolbar/ChartF-Column.png"; } - @Override - - /** - * plot面板的标题 - * 插件兼容 - */ - public String getPlotTypeTitle4PopupWindow(){ - return getPlotTypePane().title4PopupWindow(); - } - @Override public ChartEditPane getChartEditPane(String plotID) { return new ChartsEditPane(); diff --git a/designer-chart/src/main/java/com/fr/design/chart/gui/ActiveGlyphFactory.java b/designer-chart/src/main/java/com/fr/design/chart/gui/ActiveGlyphFactory.java deleted file mode 100644 index 3a2ec0fd3..000000000 --- a/designer-chart/src/main/java/com/fr/design/chart/gui/ActiveGlyphFactory.java +++ /dev/null @@ -1,97 +0,0 @@ -package com.fr.design.chart.gui; - -import java.util.HashMap; -import java.util.Map; - -import com.fr.base.chart.Glyph; -import com.fr.chart.chartglyph.CategoryAxisGlyph; -import com.fr.chart.chartglyph.ChartAlertValueGlyph; -import com.fr.chart.chartglyph.ChartGlyph; -import com.fr.chart.chartglyph.DataSeries; -import com.fr.chart.chartglyph.DataSheetGlyph; -import com.fr.chart.chartglyph.DateAxisGlyph; -import com.fr.chart.chartglyph.LegendGlyph; -import com.fr.chart.chartglyph.PlotGlyph; -import com.fr.chart.chartglyph.RadarAxisGlyph; -import com.fr.chart.chartglyph.RangeAxisGlyph; -import com.fr.chart.chartglyph.TextGlyph; -import com.fr.chart.chartglyph.TitleGlyph; -import com.fr.chart.chartglyph.TrendLineGlyph; -import com.fr.chart.chartglyph.ValueAxisGlyph; -import com.fr.design.chart.gui.active.ActiveGlyph; -import com.fr.design.chart.gui.active.AlertValueActiveGlyph; -import com.fr.design.chart.gui.active.CategoryAxisActiveGlyph; -import com.fr.design.chart.gui.active.ChartActiveGlyph; -import com.fr.design.chart.gui.active.DataLabelActiveGlyph; -import com.fr.design.chart.gui.active.DataSeriesActiveGlyph; -import com.fr.design.chart.gui.active.DataSheetActiveGlyph; -import com.fr.design.chart.gui.active.DateAxisActiveGlyph; -import com.fr.design.chart.gui.active.LegendActiveGlyph; -import com.fr.design.chart.gui.active.PlotActiveGlyph; -import com.fr.design.chart.gui.active.RadarAxisActiveGlyph; -import com.fr.design.chart.gui.active.RangeAxisActiveGlyph; -import com.fr.design.chart.gui.active.TextActiveGlyph; -import com.fr.design.chart.gui.active.TrendLineActiveGlyph; -import com.fr.design.chart.gui.active.ValueAxisActiveGlyph; - -/** - * Created by IntelliJ IDEA. - * Author : Richer - * Version: 6.5.6 - * Date : 11-11-23 - * Time : 上午9:08 - */ -public class ActiveGlyphFactory { - private static Map glyphMap = new HashMap(); - - static { - glyphMap.put(DataSeries.class.getName(), DataSeriesActiveGlyph.class); - glyphMap.put(RadarAxisGlyph.class.getName(), RadarAxisActiveGlyph.class); - glyphMap.put(RangeAxisGlyph.class.getName(), RangeAxisActiveGlyph.class); - glyphMap.put(TitleGlyph.class.getName(), TextActiveGlyph.class); - glyphMap.put(DateAxisGlyph.class.getName(), DateAxisActiveGlyph.class); - glyphMap.put(ValueAxisGlyph.class.getName(), ValueAxisActiveGlyph.class); - glyphMap.put(CategoryAxisGlyph.class.getName(), CategoryAxisActiveGlyph.class); - glyphMap.put(ChartGlyph.class.getName(), ChartActiveGlyph.class); - glyphMap.put(DataSheetGlyph.class.getName(), DataSheetActiveGlyph.class); - glyphMap.put(LegendGlyph.class.getName(), LegendActiveGlyph.class); - glyphMap.put(TextGlyph.class.getName(), DataLabelActiveGlyph.class); - glyphMap.put(TrendLineGlyph.class.getName(), TrendLineActiveGlyph.class); - glyphMap.put(ChartAlertValueGlyph.class.getName(), AlertValueActiveGlyph.class); - } - - private ActiveGlyphFactory() { - - } - - public static ActiveGlyph createActiveGlyph(ChartComponent chartComponent, Object glyph) { - return createActiveGlyph(chartComponent, glyph, null); - } - - public static ActiveGlyph createActiveGlyph(ChartComponent chartComponent, Object glyph, Glyph parentGlyph) { - if (glyph == null) { - return null; - } - String clsName = glyph.getClass().getName(); - Class cls = glyphMap.get(clsName); - Class parameterCls = glyph.getClass(); - if (cls == null) { - if (clsName.endsWith("PlotGlyph")) { - cls = PlotActiveGlyph.class; - parameterCls = PlotGlyph.class; - } else if (clsName.endsWith("DataSeries4Area")) { - cls = DataSeriesActiveGlyph.class; - parameterCls = DataSeries.class; - } else { - cls = ChartActiveGlyph.class; - parameterCls = ChartGlyph.class; - } - } - try { - Class[] argsClass = new Class[]{ChartComponent.class, parameterCls, Glyph.class}; - return (ActiveGlyph) cls.getConstructor(argsClass).newInstance(new Object[]{chartComponent, glyph, parentGlyph}); - } catch (Exception e) { - return null; - } - } -} \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/design/chart/gui/ChartComponent.java b/designer-chart/src/main/java/com/fr/design/chart/gui/ChartComponent.java index 31baca071..e3d6a5210 100644 --- a/designer-chart/src/main/java/com/fr/design/chart/gui/ChartComponent.java +++ b/designer-chart/src/main/java/com/fr/design/chart/gui/ChartComponent.java @@ -2,36 +2,26 @@ package com.fr.design.chart.gui; import com.fr.base.ScreenResolution; import com.fr.base.chart.BaseChartCollection; -import com.fr.base.chart.BaseChartGlyph; +import com.fr.base.chart.BaseChartPainter; import com.fr.base.chart.chartdata.CallbackEvent; +import com.fr.base.chart.result.WebChartIDInfo; import com.fr.chart.base.ChartConstants; -import com.fr.chart.chartattr.Axis; -import com.fr.chart.chartattr.Chart; import com.fr.chart.chartattr.ChartCollection; -import com.fr.chart.chartglyph.AxisGlyph; -import com.fr.chartx.attr.ChartProvider; -import com.fr.design.chart.gui.active.ActiveGlyph; -import com.fr.design.chart.gui.active.ChartActiveGlyph; import com.fr.design.file.HistoryTemplateListPane; import com.fr.design.gui.chart.MiddleChartComponent; import com.fr.log.FineLoggerFactory; -import com.fr.stable.ArrayUtils; +import com.fr.script.Calculator; import com.fr.stable.core.PropertyChangeListener; import java.awt.Color; -import java.awt.Cursor; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; -import java.awt.Image; import java.awt.Paint; -import java.awt.Point; import java.awt.RenderingHints; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; -import java.awt.geom.Rectangle2D; -import java.awt.geom.RoundRectangle2D; import java.util.ArrayList; import java.util.List; @@ -45,21 +35,10 @@ public class ChartComponent extends MiddleChartComponent implements MouseListene private static final long serialVersionUID = 744164838619052097L; private final List listeners = new ArrayList(); private ChartCollection chartCollection4Design; - private Chart editingChart; - private BaseChartGlyph chartGlyph; private int chartWidth = -1; private int chartHeight = -1; - private Point point; - private int resolution = ScreenResolution.getScreenResolution(); - private ActiveGlyph activeGlyph; - - private boolean supportEdit = true; - private final int[] resizeCursors = new int[]{ - Cursor.NW_RESIZE_CURSOR, Cursor.N_RESIZE_CURSOR, Cursor.NE_RESIZE_CURSOR, - Cursor.E_RESIZE_CURSOR, Cursor.W_RESIZE_CURSOR, - Cursor.SE_RESIZE_CURSOR, Cursor.S_RESIZE_CURSOR, Cursor.SW_RESIZE_CURSOR - }; + private boolean supportEdit = true; public ChartComponent() { super(); @@ -111,16 +90,9 @@ public class ChartComponent extends MiddleChartComponent implements MouseListene public void reset() { fireStopEditing(); - this.editingChart = null; - this.chartGlyph = null; - this.activeGlyph = null; - this.point = null; this.chartHeight = this.chartWidth = -1; - this.editingChart = this.chartCollection4Design.getSelectedChart(); - refreshChartGlyph(); - this.activeGlyph = ActiveGlyphFactory.createActiveGlyph(this, chartGlyph); repaint(); } @@ -162,14 +134,6 @@ public class ChartComponent extends MiddleChartComponent implements MouseListene return (this.chartCollection4Design == null) ? 0 : this.chartCollection4Design.getChartCount(); } - public ChartProvider getEditingChart() { - return editingChart; - } - - public BaseChartGlyph getChartGlyph() { - return chartGlyph; - } - public void paintComponent(Graphics g) { // super.paintComponent(g); @@ -192,12 +156,7 @@ public class ChartComponent extends MiddleChartComponent implements MouseListene g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); //画图 - drawChartGlyph(g2d); - - ActiveGlyph ag = this.getActiveGlyph(); - if (ag != null) { - ag.paint4ActiveGlyph(g2d, chartGlyph); - } + drawChart(g2d); g2d.translate(-ChartConstants.PREGAP4BOUNDS/2, -ChartConstants.PREGAP4BOUNDS/2); if (lastHint == null) { @@ -212,24 +171,10 @@ public class ChartComponent extends MiddleChartComponent implements MouseListene */ private void refreshChartGlyph() { Dimension d = getBounds().getSize(); - this.editingChart = this.chartCollection4Design.getSelectedChart();// kunsnat: 切换选中时 同步切换Plot - if (editingChart != null) { - this.chartGlyph = editingChart.createGlyph(editingChart.defaultChartData()); - this.activeGlyph = ActiveGlyphFactory.createActiveGlyph(this, chartGlyph); - } this.chartWidth = d.width - ChartConstants.PREGAP4BOUNDS; this.chartHeight = d.height - ChartConstants.PREGAP4BOUNDS; } - private ActiveGlyph getActiveGlyph() { - if (point == null) { - this.activeGlyph = new ChartActiveGlyph(this, chartGlyph); - } else { - this.activeGlyph = new ChartActiveGlyph(this, chartGlyph).findActionGlyphFromChildren(point.x, point.y); - } - return this.activeGlyph; - } - /** * 鼠标点击 * @param event 鼠标事件 @@ -243,16 +188,7 @@ public class ChartComponent extends MiddleChartComponent implements MouseListene * @param e 鼠标事件 */ public void mousePressed(MouseEvent e) { - point = new Point(e.getX(),e.getY()); - if (!ArrayUtils.contains(resizeCursors, this.getCursor().getType())) { - this.activeGlyph = new ChartActiveGlyph(this, chartGlyph).findActionGlyphFromChildren(point.x, point.y); - } - - if (this.activeGlyph == null) { - return; - } - repaint(); } @@ -291,47 +227,23 @@ public class ChartComponent extends MiddleChartComponent implements MouseListene * @param e 鼠标事件 */ public void mouseMoved(MouseEvent e) { - ActiveGlyph ag = this.getActiveGlyph(); - if (ag != null) { - ag.onMouseMove(e); - } - } - - public AxisGlyph getActiveAxisGlyph() { - return (AxisGlyph) activeGlyph.getGlyph(); - } - - public Axis getActiveAxis() { - AxisGlyph axisGlyph = getActiveAxisGlyph(); - if (editingChart.getPlot() != null) { - return editingChart.getPlot().getAxis(axisGlyph.getAxisType()); - } - return null; } private boolean needRefreshChartGlyph() { - return chartGlyph == null || chartWidth != this.getBounds().width || chartHeight != this.getBounds().height; + return chartWidth != this.getBounds().width || chartHeight != this.getBounds().height; } - public void drawChartGlyph(Graphics2D g2d) { - if (chartGlyph != null) { - if (chartGlyph.isRoundBorder()) { - chartGlyph.setBounds(new RoundRectangle2D.Double(0, 0, chartWidth, chartHeight, 10, 10)); - } else { - chartGlyph.setBounds(new Rectangle2D.Double(0, 0, chartWidth, chartHeight)); - } + private void drawChart(Graphics2D g2d) { + if (chartCollection4Design != null) { - //不直接画chartGlyph而画image的原因是表单的柱形图会溢出表单 - //其他图都ok,其实感觉应该是柱形图画的不对,应该也可以改那边 - //处理画图事件 + BaseChartPainter painter = chartCollection4Design.createResultChartPainter(Calculator.createCalculator(), + WebChartIDInfo.createEmptyDesignerInfo(), chartWidth, chartHeight); - resolution = HistoryTemplateListPane.getInstance().getCurrentEditingTemplate().getJTemplateResolution(); + int resolution = HistoryTemplateListPane.getInstance().getCurrentEditingTemplate().getJTemplateResolution(); if (resolution == 0){ resolution = ScreenResolution.getScreenResolution(); } - Image chartImage = chartGlyph.toImage(chartWidth,chartHeight,resolution, this, null); - - g2d.drawImage(chartImage, 0, 0, null); + painter.paint(g2d, chartWidth, chartHeight, resolution, null); } } diff --git a/designer-chart/src/main/java/com/fr/design/chart/gui/ChartWidgetOption.java b/designer-chart/src/main/java/com/fr/design/chart/gui/ChartWidgetOption.java index 753bb47cd..42eabf93e 100644 --- a/designer-chart/src/main/java/com/fr/design/chart/gui/ChartWidgetOption.java +++ b/designer-chart/src/main/java/com/fr/design/chart/gui/ChartWidgetOption.java @@ -37,7 +37,7 @@ public class ChartWidgetOption extends WidgetOption { Class clz = widgetClass(); try { ChartEditor widget = clz.newInstance(); - widget.setChartCollection(BaseChartGetter.createChartCollection(this.chartID)); + widget.resetChangeChartCollection(BaseChartGetter.createChartCollection(this.chartID)); return widget; } catch (InstantiationException e) { FineLoggerFactory.getLogger().error(e.getMessage(), e); diff --git a/designer-chart/src/main/java/com/fr/design/chart/gui/active/ActiveGlyph.java b/designer-chart/src/main/java/com/fr/design/chart/gui/active/ActiveGlyph.java deleted file mode 100644 index 7f1c637c6..000000000 --- a/designer-chart/src/main/java/com/fr/design/chart/gui/active/ActiveGlyph.java +++ /dev/null @@ -1,161 +0,0 @@ -package com.fr.design.chart.gui.active; - -import java.awt.AlphaComposite; -import java.awt.Color; -import java.awt.Composite; -import java.awt.Graphics2D; -import java.awt.Paint; -import java.awt.Shape; -import java.awt.event.MouseEvent; -import java.awt.geom.Point2D; - -import com.fr.base.ScreenResolution; -import com.fr.base.chart.BaseChartGlyph; -import com.fr.base.chart.Glyph; -import com.fr.design.chart.gui.ActiveGlyphFactory; -import com.fr.design.chart.gui.ChartComponent; - -/** - * Created by IntelliJ IDEA. - * Author : Richer - * Version: 6.5.6 - * Date : 11-11-22 - * Time : 下午3:51 - * 选中的Glyph - */ -public abstract class ActiveGlyph { - protected Glyph parentGlyph; - protected ChartComponent chartComponent; - - public ActiveGlyph(ChartComponent chartComponent, Glyph parentGlyph) { - this.chartComponent = chartComponent; - this.parentGlyph = parentGlyph; - } - - public abstract Glyph getGlyph(); - - public void drawAllGlyph(Graphics2D g2d, int resolution){ - Point2D offset4Paint = offset4Paint(); - g2d.translate(offset4Paint.getX(), offset4Paint.getY()); - this.getGlyph().draw(g2d, resolution); - g2d.translate(-offset4Paint.getX(), -offset4Paint.getY()); - }; - - /** - * 属性表中, 通过点击 展开到对应的界面. - */ - public abstract void goRightPane(); - - /** - * 画的偏移的 - * @return 偏移的 - */ - public Point2D offset4Paint() { - return new Point2D.Double( - this.parentGlyph.getShape().getBounds().getX(), - this.parentGlyph.getShape().getBounds().getY() - ); - } - - public void paint4ActiveGlyph(Graphics2D g2d, BaseChartGlyph chartGlyph) { - if(this.parentGlyph == null) { - return; - } - - Paint oldPaint = g2d.getPaint(); - Composite oldComposite = g2d.getComposite(); - g2d.setPaint(Color.WHITE); - g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f)); - - g2d.fill(chartGlyph.getShape()); - drawAllGlyph(g2d, ScreenResolution.getScreenResolution()); - - g2d.setPaint(oldPaint); - g2d.setComposite(oldComposite); - } - - protected void drawSelectedBounds4Active(Graphics2D g2d) { - if (this.getGlyph() != null) { - Shape shape = this.getGlyph().getShape(); - if (shape != null) { - g2d.draw(shape); - } - } - } - - - /** - *当前的ActiveGlyph是否包含坐标mouseX, mouseY - * @param mouseX 坐标X - * @param mouseY 坐标Y - * @return 包含则返回true - */ - public boolean contains(int mouseX, int mouseY) { - if (getGlyph() == null || getGlyph().getShape() == null){ - return false; - } - - Point2D offset = this.offset4Paint(); - - /* - * alex:因为Line2D.contains(x, y)必然返回false - * 所以用intersect一个区域,这个区域大小用4 * 4的,区域大一些,就灵敏一些 - */ - return getGlyph().getShape().intersects(mouseX - offset.getX() - 2, mouseY - offset.getY() - 2, 4, 4); - } - - /** - * 在当前选中的ActiveGlyph中,仅仅在其Children中找与mouseX, mouseY匹配的ActiveGlyph - * @param mouseX 坐标X - * @param mouseY 坐标Y - * @return 当前ativeGlyph - */ - public ActiveGlyph findActionGlyphFromChildren(int mouseX, int mouseY) { - Glyph currentGlyph = getGlyph(); - // 报错应对. - if (currentGlyph == null) { - return null; - } - java.util.Iterator selectableChildren = currentGlyph.selectableChildren(); - - ActiveGlyph resAG = null; - while (selectableChildren.hasNext() && resAG == null) { - ActiveGlyph childActiveGlyph = ActiveGlyphFactory.createActiveGlyph(chartComponent, selectableChildren.next(), currentGlyph); - - // 如果childActiveGlyph不为null,找一下其子辈有没有符合条件 - if (childActiveGlyph != null) { - resAG = childActiveGlyph.findActionGlyphFromChildren(mouseX, mouseY); - } - - // 如果childActiveGlyph的子辈没有符合条件的,就看一下这个childGlyph是否符合条件 - if (resAG == null && childActiveGlyph != null && childActiveGlyph.contains(mouseX, mouseY)) { - resAG = childActiveGlyph; - } - } - - // 如果当前ActiveGlyph的所有子辈都没有与mouseX, mouseY相匹配的,看一下它自己是否匹配 - if (resAG == null) { - if (this.contains(mouseX, mouseY)) { - resAG = this; - } - } - - return resAG; - } - - /** - * 拖拽 - * @param e 事件 - */ - public void onMouseDragged(MouseEvent e) { - - } - - /** - * 移动事件 - * @param e 事件 - */ - public void onMouseMove(MouseEvent e) { - - } -} \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/design/chart/gui/active/AlertValueActiveGlyph.java b/designer-chart/src/main/java/com/fr/design/chart/gui/active/AlertValueActiveGlyph.java deleted file mode 100644 index c43eee17f..000000000 --- a/designer-chart/src/main/java/com/fr/design/chart/gui/active/AlertValueActiveGlyph.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.fr.design.chart.gui.active; - -import java.awt.geom.Point2D; -import java.awt.geom.Rectangle2D; - -import com.fr.base.chart.Glyph; -import com.fr.chart.chartglyph.ChartAlertValueGlyph; -import com.fr.design.chart.gui.ChartComponent; -import com.fr.design.chart.gui.active.action.SetAnalysisLineStyleAction; - -public class AlertValueActiveGlyph extends ActiveGlyph{ - ChartAlertValueGlyph alertValueGlyph; - - public AlertValueActiveGlyph(ChartComponent chartComponent,ChartAlertValueGlyph alertLine, Glyph parentGlyph) { - super(chartComponent, parentGlyph); - this.alertValueGlyph = alertLine; - } - - public Point2D offset4Paint() { - Rectangle2D valueAxisBoudns = this.alertValueGlyph.getValueAxisGlyph().getBounds(); - - return new Point2D.Double( - this.parentGlyph.getShape().getBounds().getX() + valueAxisBoudns.getX(), - this.parentGlyph.getShape().getBounds().getY() + valueAxisBoudns.getY() - ); - } - - @Override - public Glyph getGlyph() { - return this.alertValueGlyph; - } - - @Override - public void goRightPane() { - new SetAnalysisLineStyleAction(chartComponent).showAnalysisLineStylePane(); - } - -} \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/design/chart/gui/active/AxisActiveGlyph.java b/designer-chart/src/main/java/com/fr/design/chart/gui/active/AxisActiveGlyph.java deleted file mode 100644 index aba7f8363..000000000 --- a/designer-chart/src/main/java/com/fr/design/chart/gui/active/AxisActiveGlyph.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.fr.design.chart.gui.active; - -import java.awt.Graphics2D; -import java.awt.geom.Point2D; - -import com.fr.base.chart.Glyph; -import com.fr.chart.chartglyph.AxisGlyph; -import com.fr.design.chart.gui.ChartComponent; -import com.fr.design.chart.gui.active.action.SetAxisStyleAction; - -/** - * Created by IntelliJ IDEA. - * Author : Richer - * Version: 6.5.6 - * Date : 11-11-22 - * Time : 下午4:00 - */ -public abstract class AxisActiveGlyph extends ActiveGlyph { - protected AxisGlyph axis; - - public AxisActiveGlyph(ChartComponent chartComponent, AxisGlyph axis, Glyph parentGlyph) { - super(chartComponent, parentGlyph); - this.axis = axis; - } - - public void drawAllGlyph(Graphics2D g2d, int resolution){ - Point2D offset4Paint = offset4Paint(); - g2d.translate(offset4Paint.getX(), offset4Paint.getY()); - this.axis.drawWithOutAlert(g2d, resolution); - g2d.translate(-offset4Paint.getX(), -offset4Paint.getY()); - }; - - public void goRightPane() { - new SetAxisStyleAction(chartComponent).showAxisStylePane(); - } - - /** - * 返回 对应的属性Axis - */ - public Glyph getGlyph() { - return this.axis; - } -} \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/design/chart/gui/active/CategoryAxisActiveGlyph.java b/designer-chart/src/main/java/com/fr/design/chart/gui/active/CategoryAxisActiveGlyph.java deleted file mode 100644 index ea73e829a..000000000 --- a/designer-chart/src/main/java/com/fr/design/chart/gui/active/CategoryAxisActiveGlyph.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.fr.design.chart.gui.active; - -import com.fr.base.chart.Glyph; -import com.fr.chart.chartglyph.CategoryAxisGlyph; -import com.fr.design.chart.gui.ChartComponent; - -/** - * Created by IntelliJ IDEA. - * Author : Richer - * Version: 6.5.6 - * Date : 11-11-22 - * Time : 下午4:01 - */ -public class CategoryAxisActiveGlyph extends AxisActiveGlyph { - - public CategoryAxisActiveGlyph(ChartComponent chartComponent, CategoryAxisGlyph axis, Glyph parentGlyph) { - super(chartComponent, axis, parentGlyph); - } -} \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/design/chart/gui/active/ChartActiveGlyph.java b/designer-chart/src/main/java/com/fr/design/chart/gui/active/ChartActiveGlyph.java deleted file mode 100644 index f191e7b77..000000000 --- a/designer-chart/src/main/java/com/fr/design/chart/gui/active/ChartActiveGlyph.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.fr.design.chart.gui.active; - -import java.awt.geom.Point2D; - -import com.fr.base.chart.BaseChartGlyph; -import com.fr.base.chart.Glyph; -import com.fr.design.chart.gui.ChartComponent; -import com.fr.design.chart.gui.active.action.SetChartStyleAciton; - -/** - * Created by IntelliJ IDEA. - * Author : Richer - * Version: 6.5.6 - * Date : 11-11-22 - * Time : 下午3:54 - */ -public class ChartActiveGlyph extends ActiveGlyph { - private BaseChartGlyph glyphChart; - - public ChartActiveGlyph(ChartComponent chartComponent, BaseChartGlyph chart) { - this(chartComponent, chart, null); - } - public ChartActiveGlyph(ChartComponent chartComponent, BaseChartGlyph chart, Glyph parentGlyph) { - super(chartComponent, parentGlyph); - this.glyphChart = chart; - } - - public Glyph getGlyph() { - return this.glyphChart; - } - - public Point2D offset4Paint() { - return new java.awt.Point(0, 0); - } - - public void goRightPane() { - new SetChartStyleAciton(chartComponent).showChartStylePane(); - } -} \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/design/chart/gui/active/DataLabelActiveGlyph.java b/designer-chart/src/main/java/com/fr/design/chart/gui/active/DataLabelActiveGlyph.java deleted file mode 100644 index 8f67b35b4..000000000 --- a/designer-chart/src/main/java/com/fr/design/chart/gui/active/DataLabelActiveGlyph.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.fr.design.chart.gui.active; - -import java.awt.Graphics2D; -import java.awt.geom.Point2D; -import java.util.ArrayList; - -import com.fr.base.chart.Glyph; -import com.fr.chart.chartglyph.PlotGlyph; -import com.fr.chart.chartglyph.TextGlyph; -import com.fr.design.chart.gui.ChartComponent; -import com.fr.design.chart.gui.active.action.SetDataLabelStyleAction; - -public class DataLabelActiveGlyph extends ActiveGlyph{ - private TextGlyph dataLabel; - - public DataLabelActiveGlyph(ChartComponent chartComponent, TextGlyph dataLabel, Glyph parentGlyph) { - super(chartComponent, parentGlyph); - this.dataLabel = dataLabel; - } - - public void drawAllGlyph(Graphics2D g2d, int resolution){ - Point2D offset4Paint = offset4Paint(); - g2d.translate(offset4Paint.getX(), offset4Paint.getY()); - - ArrayList allDataPointLableGlyph = new ArrayList(); - PlotGlyph plotGlyph = (PlotGlyph)(this.parentGlyph); - plotGlyph.getAllDataPointGlyph(allDataPointLableGlyph); - for(int index = 0; index < allDataPointLableGlyph.size(); index++){ - allDataPointLableGlyph.get(index).draw(g2d, resolution); - } - g2d.translate(-offset4Paint.getX(), -offset4Paint.getY()); - }; - - @Override - public Glyph getGlyph() { - return this.dataLabel; - } - - @Override - public void goRightPane() { - new SetDataLabelStyleAction(chartComponent).showDataLabelStylePane(); - } - -} \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/design/chart/gui/active/DataSeriesActiveGlyph.java b/designer-chart/src/main/java/com/fr/design/chart/gui/active/DataSeriesActiveGlyph.java deleted file mode 100644 index 20b27221b..000000000 --- a/designer-chart/src/main/java/com/fr/design/chart/gui/active/DataSeriesActiveGlyph.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.fr.design.chart.gui.active; - -import java.awt.Graphics2D; -import java.awt.geom.Point2D; -import com.fr.base.chart.Glyph; -import com.fr.chart.chartglyph.DataSeries; -import com.fr.chart.chartglyph.PlotGlyph; -import com.fr.design.chart.gui.ChartComponent; -import com.fr.design.mainframe.chart.PaneTitleConstants; -import com.fr.design.module.DesignModuleFactory; - -/** - * Created by IntelliJ IDEA. - * Author : Richer - * Version: 6.5.6 - * Date : 11-11-22 - * Time : 下午3:59 - */ -public class DataSeriesActiveGlyph extends ActiveGlyph { - private DataSeries series; - - public DataSeriesActiveGlyph(ChartComponent chartComponent, DataSeries series, Glyph parentGlyph) { - super(chartComponent, parentGlyph); - this.series = series; - } - - public Glyph getGlyph() { - return this.series; - } - - /** - * 界面条状 - */ - public void goRightPane() { - if(chartComponent.getEditingChart() == null) { - return; - } - - DesignModuleFactory.getChartPropertyPane().getChartEditPane().gotoPane(PaneTitleConstants.CHART_STYLE_TITLE, PaneTitleConstants.CHART_STYLE_SERIES_TITLE); - } - - @Override - public void drawAllGlyph(Graphics2D g2d, int resolution) { - Point2D offset4Paint = offset4Paint(); - g2d.translate(offset4Paint.getX(), offset4Paint.getY()); - if(this.parentGlyph != null && this.parentGlyph instanceof PlotGlyph){ - PlotGlyph plotGlyph = (PlotGlyph)this.parentGlyph; - plotGlyph.drawShape4Series(g2d, resolution); - } - g2d.translate(-offset4Paint.getX(), -offset4Paint.getY()); - } - -} \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/design/chart/gui/active/DataSheetActiveGlyph.java b/designer-chart/src/main/java/com/fr/design/chart/gui/active/DataSheetActiveGlyph.java deleted file mode 100644 index a5dd812e3..000000000 --- a/designer-chart/src/main/java/com/fr/design/chart/gui/active/DataSheetActiveGlyph.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.fr.design.chart.gui.active; - -import com.fr.base.chart.Glyph; -import com.fr.chart.chartglyph.DataSheetGlyph; -import com.fr.design.chart.gui.ChartComponent; -import com.fr.design.chart.gui.active.action.SetDataSheetAction; - -/** - * Created by IntelliJ IDEA. - * Author : Richer - * Version: 6.5.6 - * Date : 11-11-22 - * Time : 下午3:57 - */ -public class DataSheetActiveGlyph extends ActiveGlyph { - private DataSheetGlyph dataSheetGlyph; - - public DataSheetActiveGlyph(ChartComponent chartComponent, DataSheetGlyph dataSheetGlyph, Glyph parentGlyph) { - super(chartComponent, parentGlyph); - this.dataSheetGlyph = dataSheetGlyph; - } - - public Glyph getGlyph() { - return this.dataSheetGlyph; - } - - public void goRightPane() { - new SetDataSheetAction(chartComponent).showDataSheetStylePane(); - } -} \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/design/chart/gui/active/DateAxisActiveGlyph.java b/designer-chart/src/main/java/com/fr/design/chart/gui/active/DateAxisActiveGlyph.java deleted file mode 100644 index 60a327718..000000000 --- a/designer-chart/src/main/java/com/fr/design/chart/gui/active/DateAxisActiveGlyph.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.fr.design.chart.gui.active; - -import com.fr.base.chart.Glyph; -import com.fr.chart.chartglyph.DateAxisGlyph; -import com.fr.design.chart.gui.ChartComponent; - -/** - * Created by IntelliJ IDEA. - * Author : Richer - * Version: 6.5.6 - * Date : 11-11-22 - * Time : 下午4:03 - */ -public class DateAxisActiveGlyph extends AxisActiveGlyph { - public DateAxisActiveGlyph(ChartComponent chartComponent, DateAxisGlyph axis, Glyph parentGlyph) { - super(chartComponent, axis, parentGlyph); - } -} \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/design/chart/gui/active/LegendActiveGlyph.java b/designer-chart/src/main/java/com/fr/design/chart/gui/active/LegendActiveGlyph.java deleted file mode 100644 index 323697713..000000000 --- a/designer-chart/src/main/java/com/fr/design/chart/gui/active/LegendActiveGlyph.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.fr.design.chart.gui.active; - -import com.fr.base.chart.Glyph; -import com.fr.chart.chartglyph.LegendGlyph; -import com.fr.design.chart.gui.ChartComponent; -import com.fr.design.chart.gui.active.action.SetLegendStyleAction; - -/** - * Created by IntelliJ IDEA. - * Author : Richer - * Version: 6.5.6 - * Date : 11-11-22 - * Time : 下午3:58 - */ -public class LegendActiveGlyph extends ActiveGlyph { - private LegendGlyph legendGlyph; - - public LegendActiveGlyph(ChartComponent chartComponent, LegendGlyph legendGlyph, Glyph parentGlyph) { - super(chartComponent, parentGlyph); - this.legendGlyph = legendGlyph; - } - - public Glyph getGlyph() { - return this.legendGlyph; - } - - public void goRightPane() { - new SetLegendStyleAction(chartComponent).showLegendStylePane(); - } -} \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/design/chart/gui/active/PlotActiveGlyph.java b/designer-chart/src/main/java/com/fr/design/chart/gui/active/PlotActiveGlyph.java deleted file mode 100644 index 1190ed59c..000000000 --- a/designer-chart/src/main/java/com/fr/design/chart/gui/active/PlotActiveGlyph.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.fr.design.chart.gui.active; - -import com.fr.base.chart.Glyph; -import com.fr.chart.chartglyph.PlotGlyph; -import com.fr.design.chart.gui.ChartComponent; -import com.fr.design.chart.gui.active.action.SetPlotStyleAction; - -/** - * Created by IntelliJ IDEA. - * Author : Richer - * Version: 6.5.6 - * Date : 11-11-22 - * Time : 下午3:55 - */ -public class PlotActiveGlyph extends ActiveGlyph { - private PlotGlyph plotGlyph; - - public PlotActiveGlyph(ChartComponent chartComponent, PlotGlyph plotGlyph, Glyph parentGlyph) { - super(chartComponent, parentGlyph); - this.plotGlyph = plotGlyph; - } - - public Glyph getGlyph() { - return this.plotGlyph; - } - - public void goRightPane() { - new SetPlotStyleAction(chartComponent).showPlotPane(); - } - - public java.awt.Point offset4Paint() { - return new java.awt.Point(0, 0); - } -} \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/design/chart/gui/active/RadarAxisActiveGlyph.java b/designer-chart/src/main/java/com/fr/design/chart/gui/active/RadarAxisActiveGlyph.java deleted file mode 100644 index 2a88280cd..000000000 --- a/designer-chart/src/main/java/com/fr/design/chart/gui/active/RadarAxisActiveGlyph.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.fr.design.chart.gui.active; - -import com.fr.base.chart.Glyph; -import com.fr.chart.chartglyph.RadarAxisGlyph; -import com.fr.design.chart.gui.ChartComponent; - -/** - * Created by IntelliJ IDEA. - * Author : Richer - * Version: 6.5.6 - * Date : 11-11-22 - * Time : 下午4:03 - */ -public class RadarAxisActiveGlyph extends AxisActiveGlyph { - public RadarAxisActiveGlyph(ChartComponent chartComponent, RadarAxisGlyph axis, Glyph parentGlyph) { - super(chartComponent, axis, parentGlyph); - } -} \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/design/chart/gui/active/RangeAxisActiveGlyph.java b/designer-chart/src/main/java/com/fr/design/chart/gui/active/RangeAxisActiveGlyph.java deleted file mode 100644 index 7913eb822..000000000 --- a/designer-chart/src/main/java/com/fr/design/chart/gui/active/RangeAxisActiveGlyph.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.fr.design.chart.gui.active; - -import com.fr.base.chart.Glyph; -import com.fr.chart.chartglyph.ValueAxisGlyph; -import com.fr.design.chart.gui.ChartComponent; - -/** - * Created by IntelliJ IDEA. - * Author : Richer - * Version: 6.5.6 - * Date : 11-11-22 - * Time : 下午4:02 - */ -public class RangeAxisActiveGlyph extends AxisActiveGlyph { - public RangeAxisActiveGlyph(ChartComponent chartComponent, ValueAxisGlyph axis, Glyph parentGlyph) { - super(chartComponent, axis, parentGlyph); - } -} \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/design/chart/gui/active/TextActiveGlyph.java b/designer-chart/src/main/java/com/fr/design/chart/gui/active/TextActiveGlyph.java deleted file mode 100644 index 250321e50..000000000 --- a/designer-chart/src/main/java/com/fr/design/chart/gui/active/TextActiveGlyph.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.fr.design.chart.gui.active; - -import com.fr.base.chart.Glyph; -import com.fr.chart.chartglyph.TitleGlyph; -import com.fr.design.chart.gui.ChartComponent; -import com.fr.design.chart.gui.active.action.SetTitleStyleAction; - -/** - * Created by IntelliJ IDEA. - * Author : Richer - * Version: 6.5.6 - * Date : 11-11-22 - * Time : 下午3:57 - */ -public class TextActiveGlyph extends ActiveGlyph { - private TitleGlyph titleGlyph; - - public TextActiveGlyph(ChartComponent chartComponent, TitleGlyph titleGlyph, Glyph parentGlyph) { - super(chartComponent, parentGlyph); - this.titleGlyph = titleGlyph; - } - - public Glyph getGlyph() { - return this.titleGlyph; - } - - public java.awt.Point offset4Paint() { - return new java.awt.Point(0, 0); - } - - public void goRightPane() { - new SetTitleStyleAction(chartComponent).showTitlePane(); - } - -} \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/design/chart/gui/active/TrendLineActiveGlyph.java b/designer-chart/src/main/java/com/fr/design/chart/gui/active/TrendLineActiveGlyph.java deleted file mode 100644 index d991d6bb1..000000000 --- a/designer-chart/src/main/java/com/fr/design/chart/gui/active/TrendLineActiveGlyph.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.fr.design.chart.gui.active; - -import java.awt.Graphics2D; -import java.awt.geom.Point2D; -import java.util.ArrayList; -import java.util.List; - -import com.fr.base.chart.Glyph; -import com.fr.chart.chartglyph.PlotGlyph; -import com.fr.chart.chartglyph.TrendLineGlyph; -import com.fr.design.chart.gui.ChartComponent; -import com.fr.design.chart.gui.active.action.SetAnalysisLineStyleAction; - -public class TrendLineActiveGlyph extends ActiveGlyph{ - private TrendLineGlyph trendLine; - public TrendLineActiveGlyph(ChartComponent chartComponent,TrendLineGlyph trendLine, Glyph parentGlyph) { - super(chartComponent, parentGlyph); - this.trendLine = trendLine; - } - - @Override - public Glyph getGlyph() { - return this.trendLine; - } - - public void drawAllGlyph(Graphics2D g2d, int resolution){ - Point2D offset4Paint = offset4Paint(); - g2d.translate(offset4Paint.getX(), offset4Paint.getY()); - PlotGlyph plotGlyph = (PlotGlyph)this.parentGlyph; - List list = new ArrayList(); - plotGlyph.getAllTrendLineGlyph(list); - for(int index = 0; index < list.size(); index++){ - list.get(index).draw(g2d, resolution); - } - g2d.translate(-offset4Paint.getX(), -offset4Paint.getY()); - }; - - @Override - public void goRightPane() { - new SetAnalysisLineStyleAction(chartComponent).showAnalysisLineStylePane(); - } - -} \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/design/chart/gui/active/ValueAxisActiveGlyph.java b/designer-chart/src/main/java/com/fr/design/chart/gui/active/ValueAxisActiveGlyph.java deleted file mode 100644 index 5270f0d91..000000000 --- a/designer-chart/src/main/java/com/fr/design/chart/gui/active/ValueAxisActiveGlyph.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.fr.design.chart.gui.active; - -import com.fr.base.chart.Glyph; -import com.fr.chart.chartglyph.ValueAxisGlyph; -import com.fr.design.chart.gui.ChartComponent; - -/** - * Created by IntelliJ IDEA. - * Author : Richer - * Version: 6.5.6 - * Date : 11-11-22 - * Time : 下午4:02 - */ -public class ValueAxisActiveGlyph extends AxisActiveGlyph { - - public ValueAxisActiveGlyph(ChartComponent chartComponent, ValueAxisGlyph axis, Glyph parentGlyph) { - super(chartComponent, axis, parentGlyph); - } -} \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/design/chart/gui/active/action/ChartComponentAction.java b/designer-chart/src/main/java/com/fr/design/chart/gui/active/action/ChartComponentAction.java deleted file mode 100644 index 83d471068..000000000 --- a/designer-chart/src/main/java/com/fr/design/chart/gui/active/action/ChartComponentAction.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.fr.design.chart.gui.active.action; - -import com.fr.chart.chartattr.ChartCollection; -import com.fr.chart.chartglyph.AxisGlyph; -import com.fr.design.actions.UpdateAction; -import com.fr.design.chart.gui.ChartComponent; - -/** - * Created by IntelliJ IDEA. - * Author : Richer - * Version: 6.5.6 - * Date : 11-11-22 - * Time : 下午5:05 - */ -public abstract class ChartComponentAction extends UpdateAction { - protected ChartComponent chartComponent; - - public ChartComponentAction(ChartComponent chartComponent) { - this.chartComponent = chartComponent; - } - - public void reset() { - chartComponent.reset(); - } - - public void repaint() { - chartComponent.repaint(); - } - - public ChartCollection getChartCollection() { - return chartComponent.getChartCollection(); - } - - public AxisGlyph getActiveAxisGlyph() { - return chartComponent.getActiveAxisGlyph(); - } -} \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/design/chart/gui/active/action/SetAnalysisLineStyleAction.java b/designer-chart/src/main/java/com/fr/design/chart/gui/active/action/SetAnalysisLineStyleAction.java deleted file mode 100644 index 23c44e530..000000000 --- a/designer-chart/src/main/java/com/fr/design/chart/gui/active/action/SetAnalysisLineStyleAction.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.fr.design.chart.gui.active.action; - -import java.awt.event.ActionEvent; - -import com.fr.design.chart.gui.ChartComponent; -import com.fr.design.mainframe.chart.PaneTitleConstants; -import com.fr.design.module.DesignModuleFactory; - - -public class SetAnalysisLineStyleAction extends ChartComponentAction{ - - public SetAnalysisLineStyleAction(ChartComponent chartComponent) { - super(chartComponent); - this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Set_Analysis_Line")); - } - - @Override - public void actionPerformed(ActionEvent e) { - showAnalysisLineStylePane(); - } - - public void showAnalysisLineStylePane(){ - DesignModuleFactory.getChartPropertyPane().getChartEditPane().gotoPane(PaneTitleConstants.CHART_STYLE_TITLE, PaneTitleConstants.CHART_STYLE_LINE_TITLE); - } - - -} \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/design/chart/gui/active/action/SetAxisStyleAction.java b/designer-chart/src/main/java/com/fr/design/chart/gui/active/action/SetAxisStyleAction.java deleted file mode 100644 index a4920e883..000000000 --- a/designer-chart/src/main/java/com/fr/design/chart/gui/active/action/SetAxisStyleAction.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.fr.design.chart.gui.active.action; - -import java.awt.event.ActionEvent; - -import com.fr.design.chart.gui.ChartComponent; -import com.fr.design.mainframe.chart.PaneTitleConstants; -import com.fr.design.module.DesignModuleFactory; - -import com.fr.stable.StringUtils; - -/** - * Created by IntelliJ IDEA. - * Author : Richer - * Version: 6.5.6 - * Date : 11-11-22 - * Time : 下午5:10 - */ -public class SetAxisStyleAction extends ChartComponentAction { - public SetAxisStyleAction(ChartComponent chartComponent) { - super(chartComponent); - this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Set_Axis_Format")); - } - - public void actionPerformed(ActionEvent e) { - showAxisStylePane(); - } - - public void showAxisStylePane() { - String axisType = getActiveAxisGlyph() == null ? StringUtils.EMPTY : getActiveAxisGlyph().getAxisType(); - - DesignModuleFactory.getChartPropertyPane().getChartEditPane().gotoPane(PaneTitleConstants.CHART_STYLE_TITLE, PaneTitleConstants.CHART_STYLE_AXIS_TITLE, axisType); - } -} \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/design/chart/gui/active/action/SetChartStyleAciton.java b/designer-chart/src/main/java/com/fr/design/chart/gui/active/action/SetChartStyleAciton.java deleted file mode 100644 index 188db90c2..000000000 --- a/designer-chart/src/main/java/com/fr/design/chart/gui/active/action/SetChartStyleAciton.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.fr.design.chart.gui.active.action; - -import java.awt.event.ActionEvent; - -import com.fr.design.chart.gui.ChartComponent; -import com.fr.design.mainframe.chart.PaneTitleConstants; -import com.fr.design.module.DesignModuleFactory; - - -/** - * Created by IntelliJ IDEA. - * Author : Richer - * Version: 6.5.6 - * Date : 11-11-22 - * Time : 下午5:00 - */ -public class SetChartStyleAciton extends ChartComponentAction { - - public SetChartStyleAciton(ChartComponent chartComponent) { - super(chartComponent); - this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Pattern")); - } - - public void actionPerformed(ActionEvent e) { - showChartStylePane(); - } - - public void showChartStylePane() { - DesignModuleFactory.getChartPropertyPane().getChartEditPane().gotoPane(PaneTitleConstants.CHART_STYLE_TITLE, PaneTitleConstants.CHART_STYLE_AREA_TITLE, PaneTitleConstants.CHART_STYLE_AREA_AREA_TITLE); - } -} \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/design/chart/gui/active/action/SetDataLabelStyleAction.java b/designer-chart/src/main/java/com/fr/design/chart/gui/active/action/SetDataLabelStyleAction.java deleted file mode 100644 index 262016bfa..000000000 --- a/designer-chart/src/main/java/com/fr/design/chart/gui/active/action/SetDataLabelStyleAction.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.fr.design.chart.gui.active.action; - -import java.awt.event.ActionEvent; - -import com.fr.design.chart.gui.ChartComponent; -import com.fr.design.mainframe.chart.PaneTitleConstants; -import com.fr.design.module.DesignModuleFactory; - - -public class SetDataLabelStyleAction extends ChartComponentAction{ - - public SetDataLabelStyleAction(ChartComponent chartComponent) { - super(chartComponent); - this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Set_Data_Label")); - } - - @Override - public void actionPerformed(ActionEvent e) { - showDataLabelStylePane(); - } - - public void showDataLabelStylePane() { - DesignModuleFactory.getChartPropertyPane().getChartEditPane().gotoPane(PaneTitleConstants.CHART_STYLE_TITLE, PaneTitleConstants.CHART_STYLE_LABEL_TITLE); - } - -} \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/design/chart/gui/active/action/SetDataSheetAction.java b/designer-chart/src/main/java/com/fr/design/chart/gui/active/action/SetDataSheetAction.java deleted file mode 100644 index cb35fea8f..000000000 --- a/designer-chart/src/main/java/com/fr/design/chart/gui/active/action/SetDataSheetAction.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.fr.design.chart.gui.active.action; - -import java.awt.event.ActionEvent; - -import com.fr.design.chart.gui.ChartComponent; -import com.fr.design.mainframe.chart.PaneTitleConstants; -import com.fr.design.module.DesignModuleFactory; - - -/** - * Created by IntelliJ IDEA. - * Author : Richer - * Version: 6.5.6 - * Date : 11-11-22 - * Time : 下午4:49 - */ -public class SetDataSheetAction extends ChartComponentAction { - - private static final long serialVersionUID = -4763886493273213850L; - - public SetDataSheetAction(ChartComponent chartComponent) { - super(chartComponent); - this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Set_Data_Sheet")); - } - - public void actionPerformed(ActionEvent e) { - showDataSheetStylePane(); - } - - public void showDataSheetStylePane() { - DesignModuleFactory.getChartPropertyPane().getChartEditPane().gotoPane(PaneTitleConstants.CHART_STYLE_TITLE, PaneTitleConstants.CHART_STYLE_DATA_TITLE); - } -} \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/design/chart/gui/active/action/SetLegendStyleAction.java b/designer-chart/src/main/java/com/fr/design/chart/gui/active/action/SetLegendStyleAction.java deleted file mode 100644 index abc137bd8..000000000 --- a/designer-chart/src/main/java/com/fr/design/chart/gui/active/action/SetLegendStyleAction.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.fr.design.chart.gui.active.action; - -import java.awt.event.ActionEvent; - -import com.fr.design.chart.gui.ChartComponent; -import com.fr.design.mainframe.chart.PaneTitleConstants; -import com.fr.design.module.DesignModuleFactory; - - -/** - * Created by IntelliJ IDEA. - * Author : Richer - * Version: 6.5.6 - * Date : 11-11-22 - * Time : 下午4:56 - */ -public class SetLegendStyleAction extends ChartComponentAction { - private static final long serialVersionUID = 3253190503195130478L; - - public SetLegendStyleAction(ChartComponent chartComponent) { - super(chartComponent); - this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Set_Legend_Sytle")); - } - - public void actionPerformed(ActionEvent e) { - showLegendStylePane(); - } - - public void showLegendStylePane() { - DesignModuleFactory.getChartPropertyPane().getChartEditPane().gotoPane(PaneTitleConstants.CHART_STYLE_TITLE, PaneTitleConstants.CHART_STYLE_LEGNED_TITLE); - } -} diff --git a/designer-chart/src/main/java/com/fr/design/chart/gui/active/action/SetPlotStyleAction.java b/designer-chart/src/main/java/com/fr/design/chart/gui/active/action/SetPlotStyleAction.java deleted file mode 100644 index 92b7530f1..000000000 --- a/designer-chart/src/main/java/com/fr/design/chart/gui/active/action/SetPlotStyleAction.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.fr.design.chart.gui.active.action; - -import java.awt.event.ActionEvent; - -import com.fr.design.chart.gui.ChartComponent; -import com.fr.design.mainframe.chart.PaneTitleConstants; -import com.fr.design.module.DesignModuleFactory; - - -/** - * Created by IntelliJ IDEA. - * Author : Richer - * Version: 6.5.6 - * Date : 11-11-22 - * Time : 下午4:58 - */ -public class SetPlotStyleAction extends ChartComponentAction { - private static final long serialVersionUID = 2894127568015714372L; - - public SetPlotStyleAction(ChartComponent chartComponent) { - super(chartComponent); - this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Set_Plot")); - } - - public void actionPerformed(ActionEvent e) { - showPlotPane(); - } - - public void showPlotPane() { - DesignModuleFactory.getChartPropertyPane().getChartEditPane().gotoPane(PaneTitleConstants.CHART_STYLE_TITLE, PaneTitleConstants.CHART_STYLE_AREA_TITLE, PaneTitleConstants.CHART_STYLE_AREA_PLOT_TITLE); - } -} \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/design/chart/gui/active/action/SetTitleStyleAction.java b/designer-chart/src/main/java/com/fr/design/chart/gui/active/action/SetTitleStyleAction.java deleted file mode 100644 index b336475d4..000000000 --- a/designer-chart/src/main/java/com/fr/design/chart/gui/active/action/SetTitleStyleAction.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.fr.design.chart.gui.active.action; - -import java.awt.event.ActionEvent; - -import com.fr.design.chart.gui.ChartComponent; -import com.fr.design.mainframe.chart.PaneTitleConstants; -import com.fr.design.module.DesignModuleFactory; - - -/** - * Created by IntelliJ IDEA. - * Author : Richer - * Version: 6.5.6 - * Date : 11-11-22 - * Time : 下午4:52 - */ -public class SetTitleStyleAction extends ChartComponentAction { - private static final long serialVersionUID = -4763886493273213850L; - - public SetTitleStyleAction(ChartComponent chartComponent) { - super(chartComponent); - this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Set_Title_Style")); - } - - public void actionPerformed(ActionEvent e) { - showTitlePane(); - } - - public void showTitlePane() { - DesignModuleFactory.getChartPropertyPane().getChartEditPane().gotoPane(PaneTitleConstants.CHART_STYLE_TITLE, PaneTitleConstants.CHART_STYLE_TITLE_TITLE); - } -} \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/design/chart/report/GisMapReportDataContentPane.java b/designer-chart/src/main/java/com/fr/design/chart/report/GisMapReportDataContentPane.java index b35f40c55..6b646ce83 100644 --- a/designer-chart/src/main/java/com/fr/design/chart/report/GisMapReportDataContentPane.java +++ b/designer-chart/src/main/java/com/fr/design/chart/report/GisMapReportDataContentPane.java @@ -182,11 +182,7 @@ public class GisMapReportDataContentPane extends FurtherBasicBeanPane getPlotSeriesPane(ChartStylePane parent, Plot plot){ - return plot.isSupport3D() ? new Bar3DSeriesPane(parent, plot) : new Bar2DSeriesPane(parent, plot); - } - - public ConditionAttributesPane getPlotConditionPane(Plot plot){ - return plot.isSupport3D() ? new Bar3DPlotDataSeriesConditionPane() - : (plot.isSupportTrendLine() ? new Bar2DTrendLineDSConditionPane() : new BarPlotDataSeriesConditionPane()); - } - - /** - *图标路径 - * @return 图标路径 - */ - public String getIconPath(){ - return "com/fr/design/images/form/toolbar/ChartF-Bar.png"; - } - -} \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/design/chartinterface/ColumnIndependentChartInterface.java b/designer-chart/src/main/java/com/fr/design/chartinterface/ColumnIndependentChartInterface.java deleted file mode 100644 index 8a9249274..000000000 --- a/designer-chart/src/main/java/com/fr/design/chartinterface/ColumnIndependentChartInterface.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.fr.design.chartinterface; - -import com.fr.chart.chartattr.Plot; -import com.fr.design.beans.BasicBeanPane; -import com.fr.design.chart.fun.impl.AbstractIndependentChartUIWithAPILevel; -import com.fr.design.chart.series.SeriesCondition.impl.Bar2DTrendLineDSConditionPane; -import com.fr.design.chart.series.SeriesCondition.impl.Bar3DPlotDataSeriesConditionPane; -import com.fr.design.chart.series.SeriesCondition.impl.BarPlotDataSeriesConditionPane; -import com.fr.design.condition.ConditionAttributesPane; -import com.fr.design.mainframe.chart.gui.ChartDataPane; -import com.fr.design.mainframe.chart.gui.ChartStylePane; -import com.fr.design.mainframe.chart.gui.data.report.AbstractReportDataContentPane; -import com.fr.design.mainframe.chart.gui.data.report.CategoryPlotMoreCateReportDataContentPane; -import com.fr.design.mainframe.chart.gui.data.table.AbstractTableDataContentPane; -import com.fr.design.mainframe.chart.gui.data.table.CategoryPlotMoreCateTableDataContentPane; -import com.fr.design.mainframe.chart.gui.style.series.Bar2DSeriesPane; -import com.fr.design.mainframe.chart.gui.style.series.Bar3DSeriesPane; -import com.fr.design.mainframe.chart.gui.type.AbstractChartTypePane; -import com.fr.design.mainframe.chart.gui.type.ColumnPlotPane; - -/** - * Created by eason on 15/4/21. - */ -public class ColumnIndependentChartInterface extends AbstractIndependentChartUIWithAPILevel { - - public AbstractChartTypePane getPlotTypePane(){ - return new ColumnPlotPane(); - } - - - public AbstractTableDataContentPane getTableDataSourcePane(Plot plot, ChartDataPane parent){ - return new CategoryPlotMoreCateTableDataContentPane(parent); - } - - public AbstractReportDataContentPane getReportDataSourcePane(Plot plot, ChartDataPane parent){ - return new CategoryPlotMoreCateReportDataContentPane(parent); - } - - public BasicBeanPane getPlotSeriesPane(ChartStylePane parent, Plot plot){ - return plot.isSupport3D() ? new Bar3DSeriesPane(parent, plot) : new Bar2DSeriesPane(parent, plot); - } - - public ConditionAttributesPane getPlotConditionPane(Plot plot){ - return plot.isSupport3D() ? new Bar3DPlotDataSeriesConditionPane() - : (plot.isSupportTrendLine() ? new Bar2DTrendLineDSConditionPane() : new BarPlotDataSeriesConditionPane()); - } - - /** - *图标路径 - * @return 图标路径 - */ - public String getIconPath(){ - return "com/fr/design/images/form/toolbar/ChartF-Column.png"; - } -} \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/design/chartinterface/GisMapIndependentChartInterface.java b/designer-chart/src/main/java/com/fr/design/chartinterface/GisMapIndependentChartInterface.java deleted file mode 100644 index 04cdbd8b2..000000000 --- a/designer-chart/src/main/java/com/fr/design/chartinterface/GisMapIndependentChartInterface.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.fr.design.chartinterface; - -import com.fr.chart.chartattr.Plot; -import com.fr.design.chart.fun.impl.AbstractIndependentChartUIWithAPILevel; -import com.fr.design.mainframe.chart.gui.ChartDataPane; -import com.fr.design.mainframe.chart.gui.data.report.AbstractReportDataContentPane; -import com.fr.design.mainframe.chart.gui.data.table.AbstractTableDataContentPane; -import com.fr.design.mainframe.chart.gui.type.AbstractChartTypePane; -import com.fr.design.mainframe.chart.gui.type.GisMapPlotPane; - -/** - * Created by eason on 15/4/21. - */ -public class GisMapIndependentChartInterface extends AbstractIndependentChartUIWithAPILevel { - - - public AbstractChartTypePane getPlotTypePane(){ - return new GisMapPlotPane(); - } - - public AbstractTableDataContentPane getTableDataSourcePane(Plot plot, ChartDataPane parent){ - return null; - } - - public AbstractReportDataContentPane getReportDataSourcePane(Plot plot, ChartDataPane parent){ - return null; - } - /** - *图标路径 - * @return 图标路径 - */ - public String getIconPath(){ - return "com/fr/design/images/form/toolbar/ChartF-Gis.png"; - } - -} \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/design/chartx/MultiCategoryChartDataPane.java b/designer-chart/src/main/java/com/fr/design/chartx/AbstractVanSingleDataPane.java similarity index 57% rename from designer-chart/src/main/java/com/fr/design/chartx/MultiCategoryChartDataPane.java rename to designer-chart/src/main/java/com/fr/design/chartx/AbstractVanSingleDataPane.java index 721fc8480..1db85d8c5 100644 --- a/designer-chart/src/main/java/com/fr/design/chartx/MultiCategoryChartDataPane.java +++ b/designer-chart/src/main/java/com/fr/design/chartx/AbstractVanSingleDataPane.java @@ -1,24 +1,30 @@ package com.fr.design.chartx; import com.fr.chartx.data.AbstractDataDefinition; -import com.fr.design.chartx.fields.diff.MultiCategoryCellDataFieldsPane; -import com.fr.design.chartx.fields.diff.MultiCategoryDataSetFieldsPane; import com.fr.design.chartx.single.SingleDataPane; import com.fr.design.gui.frpane.AttributeChangeListener; import javax.swing.JPanel; /** - * Created by shine on 2019/5/22. + * Created by shine on 2019/09/06. */ -public class MultiCategoryChartDataPane extends AbstractChartDataPane { - +public abstract class AbstractVanSingleDataPane extends AbstractChartDataPane { private SingleDataPane singleDataPane; - public MultiCategoryChartDataPane(AttributeChangeListener listener) { + + public AbstractVanSingleDataPane(AttributeChangeListener listener) { super(listener); } + @Override + protected JPanel createContentPane() { + singleDataPane = createSingleDataPane(); + return singleDataPane; + } + + protected abstract SingleDataPane createSingleDataPane(); + @Override protected void populate(AbstractDataDefinition dataDefinition) { singleDataPane.populateBean(dataDefinition); @@ -28,16 +34,4 @@ public class MultiCategoryChartDataPane extends AbstractChartDataPane { - private MultiCategoryChartDataPane dataPane; - private MultiCategoryChartDataPane linkPane; + private AbstractVanSingleDataPane dataPane; + private AbstractVanSingleDataPane linkPane; @Override protected JPanel createContentPane() { - dataPane = new MultiCategoryChartDataPane(listener); - linkPane = new MultiCategoryChartDataPane(listener); + dataPane = new AbstractVanSingleDataPane(listener) { + @Override + protected SingleDataPane createSingleDataPane() { + return new SingleDataPane(new MultiCategoryDataSetFieldsPane(), new MultiCategoryCellDataFieldsPane()); + } + }; + linkPane = new AbstractVanSingleDataPane(listener) { + @Override + protected SingleDataPane createSingleDataPane() { + return new SingleDataPane(new MultiCategoryDataSetFieldsPane(), new MultiCategoryCellDataFieldsPane()); + } + }; return new VanChartGroupPane(new String[]{"data", "link"}, new JPanel[]{dataPane, linkPane}) { }; } @@ -27,13 +40,13 @@ public class GanttChartDataPane extends AbstractChartDataPane { + + private TinyFormulaPane nodeName; + private TinyFormulaPane nodeId; + private TinyFormulaPane parentId; + private UITextField seriesName; + private TinyFormulaPane nodeValue; + + @Override + protected void initComponents() { + seriesName = new UITextField(); + nodeName = new TinyFormulaPane(); + nodeId = new TinyFormulaPane(); + parentId = new TinyFormulaPane(); + nodeValue = new TinyFormulaPane(); + + super.initComponents(); + } + + @Override + protected String[] fieldLabels() { + return new String[]{ + Toolkit.i18nText("Fine-Design_Chart_Node_Name"), + "id", + Toolkit.i18nText("Fine-Design_Chart_Parent_ID"), + Toolkit.i18nText("Fine-Design_Chart_MultiPie_Series_Name"), + Toolkit.i18nText("Fine-Design_Chart_Series_Value"), + }; + } + + @Override + protected TinyFormulaPane[] formulaPanes() { + return new TinyFormulaPane[]{ + nodeName, + nodeId, + parentId, + nodeValue + }; + } + + @Override + protected Component[] fieldComponents() { + return new Component[]{ + nodeName, + nodeId, + parentId, + nodeValue, + nodeValue, + }; + } + + @Override + public void populateBean(StructureColumnFieldCollection ob) { + seriesName.setText(ob.getSeriesName()); + populateField(nodeName, ob.getNodeName()); + populateField(nodeId, ob.getNodeId()); + populateField(parentId, ob.getParentId()); + populateField(nodeValue, ob.getNodeValue()); + } + + @Override + public StructureColumnFieldCollection updateBean() { + StructureColumnFieldCollection result = new StructureColumnFieldCollection(); + result.setSeriesName(seriesName.getText()); + updateField(nodeName, result.getNodeName()); + updateField(nodeId, result.getNodeId()); + updateField(parentId, result.getParentId()); + updateField(nodeValue, result.getNodeValue()); + return result; + } +} \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/design/chartx/fields/diff/StructureDataSetFieldsPane.java b/designer-chart/src/main/java/com/fr/design/chartx/fields/diff/StructureDataSetFieldsPane.java new file mode 100644 index 000000000..049c76fd7 --- /dev/null +++ b/designer-chart/src/main/java/com/fr/design/chartx/fields/diff/StructureDataSetFieldsPane.java @@ -0,0 +1,91 @@ +package com.fr.design.chartx.fields.diff; + +import com.fr.chartx.data.field.diff.StructureColumnFieldCollection; +import com.fr.design.chartx.fields.AbstractDataSetFieldsPane; +import com.fr.design.gui.icombobox.UIComboBox; +import com.fr.design.gui.itextfield.UITextField; +import com.fr.design.i18n.Toolkit; +import com.fr.design.mainframe.chart.gui.data.CalculateComboBox; + +import java.awt.Component; + +/** + * @author Bjorn + * @version 10.0 + * Created by Bjorn on 2019-09-02 + */ +public class StructureDataSetFieldsPane extends AbstractDataSetFieldsPane { + + private UIComboBox nodeName; + private UIComboBox nodeId; + private UIComboBox parentId; + private UITextField seriesName; + private UIComboBox nodeValue; + private CalculateComboBox calculateCombox; + + @Override + protected void initComponents() { + nodeName = new UIComboBox(); + nodeId = new UIComboBox(); + parentId = new UIComboBox(); + seriesName = new UITextField(); + nodeValue = new UIComboBox(); + calculateCombox = new CalculateComboBox(); + + super.initComponents(); + } + + @Override + protected String[] fieldLabels() { + return new String[]{ + Toolkit.i18nText("Fine-Design_Chart_Node_Name"), + "id", + Toolkit.i18nText("Fine-Design_Chart_Parent_ID"), + Toolkit.i18nText("Fine-Design_Chart_MultiPie_Series_Name"), + Toolkit.i18nText("Fine-Design_Chart_Series_Value"), + Toolkit.i18nText("Fine-Design_Chart_Summary_Method") + }; + } + + @Override + protected UIComboBox[] filedComboBoxes() { + return new UIComboBox[]{ + nodeName, + nodeId, + parentId, + nodeValue + }; + } + + @Override + protected Component[] fieldComponents() { + return new Component[]{ + nodeName, + nodeId, + parentId, + nodeValue, + nodeValue, + calculateCombox + }; + } + + @Override + public void populateBean(StructureColumnFieldCollection ob) { + seriesName.setText(ob.getSeriesName()); + populateField(nodeName, ob.getNodeName()); + populateField(nodeId, ob.getNodeId()); + populateField(parentId, ob.getParentId()); + populateFunctionField(nodeValue, calculateCombox, ob.getNodeValue()); + } + + @Override + public StructureColumnFieldCollection updateBean() { + StructureColumnFieldCollection result = new StructureColumnFieldCollection(); + result.setSeriesName(seriesName.getText()); + updateField(nodeName, result.getNodeName()); + updateField(nodeId, result.getNodeId()); + updateField(parentId, result.getParentId()); + updateFunctionField(nodeValue, calculateCombox, result.getNodeValue()); + return result; + } +} diff --git a/designer-chart/src/main/java/com/fr/design/chartx/fields/diff/WordCloudCellDataFieldsPane.java b/designer-chart/src/main/java/com/fr/design/chartx/fields/diff/WordCloudCellDataFieldsPane.java index 46af0112c..fc90c87c3 100644 --- a/designer-chart/src/main/java/com/fr/design/chartx/fields/diff/WordCloudCellDataFieldsPane.java +++ b/designer-chart/src/main/java/com/fr/design/chartx/fields/diff/WordCloudCellDataFieldsPane.java @@ -64,7 +64,7 @@ public class WordCloudCellDataFieldsPane extends AbstractCellDataFieldsPane extends AbstractChartAttrPane { + + protected abstract void populate(T chart); + + protected abstract void update(T chart); + + @Override + public void populate(ChartCollection collection) { + if (collection == null) { + return; + } + AbstractChartWithData chart = collection.getSelectedChart(AbstractChartWithData.class); + if (chart == null) { + return; + } + + populate((T) chart); + } + + @Override + public void update(ChartCollection collection) { + + if (collection == null) { + return; + } + AbstractChartWithData chart = collection.getSelectedChart(AbstractChartWithData.class); + if (chart == null) { + return; + } + + update((T) chart); + } +} diff --git a/designer-chart/src/main/java/com/fr/design/chartx/impl/DefaultTypePane.java b/designer-chart/src/main/java/com/fr/design/chartx/impl/DefaultTypePane.java new file mode 100644 index 000000000..daaeb8ec1 --- /dev/null +++ b/designer-chart/src/main/java/com/fr/design/chartx/impl/DefaultTypePane.java @@ -0,0 +1,79 @@ +package com.fr.design.chartx.impl; + +import com.fr.chart.charttypes.ChartTypeManager; +import com.fr.chart.impl.AbstractChartWithData; +import com.fr.chartx.attr.ChartProvider; +import com.fr.design.ChartTypeInterfaceManager; +import com.fr.design.mainframe.chart.gui.type.AbstractChartTypePane; +import com.fr.design.mainframe.chart.gui.type.ChartImagePane; + +/** + * Created by shine on 2019/09/04. + */ +public class DefaultTypePane extends AbstractChartTypePane { + + @Override + protected String[] getTypeIconPath() { + return ChartTypeInterfaceManager.getInstance().getDemoImagePath(getPlotID()); + } + + @Override + protected String[] getTypeTipName() { + return ChartTypeInterfaceManager.getInstance().getSubName(getPlotID()); + } + + @Override + public ChartProvider getDefaultChart() { + return ChartTypeManager.getInstance().getChartTypes(getPlotID())[0]; + } + + @Override + public String title4PopupWindow() { + return ChartTypeInterfaceManager.getInstance().getName(getPlotID()); + } + + protected int getSelectIndexInChart(T chart) { + return 0; + } + + protected void setSelectIndexInChart(T chart, int index) { + } + + @Override + public void populateBean(T ob) { + if (getTypeIconPath().length > 0) { + for (ChartImagePane imagePane : typeDemo) { + imagePane.isPressing = false; + } + typeDemo.get(getSelectIndexInChart(ob)).isPressing = true; + checkDemosBackground(); + } + } + + @Override + public void updateBean(T ob) { + if (getTypeIconPath().length > 0) { + for (int index = 0, len = typeDemo.size(); index < len; index++) { + if (typeDemo.get(index).isPressing) { + setSelectIndexInChart(ob, index); + return; + } + } + } + } + + @Override + protected String[] getTypeLayoutPath() { + return new String[0]; + } + + @Override + protected String[] getTypeLayoutTipName() { + return new String[0]; + } + + @Override + protected String getPlotTypeID() { + return null; + } +} diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/MiddleChartPropertyPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/MiddleChartPropertyPane.java index 5ff3e0233..1b2a85668 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/MiddleChartPropertyPane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/MiddleChartPropertyPane.java @@ -91,7 +91,7 @@ public abstract class MiddleChartPropertyPane extends BaseChartPropertyPane{ * @param ePane 面板 */ public void populateChartPropertyPane(ChartCollection collection, TargetComponent ePane) { - addChartEditPane(collection.getSelectedChart().getPlot().getPlotID()); + addChartEditPane(collection.getSelectedChartProvider().getID()); setSupportCellData(true); this.container.setEPane(ePane); chartEditPane.populate(collection); diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/ChartEditPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/ChartEditPane.java index 6d6f73ea2..5ecfa1071 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/ChartEditPane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/ChartEditPane.java @@ -1,6 +1,7 @@ package com.fr.design.mainframe.chart; +import com.fr.chart.chartattr.Chart; import com.fr.chart.chartattr.ChartCollection; import com.fr.chartx.attr.ChartProvider; import com.fr.design.ChartTypeInterfaceManager; @@ -130,6 +131,10 @@ public class ChartEditPane extends BasicPane implements AttributeChange,Prepare4 } }; + @Deprecated + public void reLayout(Chart currentChart) { + } + /** * 重新构造面板 * @param currentChart 图表 @@ -225,8 +230,14 @@ public class ChartEditPane extends BasicPane implements AttributeChange,Prepare4 return; } - if (checkNeedsReLayout(collection.getSelectedChartProvider())) { - reLayout(collection.getSelectedChartProvider()); + ChartProvider chartProvider = collection.getSelectedChartProvider(); + if (checkNeedsReLayout(chartProvider)) { + String chartID = chartProvider.getID(); + if ("WaferChipChart".equals(chartID) || "BoxPlotChart".equals(chartID)) { + reLayout((Chart)chartProvider); + } else { + reLayout(chartProvider); + } } this.collection = collection; diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/ChartsEditPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/ChartsEditPane.java index b9f5a2fbd..ff6844d8b 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/ChartsEditPane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/ChartsEditPane.java @@ -1,6 +1,7 @@ package com.fr.design.mainframe.chart; import com.fr.chart.chartattr.Chart; +import com.fr.chartx.attr.ChartProvider; import com.fr.design.ChartTypeInterfaceManager; import com.fr.design.mainframe.chart.gui.ChartDataPane; @@ -30,15 +31,16 @@ public class ChartsEditPane extends ChartEditPane { * 重新构造面板 * @param currentChart 图表 */ - public void reLayout(Chart currentChart) { + public void reLayout(ChartProvider currentChart) { if (currentChart != null) { + Chart chart = (Chart) currentChart; this.removeAll(); this.setLayout(new BorderLayout()); paneList = new ArrayList(); String plotID = ""; - if (currentChart.getPlot() != null) { - plotID = currentChart.getPlot().getPlotID(); + if (chart.getPlot() != null) { + plotID = chart.getPlot().getPlotID(); } dataPane4SupportCell = createChartDataPane(plotID); diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/ChartTypeButtonPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/ChartTypeButtonPane.java index 4d7221113..4dedb133d 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/ChartTypeButtonPane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/ChartTypeButtonPane.java @@ -178,9 +178,8 @@ public class ChartTypeButtonPane extends BasicBeanPane implemen */ public ChartProvider getChangeStateNewChart() { ChartProvider chart = editingCollection.getSelectedChartProvider(); - String priority = ChartTypeManager.VAN_CHART_PRIORITY; - //todo@shinerefactor - // chart.getPriority(); + String chartID = chart.getID(); + String priority = ChartTypeManager.getInstanceWithCheck().getPriority(chartID); return ChartTypeManager.getInstanceWithCheck().getFirstChart(priority); } diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/ChartTypePane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/ChartTypePane.java index 8ac031f75..e9dcbedce 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/ChartTypePane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/ChartTypePane.java @@ -1,6 +1,5 @@ package com.fr.design.mainframe.chart.gui; -import com.fr.chart.chartattr.Chart; import com.fr.chart.chartattr.ChartCollection; import com.fr.chart.chartattr.SwitchState; import com.fr.chart.charttypes.ChartTypeManager; @@ -146,12 +145,6 @@ public class ChartTypePane extends AbstractChartAttrPane{ //chartID改变的话图表类型就算改变了 if (StringUtils.isNotEmpty(chartID)) { - if (chart instanceof Chart) { - //todo@shinerefactor: 这边看下是否可以删除 - ((Chart) chart).setWrapperName(ChartTypeManager.getInstanceWithCheck().getWrapperName(chartID)); - ((Chart) chart).setChartImagePath(ChartTypeManager.getInstanceWithCheck().getChartImagePath(chartID)); - } - boolean isUseDefault = ChartTypeInterfaceManager.getInstance().isUseDefaultPane(chartID); if (editPane.isDefaultPane() != isUseDefault || (!isUseDefault && !ComparatorUtils.equals(lastPlotID, chartID))) { @@ -217,12 +210,10 @@ public class ChartTypePane extends AbstractChartAttrPane{ private void relayout(ChartCollection collection){ //重构需要重构下拉框选项和cardNames ChartProvider chart = collection.getSelectedChartProvider(); - String priority = ChartTypeManager.VAN_CHART_PRIORITY; - //TODO@shinerefactor - // chart.getPriority(); - String plotID = chart.getID(); - boolean enabledChart = ChartTypeManager.enabledChart(plotID); - String item = ChartTypeInterfaceManager.getInstance().getTitle4PopupWindow(priority, plotID); + String chartID = chart.getID(); + String priority = ChartTypeManager.getInstanceWithCheck().getPriority(chartID); + boolean enabledChart = ChartTypeManager.enabledChart(chartID); + String item = ChartTypeInterfaceManager.getInstance().getName(chartID); //第一步就是重构cards cards.clear(); @@ -233,7 +224,7 @@ public class ChartTypePane extends AbstractChartAttrPane{ addOnePriorityCards(priority); } } else { - addOnePlotIDCards(priority, plotID); + addOnePlotIDCards(priority, chartID); } //下拉框重构开始。为了防止重构是触发update @@ -309,6 +300,8 @@ public class ChartTypePane extends AbstractChartAttrPane{ boolean isUseDefault = ChartTypeInterfaceManager.getInstance().isUseDefaultPane(plotID); if (editPane != null && editPane.isDefaultPane() != isUseDefault || (!isUseDefault && !ComparatorUtils.equals(lastPlotID, plotID))){ editPane.reLayout(chart); + }else { + throw new IllegalArgumentException("editPane can not be null."); } } diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/table/CategoryPlotTableDataContentPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/table/CategoryPlotTableDataContentPane.java index 6ba03732e..8c988ce29 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/table/CategoryPlotTableDataContentPane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/table/CategoryPlotTableDataContentPane.java @@ -140,7 +140,7 @@ public class CategoryPlotTableDataContentPane extends AbstractTableDataContentPa } else if(data!= null && !this.boxItemsContainsObject(categoryCombox,data.getCategoryName())){ categoryCombox.setSelectedItem(null); }else { - combineCustomEditValue(categoryCombox, data == null ? null : data.getCategoryName()); + combineCustomEditValue(categoryCombox, data.getCategoryName()); } seriesTypeComboxPane.populateBean(collection,this.isNeedSummaryCaculateMethod()); diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/table/SeriesNameUseFieldNamePane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/table/SeriesNameUseFieldNamePane.java index 73c800f9e..0c643cf8c 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/table/SeriesNameUseFieldNamePane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/table/SeriesNameUseFieldNamePane.java @@ -310,11 +310,7 @@ public class SeriesNameUseFieldNamePane extends FurtherBasicBeanPane extends Fur } public AbstractChartTypePane() { + } + + public void reLayout(String chartID) { + this.plotID = chartID; + double vs = 4; double p = TableLayout.PREFERRED; double f = TableLayout.FILL; @@ -156,9 +161,11 @@ public abstract class AbstractChartTypePane extends Fur } } - for(int i = 0; i < typeDemo.size(); i++) { - typeDemo.get(i).checkBorder(); - typeDemo.get(i).repaint(); + if (this.typeDemo != null && !typeDemo.isEmpty()) { + for (int i = 0; i < typeDemo.size(); i++) { + typeDemo.get(i).checkBorder(); + typeDemo.get(i).repaint(); + } } } @@ -197,22 +204,14 @@ public abstract class AbstractChartTypePane extends Fur return plotID; } - public void setPlotID(String plotID) { - this.plotID = plotID; - } - /** * * @param ob 对象 * @return */ public boolean accept(Object ob) { - if(ob instanceof Chart){ - Chart chart = (Chart)ob; - Plot plot = chart.getPlot(); - if(plot != null && ComparatorUtils.equals(plot.getPlotID(), getPlotID())){ - return true; - } + if (ob instanceof ChartProvider) { + return ComparatorUtils.equals(((ChartProvider) ob).getID(), getPlotID()); } return false; } diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/AreaPlotPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/AreaPlotPane.java index 483a4f09f..a84c9ab46 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/AreaPlotPane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/AreaPlotPane.java @@ -9,7 +9,6 @@ import com.fr.chart.chartattr.Plot; import com.fr.chart.chartglyph.ConditionCollection; import com.fr.chart.charttypes.AreaIndependentChart; import com.fr.design.i18n.Toolkit; -import com.fr.locale.InterProviderFactory; /** @@ -35,7 +34,7 @@ public class AreaPlotPane extends AbstractDeprecatedChartTypePane { @Override protected String[] getTypeTipName() { - String area = InterProviderFactory.getProvider().getLocText("Fine-Engine_Chart_Type_Area"); + String area = Toolkit.i18nText("Fine-Design_Chart_Type_Area"); String stack = Toolkit.i18nText("Fine-Design_Chart_Stacked"); String percent = Toolkit.i18nText("Fine-Design_Chart_Use_Percent"); String td = Toolkit.i18nText("Fine-Design_Chart_3D"); @@ -79,7 +78,7 @@ public class AreaPlotPane extends AbstractDeprecatedChartTypePane { } else { typeDemo.get(STACK_AREA_CHART).isPressing = true; } - } + } } else if(plot instanceof Area3DPlot) { Area3DPlot threeDPlot = (Area3DPlot)plot; if(threeDPlot.isStacked()) { @@ -90,7 +89,7 @@ public class AreaPlotPane extends AbstractDeprecatedChartTypePane { } } } - + checkDemosBackground(); } @@ -121,13 +120,13 @@ public class AreaPlotPane extends AbstractDeprecatedChartTypePane { } /** - * 保存界面属性 + * 保存界面属性 */ public void updateBean(Chart chart) { chart.switchPlot(getSelectedClonedPlot()); super.updateBean(chart); } - + private void createAreaCondition(Plot plot) { ConditionCollection collection = plot.getConditionCollection(); AttrAlpha alpha = (AttrAlpha) collection.getDefaultAttr().getExisted(AttrAlpha.class); @@ -143,7 +142,7 @@ public class AreaPlotPane extends AbstractDeprecatedChartTypePane { * @return 界面标题 */ public String title4PopupWindow() { - return InterProviderFactory.getProvider().getLocText("Fine-Engine_Chart_Type_Area"); + return Toolkit.i18nText("Fine-Design_Chart_Type_Area"); } public Chart getDefaultChart() { diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/BarPlotPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/BarPlotPane.java index 1a3808a6a..7f68e153b 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/BarPlotPane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/BarPlotPane.java @@ -7,7 +7,6 @@ import com.fr.chart.chartattr.Chart; import com.fr.chart.chartattr.Plot; import com.fr.chart.charttypes.BarIndependentChart; import com.fr.design.i18n.Toolkit; -import com.fr.locale.InterProviderFactory; import com.fr.log.FineLoggerFactory; @@ -33,7 +32,7 @@ public class BarPlotPane extends AbstractBarPane{ @Override protected String[] getTypeTipName() { - String bar = InterProviderFactory.getProvider().getLocText("Fine-Engine_Chart_Type_Bar"); + String bar = Toolkit.i18nText("Fine-Design_Chart_Type_Bar"); String stack = Toolkit.i18nText("Fine-Design_Chart_Stacked"); String percent = Toolkit.i18nText("Fine-Design_Chart_Use_Percent"); String td = Toolkit.i18nText("Fine-Design_Chart_3D"); @@ -67,7 +66,7 @@ public class BarPlotPane extends AbstractBarPane{ * @return 界面标题 */ public String title4PopupWindow() { - return InterProviderFactory.getProvider().getLocText("Fine-Engine_Chart_Type_Bar"); + return Toolkit.i18nText("Fine-Design_Chart_Type_Bar"); } protected Plot getSelectedClonedPlot(){ diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/BubblePlotPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/BubblePlotPane.java index 551a97523..d8fe8664c 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/BubblePlotPane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/BubblePlotPane.java @@ -4,12 +4,12 @@ import com.fr.chart.base.ChartConstants; import com.fr.chart.chartattr.BubblePlot; import com.fr.chart.chartattr.Chart; import com.fr.chart.charttypes.BubbleIndependentChart; -import com.fr.locale.InterProviderFactory; +import com.fr.design.i18n.Toolkit; /** * 气泡图 属性表 选择类型 布局界面. - * + * * @author kunsnat E-mail:kunsnat@gmail.com * @version 创建时间:2012-12-25 下午06:56:47 */ @@ -26,7 +26,7 @@ public class BubblePlotPane extends AbstractDeprecatedChartTypePane { @Override protected String[] getTypeTipName() { return new String[]{ - InterProviderFactory.getProvider().getLocText("Fine-Engine_Chart_Bubble_Chart") + Toolkit.i18nText("Fine-Design_Chart_Bubble_Chart_OLD") }; } @@ -45,7 +45,7 @@ public class BubblePlotPane extends AbstractDeprecatedChartTypePane { * @return 界面标题 */ public String title4PopupWindow() { - return InterProviderFactory.getProvider().getLocText("Fine-Engine_Chart_Bubble_Chart"); + return Toolkit.i18nText("Fine-Design_Chart_Bubble_Chart_OLD"); } /** @@ -70,7 +70,7 @@ public class BubblePlotPane extends AbstractDeprecatedChartTypePane { */ public void populateBean(Chart chart) { typeDemo.get(0).isPressing = true; - + checkDemosBackground(); } diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/ChartImagePane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/ChartImagePane.java index 3433da4e2..584d7fd1d 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/ChartImagePane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/ChartImagePane.java @@ -5,9 +5,13 @@ import com.fr.design.constants.UIConstants; import com.fr.design.gui.ilable.UILabel; import com.fr.general.IOUtils; -import javax.swing.*; -import java.awt.*; +import javax.swing.BorderFactory; +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Graphics; import java.awt.event.MouseEvent; +import java.awt.image.BufferedImage; public class ChartImagePane extends ChartSelectDemoPane { private static final long serialVersionUID = -2785128245790568603L; @@ -33,9 +37,18 @@ public class ChartImagePane extends ChartSelectDemoPane { constructImagePane(fullIconPath, tipName, isDrawRightLine); } - private void constructImagePane(String fullIconPath, String tipName, boolean isDrawRightLine){ - - UILabel image = new UILabel(IOUtils.readIcon(fullIconPath)); + private void constructImagePane(final String fullIconPath, String tipName, boolean isDrawRightLine) { + + UILabel image = new UILabel() { + @Override + public void paint(Graphics g) { + super.paint(g); + + BufferedImage image1 = IOUtils.readImageWithCache(fullIconPath); + g.drawImage(image1, 0, 0, IMAGE_WIDTH, IMAGE_HIGTH, null); + } + }; + this.setLayout(new BorderLayout()); this.add(image, BorderLayout.CENTER); addMouseListener(this); diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/ColumnPlotPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/ColumnPlotPane.java index e421bdeba..e6b446b56 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/ColumnPlotPane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/ColumnPlotPane.java @@ -6,7 +6,6 @@ import com.fr.chart.chartattr.Chart; import com.fr.chart.chartattr.Plot; import com.fr.chart.charttypes.ColumnIndependentChart; import com.fr.design.i18n.Toolkit; -import com.fr.locale.InterProviderFactory; import com.fr.log.FineLoggerFactory; @@ -32,7 +31,7 @@ public class ColumnPlotPane extends AbstractBarPane{ @Override protected String[] getTypeTipName() { - String column = InterProviderFactory.getProvider().getLocText("Fine-Engine_Chart_Type_Column"); + String column = Toolkit.i18nText("Fine-Design_Chart_Type_Column"); String stack = Toolkit.i18nText("Fine-Design_Chart_Stacked"); String percent = Toolkit.i18nText("Fine-Design_Chart_Use_Percent"); String td = Toolkit.i18nText("Fine-Design_Chart_3D"); @@ -65,7 +64,7 @@ public class ColumnPlotPane extends AbstractBarPane{ * @return 界面标题 */ public String title4PopupWindow() { - return InterProviderFactory.getProvider().getLocText("Fine-Engine_Chart_Type_Column"); + return Toolkit.i18nText("Fine-Design_Chart_Type_Column"); } protected Plot getSelectedClonedPlot(){ diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/CustomPlotPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/CustomPlotPane.java index f81b1168c..e922d2921 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/CustomPlotPane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/CustomPlotPane.java @@ -3,7 +3,7 @@ package com.fr.design.mainframe.chart.gui.type; import com.fr.chart.base.ChartConstants; import com.fr.chart.chartattr.Chart; import com.fr.chart.charttypes.CustomIndependentChart; -import com.fr.locale.InterProviderFactory; +import com.fr.design.i18n.Toolkit; /** @@ -27,7 +27,7 @@ public class CustomPlotPane extends AbstractDeprecatedChartTypePane { @Override protected String[] getTypeTipName() { return new String[]{ - InterProviderFactory.getProvider().getLocText("Fine-Engine_Chart_Type_Combine") + Toolkit.i18nText("Fine-Design_Chart_Type_Combine") }; } @@ -46,7 +46,7 @@ public class CustomPlotPane extends AbstractDeprecatedChartTypePane { * @return 界面标题 */ public String title4PopupWindow() { - return InterProviderFactory.getProvider().getLocText("Fine-Engine_Chart_Type_Combine"); + return Toolkit.i18nText("Fine-Design_Chart_Type_Combine"); } /** diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/DonutPlotPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/DonutPlotPane.java index 0b57d225d..44cdc8527 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/DonutPlotPane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/DonutPlotPane.java @@ -11,11 +11,10 @@ import com.fr.chart.chartattr.Plot; import com.fr.chart.chartglyph.ConditionCollection; import com.fr.chart.charttypes.DonutIndependentChart; import com.fr.design.i18n.Toolkit; -import com.fr.locale.InterProviderFactory; import com.fr.stable.Constants; -import java.awt.Color; import java.text.DecimalFormat; +import java.awt.Color; /** * 圆环图的类型界面 @@ -36,7 +35,7 @@ public class DonutPlotPane extends AbstractDeprecatedChartTypePane { @Override protected String[] getTypeTipName() { - String donut = InterProviderFactory.getProvider().getLocText("Fine-Engine_Chart_Type_Donut"); + String donut = Toolkit.i18nText("Fine-Design_Chart_Type_Donut"); return new String[]{ donut, Toolkit.i18nText("Fine-Design_Chart_3D") + donut @@ -104,7 +103,7 @@ public class DonutPlotPane extends AbstractDeprecatedChartTypePane { * @return 标题 */ public String title4PopupWindow() { - return InterProviderFactory.getProvider().getLocText("Fine-Engine_Chart_Type_Donut"); + return Toolkit.i18nText("Fine-Design_Chart_Type_Donut"); } /** diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/FunnelPlotPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/FunnelPlotPane.java index 1b00f7a2a..b3706a058 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/FunnelPlotPane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/FunnelPlotPane.java @@ -7,7 +7,7 @@ import com.fr.chart.chartattr.Chart; import com.fr.chart.chartattr.FunnelPlot; import com.fr.chart.chartattr.Plot; import com.fr.chart.charttypes.FunnelIndependentChart; -import com.fr.locale.InterProviderFactory; +import com.fr.design.i18n.Toolkit; import java.text.DecimalFormat; @@ -31,7 +31,7 @@ public class FunnelPlotPane extends AbstractDeprecatedChartTypePane { @Override protected String[] getTypeTipName() { return new String[]{ - InterProviderFactory.getProvider().getLocText("Fine-Engine_Chart_Type_Funnel") + Toolkit.i18nText("Fine-Design_Chart_Type_Funnel") }; } @@ -50,7 +50,7 @@ public class FunnelPlotPane extends AbstractDeprecatedChartTypePane { * @return 界面标题 */ public String title4PopupWindow() { - return InterProviderFactory.getProvider().getLocText("Fine-Engine_Chart_Type_Funnel"); + return Toolkit.i18nText("Fine-Design_Chart_Type_Funnel"); } /** diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/GanttPlotPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/GanttPlotPane.java index 1bae398b5..f68ee1fc1 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/GanttPlotPane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/GanttPlotPane.java @@ -3,7 +3,7 @@ package com.fr.design.mainframe.chart.gui.type; import com.fr.chart.base.ChartConstants; import com.fr.chart.chartattr.Chart; import com.fr.chart.charttypes.GanttIndependentChart; -import com.fr.locale.InterProviderFactory; +import com.fr.design.i18n.Toolkit; /** @@ -25,7 +25,7 @@ public class GanttPlotPane extends AbstractDeprecatedChartTypePane { @Override protected String[] getTypeTipName() { return new String[]{ - InterProviderFactory.getProvider().getLocText("Fine-Engine_Chart_Type_Gantt") + Toolkit.i18nText("Fine-Design_Chart_Type_Gantt") }; } @@ -48,7 +48,7 @@ public class GanttPlotPane extends AbstractDeprecatedChartTypePane { * @return 界面标题 */ public String title4PopupWindow() { - return InterProviderFactory.getProvider().getLocText("Fine-Engine_Chart_Type_Gantt"); + return Toolkit.i18nText("Fine-Design_Chart_Type_Gantt"); } /** diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/GisMapPlotPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/GisMapPlotPane.java index e62f2e5c5..67906b9e5 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/GisMapPlotPane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/GisMapPlotPane.java @@ -8,11 +8,12 @@ import com.fr.chart.charttypes.GisMapIndependentChart; import com.fr.design.chart.series.PlotStyle.ChartSelectDemoPane; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.itextfield.UITextField; +import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.layout.TableLayout; import com.fr.design.layout.TableLayoutHelper; -import com.fr.locale.InterProviderFactory; import com.fr.log.FineLoggerFactory; +import com.fr.stable.AssistUtils; import javax.swing.JPanel; import java.awt.BorderLayout; @@ -73,7 +74,7 @@ public class GisMapPlotPane extends AbstractDeprecatedChartTypePane { @Override protected String[] getTypeTipName() { return new String[]{ - InterProviderFactory.getProvider().getLocText("Fine-Engine_Chart_GIS_Map") + Toolkit.i18nText("Fine-Design_Chart_GIS_Map_OLD") }; } @@ -139,9 +140,9 @@ public class GisMapPlotPane extends AbstractDeprecatedChartTypePane { } }else{ String key = this.keyInput.getText().trim(); - if(plot.isGisType() && key != plot.getBaiduKey()){ + if(plot.isGisType() && !AssistUtils.equals(key,plot.getBaiduKey())){ plot.setBaiduKey(key); - }else if(!plot.isGisType() && key != plot.getGoogleKey()){ + }else if(!plot.isGisType() && !AssistUtils.equals(key,plot.getGoogleKey())){ plot.setGoogleKey(key); } } @@ -173,7 +174,7 @@ public class GisMapPlotPane extends AbstractDeprecatedChartTypePane { * @return 标题 */ public String title4PopupWindow() { - return InterProviderFactory.getProvider().getLocText("Fine-Engine_Chart_GIS_Map"); + return Toolkit.i18nText("Fine-Design_Chart_GIS_Map_OLD"); } /** diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/LinePlotPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/LinePlotPane.java index e5e23d2bc..e78bb3ac6 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/LinePlotPane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/LinePlotPane.java @@ -5,7 +5,7 @@ import com.fr.chart.chartattr.Chart; import com.fr.chart.chartattr.LinePlot; import com.fr.chart.chartattr.Plot; import com.fr.chart.charttypes.LineIndependentChart; -import com.fr.locale.InterProviderFactory; +import com.fr.design.i18n.Toolkit; import com.fr.log.FineLoggerFactory; @@ -22,7 +22,7 @@ public class LinePlotPane extends AbstractDeprecatedChartTypePane { @Override protected String[] getTypeTipName() { return new String[]{ - InterProviderFactory.getProvider().getLocText("Fine-Engine_Chart_Type_Line") + Toolkit.i18nText("Fine-Design_Chart_Type_Line") }; } @@ -84,7 +84,7 @@ public class LinePlotPane extends AbstractDeprecatedChartTypePane { } public String title4PopupWindow() { - return InterProviderFactory.getProvider().getLocText("Fine-Engine_Chart_Type_Line"); + return Toolkit.i18nText("Fine-Design_Chart_Type_Line"); } public Chart getDefaultChart() { diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/MapPlotPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/MapPlotPane.java index 2b606fc06..988073926 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/MapPlotPane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/MapPlotPane.java @@ -9,8 +9,8 @@ import com.fr.chart.chartattr.Plot; import com.fr.chart.charttypes.MapIndependentChart; import com.fr.design.chart.series.PlotSeries.MapGroupExtensionPane; import com.fr.design.chart.series.PlotStyle.ChartSelectDemoPane; +import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.locale.InterProviderFactory; import com.fr.log.FineLoggerFactory; import javax.swing.JPanel; @@ -72,7 +72,7 @@ public class MapPlotPane extends AbstractDeprecatedChartTypePane { * @return 界面标题 */ public String title4PopupWindow() { - return InterProviderFactory.getProvider().getLocText("Fine-Engine_Chart_SVG_MAP"); + return Toolkit.i18nText("Fine-Design_Chart_SVG_MAP"); } /** diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/MeterPlotPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/MeterPlotPane.java index 94527c04b..791262c0b 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/MeterPlotPane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/MeterPlotPane.java @@ -7,7 +7,6 @@ import com.fr.chart.chartattr.Plot; import com.fr.chart.chartglyph.MeterStyle; import com.fr.chart.charttypes.MeterIndependentChart; import com.fr.design.i18n.Toolkit; -import com.fr.locale.InterProviderFactory; import com.fr.log.FineLoggerFactory; @@ -33,7 +32,7 @@ public class MeterPlotPane extends AbstractDeprecatedChartTypePane { @Override protected String[] getTypeTipName() { - String meter = InterProviderFactory.getProvider().getLocText("Fine-Engine_Chart_Type_Meter"); + String meter = Toolkit.i18nText("Fine-Design_Chart_Type_Meter"); return new String[]{ Toolkit.i18nText("Fine-Design_Chart_Mode_Custom") + meter, meter + "1", @@ -81,7 +80,7 @@ public class MeterPlotPane extends AbstractDeprecatedChartTypePane { * @return 界面标题 */ public String title4PopupWindow() { - return InterProviderFactory.getProvider().getLocText("Fine-Engine_Chart_Type_Meter"); + return Toolkit.i18nText("Fine-Design_Chart_Type_Meter"); } /** diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/PiePlotPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/PiePlotPane.java index 4212d76c4..56c2c4483 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/PiePlotPane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/PiePlotPane.java @@ -10,11 +10,11 @@ import com.fr.chart.chartattr.PiePlot; import com.fr.chart.chartattr.Plot; import com.fr.chart.chartglyph.ConditionCollection; import com.fr.chart.charttypes.PieIndependentChart; -import com.fr.locale.InterProviderFactory; +import com.fr.design.i18n.Toolkit; import com.fr.stable.Constants; -import java.awt.Color; import java.text.DecimalFormat; +import java.awt.Color; /** * 饼图 属性表 选择类型 布局界面. @@ -36,7 +36,7 @@ public class PiePlotPane extends AbstractDeprecatedChartTypePane { @Override protected String[] getTypeTipName() { - String pie = InterProviderFactory.getProvider().getLocText("Fine-Engine_Chart_Type_Pie"); + String pie = Toolkit.i18nText("Fine-Design_Chart_Type_Pie"); return new String[]{ pie, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_3D") + pie @@ -63,7 +63,7 @@ public class PiePlotPane extends AbstractDeprecatedChartTypePane { * @return 界面标题 */ public String title4PopupWindow() { - return InterProviderFactory.getProvider().getLocText("Fine-Engine_Chart_Type_Pie"); + return Toolkit.i18nText("Fine-Design_Chart_Type_Pie"); } private void createPieCondition(Plot plot) { diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/RadarPlotPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/RadarPlotPane.java index e3e55cb85..df812fe2c 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/RadarPlotPane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/RadarPlotPane.java @@ -3,7 +3,7 @@ package com.fr.design.mainframe.chart.gui.type; import com.fr.chart.base.ChartConstants; import com.fr.chart.chartattr.Chart; import com.fr.chart.charttypes.RadarIndependentChart; -import com.fr.locale.InterProviderFactory; +import com.fr.design.i18n.Toolkit; /** @@ -25,7 +25,7 @@ public class RadarPlotPane extends AbstractDeprecatedChartTypePane { @Override protected String[] getTypeTipName() { return new String[]{ - InterProviderFactory.getProvider().getLocText("Fine-Engine_Chart_Type_Radar") + Toolkit.i18nText("Fine-Design_Chart_Type_Radar") }; } @@ -49,7 +49,7 @@ public class RadarPlotPane extends AbstractDeprecatedChartTypePane { * @return 界面标题 */ public String title4PopupWindow() { - return InterProviderFactory.getProvider().getLocText("Fine-Engine_Chart_Type_Radar"); + return Toolkit.i18nText("Fine-Design_Chart_Type_Radar"); } /** @@ -67,7 +67,7 @@ public class RadarPlotPane extends AbstractDeprecatedChartTypePane { */ public void populateBean(Chart chart) { typeDemo.get(RADAR).isPressing = true; - + checkDemosBackground(); } diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/RangePlotPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/RangePlotPane.java index c685b4c3b..9dfb36b0f 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/RangePlotPane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/RangePlotPane.java @@ -4,7 +4,7 @@ import com.fr.chart.base.ChartConstants; import com.fr.chart.chartattr.Chart; import com.fr.chart.chartattr.RangePlot; import com.fr.chart.charttypes.RangeIndependentChart; -import com.fr.locale.InterProviderFactory; +import com.fr.design.i18n.Toolkit; /** @@ -26,7 +26,7 @@ public class RangePlotPane extends AbstractDeprecatedChartTypePane { @Override protected String[] getTypeTipName() { return new String[]{ - InterProviderFactory.getProvider().getLocText("Fine-Engine_Chart_Type_Range") + Toolkit.i18nText("Fine-Design_Chart_Type_Range") }; } @@ -50,7 +50,7 @@ public class RangePlotPane extends AbstractDeprecatedChartTypePane { * @return 界面标题 */ public String title4PopupWindow() { - return InterProviderFactory.getProvider().getLocText("Fine-Engine_Chart_Type_Range"); + return Toolkit.i18nText("Fine-Design_Chart_Type_Range"); } /** @@ -70,7 +70,7 @@ public class RangePlotPane extends AbstractDeprecatedChartTypePane { */ public void populateBean(Chart chart) { typeDemo.get(RANGE).isPressing = true; - + checkDemosBackground(); } diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/StockPlotPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/StockPlotPane.java index c8c88fae1..5e896d3b6 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/StockPlotPane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/StockPlotPane.java @@ -3,7 +3,7 @@ package com.fr.design.mainframe.chart.gui.type; import com.fr.chart.base.ChartConstants; import com.fr.chart.chartattr.Chart; import com.fr.chart.charttypes.StockIndependentChart; -import com.fr.locale.InterProviderFactory; +import com.fr.design.i18n.Toolkit; /** @@ -25,7 +25,7 @@ public class StockPlotPane extends AbstractDeprecatedChartTypePane { @Override protected String[] getTypeTipName() { return new String[]{ - InterProviderFactory.getProvider().getLocText("Fine-Engine_Chart_Type_Stock") + Toolkit.i18nText("Fine-Design_Chart_Type_Stock") }; } @@ -49,7 +49,7 @@ public class StockPlotPane extends AbstractDeprecatedChartTypePane { * @return 界面标题 */ public String title4PopupWindow() { - return InterProviderFactory.getProvider().getLocText("Fine-Engine_Chart_Type_Stock"); + return Toolkit.i18nText("Fine-Design_Chart_Type_Stock"); } /** diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/XYScatterPlotPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/XYScatterPlotPane.java index eab3a9837..ba6edba06 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/XYScatterPlotPane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/XYScatterPlotPane.java @@ -6,11 +6,11 @@ import com.fr.chart.chartattr.Chart; import com.fr.chart.chartattr.XYScatterPlot; import com.fr.chart.chartglyph.ConditionAttr; import com.fr.chart.charttypes.XYScatterIndependentChart; -import com.fr.locale.InterProviderFactory; +import com.fr.design.i18n.Toolkit; import com.fr.stable.Constants; /** - * 散点图 属性表 选择类型 布局界面. + * 散点图 属性表 选择类型 布局界面. * @author kunsnat E-mail:kunsnat@gmail.com * @version 创建时间:2012-12-25 下午08:33:55 */ @@ -28,7 +28,7 @@ public class XYScatterPlotPane extends AbstractDeprecatedChartTypePane { @Override protected String[] getTypeTipName() { return new String[]{ - InterProviderFactory.getProvider().getLocText("Fine-Engine_Chart_Type_XYScatter") + Toolkit.i18nText("Fine-Design_Chart_Type_XYScatter") }; } @@ -47,11 +47,11 @@ public class XYScatterPlotPane extends AbstractDeprecatedChartTypePane { * @return 界面标题 */ public String title4PopupWindow() { - return InterProviderFactory.getProvider().getLocText("Fine-Engine_Chart_Type_XYScatter"); + return Toolkit.i18nText("Fine-Design_Chart_Type_XYScatter"); } /** - * 保存界面内容 + * 保存界面内容 */ public void updateBean(Chart chart) { @@ -61,7 +61,7 @@ public class XYScatterPlotPane extends AbstractDeprecatedChartTypePane { XYScatterPlot plot = new XYScatterPlot(); chart.switchPlot(plot); - + ConditionAttr conditionAttr = plot.getConditionCollection().getDefaultAttr(); AttrLineStyle lineStyle = (AttrLineStyle) conditionAttr.getConditionInType(AttrLineStyle.XML_TAG); if (lineStyle != null) { diff --git a/designer-chart/src/main/java/com/fr/design/chartinterface/AreaIndependentChartInterface.java b/designer-chart/src/main/java/com/fr/design/type/ui/AreaChartTypeUI.java similarity index 55% rename from designer-chart/src/main/java/com/fr/design/chartinterface/AreaIndependentChartInterface.java rename to designer-chart/src/main/java/com/fr/design/type/ui/AreaChartTypeUI.java index ff8a06ac7..60e52f242 100644 --- a/designer-chart/src/main/java/com/fr/design/chartinterface/AreaIndependentChartInterface.java +++ b/designer-chart/src/main/java/com/fr/design/type/ui/AreaChartTypeUI.java @@ -1,4 +1,4 @@ -package com.fr.design.chartinterface; +package com.fr.design.type.ui; import com.fr.chart.chartattr.Plot; import com.fr.design.beans.BasicBeanPane; @@ -6,6 +6,7 @@ import com.fr.design.chart.fun.impl.AbstractIndependentChartUIWithAPILevel; import com.fr.design.chart.series.SeriesCondition.impl.Area3DPlotDataSeriesConditionPane; import com.fr.design.chart.series.SeriesCondition.impl.AreaPlotDataSeriesCondtionPane; import com.fr.design.condition.ConditionAttributesPane; +import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.chart.gui.ChartDataPane; import com.fr.design.mainframe.chart.gui.ChartStylePane; import com.fr.design.mainframe.chart.gui.data.report.AbstractReportDataContentPane; @@ -20,34 +21,65 @@ import com.fr.design.mainframe.chart.gui.type.AreaPlotPane; /** * Created by eason on 15/4/21. */ -public class AreaIndependentChartInterface extends AbstractIndependentChartUIWithAPILevel { +public class AreaChartTypeUI extends AbstractIndependentChartUIWithAPILevel { - public AbstractChartTypePane getPlotTypePane(){ + public AbstractChartTypePane getPlotTypePane() { return new AreaPlotPane(); } - public AbstractTableDataContentPane getTableDataSourcePane(Plot plot, ChartDataPane parent){ + public AbstractTableDataContentPane getTableDataSourcePane(Plot plot, ChartDataPane parent) { return new CategoryPlotTableDataContentPane(parent); } - public AbstractReportDataContentPane getReportDataSourcePane(Plot plot, ChartDataPane parent){ + public AbstractReportDataContentPane getReportDataSourcePane(Plot plot, ChartDataPane parent) { return new CategoryPlotReportDataContentPane(parent); } - public BasicBeanPane getPlotSeriesPane(ChartStylePane parent, Plot plot){ + public BasicBeanPane getPlotSeriesPane(ChartStylePane parent, Plot plot) { return plot.isSupport3D() ? new Area3DSeriesPane(parent, plot) : new AreaSeriesPane(parent, plot); } - public ConditionAttributesPane getPlotConditionPane(Plot plot){ + public ConditionAttributesPane getPlotConditionPane(Plot plot) { return plot.isSupport3D() ? new Area3DPlotDataSeriesConditionPane() : new AreaPlotDataSeriesCondtionPane(); } /** - *图标路径 + * 图标路径 + * * @return 图标路径 */ - public String getIconPath(){ + public String getIconPath() { return "com/fr/design/images/form/toolbar/ChartF-Area.png"; } + @Override + public String getName() { + return Toolkit.i18nText("Fine-Design_Chart_Type_Area"); + } + + @Override + public String[] getSubName() { + String chartName = Toolkit.i18nText("Fine-Design_Chart_Type_Area"); + String stackChartName = Toolkit.i18nText("Fine-Design_Chart_Type_Stacked") + chartName; + String perStackChartName = Toolkit.i18nText("Fine-Design_Chart_Use_Percent") + stackChartName; + String stackChartName3D = Toolkit.i18nText("Fine-Design_Chart_3D") + stackChartName; + String perStackChartName3D = Toolkit.i18nText("Fine-Design_Chart_3D") + perStackChartName; + + return new String[]{ + stackChartName, + perStackChartName, + stackChartName3D, + perStackChartName3D + }; + } + + @Override + public String[] getDemoImagePath() { + return new String[]{ + "com/fr/plugin/chart/demo/image/areastacked.png", + "com/fr/plugin/chart/demo/image/areastackedpercent.png", + "com/fr/plugin/chart/demo/image/areastacked3D.png", + "com/fr/plugin/chart/demo/image/areastackedpercent3D.png", + }; + } } \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/design/type/ui/BarChartTypeUI.java b/designer-chart/src/main/java/com/fr/design/type/ui/BarChartTypeUI.java new file mode 100644 index 000000000..16300178b --- /dev/null +++ b/designer-chart/src/main/java/com/fr/design/type/ui/BarChartTypeUI.java @@ -0,0 +1,97 @@ +package com.fr.design.type.ui; + +import com.fr.chart.chartattr.Plot; +import com.fr.design.beans.BasicBeanPane; +import com.fr.design.chart.fun.impl.AbstractIndependentChartUIWithAPILevel; +import com.fr.design.chart.series.SeriesCondition.impl.Bar2DTrendLineDSConditionPane; +import com.fr.design.chart.series.SeriesCondition.impl.Bar3DPlotDataSeriesConditionPane; +import com.fr.design.chart.series.SeriesCondition.impl.BarPlotDataSeriesConditionPane; +import com.fr.design.condition.ConditionAttributesPane; +import com.fr.design.i18n.Toolkit; +import com.fr.design.mainframe.chart.gui.ChartDataPane; +import com.fr.design.mainframe.chart.gui.ChartStylePane; +import com.fr.design.mainframe.chart.gui.data.report.AbstractReportDataContentPane; +import com.fr.design.mainframe.chart.gui.data.report.CategoryPlotReportDataContentPane; +import com.fr.design.mainframe.chart.gui.data.table.AbstractTableDataContentPane; +import com.fr.design.mainframe.chart.gui.data.table.CategoryPlotTableDataContentPane; +import com.fr.design.mainframe.chart.gui.style.series.Bar2DSeriesPane; +import com.fr.design.mainframe.chart.gui.style.series.Bar3DSeriesPane; +import com.fr.design.mainframe.chart.gui.type.AbstractChartTypePane; +import com.fr.design.mainframe.chart.gui.type.BarPlotPane; + +/** + * Created by eason on 15/4/21. + */ +public class BarChartTypeUI extends AbstractIndependentChartUIWithAPILevel { + + public AbstractChartTypePane getPlotTypePane() { + return new BarPlotPane(); + } + + public AbstractTableDataContentPane getTableDataSourcePane(Plot plot, ChartDataPane parent) { + return new CategoryPlotTableDataContentPane(parent); + } + + public AbstractReportDataContentPane getReportDataSourcePane(Plot plot, ChartDataPane parent) { + return new CategoryPlotReportDataContentPane(parent); + } + + public BasicBeanPane getPlotSeriesPane(ChartStylePane parent, Plot plot) { + return plot.isSupport3D() ? new Bar3DSeriesPane(parent, plot) : new Bar2DSeriesPane(parent, plot); + } + + public ConditionAttributesPane getPlotConditionPane(Plot plot) { + return plot.isSupport3D() ? new Bar3DPlotDataSeriesConditionPane() + : (plot.isSupportTrendLine() ? new Bar2DTrendLineDSConditionPane() : new BarPlotDataSeriesConditionPane()); + } + + /** + * 图标路径 + * + * @return 图标路径 + */ + public String getIconPath() { + return "com/fr/design/images/form/toolbar/ChartF-Bar.png"; + } + + @Override + public String getName() { + return Toolkit.i18nText("Fine-Design_Chart_Type_Bar"); + } + + @Override + public String[] getSubName() { + String chartName = Toolkit.i18nText("Fine-Design_Chart_Type_Bar"); + String stackChartName = Toolkit.i18nText("Fine-Design_Chart_Type_Stacked") + chartName; + String perStackChartName = Toolkit.i18nText("Fine-Design_Chart_Use_Percent") + stackChartName; + String chartName3D = Toolkit.i18nText("Fine-Design_Chart_3D") + chartName; + String chartNameHoriz3D = chartName3D + "(" + Toolkit.i18nText("Fine-Design_Report_Utils_Left_To_Right") + ")"; + String stackChartName3D = Toolkit.i18nText("Fine-Design_Chart_3D") + stackChartName; + String perStackChartName3D = Toolkit.i18nText("Fine-Design_Chart_3D") + perStackChartName; + + //依次,条形图-旧版本、堆积条形图-旧版本、百分比堆积条形图-旧版本、三维条形图-旧版本、三维条形图-旧版本(横向)、三维堆积条形图-旧版本、三维百分比堆积条形图-旧版本 + return new String[]{ + chartName, + stackChartName, + perStackChartName, + chartName3D, + chartNameHoriz3D, + stackChartName3D, + perStackChartName3D + }; + } + + @Override + public String[] getDemoImagePath() { + return new String[]{ + "com/fr/plugin/chart/demo/image/bar.png", + "com/fr/plugin/chart/demo/image/barstacked.png", + "com/fr/plugin/chart/demo/image/barstackedpercent.png", + "com/fr/plugin/chart/demo/image/bar3D.png", + "com/fr/plugin/chart/demo/image/bar3D(cross).png", + "com/fr/plugin/chart/demo/image/barstacked3D.png", + "com/fr/plugin/chart/demo/image/barstackedpercent3D.png" + }; + } + +} \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/design/chartinterface/BubbleIndependentChartInterface.java b/designer-chart/src/main/java/com/fr/design/type/ui/BubbleChartTypeUI.java similarity index 75% rename from designer-chart/src/main/java/com/fr/design/chartinterface/BubbleIndependentChartInterface.java rename to designer-chart/src/main/java/com/fr/design/type/ui/BubbleChartTypeUI.java index b9d0b232c..eedb93c25 100644 --- a/designer-chart/src/main/java/com/fr/design/chartinterface/BubbleIndependentChartInterface.java +++ b/designer-chart/src/main/java/com/fr/design/type/ui/BubbleChartTypeUI.java @@ -1,10 +1,11 @@ -package com.fr.design.chartinterface; +package com.fr.design.type.ui; import com.fr.chart.chartattr.Plot; import com.fr.design.beans.BasicBeanPane; import com.fr.design.chart.fun.impl.AbstractIndependentChartUIWithAPILevel; import com.fr.design.chart.series.SeriesCondition.impl.BubblePlotDataSeriesConditionPane; import com.fr.design.condition.ConditionAttributesPane; +import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.chart.gui.ChartDataPane; import com.fr.design.mainframe.chart.gui.ChartStylePane; import com.fr.design.mainframe.chart.gui.data.report.AbstractReportDataContentPane; @@ -18,7 +19,7 @@ import com.fr.design.mainframe.chart.gui.type.BubblePlotPane; /** * Created by eason on 15/4/21. */ -public class BubbleIndependentChartInterface extends AbstractIndependentChartUIWithAPILevel { +public class BubbleChartTypeUI extends AbstractIndependentChartUIWithAPILevel { public AbstractChartTypePane getPlotTypePane(){ return new BubblePlotPane(); @@ -48,4 +49,22 @@ public class BubbleIndependentChartInterface extends AbstractIndependentChartUIW return new BubblePlotDataSeriesConditionPane(); } + @Override + public String getName() { + return Toolkit.i18nText("Fine-Design_Chart_Bubble_Chart_OLD"); + } + + @Override + public String[] getSubName() { + return new String[]{ + Toolkit.i18nText("Fine-Design_Chart_Bubble_Chart_OLD") + }; + } + + @Override + public String[] getDemoImagePath() { + return new String[]{ + "com/fr/plugin/chart/demo/image/bubble.png" + }; + } } \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/design/type/ui/ColumnChartTypeUI.java b/designer-chart/src/main/java/com/fr/design/type/ui/ColumnChartTypeUI.java new file mode 100644 index 000000000..4597ec509 --- /dev/null +++ b/designer-chart/src/main/java/com/fr/design/type/ui/ColumnChartTypeUI.java @@ -0,0 +1,97 @@ +package com.fr.design.type.ui; + +import com.fr.chart.chartattr.Plot; +import com.fr.design.beans.BasicBeanPane; +import com.fr.design.chart.fun.impl.AbstractIndependentChartUIWithAPILevel; +import com.fr.design.chart.series.SeriesCondition.impl.Bar2DTrendLineDSConditionPane; +import com.fr.design.chart.series.SeriesCondition.impl.Bar3DPlotDataSeriesConditionPane; +import com.fr.design.chart.series.SeriesCondition.impl.BarPlotDataSeriesConditionPane; +import com.fr.design.condition.ConditionAttributesPane; +import com.fr.design.i18n.Toolkit; +import com.fr.design.mainframe.chart.gui.ChartDataPane; +import com.fr.design.mainframe.chart.gui.ChartStylePane; +import com.fr.design.mainframe.chart.gui.data.report.AbstractReportDataContentPane; +import com.fr.design.mainframe.chart.gui.data.report.CategoryPlotMoreCateReportDataContentPane; +import com.fr.design.mainframe.chart.gui.data.table.AbstractTableDataContentPane; +import com.fr.design.mainframe.chart.gui.data.table.CategoryPlotMoreCateTableDataContentPane; +import com.fr.design.mainframe.chart.gui.style.series.Bar2DSeriesPane; +import com.fr.design.mainframe.chart.gui.style.series.Bar3DSeriesPane; +import com.fr.design.mainframe.chart.gui.type.AbstractChartTypePane; +import com.fr.design.mainframe.chart.gui.type.ColumnPlotPane; + +/** + * Created by eason on 15/4/21. + */ +public class ColumnChartTypeUI extends AbstractIndependentChartUIWithAPILevel { + + public AbstractChartTypePane getPlotTypePane() { + return new ColumnPlotPane(); + } + + + public AbstractTableDataContentPane getTableDataSourcePane(Plot plot, ChartDataPane parent) { + return new CategoryPlotMoreCateTableDataContentPane(parent); + } + + public AbstractReportDataContentPane getReportDataSourcePane(Plot plot, ChartDataPane parent) { + return new CategoryPlotMoreCateReportDataContentPane(parent); + } + + public BasicBeanPane getPlotSeriesPane(ChartStylePane parent, Plot plot) { + return plot.isSupport3D() ? new Bar3DSeriesPane(parent, plot) : new Bar2DSeriesPane(parent, plot); + } + + public ConditionAttributesPane getPlotConditionPane(Plot plot) { + return plot.isSupport3D() ? new Bar3DPlotDataSeriesConditionPane() + : (plot.isSupportTrendLine() ? new Bar2DTrendLineDSConditionPane() : new BarPlotDataSeriesConditionPane()); + } + + /** + * 图标路径 + * + * @return 图标路径 + */ + public String getIconPath() { + return "com/fr/design/images/form/toolbar/ChartF-Column.png"; + } + + @Override + public String getName() { + return Toolkit.i18nText("Fine-Design_Chart_Type_Column"); + } + + @Override + public String[] getSubName() { + String chartName = Toolkit.i18nText("Fine-Design_Chart_Type_Column"); + String stackChartName = Toolkit.i18nText("Fine-Design_Chart_Type_Stacked") + chartName; + String perStackChartName = Toolkit.i18nText("Fine-Design_Chart_Use_Percent") + stackChartName; + String chartName3D = Toolkit.i18nText("Fine-Design_Chart_3D")+ chartName; + String chartNameHoriz3D = chartName3D + "(" + Toolkit.i18nText("Fine-Design_Report_Utils_Left_To_Right") + ")"; + String stackChartName3D = Toolkit.i18nText("Fine-Design_Chart_3D") + stackChartName; + String perStackChartName3D = Toolkit.i18nText("Fine-Design_Chart_3D") + perStackChartName; + + //依次,柱形图-旧版本、堆积柱形图-旧版本、百分比堆积柱形图-旧版本、三维柱形图-旧版本、三维柱形图-旧版本(横向)、三维堆积柱形图-旧版本、三维百分比堆积柱形图-旧版本 + return new String[]{ + chartName, + stackChartName, + perStackChartName, + chartName3D, + chartNameHoriz3D, + stackChartName3D, + perStackChartName3D + }; + } + + @Override + public String[] getDemoImagePath() { + return new String[]{ + "com/fr/plugin/chart/demo/image/column.png", + "com/fr/plugin/chart/demo/image/columnstacked.png", + "com/fr/plugin/chart/demo/image/columnstackedpercent.png", + "com/fr/plugin/chart/demo/image/column3D.png", + "com/fr/plugin/chart/demo/image/column3D(cross).png", + "com/fr/plugin/chart/demo/image/columnstacked3D.png", + "com/fr/plugin/chart/demo/image/columnstackedpercent3D.png" + }; + } +} \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/design/chartinterface/CustomIndependentChartInterface.java b/designer-chart/src/main/java/com/fr/design/type/ui/CustomChartTypeUI.java similarity index 67% rename from designer-chart/src/main/java/com/fr/design/chartinterface/CustomIndependentChartInterface.java rename to designer-chart/src/main/java/com/fr/design/type/ui/CustomChartTypeUI.java index 584cdb5e1..ce47e1776 100644 --- a/designer-chart/src/main/java/com/fr/design/chartinterface/CustomIndependentChartInterface.java +++ b/designer-chart/src/main/java/com/fr/design/type/ui/CustomChartTypeUI.java @@ -1,10 +1,11 @@ -package com.fr.design.chartinterface; +package com.fr.design.type.ui; import com.fr.chart.chartattr.Plot; import com.fr.design.beans.BasicBeanPane; import com.fr.design.chart.fun.impl.AbstractIndependentChartUIWithAPILevel; import com.fr.design.chart.series.SeriesCondition.DataSeriesCustomConditionPane; import com.fr.design.condition.ConditionAttributesPane; +import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.chart.gui.ChartDataPane; import com.fr.design.mainframe.chart.gui.ChartStylePane; import com.fr.design.mainframe.chart.gui.data.report.AbstractReportDataContentPane; @@ -18,35 +19,54 @@ import com.fr.design.mainframe.chart.gui.type.CustomPlotPane; /** * Created by eason on 15/4/21. */ -public class CustomIndependentChartInterface extends AbstractIndependentChartUIWithAPILevel { +public class CustomChartTypeUI extends AbstractIndependentChartUIWithAPILevel { - public AbstractChartTypePane getPlotTypePane(){ + public AbstractChartTypePane getPlotTypePane() { return new CustomPlotPane(); } - public AbstractTableDataContentPane getTableDataSourcePane(Plot plot, ChartDataPane parent){ + public AbstractTableDataContentPane getTableDataSourcePane(Plot plot, ChartDataPane parent) { return new CategoryPlotTableDataContentPane(parent); } - public AbstractReportDataContentPane getReportDataSourcePane(Plot plot, ChartDataPane parent){ + public AbstractReportDataContentPane getReportDataSourcePane(Plot plot, ChartDataPane parent) { return new CategoryPlotReportDataContentPane(parent); } - public BasicBeanPane getPlotSeriesPane(ChartStylePane parent, Plot plot){ + public BasicBeanPane getPlotSeriesPane(ChartStylePane parent, Plot plot) { return new CustomSeriesPane(parent, plot); } - public ConditionAttributesPane getPlotConditionPane(Plot plot){ + public ConditionAttributesPane getPlotConditionPane(Plot plot) { return new DataSeriesCustomConditionPane(); } /** - *图标路径 + * 图标路径 + * * @return 图标路径 */ - public String getIconPath(){ + public String getIconPath() { return "com/fr/design/images/form/toolbar/ChartF-Comb_Chart.png"; } + @Override + public String getName() { + return Toolkit.i18nText("Fine-Design_Chart_Type_Combine"); + } + + @Override + public String[] getSubName() { + return new String[]{ + Toolkit.i18nText("Fine-Design_Chart_Type_Combine") + }; + } + + @Override + public String[] getDemoImagePath() { + return new String[]{ + "com/fr/plugin/chart/demo/image/custom.png" + }; + } } \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/design/chartinterface/DonutIndependentChartInterface.java b/designer-chart/src/main/java/com/fr/design/type/ui/DonutChartTypeUI.java similarity index 66% rename from designer-chart/src/main/java/com/fr/design/chartinterface/DonutIndependentChartInterface.java rename to designer-chart/src/main/java/com/fr/design/type/ui/DonutChartTypeUI.java index 8b5894384..f75bbe3ba 100644 --- a/designer-chart/src/main/java/com/fr/design/chartinterface/DonutIndependentChartInterface.java +++ b/designer-chart/src/main/java/com/fr/design/type/ui/DonutChartTypeUI.java @@ -1,4 +1,4 @@ -package com.fr.design.chartinterface; +package com.fr.design.type.ui; import com.fr.chart.chartattr.Plot; import com.fr.design.beans.BasicBeanPane; @@ -6,6 +6,7 @@ import com.fr.design.chart.fun.impl.AbstractIndependentChartUIWithAPILevel; import com.fr.design.chart.series.SeriesCondition.DataSeriesConditionPane; import com.fr.design.chart.series.SeriesCondition.impl.Donut2DPlotDataSeriesConditionPane; import com.fr.design.condition.ConditionAttributesPane; +import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.chart.gui.ChartDataPane; import com.fr.design.mainframe.chart.gui.ChartStylePane; import com.fr.design.mainframe.chart.gui.data.report.AbstractReportDataContentPane; @@ -20,35 +21,56 @@ import com.fr.design.mainframe.chart.gui.type.DonutPlotPane; /** * Created by eason on 15/4/21. */ -public class DonutIndependentChartInterface extends AbstractIndependentChartUIWithAPILevel { +public class DonutChartTypeUI extends AbstractIndependentChartUIWithAPILevel { - public AbstractChartTypePane getPlotTypePane(){ + public AbstractChartTypePane getPlotTypePane() { return new DonutPlotPane(); } - public AbstractTableDataContentPane getTableDataSourcePane(Plot plot, ChartDataPane parent){ + public AbstractTableDataContentPane getTableDataSourcePane(Plot plot, ChartDataPane parent) { return new CategoryPlotTableDataContentPane(parent); } - public AbstractReportDataContentPane getReportDataSourcePane(Plot plot, ChartDataPane parent){ + public AbstractReportDataContentPane getReportDataSourcePane(Plot plot, ChartDataPane parent) { return new CategoryPlotReportDataContentPane(parent); } - public BasicBeanPane getPlotSeriesPane(ChartStylePane parent, Plot plot){ + public BasicBeanPane getPlotSeriesPane(ChartStylePane parent, Plot plot) { return plot.isSupport3D() ? new Donut3DSeriesPane(parent, plot) : new Donut2DSeriesPane(parent, plot); } - - public ConditionAttributesPane getPlotConditionPane(Plot plot){ + + public ConditionAttributesPane getPlotConditionPane(Plot plot) { return plot.isSupport3D() ? new DataSeriesConditionPane() : new Donut2DPlotDataSeriesConditionPane(); } /** - *图标路径 + * 图标路径 + * * @return 图标路径 */ - public String getIconPath(){ + public String getIconPath() { return "com/fr/design/images/form/toolbar/ChartF-Donut.png"; } + @Override + public String getName() { + return Toolkit.i18nText("Fine-Design_Chart_Type_Donut"); + } + + @Override + public String[] getSubName() { + return new String[]{ + Toolkit.i18nText("Fine-Design_Chart_Type_Donut"), + Toolkit.i18nText("Fine-Design_Chart_3D") + Toolkit.i18nText("Fine-Design_Chart_Type_Donut") + }; + } + + @Override + public String[] getDemoImagePath() { + return new String[]{ + "com/fr/plugin/chart/demo/image/donut2D.png", + "com/fr/plugin/chart/demo/image/donut3D.png" + }; + } } \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/design/chartinterface/FunnelIndependentChartInterface.java b/designer-chart/src/main/java/com/fr/design/type/ui/FunnelChartTypeUI.java similarity index 75% rename from designer-chart/src/main/java/com/fr/design/chartinterface/FunnelIndependentChartInterface.java rename to designer-chart/src/main/java/com/fr/design/type/ui/FunnelChartTypeUI.java index 75ca4e6f8..d6c850381 100644 --- a/designer-chart/src/main/java/com/fr/design/chartinterface/FunnelIndependentChartInterface.java +++ b/designer-chart/src/main/java/com/fr/design/type/ui/FunnelChartTypeUI.java @@ -1,10 +1,11 @@ -package com.fr.design.chartinterface; +package com.fr.design.type.ui; import com.fr.chart.chartattr.Plot; import com.fr.design.beans.BasicBeanPane; import com.fr.design.chart.fun.impl.AbstractIndependentChartUIWithAPILevel; import com.fr.design.chart.series.SeriesCondition.impl.FunnelPlotDataSeriesConditionPane; import com.fr.design.condition.ConditionAttributesPane; +import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.chart.gui.ChartDataPane; import com.fr.design.mainframe.chart.gui.ChartStylePane; import com.fr.design.mainframe.chart.gui.data.report.AbstractReportDataContentPane; @@ -18,7 +19,7 @@ import com.fr.design.mainframe.chart.gui.type.FunnelPlotPane; /** * Created by eason on 15/4/21. */ -public class FunnelIndependentChartInterface extends AbstractIndependentChartUIWithAPILevel { +public class FunnelChartTypeUI extends AbstractIndependentChartUIWithAPILevel { public AbstractChartTypePane getPlotTypePane(){ @@ -49,4 +50,22 @@ public class FunnelIndependentChartInterface extends AbstractIndependentChartUIW return "com/fr/design/images/form/toolbar/ChartF-Funnel.png"; } + @Override + public String getName() { + return Toolkit.i18nText("Fine-Design_Chart_Type_Funnel"); + } + + @Override + public String[] getSubName() { + return new String[]{ + Toolkit.i18nText("Fine-Design_Chart_Type_Funnel") + }; + } + + @Override + public String[] getDemoImagePath() { + return new String[]{ + "com/fr/plugin/chart/demo/image/funnel.png" + }; + } } \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/design/chartinterface/GanttIndependentChartInterface.java b/designer-chart/src/main/java/com/fr/design/type/ui/GanttChartTypeUI.java similarity index 72% rename from designer-chart/src/main/java/com/fr/design/chartinterface/GanttIndependentChartInterface.java rename to designer-chart/src/main/java/com/fr/design/type/ui/GanttChartTypeUI.java index b032b7ca2..9e0b8184c 100644 --- a/designer-chart/src/main/java/com/fr/design/chartinterface/GanttIndependentChartInterface.java +++ b/designer-chart/src/main/java/com/fr/design/type/ui/GanttChartTypeUI.java @@ -1,9 +1,10 @@ -package com.fr.design.chartinterface; +package com.fr.design.type.ui; import com.fr.chart.chartattr.Plot; import com.fr.design.chart.fun.impl.AbstractIndependentChartUIWithAPILevel; import com.fr.design.chart.series.SeriesCondition.impl.GanttPlotDataSeriesConditionPane; import com.fr.design.condition.ConditionAttributesPane; +import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.chart.gui.ChartDataPane; import com.fr.design.mainframe.chart.gui.data.report.AbstractReportDataContentPane; import com.fr.design.mainframe.chart.gui.data.report.GanttPlotReportDataContentPane; @@ -15,7 +16,7 @@ import com.fr.design.mainframe.chart.gui.type.GanttPlotPane; /** * Created by eason on 15/4/21. */ -public class GanttIndependentChartInterface extends AbstractIndependentChartUIWithAPILevel { +public class GanttChartTypeUI extends AbstractIndependentChartUIWithAPILevel { public AbstractChartTypePane getPlotTypePane(){ @@ -42,4 +43,22 @@ public class GanttIndependentChartInterface extends AbstractIndependentChartUIWi return "com/fr/design/images/form/toolbar/ChartF-Gantt.png"; } + @Override + public String getName() { + return Toolkit.i18nText("Fine-Design_Chart_Type_Gantt"); + } + + @Override + public String[] getSubName() { + return new String[]{ + Toolkit.i18nText("Fine-Design_Chart_Type_Gantt") + }; + } + + @Override + public String[] getDemoImagePath() { + return new String[]{ + "com/fr/plugin/chart/demo/image/gantt.png" + }; + } } \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/design/type/ui/GisMapChartTypeUI.java b/designer-chart/src/main/java/com/fr/design/type/ui/GisMapChartTypeUI.java new file mode 100644 index 000000000..e7aa6195a --- /dev/null +++ b/designer-chart/src/main/java/com/fr/design/type/ui/GisMapChartTypeUI.java @@ -0,0 +1,59 @@ +package com.fr.design.type.ui; + +import com.fr.chart.chartattr.Plot; +import com.fr.design.chart.fun.impl.AbstractIndependentChartUIWithAPILevel; +import com.fr.design.i18n.Toolkit; +import com.fr.design.mainframe.chart.gui.ChartDataPane; +import com.fr.design.mainframe.chart.gui.data.report.AbstractReportDataContentPane; +import com.fr.design.mainframe.chart.gui.data.table.AbstractTableDataContentPane; +import com.fr.design.mainframe.chart.gui.type.AbstractChartTypePane; +import com.fr.design.mainframe.chart.gui.type.GisMapPlotPane; + +/** + * Created by eason on 15/4/21. + */ +public class GisMapChartTypeUI extends AbstractIndependentChartUIWithAPILevel { + + + public AbstractChartTypePane getPlotTypePane() { + return new GisMapPlotPane(); + } + + public AbstractTableDataContentPane getTableDataSourcePane(Plot plot, ChartDataPane parent) { + return null; + } + + public AbstractReportDataContentPane getReportDataSourcePane(Plot plot, ChartDataPane parent) { + return null; + } + + /** + * 图标路径 + * + * @return 图标路径 + */ + public String getIconPath() { + return "com/fr/design/images/form/toolbar/ChartF-Gis.png"; + } + + @Override + public String getName() { + return Toolkit.i18nText("Fine-Design_Chart_GIS_Map_OLD"); + } + + @Override + public String[] getSubName() { + return new String[]{ + Toolkit.i18nText("Fine-Design_Chart_Map_BaiduMap"), + Toolkit.i18nText("Fine-Design_Chart_Map_GoogleMap") + }; + } + + @Override + public String[] getDemoImagePath() { + return new String[]{ + "com/fr/plugin/chart/demo/image/gismap.png", + "com/fr/plugin/chart/demo/image/gismap.png" + }; + } +} \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/design/chartinterface/LineIndependentChartInterface.java b/designer-chart/src/main/java/com/fr/design/type/ui/LineChartTypeUI.java similarity index 69% rename from designer-chart/src/main/java/com/fr/design/chartinterface/LineIndependentChartInterface.java rename to designer-chart/src/main/java/com/fr/design/type/ui/LineChartTypeUI.java index a133a200a..4967b864c 100644 --- a/designer-chart/src/main/java/com/fr/design/chartinterface/LineIndependentChartInterface.java +++ b/designer-chart/src/main/java/com/fr/design/type/ui/LineChartTypeUI.java @@ -1,4 +1,4 @@ -package com.fr.design.chartinterface; +package com.fr.design.type.ui; import com.fr.chart.chartattr.Plot; import com.fr.design.beans.BasicBeanPane; @@ -6,6 +6,7 @@ import com.fr.design.chart.fun.impl.AbstractIndependentChartUIWithAPILevel; import com.fr.design.chart.series.SeriesCondition.DataSeriesConditionPane; import com.fr.design.chart.series.SeriesCondition.impl.LinePlotDataSeriesConditionPane; import com.fr.design.condition.ConditionAttributesPane; +import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.chart.gui.ChartDataPane; import com.fr.design.mainframe.chart.gui.ChartStylePane; import com.fr.design.mainframe.chart.gui.data.report.AbstractReportDataContentPane; @@ -19,35 +20,54 @@ import com.fr.design.mainframe.chart.gui.type.LinePlotPane; /** * Created by eason on 15/4/21. */ -public class LineIndependentChartInterface extends AbstractIndependentChartUIWithAPILevel { +public class LineChartTypeUI extends AbstractIndependentChartUIWithAPILevel { - public AbstractChartTypePane getPlotTypePane(){ + public AbstractChartTypePane getPlotTypePane() { return new LinePlotPane(); } - public AbstractTableDataContentPane getTableDataSourcePane(Plot plot, ChartDataPane parent){ + public AbstractTableDataContentPane getTableDataSourcePane(Plot plot, ChartDataPane parent) { return new CategoryPlotMoreCateTableDataContentPane(parent); } - public AbstractReportDataContentPane getReportDataSourcePane(Plot plot, ChartDataPane parent){ + public AbstractReportDataContentPane getReportDataSourcePane(Plot plot, ChartDataPane parent) { return new CategoryPlotMoreCateReportDataContentPane(parent); } - public BasicBeanPane getPlotSeriesPane(ChartStylePane parent, Plot plot){ + public BasicBeanPane getPlotSeriesPane(ChartStylePane parent, Plot plot) { return new LineSeriesPane(parent, plot); } - public ConditionAttributesPane getPlotConditionPane(Plot plot){ + public ConditionAttributesPane getPlotConditionPane(Plot plot) { return plot.isSupportTrendLine() ? new LinePlotDataSeriesConditionPane() : new DataSeriesConditionPane(); } /** - *图标路径 + * 图标路径 + * * @return 图标路径 */ - public String getIconPath(){ + public String getIconPath() { return "com/fr/design/images/form/toolbar/ChartF-Line.png"; } + @Override + public String getName() { + return Toolkit.i18nText("Fine-Design_Chart_Type_Line"); + } + + @Override + public String[] getSubName() { + return new String[]{ + Toolkit.i18nText("Fine-Design_Chart_Type_Line") + }; + } + + @Override + public String[] getDemoImagePath() { + return new String[]{ + "com/fr/plugin/chart/demo/image/line.png" + }; + } } \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/design/chartinterface/MapIndependentChartInterface.java b/designer-chart/src/main/java/com/fr/design/type/ui/MapChartTypeUI.java similarity index 73% rename from designer-chart/src/main/java/com/fr/design/chartinterface/MapIndependentChartInterface.java rename to designer-chart/src/main/java/com/fr/design/type/ui/MapChartTypeUI.java index 2fc17e147..da09ed48e 100644 --- a/designer-chart/src/main/java/com/fr/design/chartinterface/MapIndependentChartInterface.java +++ b/designer-chart/src/main/java/com/fr/design/type/ui/MapChartTypeUI.java @@ -1,10 +1,11 @@ -package com.fr.design.chartinterface; +package com.fr.design.type.ui; import com.fr.chart.chartattr.Plot; import com.fr.design.beans.BasicBeanPane; import com.fr.design.chart.fun.impl.AbstractIndependentChartUIWithAPILevel; import com.fr.design.chart.series.SeriesCondition.impl.MapPlotDataSeriesConditionPane; import com.fr.design.condition.ConditionAttributesPane; +import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.chart.gui.ChartDataPane; import com.fr.design.mainframe.chart.gui.ChartStylePane; import com.fr.design.mainframe.chart.gui.data.report.AbstractReportDataContentPane; @@ -16,7 +17,7 @@ import com.fr.design.mainframe.chart.gui.type.MapPlotPane; /** * Created by eason on 15/4/21. */ -public class MapIndependentChartInterface extends AbstractIndependentChartUIWithAPILevel { +public class MapChartTypeUI extends AbstractIndependentChartUIWithAPILevel { public AbstractChartTypePane getPlotTypePane(){ @@ -47,4 +48,22 @@ public class MapIndependentChartInterface extends AbstractIndependentChartUIWith return "com/fr/design/images/form/toolbar/Chart-Map.png"; } + @Override + public String getName() { + return Toolkit.i18nText("Fine-Design_Chart_SVG_MAP"); + } + + @Override + public String[] getSubName() { + return new String[]{ + Toolkit.i18nText("Fine-Design_Chart_SVG_MAP") + }; + } + + @Override + public String[] getDemoImagePath() { + return new String[]{ + "com/fr/plugin/chart/demo/image/map.png" + }; + } } \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/design/chartinterface/MeterIndependentChartInterface.java b/designer-chart/src/main/java/com/fr/design/type/ui/MeterChartTypeUI.java similarity index 56% rename from designer-chart/src/main/java/com/fr/design/chartinterface/MeterIndependentChartInterface.java rename to designer-chart/src/main/java/com/fr/design/type/ui/MeterChartTypeUI.java index ce1f5b07b..cafef9ea2 100644 --- a/designer-chart/src/main/java/com/fr/design/chartinterface/MeterIndependentChartInterface.java +++ b/designer-chart/src/main/java/com/fr/design/type/ui/MeterChartTypeUI.java @@ -1,8 +1,9 @@ -package com.fr.design.chartinterface; +package com.fr.design.type.ui; import com.fr.chart.chartattr.Plot; import com.fr.design.beans.BasicBeanPane; import com.fr.design.chart.fun.impl.AbstractIndependentChartUIWithAPILevel; +import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.chart.gui.ChartDataPane; import com.fr.design.mainframe.chart.gui.ChartStylePane; import com.fr.design.mainframe.chart.gui.data.report.AbstractReportDataContentPane; @@ -16,31 +17,54 @@ import com.fr.design.mainframe.chart.gui.type.MeterPlotPane; /** * Created by eason on 15/4/21. */ -public class MeterIndependentChartInterface extends AbstractIndependentChartUIWithAPILevel { +public class MeterChartTypeUI extends AbstractIndependentChartUIWithAPILevel { - public AbstractChartTypePane getPlotTypePane(){ + public AbstractChartTypePane getPlotTypePane() { return new MeterPlotPane(); } - public AbstractTableDataContentPane getTableDataSourcePane(Plot plot, ChartDataPane parent){ + public AbstractTableDataContentPane getTableDataSourcePane(Plot plot, ChartDataPane parent) { return new MeterPlotTableDataContentPane(parent); } - public AbstractReportDataContentPane getReportDataSourcePane(Plot plot, ChartDataPane parent){ + public AbstractReportDataContentPane getReportDataSourcePane(Plot plot, ChartDataPane parent) { return new MeterPlotReportDataContentPane(parent); } - public BasicBeanPane getPlotSeriesPane(ChartStylePane parent, Plot plot){ + public BasicBeanPane getPlotSeriesPane(ChartStylePane parent, Plot plot) { return new MeterSeriesPane(parent, plot); } /** - *图标路径 + * 图标路径 + * * @return 图标路径 */ - public String getIconPath(){ + public String getIconPath() { return "com/fr/design/images/form/toolbar/ChartF-Meter.png"; } + @Override + public String getName() { + return Toolkit.i18nText("Fine-Design_Chart_Type_Meter"); + } + + @Override + public String[] getSubName() { + return new String[]{ + Toolkit.i18nText("Fine-Design_Chart_Type_Meter"), + Toolkit.i18nText("Fine-Design_Chart_Type_Meter"), + Toolkit.i18nText("Fine-Design_Chart_Type_Meter") + }; + } + + @Override + public String[] getDemoImagePath() { + return new String[]{ + "com/fr/plugin/chart/demo/image/meter.png", + "com/fr/plugin/chart/demo/image/meterblue.png", + "com/fr/plugin/chart/demo/image/metersimple.png" + }; + } } \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/design/chartinterface/PieIndependentChartInterface.java b/designer-chart/src/main/java/com/fr/design/type/ui/PieChartTypeUI.java similarity index 66% rename from designer-chart/src/main/java/com/fr/design/chartinterface/PieIndependentChartInterface.java rename to designer-chart/src/main/java/com/fr/design/type/ui/PieChartTypeUI.java index 0583186eb..3e82d26dc 100644 --- a/designer-chart/src/main/java/com/fr/design/chartinterface/PieIndependentChartInterface.java +++ b/designer-chart/src/main/java/com/fr/design/type/ui/PieChartTypeUI.java @@ -1,4 +1,4 @@ -package com.fr.design.chartinterface; +package com.fr.design.type.ui; import com.fr.chart.chartattr.Plot; import com.fr.design.beans.BasicBeanPane; @@ -6,6 +6,7 @@ import com.fr.design.chart.fun.impl.AbstractIndependentChartUIWithAPILevel; import com.fr.design.chart.series.SeriesCondition.impl.Pie3DPlotDataSeriesConditionPane; import com.fr.design.chart.series.SeriesCondition.impl.PiePlotDataSeriesConditionPane; import com.fr.design.condition.ConditionAttributesPane; +import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.chart.gui.ChartDataPane; import com.fr.design.mainframe.chart.gui.ChartStylePane; import com.fr.design.mainframe.chart.gui.data.report.AbstractReportDataContentPane; @@ -20,35 +21,57 @@ import com.fr.design.mainframe.chart.gui.type.PiePlotPane; /** * Created by eason on 15/4/21. */ -public class PieIndependentChartInterface extends AbstractIndependentChartUIWithAPILevel { +public class PieChartTypeUI extends AbstractIndependentChartUIWithAPILevel { - public AbstractChartTypePane getPlotTypePane(){ + public AbstractChartTypePane getPlotTypePane() { return new PiePlotPane(); } - public AbstractTableDataContentPane getTableDataSourcePane(Plot plot, ChartDataPane parent){ + public AbstractTableDataContentPane getTableDataSourcePane(Plot plot, ChartDataPane parent) { return new PiePlotTableDataContentPane(parent); } - public AbstractReportDataContentPane getReportDataSourcePane(Plot plot, ChartDataPane parent){ + public AbstractReportDataContentPane getReportDataSourcePane(Plot plot, ChartDataPane parent) { return new PiePlotReportDataContentPane(parent); } - public BasicBeanPane getPlotSeriesPane(ChartStylePane parent, Plot plot){ + public BasicBeanPane getPlotSeriesPane(ChartStylePane parent, Plot plot) { return plot.isSupport3D() ? new Pie3DSeriesPane(parent, plot) : new Pie2DSeriesPane(parent, plot); } - public ConditionAttributesPane getPlotConditionPane(Plot plot){ + public ConditionAttributesPane getPlotConditionPane(Plot plot) { return plot.isSupport3D() ? new Pie3DPlotDataSeriesConditionPane() : new PiePlotDataSeriesConditionPane(); } /** - *图标路径 + * 图标路径 + * * @return 图标路径 */ - public String getIconPath(){ + public String getIconPath() { return "com/fr/design/images/form/toolbar/ChartF-Pie.png"; } + @Override + public String getName() { + return Toolkit.i18nText("Fine-Design_Chart_Type_Pie"); + } + + @Override + public String[] getSubName() { + return new String[]{ + Toolkit.i18nText("Fine-Design_Chart_Type_Pie"), + Toolkit.i18nText("Fine-Design_Chart_3D") + Toolkit.i18nText("Fine-Design_Chart_Type_Pie") + }; + } + + @Override + public String[] getDemoImagePath() { + return new String[]{ + "com/fr/plugin/chart/demo/image/pie.png", + "com/fr/plugin/chart/demo/image/pie3D.png", + }; + } + } \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/design/chartinterface/RadarIndependentChartInterface.java b/designer-chart/src/main/java/com/fr/design/type/ui/RadarChartTypeUI.java similarity index 76% rename from designer-chart/src/main/java/com/fr/design/chartinterface/RadarIndependentChartInterface.java rename to designer-chart/src/main/java/com/fr/design/type/ui/RadarChartTypeUI.java index 04ca36dcb..e994bb575 100644 --- a/designer-chart/src/main/java/com/fr/design/chartinterface/RadarIndependentChartInterface.java +++ b/designer-chart/src/main/java/com/fr/design/type/ui/RadarChartTypeUI.java @@ -1,10 +1,11 @@ -package com.fr.design.chartinterface; +package com.fr.design.type.ui; import com.fr.chart.chartattr.Plot; import com.fr.design.beans.BasicBeanPane; import com.fr.design.chart.fun.impl.AbstractIndependentChartUIWithAPILevel; import com.fr.design.chart.series.SeriesCondition.impl.RadarPlotDataSeriesConditionPane; import com.fr.design.condition.ConditionAttributesPane; +import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.chart.gui.ChartDataPane; import com.fr.design.mainframe.chart.gui.ChartStylePane; import com.fr.design.mainframe.chart.gui.data.report.AbstractReportDataContentPane; @@ -18,7 +19,7 @@ import com.fr.design.mainframe.chart.gui.type.RadarPlotPane; /** * Created by eason on 15/4/21. */ -public class RadarIndependentChartInterface extends AbstractIndependentChartUIWithAPILevel { +public class RadarChartTypeUI extends AbstractIndependentChartUIWithAPILevel { public AbstractChartTypePane getPlotTypePane(){ @@ -50,4 +51,22 @@ public class RadarIndependentChartInterface extends AbstractIndependentChartUIWi return "com/fr/design/images/form/toolbar/ChartF-Radar.png"; } + @Override + public String getName() { + return Toolkit.i18nText("Fine-Design_Chart_Type_Radar"); + } + + @Override + public String[] getSubName() { + return new String[]{ + Toolkit.i18nText("Fine-Design_Chart_Type_Radar") + }; + } + + @Override + public String[] getDemoImagePath() { + return new String[]{ + "com/fr/plugin/chart/demo/image/radar.png" + }; + } } \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/design/chartinterface/RangeIndependentChartInterface.java b/designer-chart/src/main/java/com/fr/design/type/ui/RangeChartTypeUI.java similarity index 73% rename from designer-chart/src/main/java/com/fr/design/chartinterface/RangeIndependentChartInterface.java rename to designer-chart/src/main/java/com/fr/design/type/ui/RangeChartTypeUI.java index 85866c339..b75daf11a 100644 --- a/designer-chart/src/main/java/com/fr/design/chartinterface/RangeIndependentChartInterface.java +++ b/designer-chart/src/main/java/com/fr/design/type/ui/RangeChartTypeUI.java @@ -1,8 +1,9 @@ -package com.fr.design.chartinterface; +package com.fr.design.type.ui; import com.fr.chart.chartattr.Plot; import com.fr.design.beans.BasicBeanPane; import com.fr.design.chart.fun.impl.AbstractIndependentChartUIWithAPILevel; +import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.chart.gui.ChartDataPane; import com.fr.design.mainframe.chart.gui.ChartStylePane; import com.fr.design.mainframe.chart.gui.data.report.AbstractReportDataContentPane; @@ -16,7 +17,7 @@ import com.fr.design.mainframe.chart.gui.type.RangePlotPane; /** * Created by eason on 15/4/21. */ -public class RangeIndependentChartInterface extends AbstractIndependentChartUIWithAPILevel { +public class RangeChartTypeUI extends AbstractIndependentChartUIWithAPILevel { public AbstractChartTypePane getPlotTypePane(){ @@ -43,4 +44,22 @@ public class RangeIndependentChartInterface extends AbstractIndependentChartUIWi return "com/fr/design/images/form/toolbar/ChartF-Range_Chart.png"; } + @Override + public String getName() { + return Toolkit.i18nText("Fine-Design_Chart_Type_Range"); + } + + @Override + public String[] getSubName() { + return new String[]{ + Toolkit.i18nText("Fine-Design_Chart_Type_Range") + }; + } + + @Override + public String[] getDemoImagePath() { + return new String[]{ + "com/fr/plugin/chart/demo/image/range.png" + }; + } } \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/design/chartinterface/StockIndependentChartInterface.java b/designer-chart/src/main/java/com/fr/design/type/ui/StockChartTypeUI.java similarity index 77% rename from designer-chart/src/main/java/com/fr/design/chartinterface/StockIndependentChartInterface.java rename to designer-chart/src/main/java/com/fr/design/type/ui/StockChartTypeUI.java index 7d73d8594..14917575d 100644 --- a/designer-chart/src/main/java/com/fr/design/chartinterface/StockIndependentChartInterface.java +++ b/designer-chart/src/main/java/com/fr/design/type/ui/StockChartTypeUI.java @@ -1,4 +1,4 @@ -package com.fr.design.chartinterface; +package com.fr.design.type.ui; import com.fr.chart.chartattr.Plot; import com.fr.design.beans.BasicBeanPane; @@ -6,6 +6,7 @@ import com.fr.design.chart.fun.impl.AbstractIndependentChartUIWithAPILevel; import com.fr.design.chart.series.SeriesCondition.DataSeriesConditionPane; import com.fr.design.chart.series.SeriesCondition.impl.StockPlotDataSeriesConditionPane; import com.fr.design.condition.ConditionAttributesPane; +import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.chart.gui.ChartDataPane; import com.fr.design.mainframe.chart.gui.ChartStylePane; import com.fr.design.mainframe.chart.gui.data.report.AbstractReportDataContentPane; @@ -19,7 +20,7 @@ import com.fr.design.mainframe.chart.gui.type.StockPlotPane; /** * Created by eason on 15/4/21. */ -public class StockIndependentChartInterface extends AbstractIndependentChartUIWithAPILevel { +public class StockChartTypeUI extends AbstractIndependentChartUIWithAPILevel { public AbstractChartTypePane getPlotTypePane(){ @@ -50,4 +51,22 @@ public class StockIndependentChartInterface extends AbstractIndependentChartUIWi return "com/fr/design/images/form/toolbar/ChartF-Stock.png"; } + @Override + public String getName() { + return Toolkit.i18nText("Fine-Design_Chart_Type_Stock"); + } + + @Override + public String[] getSubName() { + return new String[]{ + Toolkit.i18nText("Fine-Design_Chart_Type_Stock") + }; + } + + @Override + public String[] getDemoImagePath() { + return new String[]{ + "com/fr/plugin/chart/demo/image/stock.png" + }; + } } \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/design/chartinterface/XYScatterIndependentChartInterface.java b/designer-chart/src/main/java/com/fr/design/type/ui/XYScatterChartTypeUI.java similarity index 69% rename from designer-chart/src/main/java/com/fr/design/chartinterface/XYScatterIndependentChartInterface.java rename to designer-chart/src/main/java/com/fr/design/type/ui/XYScatterChartTypeUI.java index 64de95eae..9bf5b787d 100644 --- a/designer-chart/src/main/java/com/fr/design/chartinterface/XYScatterIndependentChartInterface.java +++ b/designer-chart/src/main/java/com/fr/design/type/ui/XYScatterChartTypeUI.java @@ -1,4 +1,4 @@ -package com.fr.design.chartinterface; +package com.fr.design.type.ui; import com.fr.chart.chartattr.Plot; import com.fr.design.beans.BasicBeanPane; @@ -6,6 +6,7 @@ import com.fr.design.chart.fun.impl.AbstractIndependentChartUIWithAPILevel; import com.fr.design.chart.series.SeriesCondition.DataSeriesConditionPane; import com.fr.design.chart.series.SeriesCondition.impl.XYScatterPlotDataSeriesConditionPane; import com.fr.design.condition.ConditionAttributesPane; +import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.chart.gui.ChartDataPane; import com.fr.design.mainframe.chart.gui.ChartStylePane; import com.fr.design.mainframe.chart.gui.data.report.AbstractReportDataContentPane; @@ -19,36 +20,55 @@ import com.fr.design.mainframe.chart.gui.type.XYScatterPlotPane; /** * Created by eason on 15/4/21. */ -public class XYScatterIndependentChartInterface extends AbstractIndependentChartUIWithAPILevel { +public class XYScatterChartTypeUI extends AbstractIndependentChartUIWithAPILevel { - public AbstractChartTypePane getPlotTypePane(){ + public AbstractChartTypePane getPlotTypePane() { return new XYScatterPlotPane(); } - public AbstractTableDataContentPane getTableDataSourcePane(Plot plot, ChartDataPane parent){ + public AbstractTableDataContentPane getTableDataSourcePane(Plot plot, ChartDataPane parent) { return new XYScatterPlotTableDataContentPane(parent); } - public AbstractReportDataContentPane getReportDataSourcePane(Plot plot, ChartDataPane parent){ + public AbstractReportDataContentPane getReportDataSourcePane(Plot plot, ChartDataPane parent) { return new XYScatterPlotReportDataContentPane(parent); } - public BasicBeanPane getPlotSeriesPane(ChartStylePane parent, Plot plot){ + public BasicBeanPane getPlotSeriesPane(ChartStylePane parent, Plot plot) { return new XYScatterSeriesPane(parent, plot); } - public ConditionAttributesPane getPlotConditionPane(Plot plot){ + public ConditionAttributesPane getPlotConditionPane(Plot plot) { return plot.isSupportTrendLine() ? new XYScatterPlotDataSeriesConditionPane() : new DataSeriesConditionPane(); } /** - *图标路径 + * 图标路径 + * * @return 图标路径 */ - public String getIconPath(){ + public String getIconPath() { return "com/fr/design/images/form/toolbar/ChartF-XYScatter.png"; } + @Override + public String getName() { + return Toolkit.i18nText("Fine-Design_Chart_Type_XYScatter"); + } + + @Override + public String[] getSubName() { + return new String[]{ + Toolkit.i18nText("Fine-Design_Chart_Type_XYScatter") + }; + } + + @Override + public String[] getDemoImagePath() { + return new String[]{ + "com/fr/plugin/chart/demo/image/point.png" + }; + } } \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/extended/chart/AbstractExtendedChartUIProvider.java b/designer-chart/src/main/java/com/fr/extended/chart/AbstractExtendedChartUIProvider.java index b1d03a4c3..a1a088020 100644 --- a/designer-chart/src/main/java/com/fr/extended/chart/AbstractExtendedChartUIProvider.java +++ b/designer-chart/src/main/java/com/fr/extended/chart/AbstractExtendedChartUIProvider.java @@ -2,7 +2,7 @@ package com.fr.extended.chart; import com.fr.chart.chartattr.Plot; import com.fr.design.beans.BasicBeanPane; -import com.fr.design.chart.fun.IndependentChartUIProvider; +import com.fr.design.chart.fun.ChartTypeUIProvider; import com.fr.design.condition.ConditionAttributesPane; import com.fr.design.gui.frpane.AttributeChangeListener; import com.fr.design.mainframe.chart.AbstractChartAttrPane; @@ -13,18 +13,27 @@ import com.fr.design.mainframe.chart.gui.ChartStylePane; import com.fr.design.mainframe.chart.gui.data.report.AbstractReportDataContentPane; import com.fr.design.mainframe.chart.gui.data.table.AbstractTableDataContentPane; import com.fr.design.mainframe.chart.gui.type.AbstractChartTypePane; -import com.fr.stable.StringUtils; import com.fr.stable.fun.impl.AbstractProvider; /** * Created by shine on 2018/3/2. */ -public abstract class AbstractExtendedChartUIProvider extends AbstractProvider implements IndependentChartUIProvider { +public abstract class AbstractExtendedChartUIProvider extends AbstractProvider implements ChartTypeUIProvider { protected abstract AbstractExtendedChartTableDataPane getTableDataSourcePane(); protected abstract AbstractReportDataContentPane getReportDataSourcePane(); + @Override + public String getName() { + return null; + } + + @Override + public String[] getSubName() { + return new String[0]; + } + @Override public boolean needChartChangePane() { return false; @@ -85,10 +94,6 @@ public abstract class AbstractExtendedChartUIProvider extends AbstractProvider i return null; } - public String getPlotTypeTitle4PopupWindow(){ - return StringUtils.EMPTY; - } - @Override public ChartsConfigPane getChartConfigPane(String plotID) { return null; diff --git a/designer-chart/src/main/java/com/fr/extended/chart/ExtendedTypePane.java b/designer-chart/src/main/java/com/fr/extended/chart/ExtendedTypePane.java index affc3a611..2d9ebb5dc 100644 --- a/designer-chart/src/main/java/com/fr/extended/chart/ExtendedTypePane.java +++ b/designer-chart/src/main/java/com/fr/extended/chart/ExtendedTypePane.java @@ -2,6 +2,7 @@ package com.fr.extended.chart; import com.fr.chart.charttypes.ChartTypeManager; import com.fr.chartx.attr.ChartProvider; +import com.fr.design.ChartTypeInterfaceManager; import com.fr.design.mainframe.chart.gui.type.AbstractChartTypePane; import com.fr.design.mainframe.chart.gui.type.ChartImagePane; @@ -71,7 +72,7 @@ public class ExtendedTypePane extends AbstractChartType @Override public String title4PopupWindow() { - return ChartTypeManager.getInstance().getChartName(getPlotID()); + return ChartTypeInterfaceManager.getInstance().getName(getPlotID()); } @Override diff --git a/designer-chart/src/main/java/com/fr/van/chart/area/AreaIndependentVanChartInterface.java b/designer-chart/src/main/java/com/fr/van/chart/area/AreaIndependentVanChartInterface.java index a604a8a0e..23bd47004 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/area/AreaIndependentVanChartInterface.java +++ b/designer-chart/src/main/java/com/fr/van/chart/area/AreaIndependentVanChartInterface.java @@ -3,6 +3,7 @@ package com.fr.van.chart.area; import com.fr.chart.chartattr.Plot; import com.fr.design.beans.BasicBeanPane; import com.fr.design.condition.ConditionAttributesPane; +import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.chart.gui.ChartStylePane; import com.fr.design.mainframe.chart.gui.type.AbstractChartTypePane; import com.fr.van.chart.vanchart.AbstractMultiCategoryVanChartUI; @@ -16,6 +17,34 @@ public class AreaIndependentVanChartInterface extends AbstractMultiCategoryVanCh return "com/fr/design/images/form/toolbar/area.png"; } + @Override + public String getName() { + return Toolkit.i18nText("Fine-Design_Chart_New_Area"); + } + + @Override + public String[] getSubName() { + String area = Toolkit.i18nText("Fine-Design_Chart_New_Area"); + String stack = Toolkit.i18nText("Fine-Design_Chart_Stacked"); + String percent = Toolkit.i18nText("Fine-Design_Chart_Use_Percent"); + return new String[]{ + area, + stack + area, + percent + stack + area, + Toolkit.i18nText("Fine-Design_Chart_Mode_Custom") + }; + } + + @Override + public String[] getDemoImagePath() { + return new String[]{ + "com/fr/plugin/chart/demo/image/14.png", + "com/fr/plugin/chart/demo/image/15.png", + "com/fr/plugin/chart/demo/image/16.png", + "com/fr/plugin/chart/demo/image/17.png" + }; + } + @Override public AbstractChartTypePane getPlotTypePane() { return new VanChartAreaPlotPane(); @@ -29,12 +58,4 @@ public class AreaIndependentVanChartInterface extends AbstractMultiCategoryVanCh return new VanChartAreaSeriesPane(parent, plot); } - /** - * plot面板的标题 - * 插件兼容 - */ - public String getPlotTypeTitle4PopupWindow(){ - return VanChartAreaPlotPane.TITLE; - } - } \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/van/chart/area/VanChartAreaPlotPane.java b/designer-chart/src/main/java/com/fr/van/chart/area/VanChartAreaPlotPane.java index 3d655d005..5cec0753a 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/area/VanChartAreaPlotPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/area/VanChartAreaPlotPane.java @@ -3,7 +3,6 @@ package com.fr.van.chart.area; import com.fr.chart.chartattr.Chart; import com.fr.chart.chartattr.Plot; import com.fr.log.FineLoggerFactory; - import com.fr.plugin.chart.area.AreaIndependentVanChart; import com.fr.plugin.chart.area.VanChartAreaPlot; import com.fr.van.chart.designer.type.AbstractVanChartTypePane; @@ -12,8 +11,6 @@ import com.fr.van.chart.designer.type.AbstractVanChartTypePane; * Created by Mitisky on 15/11/18. */ public class VanChartAreaPlotPane extends AbstractVanChartTypePane { - public static final String TITLE = com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_New_Area"); - private static final long serialVersionUID = -8161581682558781651L; @Override protected String[] getTypeIconPath() { @@ -25,40 +22,6 @@ public class VanChartAreaPlotPane extends AbstractVanChartTypePane { }; } - @Override - protected String[] getTypeTipName() { - String area = com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_New_Area"); - String stack = com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Stacked"); - String percent = com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Use_Percent"); - return new String[]{ - area, - stack + area, - percent + stack + area, - com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Mode_Custom") - }; - } - - /** - * 返回界面标题 - * - * @return 界面标题 - */ - public String title4PopupWindow() { - return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_New_Area"); - } - - - - /** - * 获取各图表类型界面ID, 本质是plotID - * - * @return 图表类型界面ID - */ - @Override - protected String getPlotTypeID() { - return VanChartAreaPlot.VAN_CHART_AREA_PLOT_ID; - } - protected Plot getSelectedClonedPlot() { VanChartAreaPlot newPlot = null; Chart[] areaChart = AreaIndependentVanChart.AreaVanChartTypes; diff --git a/designer-chart/src/main/java/com/fr/van/chart/bar/BarIndependentVanChartInterface.java b/designer-chart/src/main/java/com/fr/van/chart/bar/BarIndependentVanChartInterface.java index 3a6dbf807..2dbae99a2 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/bar/BarIndependentVanChartInterface.java +++ b/designer-chart/src/main/java/com/fr/van/chart/bar/BarIndependentVanChartInterface.java @@ -5,6 +5,7 @@ import com.fr.chart.chartattr.Plot; import com.fr.design.beans.BasicBeanPane; import com.fr.design.condition.ConditionAttributesPane; import com.fr.design.gui.frpane.AttributeChangeListener; +import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.chart.AbstractChartAttrPane; import com.fr.design.mainframe.chart.gui.ChartStylePane; import com.fr.design.mainframe.chart.gui.type.AbstractChartTypePane; @@ -20,6 +21,35 @@ import com.fr.van.chart.vanchart.AbstractMultiCategoryVanChartUI; * Created by Mitisky on 15/10/20. */ public class BarIndependentVanChartInterface extends AbstractMultiCategoryVanChartUI { + + @Override + public String getName() { + return Toolkit.i18nText("Fine-Design_Chart_New_Bar"); + } + + @Override + public String[] getSubName() { + String bar = Toolkit.i18nText("Fine-Design_Chart_New_Bar"); + String stack = Toolkit.i18nText("Fine-Design_Chart_Stacked"); + String percent = Toolkit.i18nText("Fine-Design_Chart_Use_Percent"); + return new String[]{ + bar, + stack + bar, + percent + stack + bar, + Toolkit.i18nText("Fine-Design_Chart_Mode_Custom") + }; + } + + @Override + public String[] getDemoImagePath() { + return new String[]{ + "com/fr/plugin/chart/demo/image/7.png", + "com/fr/plugin/chart/demo/image/8.png", + "com/fr/plugin/chart/demo/image/9.png", + "com/fr/plugin/chart/demo/image/10.png", + }; + } + @Override public String getIconPath() { return "com/fr/design/images/form/toolbar/bar.png"; @@ -58,12 +88,4 @@ public class BarIndependentVanChartInterface extends AbstractMultiCategoryVanCha return new AbstractChartAttrPane[]{stylePane, otherPane}; } - /** - * plot面板的标题 - * 插件兼容 - */ - public String getPlotTypeTitle4PopupWindow(){ - return VanChartBarPlotPane.TITLE; - } - } \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/van/chart/bar/VanChartBarPlotPane.java b/designer-chart/src/main/java/com/fr/van/chart/bar/VanChartBarPlotPane.java index a9aad22e2..83d1db2e9 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/bar/VanChartBarPlotPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/bar/VanChartBarPlotPane.java @@ -3,7 +3,6 @@ package com.fr.van.chart.bar; import com.fr.chart.chartattr.Chart; import com.fr.chart.chartattr.Plot; import com.fr.log.FineLoggerFactory; - import com.fr.plugin.chart.bar.BarIndependentVanChart; import com.fr.plugin.chart.column.VanChartColumnPlot; import com.fr.van.chart.designer.type.AbstractVanChartTypePane; @@ -12,9 +11,6 @@ import com.fr.van.chart.designer.type.AbstractVanChartTypePane; * Created by Mitisky on 15/10/20. */ public class VanChartBarPlotPane extends AbstractVanChartTypePane { - public static final String TITLE = com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_New_Bar"); - - private static final long serialVersionUID = 2879689884048643002L; @Override protected String[] getTypeIconPath() { @@ -25,38 +21,6 @@ public class VanChartBarPlotPane extends AbstractVanChartTypePane { }; } - @Override - protected String[] getTypeTipName() { - String bar = com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_New_Bar"); - String stack = com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Stacked"); - String percent = com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Use_Percent"); - return new String[]{ - bar, - stack + bar, - percent + stack + bar, - com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Mode_Custom") - }; - } - - /** - * 返回界面标题 - * @return 界面标题 - */ - public String title4PopupWindow() { - return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_New_Bar"); - } - - - /** - * 获取各图表类型界面ID, 本质是plotID - * - * @return 图表类型界面ID - */ - @Override - protected String getPlotTypeID() { - return VanChartColumnPlot.VAN_CHART_BAR_PLOT_ID; - } - protected Plot getSelectedClonedPlot(){ VanChartColumnPlot newPlot = null; Chart[] barChart = BarIndependentVanChart.BarVanChartTypes; diff --git a/designer-chart/src/main/java/com/fr/van/chart/bubble/BubbleIndependentVanChartInterface.java b/designer-chart/src/main/java/com/fr/van/chart/bubble/BubbleIndependentVanChartInterface.java index 107734af5..ec4fc5585 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/bubble/BubbleIndependentVanChartInterface.java +++ b/designer-chart/src/main/java/com/fr/van/chart/bubble/BubbleIndependentVanChartInterface.java @@ -5,6 +5,7 @@ import com.fr.chart.chartattr.Plot; import com.fr.design.beans.BasicBeanPane; import com.fr.design.condition.ConditionAttributesPane; import com.fr.design.gui.frpane.AttributeChangeListener; +import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.chart.AbstractChartAttrPane; import com.fr.design.mainframe.chart.gui.ChartDataPane; import com.fr.design.mainframe.chart.gui.ChartStylePane; @@ -24,6 +25,27 @@ import com.fr.van.chart.vanchart.AbstractIndependentVanChartUI; * Created by Mitisky on 16/3/31. */ public class BubbleIndependentVanChartInterface extends AbstractIndependentVanChartUI { + @Override + public String getName() { + return Toolkit.i18nText("Fine-Design_Chart_New_Bubble"); + } + + @Override + public String[] getSubName() { + return new String[]{ + Toolkit.i18nText("Fine-Design_Chart_Bubble_Chart"), + Toolkit.i18nText("Fine-Design_Chart_New_Force_Bubble") + }; + } + + @Override + public String[] getDemoImagePath() { + return new String[]{ + "com/fr/plugin/chart/demo/image/26.png", + "com/fr/plugin/chart/demo/image/27.png" + }; + } + /** * 图表的类型定义界面类型,就是属性表的第一个界面 * @@ -86,8 +108,4 @@ public class BubbleIndependentVanChartInterface extends AbstractIndependentVanCh public ConditionAttributesPane getPlotConditionPane(Plot plot){ return new VanChartBubbleConditionPane(plot); } - - public String getPlotTypeTitle4PopupWindow(){ - return VanChartBubblePlotPane.TITLE; - } } diff --git a/designer-chart/src/main/java/com/fr/van/chart/bubble/VanChartBubblePlotPane.java b/designer-chart/src/main/java/com/fr/van/chart/bubble/VanChartBubblePlotPane.java index f8fbd2a27..3e5bdd106 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/bubble/VanChartBubblePlotPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/bubble/VanChartBubblePlotPane.java @@ -19,7 +19,6 @@ import com.fr.van.chart.designer.type.AbstractVanChartTypePane; * Created by Mitisky on 16/3/31. */ public class VanChartBubblePlotPane extends AbstractVanChartTypePane { - public static final String TITLE = com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_New_Bubble");; private static final long serialVersionUID = -3481633368542654247L; @@ -34,23 +33,6 @@ public class VanChartBubblePlotPane extends AbstractVanChartTypePane { }; } - @Override - protected String[] getTypeTipName() { - return new String[]{ - com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Bubble_Chart"), - com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_New_Force_Bubble") - }; - } - - /** - * 返回界面标题 - * @return 界面标题 - */ - public String title4PopupWindow() { - return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_New_Bubble"); - } - - private void removeDefaultAttr(ConditionAttr conditionAttr, Class targetClass) { DataSeriesCondition attr = conditionAttr.getExisted(targetClass); if (attr != null){ @@ -58,16 +40,6 @@ public class VanChartBubblePlotPane extends AbstractVanChartTypePane { } } - /** - * 获取各图表类型界面ID, 本质是plotID - * - * @return 图表类型界面ID - */ - @Override - protected String getPlotTypeID() { - return VanChartBubblePlot.VAN_CHART_BUBBLE_PLOT_ID; - } - protected Plot getSelectedClonedPlot(){ VanChartBubblePlot newPlot = null; Chart[] bubbleChart = BubbleIndependentVanChart.BubbleVanChartTypes; diff --git a/designer-chart/src/main/java/com/fr/van/chart/column/ColumnIndependentVanChartInterface.java b/designer-chart/src/main/java/com/fr/van/chart/column/ColumnIndependentVanChartInterface.java index 572767869..ebecf18ca 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/column/ColumnIndependentVanChartInterface.java +++ b/designer-chart/src/main/java/com/fr/van/chart/column/ColumnIndependentVanChartInterface.java @@ -2,10 +2,8 @@ package com.fr.van.chart.column; import com.fr.chart.chartattr.Plot; import com.fr.design.beans.BasicBeanPane; -import com.fr.design.chartx.MultiCategoryChartDataPane; import com.fr.design.condition.ConditionAttributesPane; -import com.fr.design.gui.frpane.AttributeChangeListener; -import com.fr.design.mainframe.chart.gui.ChartDataPane; +import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.chart.gui.ChartStylePane; import com.fr.design.mainframe.chart.gui.type.AbstractChartTypePane; import com.fr.van.chart.vanchart.AbstractMultiCategoryVanChartUI; @@ -14,6 +12,35 @@ import com.fr.van.chart.vanchart.AbstractMultiCategoryVanChartUI; * Created by Mitisky on 15/9/24. */ public class ColumnIndependentVanChartInterface extends AbstractMultiCategoryVanChartUI { + + @Override + public String getName() { + return Toolkit.i18nText("Fine-Design_Chart_New_Column"); + } + + @Override + public String[] getSubName() { + String column = com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_New_Column"); + String stack = com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Stacked"); + String percent = com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Use_Percent"); + return new String[]{ + column, + stack + column, + percent + stack + column, + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Mode_Custom") + }; + } + + @Override + public String[] getDemoImagePath() { + return new String[]{ + "com/fr/plugin/chart/demo/image/3.png", + "com/fr/plugin/chart/demo/image/4.png", + "com/fr/plugin/chart/demo/image/5.png", + "com/fr/plugin/chart/demo/image/6.png", + }; + } + @Override public String getIconPath() { return "com/fr/design/images/form/toolbar/column.png"; @@ -33,12 +60,13 @@ public class ColumnIndependentVanChartInterface extends AbstractMultiCategoryVan return new VanChartColumnSeriesPane(parent, plot); } - public String getPlotTypeTitle4PopupWindow(){ - return VanChartColumnPlotPane.TITLE; - } - - @Override - public ChartDataPane getChartDataPane(AttributeChangeListener listener) { - return new MultiCategoryChartDataPane(listener); - } +// @Override +// public ChartDataPane getChartDataPane(AttributeChangeListener listener) { +// return new AbstractDataPane(listener) { +// @Override +// protected SingleDataPane createSingleDataPane() { +// return new SingleDataPane(new MultiCategoryDataSetFieldsPane(), new MultiCategoryCellDataFieldsPane()); +// } +// }; +// } } \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/van/chart/column/VanChartColumnPlotPane.java b/designer-chart/src/main/java/com/fr/van/chart/column/VanChartColumnPlotPane.java index be16a7662..40269cc15 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/column/VanChartColumnPlotPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/column/VanChartColumnPlotPane.java @@ -3,7 +3,6 @@ package com.fr.van.chart.column; import com.fr.chart.chartattr.Chart; import com.fr.chart.chartattr.Plot; import com.fr.log.FineLoggerFactory; - import com.fr.plugin.chart.column.ColumnIndependentVanChart; import com.fr.plugin.chart.column.VanChartColumnPlot; import com.fr.van.chart.designer.type.AbstractVanChartTypePane; @@ -12,10 +11,6 @@ import com.fr.van.chart.designer.type.AbstractVanChartTypePane; * Created by Mitisky on 15/9/24. */ public class VanChartColumnPlotPane extends AbstractVanChartTypePane { - public static final String TITLE = com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_New_Column"); - - private static final long serialVersionUID = 5950923001789733745L; - @Override protected String[] getTypeIconPath() { @@ -26,38 +21,6 @@ public class VanChartColumnPlotPane extends AbstractVanChartTypePane { }; } - @Override - protected String[] getTypeTipName() { - String column = com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_New_Column"); - String stack = com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Stacked"); - String percent = com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Use_Percent"); - return new String[]{ - column, - stack + column, - percent + stack + column, - com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Mode_Custom") - }; - } - - /** - * 返回界面标题 - * @return 界面标题 - */ - public String title4PopupWindow() { - return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_New_Column"); - } - - - /** - * 获取各图表类型界面ID, 本质是plotID - * - * @return 图表类型界面ID - */ - @Override - protected String getPlotTypeID() { - return VanChartColumnPlot.VAN_CHART_COLUMN_PLOT_ID; - } - protected Plot getSelectedClonedPlot(){ VanChartColumnPlot newPlot = null; Chart[] columnChart = ColumnIndependentVanChart.ColumnVanChartTypes; diff --git a/designer-chart/src/main/java/com/fr/van/chart/custom/CustomIndependentVanChartInterface.java b/designer-chart/src/main/java/com/fr/van/chart/custom/CustomIndependentVanChartInterface.java index d982e7d80..ffb44ca32 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/custom/CustomIndependentVanChartInterface.java +++ b/designer-chart/src/main/java/com/fr/van/chart/custom/CustomIndependentVanChartInterface.java @@ -1,6 +1,7 @@ package com.fr.van.chart.custom; import com.fr.design.gui.frpane.AttributeChangeListener; +import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.chart.AbstractChartAttrPane; import com.fr.design.mainframe.chart.gui.ChartDataPane; import com.fr.design.mainframe.chart.gui.type.AbstractChartTypePane; @@ -14,6 +15,31 @@ import com.fr.van.chart.vanchart.AbstractIndependentVanChartUI; * Created by Mitisky on 16/2/16. */ public class CustomIndependentVanChartInterface extends AbstractIndependentVanChartUI { + @Override + public String getName() { + return Toolkit.i18nText("Fine-Design_Chart_New_Combine"); + } + + @Override + public String[] getSubName() { + return new String[]{ + Toolkit.i18nText("Fine-Design_Chart_New_Column_Line"), + Toolkit.i18nText("Fine-Design_Chart_New_Column_Area"), + Toolkit.i18nText("Fine-Design_Chart_New_StackColumn_Line"), + Toolkit.i18nText("Fine-Design_Chart_New_Custom_Combine") + }; + } + + @Override + public String[] getDemoImagePath() { + return new String[]{ + "com/fr/plugin/chart/demo/image/28.png", + "com/fr/plugin/chart/demo/image/29.png", + "com/fr/plugin/chart/demo/image/30.png", + "com/fr/plugin/chart/demo/image/31.png" + }; + } + /** * 图表的类型定义界面类型,就是属性表的第一个界面 * @@ -49,8 +75,4 @@ public class CustomIndependentVanChartInterface extends AbstractIndependentVanCh public ChartDataPane getChartDataPane(AttributeChangeListener listener){ return new VanChartCustomDataPane(listener); } - - public String getPlotTypeTitle4PopupWindow(){ - return VanChartCustomPlotPane.TITLE; - } } \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/van/chart/custom/VanChartCustomPlotPane.java b/designer-chart/src/main/java/com/fr/van/chart/custom/VanChartCustomPlotPane.java index f93c29945..927fa3148 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/custom/VanChartCustomPlotPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/custom/VanChartCustomPlotPane.java @@ -10,7 +10,6 @@ import com.fr.design.layout.TableLayout; import com.fr.design.layout.TableLayoutHelper; import com.fr.design.mainframe.chart.gui.type.ChartImagePane; import com.fr.log.FineLoggerFactory; - import com.fr.plugin.chart.base.VanChartAttrLine; import com.fr.plugin.chart.base.VanChartTools; import com.fr.plugin.chart.custom.CustomDefinition; @@ -35,7 +34,6 @@ import java.util.Map; * Created by Mitisky on 16/2/16. */ public class VanChartCustomPlotPane extends AbstractVanChartTypePane { - public static final String TITLE = com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_New_Combine"); //是否选择自定义 private boolean isCustom = false; @@ -114,26 +112,6 @@ public class VanChartCustomPlotPane extends AbstractVanChartTypePane { }; } - @Override - protected String[] getTypeTipName() { - return new String[]{ - com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_New_Column_Line"), - com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_New_Column_Area"), - com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_New_StackColumn_Line"), - com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_New_Custom_Combine") - }; - } - - @Override - /** - * 返回界面标题 - * @return 界面标题 - */ - public String title4PopupWindow() { - return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_New_Combine"); - } - - @Override public void updateBean(Chart chart) { @@ -241,16 +219,6 @@ public class VanChartCustomPlotPane extends AbstractVanChartTypePane { } - /** - * 获取各图表类型界面ID, 本质是plotID - * - * @return 图表类型界面ID - */ - @Override - protected String getPlotTypeID() { - return VanChartCustomPlot.VAN_CHART_CUSTOM_PLOT_ID; - } - protected Plot getSelectedClonedPlot() { VanChartCustomPlot newPlot = null; Chart[] customChart = CustomIndependentVanChart.CustomVanChartTypes; diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/type/AbstractVanChartTypePane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/type/AbstractVanChartTypePane.java index 87e5f2413..deb285fc7 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/type/AbstractVanChartTypePane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/type/AbstractVanChartTypePane.java @@ -8,6 +8,7 @@ import com.fr.chart.chartglyph.ConditionAttr; import com.fr.chart.chartglyph.ConditionCollection; import com.fr.chart.chartglyph.DataSheet; import com.fr.chartx.attr.ZoomAttribute; +import com.fr.design.ChartTypeInterfaceManager; import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.gui.ilable.MultilineLabel; import com.fr.design.mainframe.chart.gui.type.AbstractChartTypePane; @@ -45,6 +46,21 @@ public abstract class AbstractVanChartTypePane extends AbstractChartTypePane getPlotSeriesPane(ChartStylePane parent, Plot plot){ return new VanChartGaugeSeriesPane(parent, plot); } - - public String getPlotTypeTitle4PopupWindow(){ - return VanChartGaugePlotPane.TITLE; - } } \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/van/chart/gauge/VanChartGaugePlotPane.java b/designer-chart/src/main/java/com/fr/van/chart/gauge/VanChartGaugePlotPane.java index f49752b1c..4ae860669 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/gauge/VanChartGaugePlotPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/gauge/VanChartGaugePlotPane.java @@ -3,7 +3,6 @@ package com.fr.van.chart.gauge; import com.fr.chart.chartattr.Chart; import com.fr.chart.chartattr.Plot; import com.fr.log.FineLoggerFactory; - import com.fr.plugin.chart.gauge.GaugeIndependentVanChart; import com.fr.plugin.chart.gauge.VanChartGaugePlot; import com.fr.van.chart.designer.type.AbstractVanChartTypePane; @@ -12,7 +11,6 @@ import com.fr.van.chart.designer.type.AbstractVanChartTypePane; * Created by Mitisky on 15/11/27. */ public class VanChartGaugePlotPane extends AbstractVanChartTypePane { - public static final String TITLE = com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_New_Gauge"); private static final long serialVersionUID = -4599483879031804911L; @@ -26,24 +24,6 @@ public class VanChartGaugePlotPane extends AbstractVanChartTypePane { }; } - @Override - protected String[] getTypeTipName() { - return new String[]{com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Gauge_Pointer"), - com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Gauge_Pointer180"), - com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Gauge_Ring"), - com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Gauge_Slot"), - com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Gauge_Cuvette") - }; - } - - /** - * 返回界面标题 - * @return 界面标题 - */ - public String title4PopupWindow() { - return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_New_Gauge"); - } - protected Plot getSelectedClonedPlot(){ VanChartGaugePlot newPlot = null; Chart[] GaugeChart = GaugeIndependentVanChart.GaugeVanChartTypes; @@ -55,7 +35,11 @@ public class VanChartGaugePlotPane extends AbstractVanChartTypePane { Plot cloned = null; try { - cloned = (Plot)newPlot.clone(); + if (newPlot == null) { + throw new IllegalArgumentException("newPlot con not be null"); + }else { + cloned = (Plot)newPlot.clone(); + } } catch (CloneNotSupportedException e) { FineLoggerFactory.getLogger().error("Error In GaugeChart"); } @@ -74,16 +58,6 @@ public class VanChartGaugePlotPane extends AbstractVanChartTypePane { } } - /** - * 获取各图表类型界面ID, 本质是plotID - * - * @return 图表类型界面ID - */ - @Override - protected String getPlotTypeID() { - return VanChartGaugePlot.VAN_CHART_GAUGE_PLOT; - } - protected void cloneOldConditionCollection(Plot oldPlot, Plot newPlot) throws CloneNotSupportedException{ } diff --git a/designer-chart/src/main/java/com/fr/van/chart/heatmap/designer/HeatMapIndependentVanChartInterface.java b/designer-chart/src/main/java/com/fr/van/chart/heatmap/designer/HeatMapIndependentVanChartInterface.java index 2b3a2868a..2d07fda4d 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/heatmap/designer/HeatMapIndependentVanChartInterface.java +++ b/designer-chart/src/main/java/com/fr/van/chart/heatmap/designer/HeatMapIndependentVanChartInterface.java @@ -5,6 +5,7 @@ import com.fr.chart.chartattr.Plot; import com.fr.design.beans.BasicBeanPane; import com.fr.design.condition.ConditionAttributesPane; import com.fr.design.gui.frpane.AttributeChangeListener; +import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.chart.AbstractChartAttrPane; import com.fr.design.mainframe.chart.gui.ChartStylePane; import com.fr.design.mainframe.chart.gui.type.AbstractChartTypePane; @@ -32,6 +33,18 @@ public class HeatMapIndependentVanChartInterface extends MapIndependentVanChartI return "com/fr/design/images/form/toolbar/heatmap.png"; } + @Override + public String getName() { + return Toolkit.i18nText("Fine-Design_Chart_New_HeatMap"); + } + + @Override + public String[] getDemoImagePath() { + return new String[]{ + "com/fr/plugin/chart/demo/image/42.png" + }; + } + public AbstractChartTypePane getPlotTypePane() { return new VanChartHeatMapTypePane(); } @@ -62,8 +75,4 @@ public class HeatMapIndependentVanChartInterface extends MapIndependentVanChartI }; return new AbstractChartAttrPane[]{stylePane, otherPane}; } - - public String getPlotTypeTitle4PopupWindow(){ - return VanChartHeatMapTypePane.TITLE; - } } \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/van/chart/heatmap/designer/type/VanChartHeatMapTypePane.java b/designer-chart/src/main/java/com/fr/van/chart/heatmap/designer/type/VanChartHeatMapTypePane.java index fd6cf6d19..6ffd80055 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/heatmap/designer/type/VanChartHeatMapTypePane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/heatmap/designer/type/VanChartHeatMapTypePane.java @@ -4,7 +4,6 @@ import com.fr.chart.chartattr.Chart; import com.fr.chart.chartattr.Plot; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.log.FineLoggerFactory; - import com.fr.plugin.chart.base.VanChartTools; import com.fr.plugin.chart.heatmap.HeatMapIndependentVanChart; import com.fr.plugin.chart.heatmap.VanChartHeatMapPlot; @@ -16,7 +15,6 @@ import com.fr.van.chart.map.designer.type.VanChartMapSourceChoosePane; * Created by Mitisky on 16/10/20. */ public class VanChartHeatMapTypePane extends VanChartMapPlotPane { - public static final String TITLE = com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_New_HeatMap"); @Override protected String[] getTypeIconPath() { @@ -24,33 +22,6 @@ public class VanChartHeatMapTypePane extends VanChartMapPlotPane { }; } - @Override - protected String[] getTypeTipName() { - return new String[]{ - com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_HeatMap") - }; - } - - /** - * 获取各图表类型界面ID, 本质是plotID - * - * @return 图表类型界面ID - */ - @Override - protected String getPlotTypeID() { - return VanChartHeatMapPlot.VAN_CHART_HEAT_MAP_ID; - } - - /** - * title应该是一个属性,不只是对话框的标题时用到,与其他组件结合时,也会用得到 - * - * @return 绥化狂标题 - */ - @Override - public String title4PopupWindow() { - return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_New_HeatMap"); - } - @Override protected VanChartMapSourceChoosePane createSourceChoosePane() { return new VanChartHeatMapSourceChoosePane(); diff --git a/designer-chart/src/main/java/com/fr/van/chart/line/LineIndependentVanChartInterface.java b/designer-chart/src/main/java/com/fr/van/chart/line/LineIndependentVanChartInterface.java index 4d552b420..739e87f14 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/line/LineIndependentVanChartInterface.java +++ b/designer-chart/src/main/java/com/fr/van/chart/line/LineIndependentVanChartInterface.java @@ -3,6 +3,7 @@ package com.fr.van.chart.line; import com.fr.chart.chartattr.Plot; import com.fr.design.beans.BasicBeanPane; import com.fr.design.condition.ConditionAttributesPane; +import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.chart.gui.ChartStylePane; import com.fr.design.mainframe.chart.gui.type.AbstractChartTypePane; import com.fr.van.chart.vanchart.AbstractMultiCategoryVanChartUI; @@ -16,6 +17,29 @@ public class LineIndependentVanChartInterface extends AbstractMultiCategoryVanCh return "com/fr/design/images/form/toolbar/line.png"; } + @Override + public String getName() { + return Toolkit.i18nText("Fine-Design_Chart_New_Line"); + } + + @Override + public String[] getSubName() { + return new String[]{ + Toolkit.i18nText("Fine-Design_Chart_Line_Chart"), + Toolkit.i18nText("Fine-Design_Chart_Stacked_Line"), + Toolkit.i18nText("Fine-Design_Chart_Mode_Custom") + }; + } + + @Override + public String[] getDemoImagePath() { + return new String[]{ + "com/fr/plugin/chart/demo/image/11.png", + "com/fr/plugin/chart/demo/image/12.png", + "com/fr/plugin/chart/demo/image/13.png" + }; + } + @Override public AbstractChartTypePane getPlotTypePane() { return new VanChartLinePlotPane(); @@ -29,8 +53,4 @@ public class LineIndependentVanChartInterface extends AbstractMultiCategoryVanCh return new VanChartLineSeriesPane(parent, plot); } - public String getPlotTypeTitle4PopupWindow(){ - return VanChartLinePlotPane.TITLE; - } - } \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/van/chart/line/VanChartLinePlotPane.java b/designer-chart/src/main/java/com/fr/van/chart/line/VanChartLinePlotPane.java index 9dac6fbe3..49be523d6 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/line/VanChartLinePlotPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/line/VanChartLinePlotPane.java @@ -3,7 +3,6 @@ package com.fr.van.chart.line; import com.fr.chart.chartattr.Chart; import com.fr.chart.chartattr.Plot; import com.fr.log.FineLoggerFactory; - import com.fr.plugin.chart.line.LineIndependentVanChart; import com.fr.plugin.chart.line.VanChartLinePlot; import com.fr.van.chart.designer.type.AbstractVanChartTypePane; @@ -12,8 +11,6 @@ import com.fr.van.chart.designer.type.AbstractVanChartTypePane; * Created by Mitisky on 15/11/5. */ public class VanChartLinePlotPane extends AbstractVanChartTypePane { - public static final String TITLE = com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_New_Line"); - private static final long serialVersionUID = -8161581682558781651L; @Override protected String[] getTypeIconPath() { @@ -23,33 +20,6 @@ public class VanChartLinePlotPane extends AbstractVanChartTypePane { }; } - @Override - protected String[] getTypeTipName() { - return new String[]{ - com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Line_Chart"), - com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Stacked_Line"), - com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Mode_Custom") - }; - } - - /** - * 返回界面标题 - * @return 界面标题 - */ - public String title4PopupWindow() { - return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_New_Line"); - } - - /** - * 获取各图表类型界面ID, 本质是plotID - * - * @return 图表类型界面ID - */ - @Override - protected String getPlotTypeID() { - return VanChartLinePlot.VAN_CHART_LINE_PLOT; - } - protected Plot getSelectedClonedPlot(){ VanChartLinePlot newPlot = null; Chart[] lineChart = LineIndependentVanChart.LineVanChartTypes; @@ -60,7 +30,11 @@ public class VanChartLinePlotPane extends AbstractVanChartTypePane { } Plot cloned = null; try { - cloned = (Plot)newPlot.clone(); + if (newPlot == null) { + throw new IllegalArgumentException("newPlot con not be null"); + }else { + cloned = (Plot)newPlot.clone(); + } } catch (CloneNotSupportedException e) { FineLoggerFactory.getLogger().error("Error In LineChart"); } diff --git a/designer-chart/src/main/java/com/fr/van/chart/map/MapIndependentVanChartInterface.java b/designer-chart/src/main/java/com/fr/van/chart/map/MapIndependentVanChartInterface.java index dff6d3d69..76deff2d3 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/map/MapIndependentVanChartInterface.java +++ b/designer-chart/src/main/java/com/fr/van/chart/map/MapIndependentVanChartInterface.java @@ -4,6 +4,7 @@ import com.fr.chart.chartattr.Plot; import com.fr.design.beans.BasicBeanPane; import com.fr.design.condition.ConditionAttributesPane; import com.fr.design.gui.frpane.AttributeChangeListener; +import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.chart.AbstractChartAttrPane; import com.fr.design.mainframe.chart.gui.ChartDataPane; import com.fr.design.mainframe.chart.gui.ChartStylePane; @@ -32,6 +33,33 @@ import com.fr.van.chart.vanchart.AbstractIndependentVanChartUI; */ public class MapIndependentVanChartInterface extends AbstractIndependentVanChartUI { + @Override + public String getName() { + return Toolkit.i18nText("Fine-Design_Chart_New_Map"); + } + + @Override + public String[] getSubName() { + return new String[]{ + Toolkit.i18nText("Fine-Design_Chart_Region_Map"), + Toolkit.i18nText("Fine-Design_Chart_PointMap"), + Toolkit.i18nText("Fine-Design_Chart_LineMap"), + Toolkit.i18nText("Fine-Design_Chart_Combine_Map") + }; + } + + + @Override + public String[] getDemoImagePath() { + return new String[]{ + "com/fr/plugin/chart/demo/image/33.png", + "com/fr/plugin/chart/demo/image/34.png", + "com/fr/plugin/chart/demo/image/35.png", + "com/fr/plugin/chart/demo/image/36.png" + }; + } + + /** * 图表的类型定义界面类型,就是属性表的第一个界面 * @@ -93,8 +121,4 @@ public class MapIndependentVanChartInterface extends AbstractIndependentVanChart public ConditionAttributesPane getPlotConditionPane(Plot plot){ return new VanChartMapConditionPane(plot); } - - public String getPlotTypeTitle4PopupWindow(){ - return VanChartMapPlotPane.TITLE; - } } diff --git a/designer-chart/src/main/java/com/fr/van/chart/map/designer/type/VanChartMapPlotPane.java b/designer-chart/src/main/java/com/fr/van/chart/map/designer/type/VanChartMapPlotPane.java index 1c8b102b3..669865220 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/map/designer/type/VanChartMapPlotPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/map/designer/type/VanChartMapPlotPane.java @@ -19,7 +19,6 @@ import java.awt.Component; * Created by Mitisky on 16/5/4. */ public class VanChartMapPlotPane extends AbstractVanChartTypePane { - public static final String TITLE = com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_New_Map"); private VanChartMapSourceChoosePane sourceChoosePane; @@ -32,36 +31,6 @@ public class VanChartMapPlotPane extends AbstractVanChartTypePane { }; } - @Override - protected String[] getTypeTipName() { - return new String[]{ - com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Region_Map"), - com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_PointMap"), - com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_LineMap"), - com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Combine_Map") - }; - } - - /** - * 获取各图表类型界面ID, 本质是plotID - * - * @return 图表类型界面ID - */ - @Override - protected String getPlotTypeID() { - return VanChartMapPlot.VAN_CHART_MAP_ID; - } - - /** - * title应该是一个属性,不只是对话框的标题时用到,与其他组件结合时,也会用得到 - * - * @return 绥化狂标题 - */ - @Override - public String title4PopupWindow() { - return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_New_Map"); - } - protected Component[][] getPaneComponents(JPanel typePane){ try { sourceChoosePane = createSourceChoosePane(); @@ -146,6 +115,9 @@ public class VanChartMapPlotPane extends AbstractVanChartTypePane { } } Plot cloned = null; + if (null == newPlot) { + return cloned; + } try { cloned = (Plot)newPlot.clone(); } catch (CloneNotSupportedException e) { diff --git a/designer-chart/src/main/java/com/fr/van/chart/multilayer/MultiPieIndependentVanChartInterface.java b/designer-chart/src/main/java/com/fr/van/chart/multilayer/MultiPieIndependentVanChartInterface.java index 06f0b0f75..d6fe79390 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/multilayer/MultiPieIndependentVanChartInterface.java +++ b/designer-chart/src/main/java/com/fr/van/chart/multilayer/MultiPieIndependentVanChartInterface.java @@ -2,10 +2,8 @@ package com.fr.van.chart.multilayer; import com.fr.chart.chartattr.Plot; import com.fr.design.beans.BasicBeanPane; -import com.fr.design.chartx.MultiPieChartDataPane; import com.fr.design.condition.ConditionAttributesPane; -import com.fr.design.gui.frpane.AttributeChangeListener; -import com.fr.design.mainframe.chart.gui.ChartDataPane; +import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.chart.gui.ChartStylePane; import com.fr.design.mainframe.chart.gui.type.AbstractChartTypePane; import com.fr.van.chart.multilayer.other.VanChartMultiPieConditionPane; @@ -27,10 +25,27 @@ public class MultiPieIndependentVanChartInterface extends AbstractIndependentVan } @Override - public ChartDataPane getChartDataPane(AttributeChangeListener listener) { - return new MultiPieChartDataPane(listener); + public String getName() { + return Toolkit.i18nText("Fine-Design_Chart_New_MultiPie"); } + @Override + public String[] getDemoImagePath() { + return new String[]{ + "com/fr/plugin/chart/demo/image/32.png" + }; + } + +// @Override +// public ChartDataPane getChartDataPane(AttributeChangeListener listener) { +// return new AbstractDataPane(listener) { +// @Override +// protected SingleDataPane createSingleDataPane() { +// return new SingleDataPane(new MultiPieDataSetFieldsPane(), new MultiPieCellDataFieldsPane()); +// } +// }; +// } + public BasicBeanPane getPlotSeriesPane(ChartStylePane parent, Plot plot){ return new VanChartMultiPieSeriesPane(parent, plot); } @@ -39,7 +54,4 @@ public class MultiPieIndependentVanChartInterface extends AbstractIndependentVan return new VanChartMultiPieConditionPane(plot); } - public String getPlotTypeTitle4PopupWindow(){ - return VanChartMultiPiePlotPane.TITLE; - } } diff --git a/designer-chart/src/main/java/com/fr/van/chart/multilayer/VanChartMultiPiePlotPane.java b/designer-chart/src/main/java/com/fr/van/chart/multilayer/VanChartMultiPiePlotPane.java index fadef10db..397a11892 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/multilayer/VanChartMultiPiePlotPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/multilayer/VanChartMultiPiePlotPane.java @@ -3,7 +3,6 @@ package com.fr.van.chart.multilayer; import com.fr.chart.chartattr.Chart; import com.fr.chart.chartattr.Plot; import com.fr.log.FineLoggerFactory; - import com.fr.plugin.chart.base.VanChartTools; import com.fr.plugin.chart.multilayer.MultiPieIndependentVanChart; import com.fr.plugin.chart.multilayer.VanChartMultiPiePlot; @@ -14,30 +13,12 @@ import com.fr.van.chart.designer.type.AbstractVanChartTypePane; * Created by Fangjie on 2016/6/15. */ public class VanChartMultiPiePlotPane extends AbstractVanChartTypePane { - public static final String TITLE = com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_New_MultiPie"); @Override protected String[] getTypeIconPath() { return new String[]{"/com/fr/van/chart/multilayer/image/multiPie.png" }; } - @Override - protected String[] getTypeTipName() { - return new String[]{ - com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_MultiPie_Chart") - }; - } - - @Override - protected String getPlotTypeID() { - return VanChartMultiPiePlot.VAN_CHART_MULTILAYER_PLOT_ID; - } - - @Deprecated - public String title4PopupWindow() { - return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_New_MultiPie"); - } - @Override protected Plot getSelectedClonedPlot(){ VanChartMultiPiePlot newPlot = null; @@ -49,6 +30,9 @@ public class VanChartMultiPiePlotPane extends AbstractVanChartTypePane { } Plot cloned = null; + if (null == newPlot) { + return cloned; + } try { cloned = (Plot)newPlot.clone(); } catch (CloneNotSupportedException e) { diff --git a/designer-chart/src/main/java/com/fr/van/chart/multilayer/data/MultiPiePlotReportDataContentPane.java b/designer-chart/src/main/java/com/fr/van/chart/multilayer/data/MultiPiePlotReportDataContentPane.java index 12eba5581..217806a49 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/multilayer/data/MultiPiePlotReportDataContentPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/multilayer/data/MultiPiePlotReportDataContentPane.java @@ -14,6 +14,7 @@ import com.fr.design.mainframe.chart.gui.ChartDataPane; import com.fr.design.mainframe.chart.gui.data.report.AbstractReportDataContentPane; import com.fr.plugin.chart.multilayer.data.MultiPieReportDataDefinition; +import com.fr.stable.AssistUtils; import javax.swing.BorderFactory; import javax.swing.JPanel; @@ -81,7 +82,7 @@ public class MultiPiePlotReportDataContentPane extends AbstractReportDataContent @Override public void setTextFieldValue(double value) { //如果为0,则没有改变值 - if (value == 0){ + if (AssistUtils.equals(0, value)) { return; } super.setTextFieldValue(value); diff --git a/designer-chart/src/main/java/com/fr/van/chart/multilayer/data/MultiPiePlotTableDataContentPane.java b/designer-chart/src/main/java/com/fr/van/chart/multilayer/data/MultiPiePlotTableDataContentPane.java index fddef0ec5..580b1e91a 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/multilayer/data/MultiPiePlotTableDataContentPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/multilayer/data/MultiPiePlotTableDataContentPane.java @@ -18,6 +18,7 @@ import com.fr.general.ComparatorUtils; import com.fr.plugin.chart.multilayer.data.MultiPieValueDefinition; import com.fr.stable.ArrayUtils; +import com.fr.stable.AssistUtils; import com.fr.stable.StringUtils; import com.fr.van.chart.designer.TableLayout4VanChartHelper; @@ -170,7 +171,7 @@ public class MultiPiePlotTableDataContentPane extends AbstractTableDataContentPa @Override public void setTextFieldValue(double value) { //如果为0,则没有改变值 - if (value == 0){ + if (AssistUtils.equals(0, value)) { return; } super.setTextFieldValue(value); diff --git a/designer-chart/src/main/java/com/fr/van/chart/pie/PieIndependentVanChartInterface.java b/designer-chart/src/main/java/com/fr/van/chart/pie/PieIndependentVanChartInterface.java index e98278aab..06841c0c9 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/pie/PieIndependentVanChartInterface.java +++ b/designer-chart/src/main/java/com/fr/van/chart/pie/PieIndependentVanChartInterface.java @@ -3,6 +3,7 @@ package com.fr.van.chart.pie; import com.fr.chart.chartattr.Plot; import com.fr.design.beans.BasicBeanPane; import com.fr.design.condition.ConditionAttributesPane; +import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.chart.gui.ChartDataPane; import com.fr.design.mainframe.chart.gui.ChartStylePane; import com.fr.design.mainframe.chart.gui.data.table.AbstractTableDataContentPane; @@ -23,6 +24,30 @@ public class PieIndependentVanChartInterface extends AbstractIndependentVanChart return "com/fr/design/images/form/toolbar/pie.png"; } + @Override + public String getName() { + return Toolkit.i18nText("Fine-Design_Chart_New_Pie"); + } + + @Override + public String[] getSubName() { + return new String[]{ + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_New_Pie"), + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_SameArc_Pie"), + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_DifferArc_Pie") + }; + } + + @Override + public String[] getDemoImagePath() { + return new String[]{ + "com/fr/plugin/chart/demo/image/0.png", + "com/fr/plugin/chart/demo/image/1.png", + "com/fr/plugin/chart/demo/image/2.png" + }; + } + + @Override public AbstractChartTypePane getPlotTypePane() { return new VanChartPiePlotPane(); @@ -48,8 +73,4 @@ public class PieIndependentVanChartInterface extends AbstractIndependentVanChart public AbstractTableDataContentPane getTableDataSourcePane(Plot plot, ChartDataPane parent){ return (parent instanceof VanChartDataPane) ? new CategoryCustomPlotTableDataContentPane(parent) : new CategoryPlotTableDataContentPane(parent); } - - public String getPlotTypeTitle4PopupWindow(){ - return VanChartPiePlotPane.TITLE; - } } \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/van/chart/pie/VanChartPiePlotPane.java b/designer-chart/src/main/java/com/fr/van/chart/pie/VanChartPiePlotPane.java index 981956be0..9bbddbb03 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/pie/VanChartPiePlotPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/pie/VanChartPiePlotPane.java @@ -4,7 +4,6 @@ package com.fr.van.chart.pie; import com.fr.chart.chartattr.Chart; import com.fr.chart.chartattr.Plot; import com.fr.log.FineLoggerFactory; - import com.fr.plugin.chart.PiePlot4VanChart; import com.fr.plugin.chart.pie.PieIndependentVanChart; import com.fr.van.chart.designer.type.AbstractVanChartTypePane; @@ -13,7 +12,6 @@ import com.fr.van.chart.designer.type.AbstractVanChartTypePane; * 饼图(新特性) 属性表 选择类型 布局界面. */ public class VanChartPiePlotPane extends AbstractVanChartTypePane { - public static final String TITLE = com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_New_Pie"); private static final long serialVersionUID = 6163246902689597259L; @@ -25,33 +23,6 @@ public class VanChartPiePlotPane extends AbstractVanChartTypePane { }; } - @Override - protected String[] getTypeTipName() { - return new String[]{ - com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_New_Pie"), - com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_SameArc_Pie"), - com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_DifferArc_Pie") - }; - } - - /** - * 返回界面标题 - * @return 界面标题 - */ - public String title4PopupWindow() { - return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_New_Pie"); - } - - /** - * 获取各图表类型界面ID, 本质是plotID - * - * @return 图表类型界面ID - */ - @Override - protected String getPlotTypeID() { - return PiePlot4VanChart.VAN_CHART_PIE_PLOT; - } - protected Plot getSelectedClonedPlot(){ PiePlot4VanChart newPlot = null; Chart[] pieChart = PieIndependentVanChart.newPieChartTypes; @@ -62,6 +33,9 @@ public class VanChartPiePlotPane extends AbstractVanChartTypePane { } Plot cloned = null; + if (null == newPlot) { + return cloned; + } try { cloned = (Plot)newPlot.clone(); } catch (CloneNotSupportedException e) { diff --git a/designer-chart/src/main/java/com/fr/van/chart/radar/RadarIndependentVanChartInterface.java b/designer-chart/src/main/java/com/fr/van/chart/radar/RadarIndependentVanChartInterface.java index b243ade9d..21784c522 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/radar/RadarIndependentVanChartInterface.java +++ b/designer-chart/src/main/java/com/fr/van/chart/radar/RadarIndependentVanChartInterface.java @@ -3,6 +3,7 @@ package com.fr.van.chart.radar; import com.fr.chart.chartattr.Plot; import com.fr.design.beans.BasicBeanPane; import com.fr.design.condition.ConditionAttributesPane; +import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.chart.gui.ChartStylePane; import com.fr.design.mainframe.chart.gui.type.AbstractChartTypePane; import com.fr.van.chart.vanchart.AbstractIndependentVanChartUI; @@ -16,6 +17,27 @@ public class RadarIndependentVanChartInterface extends AbstractIndependentVanCha return "com/fr/design/images/form/toolbar/radar.png"; } + @Override + public String getName() { + return Toolkit.i18nText("Fine-Design_Chart_New_Radar"); + } + + @Override + public String[] getSubName() { + return new String[]{ + Toolkit.i18nText("Fine-Design_Chart_Radar_Chart"), + Toolkit.i18nText("Fine-Design_Chart_StackColumn_Radar") + }; + } + + @Override + public String[] getDemoImagePath() { + return new String[]{ + "com/fr/plugin/chart/demo/image/23.png", + "com/fr/plugin/chart/demo/image/24.png" + }; + } + @Override public AbstractChartTypePane getPlotTypePane() { return new VanChartRadarPlotPane(); @@ -28,8 +50,4 @@ public class RadarIndependentVanChartInterface extends AbstractIndependentVanCha public ConditionAttributesPane getPlotConditionPane(Plot plot){ return new VanChartRadarConditionPane(plot); } - - public String getPlotTypeTitle4PopupWindow(){ - return VanChartRadarPlotPane.TITLE; - } } \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/van/chart/radar/VanChartRadarPlotPane.java b/designer-chart/src/main/java/com/fr/van/chart/radar/VanChartRadarPlotPane.java index 3123cf606..a77c71bc9 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/radar/VanChartRadarPlotPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/radar/VanChartRadarPlotPane.java @@ -3,7 +3,6 @@ package com.fr.van.chart.radar; import com.fr.chart.chartattr.Chart; import com.fr.chart.chartattr.Plot; import com.fr.log.FineLoggerFactory; - import com.fr.plugin.chart.radar.RadarIndependentVanChart; import com.fr.plugin.chart.radar.VanChartRadarPlot; import com.fr.van.chart.designer.type.AbstractVanChartTypePane; @@ -12,7 +11,6 @@ import com.fr.van.chart.designer.type.AbstractVanChartTypePane; * Created by Mitisky on 15/12/28. */ public class VanChartRadarPlotPane extends AbstractVanChartTypePane { - public static final String TITLE = com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_New_Radar"); private static final long serialVersionUID = -4599483879031804911L; @@ -23,32 +21,6 @@ public class VanChartRadarPlotPane extends AbstractVanChartTypePane { }; } - @Override - protected String[] getTypeTipName() { - return new String[]{ - com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Radar_Chart"), - com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_StackColumn_Radar") - }; - } - - /** - * 返回界面标题 - * @return 界面标题 - */ - public String title4PopupWindow() { - return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_New_Radar"); - } - - /** - * 获取各图表类型界面ID, 本质是plotID - * - * @return 图表类型界面ID - */ - @Override - protected String getPlotTypeID() { - return VanChartRadarPlot.VAN_CHART_RADAR_PLOT; - } - protected Plot getSelectedClonedPlot(){ VanChartRadarPlot newPlot = null; Chart[] RadarChart = RadarIndependentVanChart.RadarVanChartTypes; @@ -59,6 +31,9 @@ public class VanChartRadarPlotPane extends AbstractVanChartTypePane { } Plot cloned = null; + if (null == newPlot) { + return cloned; + } try { cloned = (Plot)newPlot.clone(); } catch (CloneNotSupportedException e) { diff --git a/designer-chart/src/main/java/com/fr/van/chart/range/component/LegendGradientBar.java b/designer-chart/src/main/java/com/fr/van/chart/range/component/LegendGradientBar.java index 72ea983fd..6b09d4e1b 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/range/component/LegendGradientBar.java +++ b/designer-chart/src/main/java/com/fr/van/chart/range/component/LegendGradientBar.java @@ -13,6 +13,7 @@ import com.fr.design.style.color.ColorSelectDialog; import com.fr.design.style.color.ColorSelectable; import com.fr.plugin.chart.range.GradualIntervalConfig; import com.fr.plugin.chart.range.glyph.GradualColorDist; +import com.fr.stable.AssistUtils; import javax.swing.JComponent; import javax.swing.event.ChangeEvent; @@ -224,7 +225,7 @@ public class LegendGradientBar extends JComponent implements ColorSelectable, UI //防止位置重复,设置偏移 private int setOffset(int x, int index, int offset) { for (int i = 0; i < selectColorPointBtnList.size(); i++){ - if (i != index && x == selectColorPointBtnList.get(i).getX()){ + if (i != index && AssistUtils.equals(x, selectColorPointBtnList.get(i).getX())) { if (x >= (min+max)/2) { x -= offset; x = setOffset(x, index, offset+OFFSETSTEP); diff --git a/designer-chart/src/main/java/com/fr/van/chart/scatter/ScatterIndependentVanChartInterface.java b/designer-chart/src/main/java/com/fr/van/chart/scatter/ScatterIndependentVanChartInterface.java index 7b81ce48c..dbcbac3ac 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/scatter/ScatterIndependentVanChartInterface.java +++ b/designer-chart/src/main/java/com/fr/van/chart/scatter/ScatterIndependentVanChartInterface.java @@ -6,6 +6,7 @@ import com.fr.chart.chartattr.Plot; import com.fr.design.beans.BasicBeanPane; import com.fr.design.condition.ConditionAttributesPane; import com.fr.design.gui.frpane.AttributeChangeListener; +import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.chart.AbstractChartAttrPane; import com.fr.design.mainframe.chart.gui.ChartDataPane; import com.fr.design.mainframe.chart.gui.ChartStylePane; @@ -35,6 +36,18 @@ public class ScatterIndependentVanChartInterface extends AbstractIndependentVanC return new VanChartScatterPlotPane(); } + @Override + public String getName() { + return Toolkit.i18nText("Fine-Design_Chart_New_Scatter"); + } + + @Override + public String[] getDemoImagePath() { + return new String[]{ + "com/fr/plugin/chart/demo/image/25.png" + }; + } + /** * 图标路径 * @@ -84,8 +97,4 @@ public class ScatterIndependentVanChartInterface extends AbstractIndependentVanC public ConditionAttributesPane getPlotConditionPane(Plot plot){ return new VanChartScatterConditionPane(plot); } - - public String getPlotTypeTitle4PopupWindow(){ - return VanChartScatterPlotPane.TITLE; - } } \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/van/chart/scatter/VanChartScatterPlotPane.java b/designer-chart/src/main/java/com/fr/van/chart/scatter/VanChartScatterPlotPane.java index e0de77fc8..b2d6be16e 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/scatter/VanChartScatterPlotPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/scatter/VanChartScatterPlotPane.java @@ -6,7 +6,6 @@ import com.fr.chart.chartattr.Plot; import com.fr.chart.chartglyph.ConditionAttr; import com.fr.chart.chartglyph.ConditionCollection; import com.fr.log.FineLoggerFactory; - import com.fr.plugin.chart.base.VanChartAttrLine; import com.fr.plugin.chart.base.VanChartTools; import com.fr.plugin.chart.scatter.ScatterIndependentVanChart; @@ -17,8 +16,6 @@ import com.fr.van.chart.designer.type.AbstractVanChartTypePane; * Created by Mitisky on 16/2/16. */ public class VanChartScatterPlotPane extends AbstractVanChartTypePane { - public static final String TITLE = com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_New_Scatter"); - private static final long serialVersionUID = -3481633368542654247L; @Override @@ -27,31 +24,6 @@ public class VanChartScatterPlotPane extends AbstractVanChartTypePane { }; } - @Override - protected String[] getTypeTipName() { - return new String[]{ - com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_New_Scatter") - }; - } - - /** - * 返回界面标题 - * @return 界面标题 - */ - public String title4PopupWindow() { - return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_New_Scatter"); - } - - /** - * 获取各图表类型界面ID, 本质是plotID - * - * @return 图表类型界面ID - */ - @Override - protected String getPlotTypeID() { - return VanChartScatterPlot.VAN_CHART_SCATTER_PLOT_ID; - } - protected Plot getSelectedClonedPlot(){ VanChartScatterPlot newPlot = null; Chart[] scatterChart = ScatterIndependentVanChart.ScatterVanChartTypes; @@ -61,6 +33,9 @@ public class VanChartScatterPlotPane extends AbstractVanChartTypePane { } } Plot cloned = null; + if (null == newPlot) { + return cloned; + } try { cloned = (Plot)newPlot.clone(); } catch (CloneNotSupportedException e) { diff --git a/designer-chart/src/main/java/com/fr/van/chart/structure/desinger/StructureIndependentVanChartInterface.java b/designer-chart/src/main/java/com/fr/van/chart/structure/desinger/StructureIndependentVanChartInterface.java index 9562289c1..3286d0cc3 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/structure/desinger/StructureIndependentVanChartInterface.java +++ b/designer-chart/src/main/java/com/fr/van/chart/structure/desinger/StructureIndependentVanChartInterface.java @@ -5,6 +5,7 @@ import com.fr.chart.chartattr.Plot; import com.fr.design.beans.BasicBeanPane; import com.fr.design.condition.ConditionAttributesPane; import com.fr.design.gui.frpane.AttributeChangeListener; +import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.chart.AbstractChartAttrPane; import com.fr.design.mainframe.chart.gui.ChartDataPane; import com.fr.design.mainframe.chart.gui.ChartStylePane; @@ -32,6 +33,29 @@ public class StructureIndependentVanChartInterface extends AbstractIndependentVa return new VanChartStructureTypePane(); } + @Override + public String getName() { + return Toolkit.i18nText("Fine-Design_Chart_New_Structure"); + } + + @Override + public String[] getSubName() { + return new String[]{ + Toolkit.i18nText("Fine-Design_Chart_Vertical_Structure"), + Toolkit.i18nText("Fine-Design_Chart_Horizontal_Structure"), + Toolkit.i18nText("Fine-Design_Chart_Radial_Structure") + }; + } + + @Override + public String[] getDemoImagePath() { + return new String[]{ + "com/fr/plugin/chart/demo/image/45.png", + "com/fr/plugin/chart/demo/image/46.png", + "com/fr/plugin/chart/demo/image/47.png" + }; + } + @Override public String getIconPath() { return "com/fr/design/images/form/toolbar/structure.png"; @@ -74,4 +98,9 @@ public class StructureIndependentVanChartInterface extends AbstractIndependentVa public ConditionAttributesPane getPlotConditionPane(Plot plot) { return new VanChartStructureConditionPane(plot); } + + /* @Override + public ChartDataPane getChartDataPane(AttributeChangeListener listener) { + return new StructureChartDataPane(listener); + }*/ } diff --git a/designer-chart/src/main/java/com/fr/van/chart/structure/desinger/type/VanChartStructureTypePane.java b/designer-chart/src/main/java/com/fr/van/chart/structure/desinger/type/VanChartStructureTypePane.java index 39d024c3f..1674c850c 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/structure/desinger/type/VanChartStructureTypePane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/structure/desinger/type/VanChartStructureTypePane.java @@ -3,7 +3,6 @@ package com.fr.van.chart.structure.desinger.type; import com.fr.chart.chartattr.Chart; import com.fr.chart.chartattr.Plot; import com.fr.log.FineLoggerFactory; - import com.fr.plugin.chart.base.VanChartTools; import com.fr.plugin.chart.structure.StructureIndependentVanChart; import com.fr.plugin.chart.structure.VanChartStructurePlot; @@ -23,30 +22,6 @@ public class VanChartStructureTypePane extends AbstractVanChartTypePane { }; } - @Override - protected String[] getTypeTipName() { - return new String[]{ - com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Vertical_Structure"), - com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Horizontal_Structure"), - com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Radial_Structure") - }; - } - - @Override - protected String getPlotTypeID() { - return VanChartStructurePlot.STRUCTURE_PLOT_ID; - } - - /** - * title应该是一个属性,不只是对话框的标题时用到,与其他组件结合时,也会用得到 - * - * @return 绥化狂标题 - */ - @Override - public String title4PopupWindow() { - return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_New_Structure"); - } - protected Plot getSelectedClonedPlot(){ VanChartStructurePlot newPlot = null; Chart[] charts = StructureIndependentVanChart.StructureVanCharts; @@ -57,6 +32,9 @@ public class VanChartStructureTypePane extends AbstractVanChartTypePane { } Plot cloned = null; + if (null == newPlot) { + return cloned; + } try { cloned = (Plot)newPlot.clone(); } catch (CloneNotSupportedException e) { diff --git a/designer-chart/src/main/java/com/fr/van/chart/treemap/TreeMapIndependentVanChartInterface.java b/designer-chart/src/main/java/com/fr/van/chart/treemap/TreeMapIndependentVanChartInterface.java index 8c7a6b5e0..2b6589ed8 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/treemap/TreeMapIndependentVanChartInterface.java +++ b/designer-chart/src/main/java/com/fr/van/chart/treemap/TreeMapIndependentVanChartInterface.java @@ -4,6 +4,7 @@ import com.fr.chart.chartattr.Chart; import com.fr.chart.chartattr.Plot; import com.fr.design.beans.BasicBeanPane; import com.fr.design.gui.frpane.AttributeChangeListener; +import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.chart.AbstractChartAttrPane; import com.fr.design.mainframe.chart.gui.ChartStylePane; import com.fr.design.mainframe.chart.gui.type.AbstractChartTypePane; @@ -22,6 +23,18 @@ public class TreeMapIndependentVanChartInterface extends MultiPieIndependentVanC return new VanChartTreeMapPlotPane(); } + @Override + public String getName() { + return Toolkit.i18nText("Fine-Design_Chart_New_TreeMap"); + } + + @Override + public String[] getDemoImagePath() { + return new String[]{ + "com/fr/plugin/chart/demo/image/40.png" + }; + } + @Override public String getIconPath() { return "com/fr/design/images/form/toolbar/treeMap.png"; @@ -43,7 +56,4 @@ public class TreeMapIndependentVanChartInterface extends MultiPieIndependentVanC return new AbstractChartAttrPane[]{stylePane, otherPane}; } - public String getPlotTypeTitle4PopupWindow(){ - return VanChartTreeMapPlotPane.TITLE; - } } diff --git a/designer-chart/src/main/java/com/fr/van/chart/treemap/VanChartTreeMapPlotPane.java b/designer-chart/src/main/java/com/fr/van/chart/treemap/VanChartTreeMapPlotPane.java index b21f9dc79..73a59d057 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/treemap/VanChartTreeMapPlotPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/treemap/VanChartTreeMapPlotPane.java @@ -3,7 +3,6 @@ package com.fr.van.chart.treemap; import com.fr.chart.chartattr.Chart; import com.fr.chart.chartattr.Plot; import com.fr.log.FineLoggerFactory; - import com.fr.plugin.chart.treemap.TreeMapIndependentVanChart; import com.fr.plugin.chart.treemap.VanChartTreeMapPlot; import com.fr.van.chart.multilayer.VanChartMultiPiePlotPane; @@ -12,19 +11,12 @@ import com.fr.van.chart.multilayer.VanChartMultiPiePlotPane; * Created by Fangjie on 2016/7/11. */ public class VanChartTreeMapPlotPane extends VanChartMultiPiePlotPane { - public static final String TITLE = com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_New_TreeMap"); + protected String[] getTypeIconPath() { return new String[]{"/com/fr/van/chart/treemap/images/treeMap.png" }; } - @Override - protected String[] getTypeTipName() { - return new String[]{ - com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_TreeMap_Chart") - }; - } - @Override protected String getPlotTypeID() { return VanChartTreeMapPlot.VAN_CHART_TREE_MAP_PLOT_ID; @@ -45,6 +37,9 @@ public class VanChartTreeMapPlotPane extends VanChartMultiPiePlotPane { } Plot cloned = null; + if (null == newPlot) { + return cloned; + } try { cloned = (Plot)newPlot.clone(); } catch (CloneNotSupportedException e) { diff --git a/designer-chart/src/main/java/com/fr/van/chart/wordcloud/designer/WordCloudIndependentVanChartInterface.java b/designer-chart/src/main/java/com/fr/van/chart/wordcloud/designer/WordCloudIndependentVanChartInterface.java index 429e8aa43..ac5250632 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/wordcloud/designer/WordCloudIndependentVanChartInterface.java +++ b/designer-chart/src/main/java/com/fr/van/chart/wordcloud/designer/WordCloudIndependentVanChartInterface.java @@ -3,12 +3,11 @@ package com.fr.van.chart.wordcloud.designer; import com.fr.chart.chartattr.Chart; import com.fr.chart.chartattr.Plot; import com.fr.design.beans.BasicBeanPane; -import com.fr.design.chartx.WordCloudChartDataPane; import com.fr.design.condition.ConditionAttributesPane; import com.fr.design.dialog.BasicPane; import com.fr.design.gui.frpane.AttributeChangeListener; +import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.chart.AbstractChartAttrPane; -import com.fr.design.mainframe.chart.gui.ChartDataPane; import com.fr.design.mainframe.chart.gui.ChartStylePane; import com.fr.design.mainframe.chart.gui.type.AbstractChartTypePane; import com.fr.van.chart.designer.other.VanChartInteractivePaneWithOutSort; @@ -37,6 +36,18 @@ public class WordCloudIndependentVanChartInterface extends AbstractIndependentVa return new VanChartWordCloudTypePane(); } + @Override + public String getName() { + return Toolkit.i18nText("Fine-Design_Chart_Word_Cloud"); + } + + @Override + public String[] getDemoImagePath() { + return new String[]{ + "com/fr/plugin/chart/demo/image/43.png" + }; + } + /** * 图标路径 * @@ -82,12 +93,13 @@ public class WordCloudIndependentVanChartInterface extends AbstractIndependentVa return new AbstractChartAttrPane[]{stylePane, otherPane}; } - public String getPlotTypeTitle4PopupWindow(){ - return VanChartWordCloudTypePane.TITLE; - } - - @Override - public ChartDataPane getChartDataPane(AttributeChangeListener listener) { - return new WordCloudChartDataPane(listener); - } +// @Override +// public ChartDataPane getChartDataPane(AttributeChangeListener listener) { +// return new AbstractDataPane(listener) { +// @Override +// protected SingleDataPane createSingleDataPane() { +// return new SingleDataPane(new WordCloudDataSetFieldsPane(), new WordCloudCellDataFieldsPane()); +// } +// }; +// } } diff --git a/designer-chart/src/main/java/com/fr/van/chart/wordcloud/designer/type/VanChartWordCloudTypePane.java b/designer-chart/src/main/java/com/fr/van/chart/wordcloud/designer/type/VanChartWordCloudTypePane.java index d2d505caf..1a75c18e1 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/wordcloud/designer/type/VanChartWordCloudTypePane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/wordcloud/designer/type/VanChartWordCloudTypePane.java @@ -3,7 +3,6 @@ package com.fr.van.chart.wordcloud.designer.type; import com.fr.chart.chartattr.Chart; import com.fr.chart.chartattr.Plot; import com.fr.log.FineLoggerFactory; - import com.fr.plugin.chart.base.VanChartTools; import com.fr.plugin.chart.wordcloud.VanChartWordCloudPlot; import com.fr.plugin.chart.wordcloud.WordCloudIndependentVanChart; @@ -13,7 +12,7 @@ import com.fr.van.chart.designer.type.AbstractVanChartTypePane; * Created by Mitisky on 16/11/29. */ public class VanChartWordCloudTypePane extends AbstractVanChartTypePane { - public static final String TITLE = com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Word_Cloud"); + @Override protected String[] getTypeIconPath() { return new String[]{ @@ -21,13 +20,6 @@ public class VanChartWordCloudTypePane extends AbstractVanChartTypePane { }; } - @Override - protected String[] getTypeTipName() { - return new String[]{ - com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Word_Cloud") - }; - } - /** * 获取各图表类型界面ID, 本质是plotID * diff --git a/designer-form/src/main/java/com/fr/design/designer/beans/AdapterBus.java b/designer-form/src/main/java/com/fr/design/designer/beans/AdapterBus.java index 0133c7a9e..a34d2afa1 100644 --- a/designer-form/src/main/java/com/fr/design/designer/beans/AdapterBus.java +++ b/designer-form/src/main/java/com/fr/design/designer/beans/AdapterBus.java @@ -41,6 +41,9 @@ public class AdapterBus { */ public static ComponentAdapter getComponentAdapter(FormDesigner designer, JComponent creator) { JComponent jcomponent = getJComponent(creator); + if (null == jcomponent) { + return null; + } ComponentAdapter adapter = (ComponentAdapter) jcomponent.getClientProperty("component.adapter"); if (adapter == null) { adapter = new CompositeComponentAdapter(designer, creator); diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/XChartEditor.java b/designer-form/src/main/java/com/fr/design/designer/creator/XChartEditor.java index 14a5e3c96..ecf623477 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/XChartEditor.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/XChartEditor.java @@ -176,16 +176,21 @@ public class XChartEditor extends XBorderStyleWidgetCreator { * @return 控件. */ public JComponent createToolPane(final BaseJForm jform, final FormDesigner formDesigner) { - getDesignerEditorTarget().addStopEditingListener(new PropertyChangeAdapter() { - public void propertyChange() { - JComponent pane = jform.getEditingPane(); - if (pane instanceof BaseChartPropertyPane) { - ((BaseChartPropertyPane) pane).setSupportCellData(true); - ((BaseChartPropertyPane) pane).populateChartPropertyPane(getDesignerEditorTarget().update(), formDesigner); + MiddleChartComponent middleChartComponent = getDesignerEditorTarget(); + if (null != middleChartComponent) { + middleChartComponent.addStopEditingListener(new PropertyChangeAdapter() { + public void propertyChange() { + JComponent pane = jform.getEditingPane(); + if (pane instanceof BaseChartPropertyPane) { + ((BaseChartPropertyPane) pane).setSupportCellData(true); + MiddleChartComponent middleChartComponent = getDesignerEditorTarget(); + if (null != middleChartComponent) { + ((BaseChartPropertyPane) pane).populateChartPropertyPane(middleChartComponent.update(), formDesigner); + } + } } - } - }); - + }); + } if (isEditing){ final BaseChartPropertyPane propertyPane = DesignModuleFactory.getChartPropertyPane(); SwingUtilities.invokeLater(new Runnable() { @@ -193,7 +198,10 @@ public class XChartEditor extends XBorderStyleWidgetCreator { public void run() { if (getDesignerEditor().getEditorTarget() != null) { propertyPane.setSupportCellData(true); - propertyPane.populateChartPropertyPane(getDesignerEditorTarget().update(), formDesigner); + MiddleChartComponent middleChartComponent = getDesignerEditorTarget(); + if (null != middleChartComponent) { + propertyPane.populateChartPropertyPane(middleChartComponent.update(), formDesigner); + } } } }); diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/XCheckBox.java b/designer-form/src/main/java/com/fr/design/designer/creator/XCheckBox.java index ab74ccd98..da9b7c955 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/XCheckBox.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/XCheckBox.java @@ -7,13 +7,12 @@ import com.fr.design.form.util.XCreatorConstants; import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.mainframe.widget.editors.WidgetValueEditor; import com.fr.form.ui.CheckBox; -import com.fr.form.ui.WidgetValue; +import com.fr.form.ui.concept.data.ValueInitializer; import com.fr.stable.ArrayUtils; import com.fr.stable.core.PropertyChangeAdapter; -import javax.swing.BorderFactory; -import javax.swing.JComponent; -import java.awt.Dimension; +import javax.swing.*; +import java.awt.*; import java.beans.IntrospectionException; /** @@ -21,72 +20,72 @@ import java.beans.IntrospectionException; * @since 6.5.3 */ public class XCheckBox extends XWidgetCreator { - + public XCheckBox(CheckBox widget, Dimension initSize) { super(widget, initSize); } @Override - public CRPropertyDescriptor[] supportedDescriptor() throws IntrospectionException { - return (CRPropertyDescriptor[]) ArrayUtils.addAll(super.supportedDescriptor(), new CRPropertyDescriptor[] { - new CRPropertyDescriptor("text", this.data.getClass()).setI18NName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Text")) - .putKeyValue(XCreatorConstants.PROPERTY_CATEGORY, "Fine-Design_Basic_Advanced") - .setPropertyChangeListener(new PropertyChangeAdapter() { + public CRPropertyDescriptor[] supportedDescriptor() throws IntrospectionException { + return (CRPropertyDescriptor[]) ArrayUtils.addAll(super.supportedDescriptor(), new CRPropertyDescriptor[]{ + new CRPropertyDescriptor("text", this.data.getClass()).setI18NName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Text")) + .putKeyValue(XCreatorConstants.PROPERTY_CATEGORY, "Fine-Design_Basic_Advanced") + .setPropertyChangeListener(new PropertyChangeAdapter() { - @Override - public void propertyChange() { - ((UICheckBox) editor).setText(((CheckBox) data).getText()); - } - }), - new CRPropertyDescriptor("widgetValue", this.data.getClass()).setI18NName( - com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Widget_Value")).setEditorClass(WidgetValueEditor.class) - .putKeyValue(XCreatorConstants.PROPERTY_CATEGORY, "Fine-Design_Basic_Advanced") - .setPropertyChangeListener(new PropertyChangeAdapter() { + @Override + public void propertyChange() { + ((UICheckBox) editor).setText(((CheckBox) data).getText()); + } + }), + new CRPropertyDescriptor("widgetValue", this.data.getClass()).setI18NName( + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Widget_Value")).setEditorClass(WidgetValueEditor.class) + .putKeyValue(XCreatorConstants.PROPERTY_CATEGORY, "Fine-Design_Basic_Advanced") + .setPropertyChangeListener(new PropertyChangeAdapter() { - @Override - public void propertyChange() { - WidgetValue value = ((CheckBox) data).getWidgetValue(); - if (value != null && value.getValue() instanceof Boolean) { - ((UICheckBox) editor).setSelected((Boolean) value.getValue()); - } - } - }), - new CRPropertyDescriptor("fontSize", this.data.getClass(), "getFontSize", "setFontSize") - .setI18NName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Style_Font_Size")) - .putKeyValue(XCreatorConstants.PROPERTY_CATEGORY, "Fine-Design_Basic_Advanced") - }); - } + @Override + public void propertyChange() { + ValueInitializer value = ((CheckBox) data).getWidgetValue(); + if (value != null && value.getValue() instanceof Boolean) { + ((UICheckBox) editor).setSelected((Boolean) value.getValue()); + } + } + }), + new CRPropertyDescriptor("fontSize", this.data.getClass(), "getFontSize", "setFontSize") + .setI18NName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Style_Font_Size")) + .putKeyValue(XCreatorConstants.PROPERTY_CATEGORY, "Fine-Design_Basic_Advanced") + }); + } @Override protected JComponent initEditor() { if (editor == null) { editor = new UICheckBox(); - editor.setBorder(BorderFactory.createEmptyBorder(0, 8, 0, 0)); + editor.setBorder(BorderFactory.createEmptyBorder(0, 8, 0, 0)); } return editor; } @Override protected void initXCreatorProperties() { - super.initXCreatorProperties(); - UICheckBox jCheckBox = (UICheckBox) editor; - CheckBox check = (CheckBox) data; - jCheckBox.setText(check.getText()); - if (check.getWidgetValue() != null && check.getWidgetValue().getValue() instanceof Boolean) { - jCheckBox.setSelected((Boolean) check.getWidgetValue().getValue()); - } - } + super.initXCreatorProperties(); + UICheckBox jCheckBox = (UICheckBox) editor; + CheckBox check = (CheckBox) data; + jCheckBox.setText(check.getText()); + if (check.getWidgetValue() != null && check.getWidgetValue().getValue() instanceof Boolean) { + jCheckBox.setSelected((Boolean) check.getWidgetValue().getValue()); + } + } @Override protected String getIconName() { return "check_box_16.png"; } - public void firePropertyChange(){ - ((UICheckBox) editor).setText(((CheckBox) data).getText()); - WidgetValue value = ((CheckBox) data).getWidgetValue(); - if (value != null && value.getValue() instanceof Boolean) { - ((UICheckBox) editor).setSelected((Boolean) value.getValue()); - } - } + public void firePropertyChange() { + ((UICheckBox) editor).setText(((CheckBox) data).getText()); + ValueInitializer value = ((CheckBox) data).getWidgetValue(); + if (value != null && value.getValue() instanceof Boolean) { + ((UICheckBox) editor).setSelected((Boolean) value.getValue()); + } + } } diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/XDateEditor.java b/designer-form/src/main/java/com/fr/design/designer/creator/XDateEditor.java index c6ec47a3b..38da20da6 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/XDateEditor.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/XDateEditor.java @@ -12,15 +12,14 @@ import com.fr.design.mainframe.widget.editors.WidgetValueEditor; import com.fr.design.mainframe.widget.renderer.DateCellRenderer; import com.fr.form.ui.DateEditor; import com.fr.form.ui.WidgetValue; +import com.fr.form.ui.concept.data.ValueInitializer; import com.fr.general.DateUtils; import com.fr.stable.ArrayUtils; import com.fr.stable.StringUtils; import com.fr.stable.core.PropertyChangeAdapter; -import javax.swing.JComponent; -import java.awt.BorderLayout; -import java.awt.Color; -import java.awt.Dimension; +import javax.swing.*; +import java.awt.*; import java.beans.IntrospectionException; import java.util.Date; @@ -84,7 +83,7 @@ public class XDateEditor extends XDirectWriteEditor { private void initFieldText() { DateEditor dateEditor = (DateEditor) data; if (dateEditor.getWidgetValue() != null) { - WidgetValue widgetValue = dateEditor.getWidgetValue(); + ValueInitializer widgetValue = dateEditor.getWidgetValue(); //控件值.toString String valueStr = widgetValue.toString(); //控件值 diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/XWAbsoluteLayout.java b/designer-form/src/main/java/com/fr/design/designer/creator/XWAbsoluteLayout.java index b219530f7..56fcf6486 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/XWAbsoluteLayout.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/XWAbsoluteLayout.java @@ -31,6 +31,7 @@ import com.fr.general.FRScreen; import com.fr.general.IOUtils; import com.fr.share.ShareConstants; +import com.fr.stable.AssistUtils; import com.fr.stable.Constants; import javax.swing.Icon; @@ -108,7 +109,7 @@ public class XWAbsoluteLayout extends XLayoutContainer { Toolkit toolkit = Toolkit.getDefaultToolkit(); Dimension scrnsize = toolkit.getScreenSize(); double screenValue = FRScreen.getByDimension(scrnsize).getValue(); - if (screenValue != FormArea.DEFAULT_SLIDER) { + if (!AssistUtils.equals(screenValue, FormArea.DEFAULT_SLIDER)) { this.setContainerPercent(screenValue / FormArea.DEFAULT_SLIDER); } } @@ -167,7 +168,7 @@ public class XWAbsoluteLayout extends XLayoutContainer { * 界面容器大小不是默认的时,处理控件的BoundsWidget,且避免出现空隙 */ private Rectangle dealWidgetBound(Rectangle rec) { - if (containerPercent == 1.0) { + if (AssistUtils.equals(1.0, containerPercent)) { return rec; } rec.x = (int) (rec.x / containerPercent); @@ -244,7 +245,7 @@ public class XWAbsoluteLayout extends XLayoutContainer { @Override public void updateChildBound(int minHeight) { double prevContainerPercent = FRScreen.getByDimension(toData().getDesigningResolution()).getValue() / FormArea.DEFAULT_SLIDER; - if (toData().getCompState() == 0 && prevContainerPercent != containerPercent) { + if (toData().getCompState() == 0 && !AssistUtils.equals(containerPercent, prevContainerPercent)) { for (int i = 0; i < this.getComponentCount(); i++) { XCreator creator = getXCreator(i); Rectangle rec = new Rectangle(creator.getBounds()); diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/XWFitLayout.java b/designer-form/src/main/java/com/fr/design/designer/creator/XWFitLayout.java index 8d3d75a35..714bd0a2e 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/XWFitLayout.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/XWFitLayout.java @@ -21,6 +21,7 @@ import com.fr.form.ui.container.WLayout; import com.fr.general.FRLogger; import com.fr.general.FRScreen; import com.fr.stable.ArrayUtils; +import com.fr.stable.AssistUtils; import edu.emory.mathcs.backport.java.util.Arrays; import javax.swing.JOptionPane; @@ -72,7 +73,7 @@ public class XWFitLayout extends XLayoutContainer { Toolkit toolkit = Toolkit.getDefaultToolkit(); Dimension scrnsize = toolkit.getScreenSize(); double screenValue = FRScreen.getByDimension(scrnsize).getValue(); - if(screenValue != FormArea.DEFAULT_SLIDER){ + if (!AssistUtils.equals(FormArea.DEFAULT_SLIDER, screenValue)) { this.setContainerPercent(screenValue / FormArea.DEFAULT_SLIDER); } } @@ -717,7 +718,7 @@ public class XWFitLayout extends XLayoutContainer { * 界面容器大小不是默认的时,处理控件的BoundsWidget,且避免出现空隙 */ private Rectangle dealWidgetBound(Rectangle rec) { - if (containerPercent == 1.0) { + if (AssistUtils.equals(1.0, containerPercent)) { return rec; } rec.x = (int) (rec.x/containerPercent); @@ -731,7 +732,7 @@ public class XWFitLayout extends XLayoutContainer { * 界面容器大小不是默认的时,恢复组件实际大小 */ private Rectangle dealWgtBound(Rectangle rec) { - if (containerPercent == 1.0) { + if (AssistUtils.equals(1.0, containerPercent)) { return rec; } rec.x = (int) (rec.x * containerPercent); diff --git a/designer-form/src/main/java/com/fr/design/designer/properties/FormWidgetAuthorityEditPane.java b/designer-form/src/main/java/com/fr/design/designer/properties/FormWidgetAuthorityEditPane.java index b66293cfc..080465d46 100644 --- a/designer-form/src/main/java/com/fr/design/designer/properties/FormWidgetAuthorityEditPane.java +++ b/designer-form/src/main/java/com/fr/design/designer/properties/FormWidgetAuthorityEditPane.java @@ -56,6 +56,7 @@ public class FormWidgetAuthorityEditPane extends AuthorityEditPane { for (String selectedRole : selectedArray) { for (Widget widget : widgets) { widget.changeVisibleAuthorityState(selectedRole, widgetVisible.isSelected()); + widgetAvailable.setEnabled(widgetVisible.isSelected()); } } doAfterAuthority(); diff --git a/designer-form/src/main/java/com/fr/design/designer/properties/items/FRBorderConstraintsItems.java b/designer-form/src/main/java/com/fr/design/designer/properties/items/FRBorderConstraintsItems.java index 80085df89..3ff00ae90 100644 --- a/designer-form/src/main/java/com/fr/design/designer/properties/items/FRBorderConstraintsItems.java +++ b/designer-form/src/main/java/com/fr/design/designer/properties/items/FRBorderConstraintsItems.java @@ -22,13 +22,13 @@ public class FRBorderConstraintsItems implements ItemProvider { public static Item[] createItems(String[] directions) { Item[] items = new Item[directions.length]; for (int i = 0; i < directions.length; i++) { - if (WBorderLayout.NORTH == directions[i]) { + if (WBorderLayout.NORTH.equals(directions[i])) { items[i] = new Item(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_BorderLayout_North"), WBorderLayout.NORTH); - } else if (WBorderLayout.SOUTH == directions[i]) { + } else if (WBorderLayout.SOUTH.equals(directions[i])) { items[i] = new Item(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_BorderLayout_South"), WBorderLayout.SOUTH); - } else if (WBorderLayout.WEST == directions[i]) { + } else if (WBorderLayout.WEST.equals(directions[i])) { items[i] = new Item(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_BorderLayout_West"), WBorderLayout.WEST); - } else if (WBorderLayout.EAST == directions[i]) { + } else if (WBorderLayout.EAST.equals(directions[i])) { items[i] = new Item(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_BorderLayout_East"), WBorderLayout.EAST); } } diff --git a/designer-form/src/main/java/com/fr/design/gui/xpane/ToolTipEditor.java b/designer-form/src/main/java/com/fr/design/gui/xpane/ToolTipEditor.java index 91bfbf0b0..e2a78e7d2 100644 --- a/designer-form/src/main/java/com/fr/design/gui/xpane/ToolTipEditor.java +++ b/designer-form/src/main/java/com/fr/design/gui/xpane/ToolTipEditor.java @@ -15,7 +15,7 @@ import com.fr.design.utils.gui.GUICoreUtils; import com.fr.form.ui.DataControl; import com.fr.form.ui.EditorHolder; import com.fr.form.ui.Widget; -import com.fr.form.ui.WidgetValue; +import com.fr.form.ui.WidgetValueUtils; import com.fr.general.Background; import com.fr.general.GeneralContext; import com.fr.plugin.context.PluginContext; @@ -77,7 +77,7 @@ public class ToolTipEditor extends JWindow { createWidget.setWidgetName(widget.getWidgetName()); createWidget.setEnabled(widget.isEnabled()); createWidget.setVisible(widget.isVisible()); - WidgetValue.convertWidgetValue((DataControl) createWidget, widget.getWidgetValue().getValue()); + WidgetValueUtils.convertWidgetValue((DataControl) createWidget, widget.getWidgetValue().getValue()); XCreator creator = null; creator = parent.replace(createWidget, holder); Component designer = holder.getDesignerEditor().getEditorTarget().getParent(); diff --git a/designer-form/src/main/java/com/fr/design/mainframe/FormArea.java b/designer-form/src/main/java/com/fr/design/mainframe/FormArea.java index b42d1b41e..ee1b1976c 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/FormArea.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/FormArea.java @@ -23,6 +23,7 @@ import com.fr.design.utils.gui.LayoutUtils; import com.fr.form.main.mobile.FormMobileAttr; import com.fr.form.ui.container.WBorderLayout; import com.fr.general.FRScreen; +import com.fr.stable.AssistUtils; import javax.swing.JComponent; @@ -188,7 +189,6 @@ public class FormArea extends JComponent implements ScrollRulerComponent { value = value > SHOWVALMAX ? SHOWVALMAX : value; value = value < SHOWVALMIN ? SHOWVALMIN : value; JForm jf = (JForm) HistoryTemplateListPane.getInstance().getCurrentEditingTemplate(); - jf.resolution = (int) value; jf.getFormDesign().setResolution((int) value); jf.getFormDesign().getArea().resolution = (int) value; reCalculateRoot(value, true); @@ -226,7 +226,7 @@ public class FormArea extends JComponent implements ScrollRulerComponent { // slidePane.populateBean(screenValue); if (root.acceptType(XWFitLayout.class)) { XWFitLayout layout = (XWFitLayout) root; - if (screenValue != DEFAULT_SLIDER) { + if ( !AssistUtils.equals(screenValue, DEFAULT_SLIDER) ) { reCalculateRoot(screenValue, true); } else { // 组件间隔啊 @@ -354,7 +354,7 @@ public class FormArea extends JComponent implements ScrollRulerComponent { // double value = slidePane.updateBean(); //重置滑块的值为默认值100 START_VALUE = DEFAULT_SLIDER; - if (screenValue == DEFAULT_SLIDER) { + if ( AssistUtils.equals(screenValue, DEFAULT_SLIDER) ) { layout.getParent().setSize(width, height + designer.getParaHeight()); FormArea.this.validate(); } else { @@ -370,7 +370,7 @@ public class FormArea extends JComponent implements ScrollRulerComponent { * @param value */ private void reCalculateRoot(double value, boolean needCalculateParaHeight) { - if (value == START_VALUE) { + if ( AssistUtils.equals(value, START_VALUE) ) { return; } double percent = (value - START_VALUE) / START_VALUE; @@ -734,15 +734,15 @@ public class FormArea extends JComponent implements ScrollRulerComponent { this.horicalMax = (int) totalSize.getHeight(); // 撤销时会refreshRoot,导致layout大小变为默认大小 // 按照之前设置的宽高和百分比重置下容器size - if (width != widthPane.getValue()) { + if ( !AssistUtils.equals(width, widthPane.getValue()) ) { widthPane.setValue(width); reCalculateWidth((int) width); } - if (height != heightPane.getValue()) { + if ( !AssistUtils.equals(height, heightPane.getValue()) ) { heightPane.setValue(height); reCalculateHeight((int) height); } - if (designer.getRootComponent().acceptType(XWFitLayout.class) && slide == DEFAULT_SLIDER) { + if (designer.getRootComponent().acceptType(XWFitLayout.class) && AssistUtils.equals(slide, DEFAULT_SLIDER) ) { XWFitLayout layout = (XWFitLayout) designer.getRootComponent(); // 撤销时先refreshRoot了,此处去掉内边距再增加间隔 layout.moveContainerMargin(); @@ -817,6 +817,9 @@ public class FormArea extends JComponent implements ScrollRulerComponent { Rectangle rec = new Rectangle(left + (right - DESIGNERWIDTH) / 2, TOPGAP, right, bottom); //是否为表单 if (isValid) { + if (hbarPreferredSize == null) { + throw new IllegalArgumentException("hbarPreferredSize can not be null!"); + } int maxHeight = bottom - hbarPreferredSize.height - resize.height - TOPGAP * 2; int maxWidth = right - vbarPreferredSize.width; DESIGNERWIDTH = DESIGNERWIDTH > maxWidth ? maxWidth : DESIGNERWIDTH; diff --git a/designer-form/src/main/java/com/fr/design/mainframe/FormCreatorDropTarget.java b/designer-form/src/main/java/com/fr/design/mainframe/FormCreatorDropTarget.java index 0e8e77ed7..3ed29d047 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/FormCreatorDropTarget.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/FormCreatorDropTarget.java @@ -148,6 +148,9 @@ public class FormCreatorDropTarget extends DropTarget { // 取消前一个焦点容器的提示渲染器 designer.setPainter(null); } + if (container == null) { + throw new IllegalArgumentException("container can not be null!"); + } //获取painter的时候要考虑布局之间嵌套的问题 XLayoutContainer xLayoutContainer = container.getTopLayout(); if (xLayoutContainer != null && xLayoutContainer.getParent() != null @@ -215,7 +218,8 @@ public class FormCreatorDropTarget extends DropTarget { * * @param dtde 事件 */ - public void dragEnter(DropTargetDragEvent dtde) { + @Override + public synchronized void dragEnter(DropTargetDragEvent dtde) { Point loc = dtde.getLocation(); this.entering(loc.x, loc.y); } @@ -225,7 +229,8 @@ public class FormCreatorDropTarget extends DropTarget { * * @param dtde 事件 */ - public void dragOver(DropTargetDragEvent dtde) { + @Override + public synchronized void dragOver(DropTargetDragEvent dtde) { Point loc = dtde.getLocation(); hovering(loc.x, loc.y); } @@ -235,7 +240,8 @@ public class FormCreatorDropTarget extends DropTarget { * * @param dtde 事件 */ - public void dropActionChanged(DropTargetDragEvent dtde) { + @Override + public synchronized void dropActionChanged(DropTargetDragEvent dtde) { } /** @@ -243,7 +249,8 @@ public class FormCreatorDropTarget extends DropTarget { * * @param dte 事件 */ - public void dragExit(DropTargetEvent dte) { + @Override + public synchronized void dragExit(DropTargetEvent dte) { this.exiting(); } @@ -252,7 +259,8 @@ public class FormCreatorDropTarget extends DropTarget { * * @param dtde 事件 */ - public void drop(DropTargetDropEvent dtde) { + @Override + public synchronized void drop(DropTargetDropEvent dtde) { Point loc = dtde.getLocation(); this.adding(loc.x, loc.y); //针对在表单中拖入一个控件直接ctrl+s无反应 diff --git a/designer-form/src/main/java/com/fr/design/mainframe/FormDesigner.java b/designer-form/src/main/java/com/fr/design/mainframe/FormDesigner.java index 99883fff3..fbf52d021 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/FormDesigner.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/FormDesigner.java @@ -1368,6 +1368,7 @@ public class FormDesigner extends TargetComponent

implements TreeSelection Thread.sleep(1500); } catch (InterruptedException e) { FRLogger.getLogger().error(e.getMessage(), e); + Thread.currentThread().interrupt(); } pane.setLayout(new BorderLayout()); diff --git a/designer-form/src/main/java/com/fr/design/mainframe/FormDesignerDropTarget.java b/designer-form/src/main/java/com/fr/design/mainframe/FormDesignerDropTarget.java index 4e7ea5ae6..f7faf9d60 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/FormDesignerDropTarget.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/FormDesignerDropTarget.java @@ -6,10 +6,11 @@ import com.fr.form.ui.DataControl; import com.fr.form.ui.IframeEditor; import com.fr.form.ui.Widget; import com.fr.form.ui.WidgetValue; +import com.fr.form.ui.concept.data.ValueInitializer; import com.fr.general.ComparatorUtils; import com.fr.log.FineLoggerFactory; -import java.awt.Point; +import java.awt.*; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.Transferable; import java.awt.datatransfer.UnsupportedFlavorException; @@ -31,7 +32,8 @@ public class FormDesignerDropTarget extends DropTargetAdapter { /** * 响应拖拽进入事件 - * @param dtde 需要被处理的拖拽事件 + * + * @param dtde 需要被处理的拖拽事件 */ public void dragEnter(DropTargetDragEvent dtde) { dtde.acceptDrag(dtde.getDropAction()); @@ -39,6 +41,7 @@ public class FormDesignerDropTarget extends DropTargetAdapter { /** * 处理拖拽经过事件 + * * @param dtde 需要被处理的拖拽事件 */ public void dragOver(DropTargetDragEvent dtde) { @@ -52,7 +55,8 @@ public class FormDesignerDropTarget extends DropTargetAdapter { /** * 处理拖拽释放事件 - * @param dtde 需要被处理的拖拽事件 + * + * @param dtde 需要被处理的拖拽事件 */ public void drop(DropTargetDropEvent dtde) { Transferable tr = dtde.getTransferable(); @@ -75,22 +79,16 @@ public class FormDesignerDropTarget extends DropTargetAdapter { if (!(widget instanceof DataControl)) { return; } - WidgetValue oldvalue = ((DataControl) widget).getWidgetValue(); - WidgetValue newValue = new WidgetValue(new DataBinding((String[][]) o)); - if (!ComparatorUtils.equals(oldvalue, newValue)) { + ValueInitializer oldValue = ((DataControl) widget).getWidgetValue(); + ValueInitializer newValue = new WidgetValue(new DataBinding((String[][]) o)); + if (!ComparatorUtils.equals(oldValue, newValue)) { ((DataControl) widget).setWidgetValue(newValue); designer.fireTargetModified(); } creator.rebuid(); designer.getSelectionModel().setSelectedCreator(creator); - } catch (UnsupportedFlavorException e) { - FineLoggerFactory.getLogger().error(e.getMessage(), e); - } catch (IOException e) { + } catch (UnsupportedFlavorException | IOException e) { FineLoggerFactory.getLogger().error(e.getMessage(), e); } } - - private void setSrcForIframeEditor() { - - } } \ No newline at end of file diff --git a/designer-form/src/main/java/com/fr/design/mainframe/FormToolBar.java b/designer-form/src/main/java/com/fr/design/mainframe/FormToolBar.java index 860144dc8..71a93e9bc 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/FormToolBar.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/FormToolBar.java @@ -20,7 +20,7 @@ public class FormToolBar { } public void setButtonlist(List buttonlist) { - if (buttonlist == null || buttonlist.size() < 0) { + if (buttonlist == null) { this.buttonlist = new ArrayList(); } else { this.buttonlist = buttonlist; diff --git a/designer-form/src/main/java/com/fr/design/mainframe/FormToolBarPane.java b/designer-form/src/main/java/com/fr/design/mainframe/FormToolBarPane.java index e64259b27..17d620829 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/FormToolBarPane.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/FormToolBarPane.java @@ -118,7 +118,7 @@ public class FormToolBarPane extends BasicBeanPane { } private void setToolBar(List list) { - if (list == null || list.size() < 0) { + if (list == null) { return; } this.removeAll(); diff --git a/designer-form/src/main/java/com/fr/design/mainframe/JForm.java b/designer-form/src/main/java/com/fr/design/mainframe/JForm.java index bcf761fac..6b8cbbe5d 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/JForm.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/JForm.java @@ -765,6 +765,7 @@ public class JForm extends JTemplate implements BaseJForm defaultOptions = Arrays.asList(FormWebWidgetConstants.getFormElementCaseToolBarInstance()); List options = new ArrayList(); options.addAll(defaultOptions); + WidgetOption[] widgetOptions = ExtraDesignClassManager.getInstance().getWebWidgetOptions(new Filter() { + @Override + public boolean accept(ToolbarItemProvider toolbarItemProvider) { + return toolbarItemProvider.accept(HistoryTemplateListCache.getInstance().getCurrentEditingTemplate()); + } + }); + options.addAll(Arrays.asList(widgetOptions)); return options.toArray(new WidgetOption[options.size()]); } diff --git a/designer-form/src/main/java/com/fr/design/parameter/RootDesignDefinePane.java b/designer-form/src/main/java/com/fr/design/parameter/RootDesignDefinePane.java index a48d64fdc..5f45b57b0 100644 --- a/designer-form/src/main/java/com/fr/design/parameter/RootDesignDefinePane.java +++ b/designer-form/src/main/java/com/fr/design/parameter/RootDesignDefinePane.java @@ -24,6 +24,7 @@ import com.fr.design.mainframe.JTemplate; import com.fr.design.mainframe.widget.accessibles.AccessibleBackgroundEditor; import com.fr.design.utils.gui.UIComponentUtils; import com.fr.design.widget.ui.designer.AbstractDataModify; +import com.fr.design.widget.ui.designer.component.UIBoundSpinner; import com.fr.form.ui.container.WParameterLayout; import com.fr.general.Background; @@ -61,7 +62,7 @@ public class RootDesignDefinePane extends AbstractDataModify { public void initComponent() { this.setLayout(FRGUIPaneFactory.createBorderLayout()); - designerWidth = new UISpinner(1, Integer.MAX_VALUE, 1); + designerWidth = new UIBoundSpinner(1, Integer.MAX_VALUE, 1); JPanel advancePane = createAdvancePane(); UIExpandablePane advanceExpandablePane = new UIExpandablePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Advanced"), 280, 20, advancePane); this.add(advanceExpandablePane, BorderLayout.NORTH); @@ -162,16 +163,29 @@ public class RootDesignDefinePane extends AbstractDataModify { public WParameterLayout updateBean() { WParameterLayout wParameterLayout = (WParameterLayout) creator.toData(); wParameterLayout.setLabelName(labelNameTextField.getText()); - wParameterLayout.setDesignWidth((int) designerWidth.getValue()); + if (isCompsOutOfDesignerWidth((int) designerWidth.getValue())) { + designerWidth.setValue(wParameterLayout.getDesignWidth()); + } else { + wParameterLayout.setDesignWidth((int) designerWidth.getValue()); + } wParameterLayout.setDelayDisplayContent(displayReport.isSelected()); wParameterLayout.setUseParamsTemplate(useParamsTemplate.isSelected()); JTemplate jTemplate = HistoryTemplateListPane.getInstance().getCurrentEditingTemplate(); jTemplate.needAddTemplateIdAttr(useParamsTemplate.isSelected()); wParameterLayout.setBackground((Background) background.getValue()); - wParameterLayout.setPosition((int)hAlignmentPane.getSelectedItem()); + wParameterLayout.setPosition((int) hAlignmentPane.getSelectedItem()); return wParameterLayout; } + private boolean isCompsOutOfDesignerWidth(int designerWidth){ + for(int i=0; i designerWidth){ + return true; + } + } + return false; + } @Override public DataCreatorUI dataUI() { return null; diff --git a/designer-form/src/main/java/com/fr/design/widget/ui/designer/component/FormWidgetValuePane.java b/designer-form/src/main/java/com/fr/design/widget/ui/designer/component/FormWidgetValuePane.java index cdf8c28f2..6943085ec 100644 --- a/designer-form/src/main/java/com/fr/design/widget/ui/designer/component/FormWidgetValuePane.java +++ b/designer-form/src/main/java/com/fr/design/widget/ui/designer/component/FormWidgetValuePane.java @@ -1,7 +1,11 @@ package com.fr.design.widget.ui.designer.component; import com.fr.design.constants.LayoutConstants; -import com.fr.design.editor.editor.*; +import com.fr.design.editor.editor.BooleanEditor; +import com.fr.design.editor.editor.DateEditor; +import com.fr.design.editor.editor.DoubleEditor; +import com.fr.design.editor.editor.Editor; +import com.fr.design.editor.editor.FormulaEditor; import com.fr.design.gui.ibutton.UIButtonGroup; import com.fr.design.mainframe.widget.editors.DataBindingEditor; import com.fr.design.mainframe.widget.editors.DataTableEditor; @@ -9,9 +13,9 @@ import com.fr.design.mainframe.widget.editors.ServerDataBindingEditor; import com.fr.design.mainframe.widget.editors.ServerDataTableEditor; import com.fr.form.ui.DataControl; import com.fr.form.ui.WidgetValue; +import com.fr.form.ui.concept.data.ValueInitializer; import com.fr.general.ComparatorUtils; - import javax.swing.*; import java.awt.*; @@ -112,7 +116,7 @@ public class FormWidgetValuePane extends JPanel { } public void populate(DataControl ob) { - WidgetValue widgetValue = ob.getWidgetValue(); + ValueInitializer widgetValue = ob.getWidgetValue(); if (widgetValue != null) { for (int i = 0; i < editor.length; i++) { if (editor[i].accept(widgetValue.getValue())) { diff --git a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/ParaMobileDefinePane.java b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/ParaMobileDefinePane.java index b924b5c55..cf909618c 100644 --- a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/ParaMobileDefinePane.java +++ b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/ParaMobileDefinePane.java @@ -19,6 +19,7 @@ import com.fr.design.mainframe.MobileWidgetListPane; import com.fr.design.mainframe.WidgetPropertyPane; import com.fr.form.ui.container.WParameterLayout; import com.fr.form.ui.container.WSortLayout; +import com.fr.general.CloudCenter; import com.fr.general.ComparatorUtils; import com.fr.general.SiteCenter; import com.fr.log.FineLoggerFactory; @@ -87,9 +88,7 @@ public class ParaMobileDefinePane extends MobileWidgetDefinePane { double[] rowSize = {p, p}; double[] columnSize = {p, f}; int[][] rowCount = {{1, 1}, {1, 1}}; - if (ExtraReportClassManager.getInstance().getArray(MobileParamStyleProvider.MARK_STRING).size() != 0) { - tipLabel = null; - } else { + if (ExtraReportClassManager.getInstance().getArray(MobileParamStyleProvider.MARK_STRING).isEmpty()) { ((WParameterLayout) (paraCreator.toData())).setProvider((MobileParamStyleProvider) ((Item) paramLocationComboBox.getItemAt(0)).getValue()); } Component[][] components = new Component[][]{ @@ -127,10 +126,9 @@ public class ParaMobileDefinePane extends MobileWidgetDefinePane { @Override public void mouseClicked(MouseEvent e) { try { - //todo 添加对应插件下载地址 - Desktop.getDesktop().browse(new URI(SiteCenter.getInstance().acquireUrlByKind("plugin.download"))); + Desktop.getDesktop().browse(new URI(CloudCenter.getInstance().acquireUrlByKind("plugin.mobile.style"))); } catch (Exception exp) { - + FineLoggerFactory.getLogger().error(exp.getMessage(), exp); } } @Override diff --git a/designer-realize/src/main/java/com/fr/design/actions/cell/style/AlignmentAction.java b/designer-realize/src/main/java/com/fr/design/actions/cell/style/AlignmentAction.java index df56afc58..8dab29a0d 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/cell/style/AlignmentAction.java +++ b/designer-realize/src/main/java/com/fr/design/actions/cell/style/AlignmentAction.java @@ -110,8 +110,10 @@ public class AlignmentAction extends ButtonGroupAction implements StyleActionInt group.setAllToolTips(new String[]{com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_StyleAlignment_Left"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Center"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_StyleAlignment_Right")}); } for (int i = 0; i < 3; i++) { - group.getButton(i).setRoundBorder(true, UIConstants.ARC); - group.getButton(i).setBorderPainted(true); + if (group != null) { + group.getButton(i).setRoundBorder(true, UIConstants.ARC); + group.getButton(i).setBorderPainted(true); + } } return group; } diff --git a/designer-realize/src/main/java/com/fr/design/actions/cell/style/ReportFontSizeAction.java b/designer-realize/src/main/java/com/fr/design/actions/cell/style/ReportFontSizeAction.java index 7a3563be4..5a19a507b 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/cell/style/ReportFontSizeAction.java +++ b/designer-realize/src/main/java/com/fr/design/actions/cell/style/ReportFontSizeAction.java @@ -15,6 +15,7 @@ import com.fr.design.gui.icombobox.UIComboBox; import com.fr.design.mainframe.ElementCasePane; import com.fr.general.ComparatorUtils; import com.fr.general.FRFont; +import com.fr.stable.AssistUtils; /** @@ -51,7 +52,7 @@ public class ReportFontSizeAction extends AbstractStyleAction { if (style.getFRFont().getSize() == defStyle.getFRFont().getSize()) { style = StyleUtils.setReportFontSize(style, defStyle.getFRFont().getSize()); } - if (selectedFontSize == style.getFRFont().getSize()) { + if (AssistUtils.equals(selectedFontSize, style.getFRFont().getSize())){ return style; } style = StyleUtils.setReportFontSize(style, selectedFontSize); diff --git a/designer-realize/src/main/java/com/fr/design/dscolumn/DSColumnAdvancedPane.java b/designer-realize/src/main/java/com/fr/design/dscolumn/DSColumnAdvancedPane.java index 7f86dd2ee..0941b4b22 100644 --- a/designer-realize/src/main/java/com/fr/design/dscolumn/DSColumnAdvancedPane.java +++ b/designer-realize/src/main/java/com/fr/design/dscolumn/DSColumnAdvancedPane.java @@ -247,11 +247,7 @@ public class DSColumnAdvancedPane extends BasicPane { this.sortOrderComboBox.setSortOrder(new SortOrder(sort)); String sortFormula = dSColumn.getSortFormula(); - if (sortFormula != null && sortFormula.length() >= 1) { - sortFormulaTextField.setText(sortFormula); - } else { - sortFormulaTextField.setText(sortFormula); - } + sortFormulaTextField.setText(sortFormula); } public void update(CellElement cellElement) { diff --git a/designer-realize/src/main/java/com/fr/design/dscolumn/SelectedDataColumnPane.java b/designer-realize/src/main/java/com/fr/design/dscolumn/SelectedDataColumnPane.java index 2707685b5..ad670abf3 100644 --- a/designer-realize/src/main/java/com/fr/design/dscolumn/SelectedDataColumnPane.java +++ b/designer-realize/src/main/java/com/fr/design/dscolumn/SelectedDataColumnPane.java @@ -263,7 +263,7 @@ public class SelectedDataColumnPane extends BasicPane { SimpleDSColumn simpleDSColumn = updateColumnPane(); dsColumn.setDSName(Objects.requireNonNull(simpleDSColumn).getDsName()); - dsColumn.setColumn(simpleDSColumn.getColumn()); + dsColumn.setColumn(Objects.requireNonNull(simpleDSColumn).getColumn()); dsColumn.setParameters((ps != null && ps.length > 0) ? ps : null); } diff --git a/designer-realize/src/main/java/com/fr/design/javascript/ListenerEditPane.java b/designer-realize/src/main/java/com/fr/design/javascript/ListenerEditPane.java index 91ccd3802..5f1f941fa 100644 --- a/designer-realize/src/main/java/com/fr/design/javascript/ListenerEditPane.java +++ b/designer-realize/src/main/java/com/fr/design/javascript/ListenerEditPane.java @@ -140,10 +140,11 @@ public class ListenerEditPane extends BasicBeanPane { @Override public void populateBean(Listener listener) { - this.listener = listener; - if (this.listener == null) { + if (listener == null){ this.listener = new Listener(); + return; } + this.listener = listener; this.nameText.setText(listener.getEventName()); JavaScript js = listener.getAction(); for (int i = 0; i < this.cards.size(); i++) { diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/AuthorityEditToolBarPane.java b/designer-realize/src/main/java/com/fr/design/mainframe/AuthorityEditToolBarPane.java index f6f2b7a10..6224bcfeb 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/AuthorityEditToolBarPane.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/AuthorityEditToolBarPane.java @@ -13,6 +13,7 @@ import com.fr.design.roleAuthority.ReportAndFSManagePane; import com.fr.design.roleAuthority.RolesAlreadyEditedPane; import com.fr.design.webattr.ToolBarButton; import com.fr.general.ComparatorUtils; +import com.fr.stable.StringUtils; import javax.swing.*; @@ -204,7 +205,7 @@ public class AuthorityEditToolBarPane extends AuthorityPropertyPane { public void populateType() { - if (name.getText() == "") { + if (StringUtils.isEmpty(name.getText())) { type.setText(""); } else { type.setText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Toolbar_Button")); @@ -218,7 +219,7 @@ public class AuthorityEditToolBarPane extends AuthorityPropertyPane { names += "," + buttonlists.get(i).getNameOption().optionName(); } } - if (names != "") { + if (StringUtils.isNotEmpty(names)) { names = names.substring(1); } name.setText(names); @@ -226,7 +227,7 @@ public class AuthorityEditToolBarPane extends AuthorityPropertyPane { public void populateCheckPane() { checkPane.removeAll(); - if (name.getText() == "") { + if (StringUtils.isEmpty(name.getText())) { return; } double f = TableLayout.FILL; diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/ElementCasePane.java b/designer-realize/src/main/java/com/fr/design/mainframe/ElementCasePane.java index b68a5f72e..a28156110 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/ElementCasePane.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/ElementCasePane.java @@ -117,6 +117,7 @@ import javax.swing.JPanel; import javax.swing.JPopupMenu; import javax.swing.JScrollBar; import javax.swing.KeyStroke; +import javax.swing.SwingUtilities; import java.awt.AWTEvent; import java.awt.Adjustable; import java.awt.Dimension; @@ -527,7 +528,7 @@ public abstract class ElementCasePane extends Tar try { //旧选中内容编辑器释放模板对象 QuickEditor editor = this.getCurrentEditor(); - if(editor != null){ + if (editor != null) { editor.release(); } } catch (UnsupportedOperationException e) { @@ -853,15 +854,20 @@ public abstract class ElementCasePane extends Tar */ public void fireSelectionChangeListener() { // Guaranteed to return a non-null array - Object[] listeners = listenerList.getListenerList(); + final Object[] listeners = listenerList.getListenerList(); - // Process the listeners last to first, notifying - // those that are interested in this event - for (int i = listeners.length - 2; i >= 0; i -= 2) { - if (listeners[i] == SelectionListener.class) { - ((SelectionListener) listeners[i + 1]).selectionChanged(new SelectionEvent(this)); + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + // Process the listeners last to first, notifying + // those that are interested in this event + for (int i = listeners.length - 2; i >= 0; i -= 2) { + if (listeners[i] == SelectionListener.class) { + ((SelectionListener) listeners[i + 1]).selectionChanged(new SelectionEvent(this)); + } + } } - } + }); } /** diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/FormatBrushAction.java b/designer-realize/src/main/java/com/fr/design/mainframe/FormatBrushAction.java index 56d4d33ec..76298161f 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/FormatBrushAction.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/FormatBrushAction.java @@ -157,7 +157,7 @@ public class FormatBrushAction extends ElementCaseAction { } Style style = cellElement.getStyle(); if (style == null) { - style = style.DEFAULT_STYLE; + style = Style.DEFAULT_STYLE; } referencedStyle[i][j] = style; diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/JWorkBook.java b/designer-realize/src/main/java/com/fr/design/mainframe/JWorkBook.java index e5cb04b0f..f7e9ed765 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/JWorkBook.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/JWorkBook.java @@ -89,6 +89,7 @@ import com.fr.report.elementcase.TemplateElementCase; import com.fr.report.poly.PolyWorkSheet; import com.fr.report.worksheet.WorkSheet; import com.fr.stable.ArrayUtils; +import com.fr.stable.AssistUtils; import com.fr.stable.StableUtils; import com.fr.stable.StringUtils; import com.fr.stable.module.Module; @@ -469,7 +470,7 @@ public class JWorkBook extends JTemplate { double creatorWidth = blockCreator.getEditorBounds().width; double areaHeight = polyDezi.polyArea.getHeight(); double areaWidth = polyDezi.polyArea.getWidth(); - if (creatorWidth == 0 || creatorHeight == 0) { + if(AssistUtils.equals(creatorWidth,0) || AssistUtils.equals(creatorHeight,0)){ return resolution; } double time = (areaHeight / creatorHeight) < (areaWidth / creatorWidth) ? (areaHeight / creatorHeight) : (areaWidth / creatorWidth); @@ -486,7 +487,7 @@ public class JWorkBook extends JTemplate { int row = reportPane.getSelection().getSelectedRows()[0]; double rowLength = reportPane.getSelection().getSelectedRows().length; double rowExtent = reportPane.getGrid().getVerticalExtent(); - if (columnLength == 0 || rowLength == 0) { + if(AssistUtils.equals(columnLength,0) || AssistUtils.equals(rowLength,0)){ return resolution; } double time = (columnExtent / columnLength) < (rowExtent / rowLength) ? (columnExtent / columnLength) : (rowExtent / rowLength); diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/SheetAuthorityEditPane.java b/designer-realize/src/main/java/com/fr/design/mainframe/SheetAuthorityEditPane.java index e3a9ff86d..f559c828f 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/SheetAuthorityEditPane.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/SheetAuthorityEditPane.java @@ -13,6 +13,7 @@ import com.fr.general.ComparatorUtils; import com.fr.main.impl.WorkBook; import com.fr.privilege.finegrain.WorkSheetPrivilegeControl; import com.fr.report.worksheet.WorkSheet; +import com.fr.stable.StringUtils; import javax.swing.*; import java.awt.*; @@ -115,7 +116,7 @@ public class SheetAuthorityEditPane extends AuthorityEditPane { populateName(); populateType(); checkPane.removeAll(); - if (name.getText() == "") { + if (StringUtils.isEmpty(name.getText())){ return; } checkPane.add(populateCheckPane(), BorderLayout.CENTER); diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/app/DesignerAppActivator.java b/designer-realize/src/main/java/com/fr/design/mainframe/app/DesignerAppActivator.java index b13cdca85..ec425847d 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/app/DesignerAppActivator.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/app/DesignerAppActivator.java @@ -15,7 +15,7 @@ public class DesignerAppActivator extends Activator implements Prepare { @Override public void start() { - List appList = rightCollectMutable(App.KEY); + List appList = findMutable(App.KEY); for (App app : appList) { JTemplateFactory.register(app); } @@ -24,7 +24,7 @@ public class DesignerAppActivator extends Activator implements Prepare { @Override public void stop() { - List appList = rightCollectMutable(App.KEY); + List appList = findMutable(App.KEY); for (App app : appList) { JTemplateFactory.remove(app); } diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/cell/CellElementEditPane.java b/designer-realize/src/main/java/com/fr/design/mainframe/cell/CellElementEditPane.java index be62fb584..487214a80 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/cell/CellElementEditPane.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/cell/CellElementEditPane.java @@ -62,8 +62,7 @@ public class CellElementEditPane extends BasicPane { @Override public void tabChanged(int index) { card.show(center, paneList.get(index).title4PopupWindow()); - paneList.get(index).populateBean(cellelement, ePane);// 设置面板变了,也要populate - paneList.get(index).addAttributeChangeListener(listener); + populate(ePane); if (titleChangeListener != null) { titleChangeListener.fireTitleChange(getSelectedTabName()); } diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/cell/settingpane/CellStylePane.java b/designer-realize/src/main/java/com/fr/design/mainframe/cell/settingpane/CellStylePane.java index 1487908e7..370677860 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/cell/settingpane/CellStylePane.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/cell/settingpane/CellStylePane.java @@ -102,7 +102,8 @@ public class CellStylePane extends AbstractCellAttrPane { } Style style = cellElement.getStyle(); if (style == null) { - style = style.DEFAULT_STYLE; + style = Style.DEFAULT_STYLE; + } style = stylePane.updateStyle(style); cellElement.setStyle(style); diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/errorinfo/ErrorInfoUploader.java b/designer-realize/src/main/java/com/fr/design/mainframe/errorinfo/ErrorInfoUploader.java index 737d47044..e22e1059e 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/errorinfo/ErrorInfoUploader.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/errorinfo/ErrorInfoUploader.java @@ -1,5 +1,6 @@ package com.fr.design.mainframe.errorinfo; +import com.fr.concurrent.NamedThreadFactory; import com.fr.design.mainframe.SiteCenterToken; import com.fr.general.CloudCenter; import com.fr.general.CommonIOUtils; @@ -24,6 +25,8 @@ import java.io.InputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; /** * Created by Administrator on 2017/7/24 0024. @@ -81,8 +84,8 @@ public class ErrorInfoUploader { return; } - - Thread updateThread = new Thread(new Runnable() { + ExecutorService es = Executors.newSingleThreadExecutor(new NamedThreadFactory("ErrorInfoUploader")); + es.submit(new Runnable() { @Override public void run() { String localCacheFilePath = StableUtils.pathJoin(ProductConstants.getEnvHome(), "solution", "solution.zip"); @@ -92,7 +95,7 @@ public class ErrorInfoUploader { } } }); - updateThread.start(); + es.shutdown(); } private void downloadSolution(File localCacheZip) { diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/form/FormReportComponentComposite.java b/designer-realize/src/main/java/com/fr/design/mainframe/form/FormReportComponentComposite.java index 17f4bf348..a31dea5b3 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/form/FormReportComponentComposite.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/form/FormReportComponentComposite.java @@ -19,6 +19,7 @@ import com.fr.grid.Grid; import com.fr.grid.GridUtils; import com.fr.report.ReportHelper; import com.fr.report.worksheet.FormElementCase; +import com.fr.stable.AssistUtils; import javax.swing.*; import javax.swing.event.ChangeEvent; @@ -128,7 +129,7 @@ public class FormReportComponentComposite extends JComponent implements TargetMo int row = reportPane.getSelection().getSelectedRows()[0]; double rowLength = reportPane.getSelection().getSelectedRows().length; double rowExtent = reportPane.getGrid().getVerticalExtent(); - if (columnLength == 0 || rowLength == 0) { + if (AssistUtils.equals(columnLength, 0d) || AssistUtils.equals(rowLength, 0d)) { return ScreenResolution.getScreenResolution(); } double time = (columnExtent / columnLength) < (rowExtent / rowLength) ? (columnExtent / columnLength) : (rowExtent / rowLength); diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/messagecollect/StartupMessageCollector.java b/designer-realize/src/main/java/com/fr/design/mainframe/messagecollect/StartupMessageCollector.java new file mode 100644 index 000000000..ac1072466 --- /dev/null +++ b/designer-realize/src/main/java/com/fr/design/mainframe/messagecollect/StartupMessageCollector.java @@ -0,0 +1,95 @@ +package com.fr.design.mainframe.messagecollect; + +import com.fr.concurrent.NamedThreadFactory; +import com.fr.design.DesignerEnvManager; +import com.fr.design.mainframe.SiteCenterToken; +import com.fr.event.Event; +import com.fr.event.EventDispatcher; +import com.fr.event.Listener; +import com.fr.general.CloudCenter; +import com.fr.general.ComparatorUtils; +import com.fr.general.http.HttpToolbox; +import com.fr.json.JSONObject; +import com.fr.log.FineLoggerFactory; +import com.fr.module.ModuleContext; +import com.fr.module.engine.FineModule; +import com.fr.runtime.FineRuntime; +import com.fr.stable.StringUtils; + +import java.util.HashMap; +import java.util.concurrent.ExecutorService; + +/** + * 启动信息收集 + * + * @author vito + * @version 10.0 + * Created by vito on 2019/9/4 + */ +public class StartupMessageCollector { + + private static final String XML_STARTUP_TIME = "t"; + private static final String XML_STARTUP_LOG = "startupLog"; + private static final String XML_STARTUP_Memory = "designerMemory"; + private static final String XML_STARTUP_COST = "cost"; + private static final String XML_UUID = "UUID"; + private static final String STARTUP_URL_KEY = "user.info.v10.startup"; + private static final String LOG_TYPE = "single"; + private static final int BYTE_TO_MB = 1024 * 1024; + + public static final StartupMessageCollector INSTANCE = new StartupMessageCollector(); + + private StartupMessageCollector() { + } + + public static StartupMessageCollector getInstance() { + return INSTANCE; + } + + public void recordStartupLog() { + EventDispatcher.listen(FineRuntime.ApplicationEvent.AFTER_START, new Listener() { + + @Override + public void on(Event event, Long param) { + final String url = CloudCenter.getInstance().acquireUrlByKind(STARTUP_URL_KEY); + if (StringUtils.isEmpty(url)) { + return; + } + ExecutorService es = ModuleContext.getExecutor() + .newSingleThreadExecutor(new NamedThreadFactory("StartupMessageCollector")); + es.submit(new Runnable() { + @Override + public void run() { + FineModule root = (FineModule) ModuleContext.getRoot().getRoot(); + JSONObject profile = root.profile(); + if (profile.isEmpty()) { + return; + } + JSONObject json = JSONObject.create() + .put(XML_UUID, DesignerEnvManager.getEnvManager().getUUID()) + .put(XML_STARTUP_TIME, FineRuntime.getAppStartTime() + FineRuntime.getStartingTime()) + .put(XML_STARTUP_COST, FineRuntime.getStartingTime()) + .put(XML_STARTUP_LOG, profile) + .put(XML_STARTUP_Memory, Runtime.getRuntime().totalMemory() / BYTE_TO_MB); + sendInfo(json, url + LOG_TYPE); + } + }); + es.shutdown(); + } + }); + } + + private boolean sendInfo(JSONObject content, String url) { + boolean success = false; + try { + HashMap para = new HashMap<>(); + para.put("token", SiteCenterToken.generateToken()); + para.put("content", content); + String res = HttpToolbox.post(url, para); + success = ComparatorUtils.equals(new JSONObject(res).get("status"), "success"); + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } + return success; + } +} diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/messagecollect/solid/SolidCollectConstants.java b/designer-realize/src/main/java/com/fr/design/mainframe/messagecollect/solid/SolidCollectConstants.java new file mode 100644 index 000000000..452da9ecc --- /dev/null +++ b/designer-realize/src/main/java/com/fr/design/mainframe/messagecollect/solid/SolidCollectConstants.java @@ -0,0 +1,18 @@ +package com.fr.design.mainframe.messagecollect.solid; + +/** + * Created by alex sung on 2019/9/5. + */ +public class SolidCollectConstants { + private SolidCollectConstants(){} + + /** + * 客户端请求subject + */ + public static final String REQUEST_SUBJECT = "solid"; + + /** + * 客户端请求超时鉴权时间,默认1h失效 + */ + public static final long TIME_OUT = 60 * 60 * 1000; +} diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/messagecollect/solid/SolidCollector.java b/designer-realize/src/main/java/com/fr/design/mainframe/messagecollect/solid/SolidCollector.java new file mode 100644 index 000000000..68cc882a9 --- /dev/null +++ b/designer-realize/src/main/java/com/fr/design/mainframe/messagecollect/solid/SolidCollector.java @@ -0,0 +1,97 @@ +package com.fr.design.mainframe.messagecollect.solid; + +import com.fr.general.CloudCenter; +import com.fr.general.http.HttpToolbox; +import com.fr.json.JSON; +import com.fr.json.JSONFactory; +import com.fr.log.FineLoggerFactory; +import com.fr.security.JwtUtils; +import com.fr.stable.CommonUtils; +import com.fr.stable.StringUtils; +import com.fr.workspace.WorkContext; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +import static com.fr.design.mainframe.messagecollect.solid.SolidCollectConstants.REQUEST_SUBJECT; +import static com.fr.design.mainframe.messagecollect.solid.SolidCollectConstants.TIME_OUT; + +/** + * 设计器固化信息回传类 + * Created by alex sung on 2019/8/22. + */ + + +public class SolidCollector { + private static final String CONTENT_URL = "/v10/collect/solid"; + private static final String DELETE_URL = "/v10/collect/solid/delete"; + private static final String UNLOCK_URL = "/v10/collect/solid/unlock"; + private static final String ATTR_CIPHER_TEXT = "cipherText"; + private static final String ATTR_SIGNATURE = "signature"; + private static final String SOLID_UPLOAD_URL = CloudCenter.getInstance().acquireUrlByKind("design.solid"); + + private static volatile SolidCollector instance; + + public static SolidCollector getInstance() { + if (instance == null) { + synchronized (SolidCollector.class) { + if (instance == null) { + instance = new SolidCollector(); + } + } + } + return instance; + } + + /** + * 回传文件给云中心,并删除服务端本地文件 + */ + public void sendToCloudCenterAndDeleteFile() { + if (WorkContext.getCurrent().isLocal()) { + return; + } + FineLoggerFactory.getLogger().info("start to get solid content from server..."); + try { + String content = requestContent(); + if (StringUtils.isNotEmpty(content)) { + String cipherText = JSONFactory.createJSON(JSON.OBJECT, content).optString("data"); + if(StringUtils.isNotEmpty(cipherText)){ + Map params = new HashMap<>(); + params.put(ATTR_CIPHER_TEXT, cipherText); + params.put(ATTR_SIGNATURE, String.valueOf(CommonUtils.signature())); + HttpToolbox.post(SOLID_UPLOAD_URL, params); + + String deleteUrl = WorkContext.getCurrent().getPath() + DELETE_URL; + HttpToolbox.post(deleteUrl, getParams()); + } + } + FineLoggerFactory.getLogger().info("send solid content to cloud center success."); + } catch (Exception e) { + FineLoggerFactory.getLogger().info(e.getMessage(), e); + } finally { + String unlockUrl = WorkContext.getCurrent().getPath() + UNLOCK_URL; + try { + HttpToolbox.post(unlockUrl, getParams()); + } catch (IOException e) { + FineLoggerFactory.getLogger().warn(e.getMessage(), e); + } + } + } + + /** + * 获取服务端固化文件内容 + * @return 回传内容 + */ + public String requestContent() throws Exception { + Map params = new HashMap(); + params.put("token", JwtUtils.createDefaultJWT(REQUEST_SUBJECT, TIME_OUT)); + return HttpToolbox.get(WorkContext.getCurrent().getPath() + CONTENT_URL, params); + } + + private Map getParams() { + Map params = new HashMap(); + params.put("token", JwtUtils.createDefaultJWT(REQUEST_SUBJECT, TIME_OUT)); + return params; + } +} diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/socketio/DesignerSocketIO.java b/designer-realize/src/main/java/com/fr/design/mainframe/socketio/DesignerSocketIO.java index 10a1ee0bd..e2b13b1ad 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/socketio/DesignerSocketIO.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/socketio/DesignerSocketIO.java @@ -6,6 +6,7 @@ import com.fr.design.EnvChangeEntrance; import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.loghandler.DesignerLogger; +import com.fr.design.ui.util.UIUtil; import com.fr.event.EventDispatcher; import com.fr.log.FineLoggerFactory; import com.fr.report.RemoteDesignConstants; @@ -22,9 +23,7 @@ import io.socket.client.IO; import io.socket.client.Socket; import io.socket.emitter.Emitter; -import javax.swing.JOptionPane; -import javax.swing.SwingUtilities; -import javax.swing.UIManager; +import javax.swing.*; import java.io.IOException; import java.net.URI; import java.net.URL; @@ -88,7 +87,8 @@ public class DesignerSocketIO { */ if (status != Status.Disconnecting) { try { - SwingUtilities.invokeAndWait(new Runnable() { + UIUtil.invokeAndWaitIfNeeded(new Runnable() { + @Override public void run() { JOptionPane.showMessageDialog( DesignerContext.getDesignerFrame(), diff --git a/designer-realize/src/main/java/com/fr/design/webattr/FToolBar.java b/designer-realize/src/main/java/com/fr/design/webattr/FToolBar.java index 6d92d4789..3941a0f59 100644 --- a/designer-realize/src/main/java/com/fr/design/webattr/FToolBar.java +++ b/designer-realize/src/main/java/com/fr/design/webattr/FToolBar.java @@ -17,7 +17,7 @@ public class FToolBar { } public void setButtonlist(List buttonlist) { - if (buttonlist == null || buttonlist.size() < 0) { + if (buttonlist == null ) { this.buttonlist = new ArrayList(); } else { this.buttonlist = buttonlist; diff --git a/designer-realize/src/main/java/com/fr/design/webattr/ToolBarDragPane.java b/designer-realize/src/main/java/com/fr/design/webattr/ToolBarDragPane.java index c420c04b4..fc3d81352 100644 --- a/designer-realize/src/main/java/com/fr/design/webattr/ToolBarDragPane.java +++ b/designer-realize/src/main/java/com/fr/design/webattr/ToolBarDragPane.java @@ -35,6 +35,7 @@ import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.image.ImageObserver; +import java.util.List; /** * 新的拖拽ToolBar button以实现自定义工具栏 报表web设置那儿的.应该不叫ToolBarDragPane,因为实际没有提供drag功能 @@ -225,6 +226,16 @@ public class ToolBarDragPane extends WidgetToolBarPane { public void setAllEnabled(boolean b) { GUICoreUtils.setEnabled(this, b); isEnabled = b; + removeAllListener(northToolBar.getToolBarButtons()); + } + + private void removeAllListener(List toolBarButtons) { + for (ToolBarButton button : toolBarButtons) { + button.setEnabled(isEnabled); + if (!isEnabled) { + button.removeMouseListener(button); + } + } } /** diff --git a/designer-realize/src/main/java/com/fr/design/webattr/ToolBarPane.java b/designer-realize/src/main/java/com/fr/design/webattr/ToolBarPane.java index db5409e30..fd3140a04 100644 --- a/designer-realize/src/main/java/com/fr/design/webattr/ToolBarPane.java +++ b/designer-realize/src/main/java/com/fr/design/webattr/ToolBarPane.java @@ -124,7 +124,7 @@ public class ToolBarPane extends BasicBeanPane { } private void setToolBar(List list) { - if (list == null || list.size() < 0) { + if (list == null ) { return; } this.removeAll(); diff --git a/designer-realize/src/main/java/com/fr/design/webattr/WebSettingPane.java b/designer-realize/src/main/java/com/fr/design/webattr/WebSettingPane.java index ea8225ea0..59b0d2316 100644 --- a/designer-realize/src/main/java/com/fr/design/webattr/WebSettingPane.java +++ b/designer-realize/src/main/java/com/fr/design/webattr/WebSettingPane.java @@ -122,8 +122,8 @@ public abstract class WebSettingPane extends BasicBeanPane choseComboBox.removeItemListener(itemListener); choseComboBox.setSelectedIndex(SERVER_SET); choseComboBox.addItemListener(itemListener); - checkEnabled(false); populateServerSettings(); + checkEnabled(false); return; } // 模板设置 diff --git a/designer-realize/src/main/java/com/fr/design/write/submit/SmartInsertDBManipulationPane.java b/designer-realize/src/main/java/com/fr/design/write/submit/SmartInsertDBManipulationPane.java index 693722812..dd675ffe3 100644 --- a/designer-realize/src/main/java/com/fr/design/write/submit/SmartInsertDBManipulationPane.java +++ b/designer-realize/src/main/java/com/fr/design/write/submit/SmartInsertDBManipulationPane.java @@ -27,6 +27,7 @@ import com.fr.design.selection.SelectionListener; import com.fr.grid.selection.CellSelection; import com.fr.grid.selection.FloatSelection; import com.fr.grid.selection.Selection; +import com.fr.report.cell.TemplateCellElement; import com.fr.stable.ColumnRow; import com.fr.stable.ColumnRowGroup; import com.fr.stable.StringUtils; @@ -427,7 +428,7 @@ public class SmartInsertDBManipulationPane extends DBManipulationPane { dealSelectColRow(add, cellselection); } else { ColumnRow columnRow = ColumnRow.valueOf(cellselection.getColumn(), cellselection.getRow()); - String allColumnRow = columnRow.toString(); + String allColumnRow = newValue.toString(); if (!allColumnRow.contains(columnRow.toString())) { add.addColumnRow(columnRow); } @@ -454,11 +455,22 @@ public class SmartInsertDBManipulationPane extends DBManipulationPane { newAdd.clear(); for (int i = 0; i < cs; i++) { for (int j = 0; j < rs; j++) { - ColumnRow columnRow = ColumnRow.valueOf(c + i, r + j); - if (!allColumnRow.contains(columnRow.toString())) { - add.addColumnRow(columnRow); + TemplateCellElement cellElement = ePane.getEditingElementCase().getTemplateCellElement(c + i, r + j ); + if (cellElement != null && ((i + c) != 0 || (r + j) != 0)) { + String value = cellElement.toString(); + if (!newAdd.contains(value) && !allColumnRow.contains(value)) { + add.addColumnRow(ColumnRow.valueOf(value)); + } + newAdd.add(value); + } + + if (cellElement == null) { + ColumnRow columnRow = ColumnRow.valueOf(c + i, r + j); + if (!allColumnRow.contains(columnRow.toString())) { + add.addColumnRow(columnRow); + } + newAdd.add(columnRow.toString()); } - newAdd.add(columnRow.toString()); } } int oldSize = oldAdd.size(); diff --git a/designer-realize/src/main/java/com/fr/grid/AbstractGridHeaderMouseHandler.java b/designer-realize/src/main/java/com/fr/grid/AbstractGridHeaderMouseHandler.java index 6c9363b9f..3873ae2e7 100644 --- a/designer-realize/src/main/java/com/fr/grid/AbstractGridHeaderMouseHandler.java +++ b/designer-realize/src/main/java/com/fr/grid/AbstractGridHeaderMouseHandler.java @@ -112,14 +112,18 @@ public abstract class AbstractGridHeaderMouseHandler extends MouseInputAdapter { if (between(evt, tmpSize1, tmpSize2)) { if (index >= dragIndex) { try { - method.invoke(report, dragIndex, FU.valueOfPix(evtOffset(evt, oldEndValueSize), resolution)); + if(method != null) { + method.invoke(report, dragIndex, FU.valueOfPix(evtOffset(evt, oldEndValueSize), resolution)); + } } catch (Exception e) { FineLoggerFactory.getLogger().error(e.getMessage(), e); } //sizeList.set(dragIndex, FU.valueOfPix(evtOffset(evt, oldEndValueSize), resolution)); } else { try { - method.invoke(report, index, FU.valueOfPix(evtOffset(evt, (int) tmpSize1), resolution)); + if(method != null) { + method.invoke(report, index, FU.valueOfPix(evtOffset(evt, (int) tmpSize1), resolution)); + } } catch (Exception e) { FineLoggerFactory.getLogger().error(e.getMessage(), e); } @@ -127,7 +131,9 @@ public abstract class AbstractGridHeaderMouseHandler extends MouseInputAdapter { // from all to do. for (int h = (dragIndex - 1); h > index; h--) { try { - method.invoke(report, h, UNIT.ZERO); + if(method != null) { + method.invoke(report, h, UNIT.ZERO); + } } catch (Exception e) { FineLoggerFactory.getLogger().error(e.getMessage(), e); } diff --git a/designer-realize/src/main/java/com/fr/grid/GridRowUI.java b/designer-realize/src/main/java/com/fr/grid/GridRowUI.java index 44f1fe874..a0245a3d8 100644 --- a/designer-realize/src/main/java/com/fr/grid/GridRowUI.java +++ b/designer-realize/src/main/java/com/fr/grid/GridRowUI.java @@ -7,7 +7,7 @@ import java.awt.geom.Rectangle2D; import javax.swing.JComponent; import javax.swing.UIManager; import javax.swing.plaf.ComponentUI; - +import com.fr.stable.AssistUtils; import com.fr.base.BaseUtils; import com.fr.base.DynamicUnitList; import com.fr.base.GraphHelper; @@ -106,7 +106,7 @@ public class GridRowUI extends ComponentUI { tmpHeight1 += tmpIncreaseHeight; tmpIncreaseHeight = rowHeightList.get(i).toPixD(resolution); // check these row wich height is zero. - tmpHeight2 = tmpIncreaseHeight == 0 ? tmpHeight1 + 1 : tmpHeight1 + tmpIncreaseHeight; + tmpHeight2 = AssistUtils.equals(tmpIncreaseHeight,0d) ? tmpHeight1 + 1 : tmpHeight1 + tmpIncreaseHeight; // check selection bound. Selection sel = reportPane.getSelection(); int[] selectedRows = sel.getSelectedRows(); diff --git a/designer-realize/src/main/java/com/fr/grid/GridUI.java b/designer-realize/src/main/java/com/fr/grid/GridUI.java index c7ea41368..0ccff309f 100644 --- a/designer-realize/src/main/java/com/fr/grid/GridUI.java +++ b/designer-realize/src/main/java/com/fr/grid/GridUI.java @@ -47,6 +47,7 @@ import com.fr.stable.ColumnRow; import com.fr.stable.Constants; import com.fr.stable.script.CalculatorUtils; import com.fr.stable.unit.FU; +import com.fr.stable.AssistUtils; import com.fr.third.antlr.ANTLRException; import javax.swing.JComponent; @@ -617,10 +618,10 @@ public class GridUI extends ComponentUI { tmpLine2D = (Line2D) paginateLineList.get(j);// 直接强制转换,因为List中肯定都是Line2D型的 for (int k = j + 1; k < paginateLineList.size(); k++) { tmpLine2D2 = (Line2D) paginateLineList.get(k); - if (tmpLine2D2.getX1() == tmpLine2D.getX1() - && tmpLine2D2.getX2() == tmpLine2D.getX2() - && tmpLine2D2.getY1() == tmpLine2D.getY1() - && tmpLine2D2.getY2() == tmpLine2D.getY2()) { + if (AssistUtils.equals(tmpLine2D2.getX1() ,tmpLine2D.getX1()) + && AssistUtils.equals(tmpLine2D2.getX2() , tmpLine2D.getX2()) + && AssistUtils.equals(tmpLine2D2.getY1() , tmpLine2D.getY1()) + && AssistUtils.equals(tmpLine2D2.getY2() , tmpLine2D.getY2())) { paginateLineList.remove(k); } } diff --git a/designer-realize/src/main/java/com/fr/poly/PolyComponentsBar.java b/designer-realize/src/main/java/com/fr/poly/PolyComponentsBar.java index d06f77af4..d1c7ddd40 100644 --- a/designer-realize/src/main/java/com/fr/poly/PolyComponentsBar.java +++ b/designer-realize/src/main/java/com/fr/poly/PolyComponentsBar.java @@ -3,8 +3,8 @@ package com.fr.poly; import com.fr.base.BaseUtils; import com.fr.base.chart.BaseChartCollection; import com.fr.base.chart.BaseChartGetter; -import com.fr.base.chart.BaseChartNameID; import com.fr.base.vcs.DesignerMode; +import com.fr.chart.charttypes.ChartTypeManager; import com.fr.design.ChartTypeInterfaceManager; import com.fr.design.constants.UIConstants; import com.fr.design.gui.ibutton.UIButton; @@ -12,7 +12,6 @@ import com.fr.design.gui.itooltip.MultiLineToolTip; import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.mainframe.dnd.SerializableTransferable; -import com.fr.locale.InterProviderFactory; import com.fr.log.FineLoggerFactory; import com.fr.report.poly.PolyECBlock; import com.sun.java.swing.plaf.windows.WindowsLookAndFeel; @@ -54,8 +53,8 @@ public class PolyComponentsBar extends JToolBar { setFloatable(false); setBackground(UIConstants.TOOLBARUI_BACKGROUND); setLayout(FRGUIPaneFactory.create1ColumnGridLayout()); - BaseChartNameID[] typeName = BaseChartGetter.getStaticAllChartBaseNames(); - int typeLen = typeName.length < MAX_BAR_NUM ? typeName.length : MAX_BAR_NUM; + String[] iDs = ChartTypeManager.getInstance().getAllChartIDs(); + int typeLen = iDs.length < MAX_BAR_NUM ? iDs.length : MAX_BAR_NUM; serIcons = new SerIcon[typeLen + 1]; serIcons[0] = new SerIcon( PolyECBlock.class, @@ -64,10 +63,10 @@ public class PolyComponentsBar extends JToolBar { ); this.add(serIcons[0]); for (int i = 0; i < typeLen; i++) { - String chartID = typeName[i].getChartID(); + String chartID = iDs[i]; String iconPath = ChartTypeInterfaceManager.getInstance().getIconPath(chartID); BaseChartCollection chartCollection = BaseChartGetter.createChartCollection(chartID); - serIcons[i + 1] = new SerIcon(chartCollection, InterProviderFactory.getProvider().getLocText(typeName[i].getName()), iconPath); + serIcons[i + 1] = new SerIcon(chartCollection, ChartTypeInterfaceManager.getInstance().getName(chartID), iconPath); this.add(serIcons[i + 1]); } diff --git a/designer-realize/src/main/java/com/fr/poly/PolyDesignUI.java b/designer-realize/src/main/java/com/fr/poly/PolyDesignUI.java index 2bf55e5a0..d12920bfd 100644 --- a/designer-realize/src/main/java/com/fr/poly/PolyDesignUI.java +++ b/designer-realize/src/main/java/com/fr/poly/PolyDesignUI.java @@ -47,7 +47,7 @@ import java.util.ArrayList; */ public class PolyDesignUI extends ComponentUI { private static final Color PAGINATE_LINE_COLOR = Color.GRAY; - + private static final double SCROLL_POINT = 50; private static final int SCROLL_DISTANCE = 15; private static final int TEN = 10; @@ -65,11 +65,11 @@ public class PolyDesignUI extends ComponentUI { /** * 从组件中获取设计器, 并赋值 - * + * * @param c 组件对象 - * + * * @date 2015-2-12-下午2:38:05 - * + * */ public void installUI(JComponent c) { designer = ((PolyArea) c).getPolyDesigner(); @@ -137,7 +137,7 @@ public class PolyDesignUI extends ComponentUI { } } } - + private void changeForbiddenWindowVisibility(BlockCreator creator){ Rectangle pixRec = creator.getBounds(); boolean intersected = designer.intersectsAllBlock(creator); @@ -145,12 +145,12 @@ public class PolyDesignUI extends ComponentUI { creator.getEditor().hideForbiddenWindow(); return; } - + int x = (int) (designer.getAreaLocationX() + pixRec.getCenterX()*time - designer.getHorizontalValue()); int y = (int) (designer.getAreaLocationY() + pixRec.getCenterY()*time - designer.getVerticalValue()); creator.getEditor().showForbiddenWindow(x, y); } - + private Rectangle getCreatorPixRectangle(BlockCreator creator, Point location){ int width = creator.getWidth(); int height = creator.getHeight(); @@ -158,21 +158,22 @@ public class PolyDesignUI extends ComponentUI { int resy = location.y - height / 2 + designer.getVerticalValue(); return new Rectangle(resx, resy, width, height); } - + + @SuppressWarnings("squid:S2142") private void scrollWhenCreatorAtCorner(final BlockCreator creator){ Thread scrollThread = new Thread(new Runnable() { - + @Override public void run() { try { Thread.sleep(100); - + int rightCornerX = creator.getX() + creator.getWidth(); int rightCornerY = creator.getY() + creator.getHeight(); JScrollBar horizonBar = designer.getHorizontalScrollBar(); JScrollBar verticalBar = designer.getVerticalScrollBar(); - + int scrollX = designer.getWidth() + horizonBar.getValue(); int scrollY = designer.getHeight() + verticalBar.getValue(); @@ -180,7 +181,7 @@ public class PolyDesignUI extends ComponentUI { if(rightCornerX > scrollX - SCROLL_POINT){ horizonBar.setValue(horizonBar.getValue() + SCROLL_DISTANCE); } - + if(rightCornerY > scrollY - SCROLL_POINT){ verticalBar.setValue(verticalBar.getValue() + SCROLL_DISTANCE); } @@ -200,7 +201,7 @@ public class PolyDesignUI extends ComponentUI { GraphHelper.drawString(g, convertUnit(y), 0, resy); GraphHelper.drawString(g, convertUnit(x), resx, 10); } - + private String convertUnit(int i) { short unit = designer.getRulerLengthUnit(); // int resolution = ScreenResolution.getScreenResolution(); diff --git a/designer-realize/src/main/java/com/fr/poly/PolyUtils.java b/designer-realize/src/main/java/com/fr/poly/PolyUtils.java index e297a69ad..3f1f270fd 100644 --- a/designer-realize/src/main/java/com/fr/poly/PolyUtils.java +++ b/designer-realize/src/main/java/com/fr/poly/PolyUtils.java @@ -32,6 +32,9 @@ public class PolyUtils { } public static BlockCreator createCreator(TemplateBlock block) { + if (block == null) { + return null; + } Class cls = block.getClass(); Class clazz = blockMapCls.get(cls); if (clazz == null) { @@ -55,7 +58,7 @@ public class PolyUtils { TemplateBlock block = new PolyChartBlock(cc); return createCreator(block); } - + private static TemplateBlock blockGenerate(Class clazz) { TemplateBlock block = null; try { @@ -85,7 +88,7 @@ public class PolyUtils { public static int converty2Designer(PolyDesigner designer, int y) { return y += designer.getVerticalValue(); } - + /** * 获取所处(x,y)位置的聚合块,如果没有,就返回null * @param designer @@ -110,4 +113,4 @@ public class PolyUtils { } return null; } -} \ No newline at end of file +} diff --git a/designer-realize/src/main/java/com/fr/poly/creator/BlockCreator.java b/designer-realize/src/main/java/com/fr/poly/creator/BlockCreator.java index 1d11a783d..5b581f8f1 100644 --- a/designer-realize/src/main/java/com/fr/poly/creator/BlockCreator.java +++ b/designer-realize/src/main/java/com/fr/poly/creator/BlockCreator.java @@ -54,6 +54,9 @@ public abstract class BlockCreator extends JComponent i @Override public boolean equals(Object o) { + if (o == null) { + return false; + } return ComparatorUtils.equals(o.getClass().getName(), this.getClass().getName()); } }); @@ -81,7 +84,7 @@ public abstract class BlockCreator extends JComponent i //默认大小, 报表块默认3列6行, 图表块默认330*240 public abstract UnitRectangle getDefaultBlockBounds(); - + // 不同的Block有不同的显示器 protected abstract JComponent initMonitor(); @@ -97,9 +100,9 @@ public abstract class BlockCreator extends JComponent i /** * 检测按钮状态 - * + * * @date 2015-2-5-上午11:33:46 - * + * */ public abstract void checkButtonEnable(); @@ -134,31 +137,31 @@ public abstract class BlockCreator extends JComponent i /** * 获取当前工具栏组 - * + * * @return 工具栏组 - * + * * @date 2015-2-5-上午11:29:07 - * + * */ public abstract ToolBarDef[] toolbars4Target(); /** * 在Form的工具栏组 - * + * * @return 组件数组 - * + * * @date 2015-2-5-上午11:31:46 - * + * */ public abstract JComponent[] toolBarButton4Form(); - + /** * 获取当前菜单栏组 - * + * * @return 菜单栏组 - * + * * @date 2015-2-5-上午11:29:07 - * + * */ public abstract MenuDef[] menus4Target(); @@ -167,12 +170,12 @@ public abstract class BlockCreator extends JComponent i /** * 获取菜单里的快捷方式数组 - * + * * @return 菜单里的快捷方式数组 - * + * * @date 2015-2-5-上午11:27:08 - * + * */ public abstract ShortCut[] shortcut4TemplateMenu(); -} \ No newline at end of file +} diff --git a/designer-realize/src/main/java/com/fr/poly/creator/BlockEditor.java b/designer-realize/src/main/java/com/fr/poly/creator/BlockEditor.java index 686084177..cac1a0e22 100644 --- a/designer-realize/src/main/java/com/fr/poly/creator/BlockEditor.java +++ b/designer-realize/src/main/java/com/fr/poly/creator/BlockEditor.java @@ -30,20 +30,20 @@ import com.fr.stable.unit.UnitRectangle; * @since 6.5.4 创建于2011-5-5 聚合报表块编辑器 */ public abstract class BlockEditor extends JComponent{ - + protected PolyDesigner designer; protected BlockCreator creator; protected int resolution = ScreenResolution.getScreenResolution(); protected T editComponent; - + private JComponent addHeightTool;// 改变高度的组件 private JComponent addWidthTool; // 改变宽度的组件 private JComponent moveTool; // 拖动聚合块的组件 - + private boolean isDragging; private Absorptionline lineInX; private Absorptionline lineInY; - + private BlockForbiddenWindow forbiddenWindow; public BlockEditor(PolyDesigner designer, BlockCreator creator) { @@ -74,16 +74,16 @@ public abstract class BlockEditor this.moveTool = new BlockControlButton(); this.add(BlockEditorLayout.BOTTOMCORNER, this.moveTool); - + this.forbiddenWindow = new BlockForbiddenWindow(); } - + /** * 重置当前鼠标选中状态 - * + * */ public abstract void resetSelectionAndChooseState(); - + protected abstract T createEffective(); protected abstract Dimension getAddHeigthPreferredSize(); @@ -91,9 +91,9 @@ public abstract class BlockEditor protected abstract Dimension getAddWidthPreferredSize(); protected abstract void initDataChangeListener(); - + protected abstract RowOperationMouseHandler createRowOperationMouseHandler(); - + protected abstract ColumnOperationMouseHandler createColumnOperationMouseHandler(); protected void addColumnRowListeners() { @@ -122,28 +122,31 @@ public abstract class BlockEditor initSize(); LayoutUtils.layoutRootContainer(BlockEditor.this); } - + @Override public boolean equals(Object o) { + if (o == null) { + return false; + } return ComparatorUtils.equals(o.getClass().getName(), this.getClass().getName()); } }); } - + public void setDragging(boolean isDragging) { this.isDragging = isDragging; } - + /** * 当前是否处于拖动状态 - * + * * @return 是否处于拖动状态 - * + * */ public boolean isDragging() { return this.isDragging; } - + public void setXAbsorptionline(Absorptionline line) { this.lineInX = line; } @@ -151,27 +154,27 @@ public abstract class BlockEditor public void setYAbsorptionline(Absorptionline line) { this.lineInY = line; } - - + + /** * 显示禁止重叠窗口 - * + * * @param x x坐标 * @param y y坐标 - * + * */ public void showForbiddenWindow(int x, int y){ this.forbiddenWindow.showWindow(x, y); } - + /** * 隐藏禁止重叠窗口 - * + * */ public void hideForbiddenWindow(){ this.forbiddenWindow.hideWindow(); } - + public void paintAbsorptionline(Graphics g) { if(lineInX != null) { lineInX.paint(g,designer); @@ -202,7 +205,7 @@ public abstract class BlockEditor public Dimension getCornerSize() { return new Dimension(); } - + private class BlockControlButton extends UIButton { @Override public ButtonUI getUI() { @@ -220,4 +223,4 @@ public abstract class BlockEditor }; } } -} \ No newline at end of file +} diff --git a/designer-realize/src/main/java/com/fr/poly/creator/ECBlockEditor.java b/designer-realize/src/main/java/com/fr/poly/creator/ECBlockEditor.java index 674de0e2d..809a246e1 100644 --- a/designer-realize/src/main/java/com/fr/poly/creator/ECBlockEditor.java +++ b/designer-realize/src/main/java/com/fr/poly/creator/ECBlockEditor.java @@ -136,6 +136,7 @@ public class ECBlockEditor extends BlockEditor { * @date 2014-11-24-下午3:48:19 */ public void resetSelectionAndChooseState() { + boolean chooseBlock = designer.isChooseBlock(); designer.setChooseType(SelectionType.INNER); if (DesignerMode.isAuthorityEditing()) { JTemplate jTemplate = HistoryTemplateListPane.getInstance().getCurrentEditingTemplate(); @@ -167,7 +168,9 @@ public class ECBlockEditor extends BlockEditor { conditionAttributesGroupPane.populate(editComponent); EastRegionContainerPane.getInstance().updateCellElementState(isSelectedOneCell()); - + if (chooseBlock) { + EastRegionContainerPane.getInstance().switchTabTo(EastRegionContainerPane.KEY_CELL_ATTR); + } } // 超级链接 diff --git a/designer-realize/src/main/java/com/fr/quickeditor/cellquick/CellFormulaQuickEditor.java b/designer-realize/src/main/java/com/fr/quickeditor/cellquick/CellFormulaQuickEditor.java index 713f9ac3d..ff8a74e57 100644 --- a/designer-realize/src/main/java/com/fr/quickeditor/cellquick/CellFormulaQuickEditor.java +++ b/designer-realize/src/main/java/com/fr/quickeditor/cellquick/CellFormulaQuickEditor.java @@ -103,7 +103,7 @@ public class CellFormulaQuickEditor extends CellQuickEditor { formulaButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { String text = formulaTextField.getText(); - final UIFormula formulaPane = FormulaFactory.createFormulaPane(); + final UIFormula formulaPane = FormulaFactory.createFormulaPaneWhenReserveFormula(); formulaPane.populate(BaseFormula.createFormulaBuilder().build(text)); formulaPane.showLargeWindow(DesignerContext.getDesignerFrame(), new DialogActionAdapter() { @Override diff --git a/designer-realize/src/main/java/com/fr/start/Designer.java b/designer-realize/src/main/java/com/fr/start/Designer.java index 654f396c8..19c9a5dba 100644 --- a/designer-realize/src/main/java/com/fr/start/Designer.java +++ b/designer-realize/src/main/java/com/fr/start/Designer.java @@ -82,6 +82,7 @@ public class Designer extends BaseDesigner { private UIButton saveButton; private UIButton undo; private UIButton redo; + private UIButton[] upToolBar; private UIPreviewButton run; public Designer(String[] args) { @@ -94,7 +95,7 @@ public class Designer extends BaseDesigner { * @param args 参数 */ public static void main(String[] args) { - + StopWatch watch = new StopWatch(); watch.start(); //启动运行时 @@ -210,11 +211,17 @@ public class Designer extends BaseDesigner { */ @Override public UIButton[] createUp() { - return new UIButton[]{createSaveButton(), createUndoButton(), createRedoButton()}; + if (upToolBar == null) { + createSaveButton(); + createUndoButton(); + createRedoButton(); + return upToolBar = new UIButton[]{saveButton, undo, redo}; + } + return upToolBar; } - private UIButton createSaveButton() { + private void createSaveButton() { saveButton = new UIButton(BaseUtils.readIcon("/com/fr/design/images/buttonicon/save.png")); saveButton.setToolTipText(KeySetUtils.SAVE_TEMPLATE.getMenuKeySetName()); saveButton.set4ToolbarButton(); @@ -227,11 +234,10 @@ public class Designer extends BaseDesigner { jt.requestFocus(); } }); - return saveButton; } - private UIButton createUndoButton() { + private void createUndoButton() { undo = new UIButton(BaseUtils.readIcon("/com/fr/design/images/buttonicon/undo.png")); undo.setToolTipText(KeySetUtils.UNDO.getMenuKeySetName()); undo.set4ToolbarButton(); @@ -244,10 +250,9 @@ public class Designer extends BaseDesigner { } } }); - return undo; } - private UIButton createRedoButton() { + private void createRedoButton() { redo = new UIButton(BaseUtils.readIcon("/com/fr/design/images/buttonicon/redo.png")); redo.setToolTipText(KeySetUtils.REDO.getMenuKeySetName()); redo.set4ToolbarButton(); @@ -260,7 +265,6 @@ public class Designer extends BaseDesigner { } } }); - return redo; } private void createRunButton(UILargeToolbar largeToolbar) { diff --git a/designer-realize/src/main/java/com/fr/start/DesignerInitial.java b/designer-realize/src/main/java/com/fr/start/DesignerInitial.java index ea1faa321..dfbdb940d 100644 --- a/designer-realize/src/main/java/com/fr/start/DesignerInitial.java +++ b/designer-realize/src/main/java/com/fr/start/DesignerInitial.java @@ -1,24 +1,53 @@ package com.fr.start; +import com.fr.design.constants.DesignerLaunchStatus; +import com.fr.design.mainframe.DesignerContext; +import com.fr.design.ui.util.UIUtil; +import com.fr.event.Event; +import com.fr.event.EventDispatcher; +import com.fr.event.Listener; +import com.fr.event.Null; + /** * Created by juhaoyu on 2019-06-14. * 设计器上下文 */ public class DesignerInitial { - + private static volatile Designer designer; - - public synchronized static void init(String... args) { - - designer = new Designer(args); + + public static void init(final String... args) { + UIUtil.invokeLaterIfNeeded(new Runnable() { + @Override + public void run() { + designer = new Designer(args); + } + }); } - - public synchronized static void show() { - - if (designer != null) { - designer.show(); - } - //启动画面结束 - SplashContext.getInstance().hide(); + + public static void prepare() { + UIUtil.invokeLaterIfNeeded(new Runnable() { + @Override + public void run() { + if (designer != null) { + designer.show(); + } + } + }); + EventDispatcher.listen(DesignerLaunchStatus.OPEN_LAST_FILE_COMPLETE, new Listener() { + @Override + public void on(Event event, Null param) { + UIUtil.invokeLaterIfNeeded(new Runnable() { + @Override + public void run() { + DesignerContext.getDesignerFrame().setVisible(true); + DesignerContext.getDesignerFrame().resizeFrame(); + //启动画面结束 + SplashContext.getInstance().hide(); + } + }); + DesignerLaunchStatus.setStatus(DesignerLaunchStatus.STARTUP_COMPLETE); + } + }); } } diff --git a/designer-realize/src/main/java/com/fr/start/SplashContext.java b/designer-realize/src/main/java/com/fr/start/SplashContext.java index e45eee48f..b437846b9 100644 --- a/designer-realize/src/main/java/com/fr/start/SplashContext.java +++ b/designer-realize/src/main/java/com/fr/start/SplashContext.java @@ -36,18 +36,19 @@ public class SplashContext { private SplashStrategy splashStrategy; - private String moduleID = ""; + private String moduleId = ""; private int loadingIndex = 0; private String[] loading = new String[]{"..", "....", "......"}; private int fetchOnlineTimes = 0; private String guest = StringUtils.EMPTY; + private boolean hasShowThanks = false; - private ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1, new NamedThreadFactory("SplashContext")); + private ScheduledExecutorService scheduler = Executors + .newScheduledThreadPool(1, new NamedThreadFactory("SplashContext")); private Listener listener; - public static SplashContext getInstance() { return SPLASH_CONTEXT; } @@ -76,11 +77,11 @@ public class SplashContext { * 隐藏启动动画 */ public void hide() { - splashStrategy.hide(); - //取消监听 - EventDispatcher.stopListen(listener); // 窗口关闭后取消定时获取模块信息的timer scheduler.shutdown(); + //取消监听 + EventDispatcher.stopListen(listener); + splashStrategy.hide(); // 一次性 splashStrategy = null; } @@ -91,7 +92,7 @@ public class SplashContext { public void run() { showThanks(); loadingIndex++; - updateModuleLog(moduleID.isEmpty() ? StringUtils.EMPTY : moduleID + loading[loadingIndex % 3]); + updateModuleLog(moduleId.isEmpty() ? StringUtils.EMPTY : moduleId + loading[loadingIndex % 3]); } }, 0, 300, TimeUnit.MILLISECONDS); @@ -99,9 +100,9 @@ public class SplashContext { @Override public void on(Event event, String i18n) { - moduleID = i18n; + moduleId = i18n; loadingIndex++; - updateModuleLog(moduleID.isEmpty() ? StringUtils.EMPTY : moduleID + loading[loadingIndex % 3]); + updateModuleLog(moduleId.isEmpty() ? StringUtils.EMPTY : moduleId + loading[loadingIndex % 3]); } }; EventDispatcher.listen(ModuleEvent.MajorModuleStarting, listener); @@ -149,10 +150,11 @@ public class SplashContext { * 获取10次在线资源,最大时间3秒 */ private void showThanks() { - if (shouldShowThanks()) { + if (shouldShowThanks() && !hasShowThanks) { tryFetchOnline(); if (StringUtils.isNotEmpty(guest)) { updateThanksLog(THANKS + guest); + hasShowThanks = true; } } } diff --git a/designer-realize/src/main/java/com/fr/start/common/SplashCommon.java b/designer-realize/src/main/java/com/fr/start/common/SplashCommon.java new file mode 100644 index 000000000..47597c45d --- /dev/null +++ b/designer-realize/src/main/java/com/fr/start/common/SplashCommon.java @@ -0,0 +1,66 @@ +package com.fr.start.common; + +import com.fr.design.ui.util.UIUtil; +import com.fr.start.SplashStrategy; + + +/** + * 静态启动画面 + * + * @author vito + * @version 10.0 + * Created by vito on 2019年9月16日 + */ +public class SplashCommon implements SplashStrategy { + + private SplashWindow splashWindow; + + @Override + public void show() { + UIUtil.invokeLaterIfNeeded(new Runnable() { + @Override + public void run() { + splashWindow = new SplashWindow(); + splashWindow.setVisible(true); + } + }); + } + + @Override + public void hide() { + UIUtil.invokeLaterIfNeeded(new Runnable() { + @Override + public void run() { + if (splashWindow != null) { + splashWindow.setVisible(false); + splashWindow.dispose(); + } + } + }); + + } + + @Override + public void updateModuleLog(final String text) { + UIUtil.invokeLaterIfNeeded(new Runnable() { + @Override + public void run() { + if (splashWindow != null) { + splashWindow.updateModuleLog(text); + } + } + }); + } + + @Override + public void updateThanksLog(final String text) { + UIUtil.invokeLaterIfNeeded(new Runnable() { + @Override + public void run() { + if (splashWindow != null) { + splashWindow.updateThanksLog(text); + } + } + }); + } +} diff --git a/designer-realize/src/main/java/com/fr/start/common/SplashPane.java b/designer-realize/src/main/java/com/fr/start/common/SplashPane.java new file mode 100644 index 000000000..a96efe76f --- /dev/null +++ b/designer-realize/src/main/java/com/fr/start/common/SplashPane.java @@ -0,0 +1,120 @@ +package com.fr.start.common; + +import com.bulenkov.iconloader.IconLoader; +import com.bulenkov.iconloader.util.JBUI; +import com.fr.base.GraphHelper; +import com.fr.design.ui.util.GraphicsConfig; +import com.fr.stable.GraphDrawHelper; +import com.fr.stable.StringUtils; +import com.fr.stable.os.OperatingSystem; +import com.fr.value.NotNullLazyValue; +import org.jetbrains.annotations.NotNull; + +import javax.swing.*; +import java.awt.*; +import java.util.Locale; + +/** + * 启动画面面板 + * + * @author vito + * @version 10.0 + * Created by vito on 2019/09/12 + */ +public class SplashPane extends JPanel { + + private static String OEM_PATH = "/com/fr/design/images/splash_10.png"; + private static float JBUI_INIT_SCALE = JBUI.scale(1f); + + private static final Color MODULE_COLOR = new Color(255, 255, 255); + private static final int MODULE_INFO_X = uiScale(36); + private static final int MODULE_INFO_Y = uiScale(339); + + private static final Color THANK_COLOR = new Color(255, 255, 255, (int) (0.6 * 255 + 0.5)); + private static final int THANK_INFO_X = uiScale(470); + private static final int FONT_SIZE = uiScale(12); + + private static final int MODULE_INFO_WIDTH = uiScale(150); + private static final int MODULE_INFO_HEIGHT = uiScale(20); + + private static final String ARIAL_FONT_NAME = "Arial"; + private static final String YAHEI_FONT_NAME = "Microsoft YaHei"; + + private String thanksLog = StringUtils.EMPTY; + private String moduleText = StringUtils.EMPTY; + + private static int uiScale(int i) { + return (int) (i * JBUI_INIT_SCALE); + } + + private NotNullLazyValue fontValue = new NotNullLazyValue() { + @NotNull + @Override + protected Font compute() { + Font font = null; + if (OperatingSystem.isWindows()) { + font = createFont(YAHEI_FONT_NAME); + } + if (font == null || isDialogFont(font)) { + font = createFont(ARIAL_FONT_NAME); + } + return font; + } + }; + + @Override + protected void paintComponent(Graphics g) { + super.paintComponent(g); + Icon icon = IconLoader.getIcon(OEM_PATH); + icon.paintIcon(null, g, 0, 0); + paintShowText((Graphics2D) g); + g.dispose(); + } + + + protected void paintShowText(Graphics2D g) { + GraphicsConfig config = new GraphicsConfig(g).setupAAPainting(); + + g.setPaint(MODULE_COLOR); + g.setFont(fontValue.getValue()); + + //加载模块信息 + GraphDrawHelper.drawString(g, moduleText, MODULE_INFO_X, MODULE_INFO_Y); + + //感谢用户信息 + if (StringUtils.isNotEmpty(thanksLog)) { + g.setPaint(THANK_COLOR); + GraphHelper.drawString(g, thanksLog, THANK_INFO_X, MODULE_INFO_Y); + } + config.restore(); + } + + Dimension getSplashDimension() { + Icon icon = IconLoader.getIcon(OEM_PATH); + return new Dimension(icon.getIconWidth(), icon.getIconHeight()); + } + + private boolean isDialogFont(Font font) { + return Font.DIALOG.equals(font.getFamily(Locale.US)); + } + + private Font createFont(String fontName) { + return new Font(fontName, Font.PLAIN, FONT_SIZE); + } + + /** + * 设置在启动过程中, 动态改变的文本, 如 当前启动的模块信息 + * + * @param text 指定的文本 + */ + void updateModuleLog(String text) { + moduleText = text; + repaint(MODULE_INFO_X, MODULE_INFO_Y - FONT_SIZE, MODULE_INFO_WIDTH, MODULE_INFO_HEIGHT); + } + + void updateThanksLog(String text) { + thanksLog = text; + repaint(THANK_INFO_X, MODULE_INFO_Y - FONT_SIZE, MODULE_INFO_WIDTH, MODULE_INFO_HEIGHT); + } + +} diff --git a/designer-realize/src/main/java/com/fr/start/common/SplashWindow.java b/designer-realize/src/main/java/com/fr/start/common/SplashWindow.java new file mode 100644 index 000000000..58a27dd7f --- /dev/null +++ b/designer-realize/src/main/java/com/fr/start/common/SplashWindow.java @@ -0,0 +1,70 @@ +package com.fr.start.common; + +import com.fr.design.utils.gui.GUICoreUtils; +import com.fr.stable.os.OperatingSystem; +import com.sun.awt.AWTUtilities; + +import javax.swing.*; +import java.awt.*; + +/** + * 启动画面窗口 + * + * @author vito + * @version 10.0 + * Created by vito on 2019/10/16 + */ +public class SplashWindow extends JFrame { + + private SplashPane splash; + + public SplashWindow() { + // alex:必须设置这个属性为true,才可以用透明背景 + System.setProperty("sun.java2d.noddraw", "true"); + + //slash pane + this.splash = new SplashPane(); + + splash.setBackground(null); + this.setContentPane(splash); + this.setSize(splash.getSplashDimension()); + + this.setAlwaysOnTop(false); + this.setUndecorated(true); + AWTUtilities.setWindowOpaque(this, false); + + //使窗体背景透明 + if (OperatingSystem.isWindows()) { + this.setBackground(new Color(0, 0, 0, 0)); + } + + GUICoreUtils.centerWindow(this); + } + + /** + * 注销窗口 + */ + @Override + public void dispose() { + super.dispose(); + } + + /** + * 设置在启动过程中, 动态改变的文本, 如 当前启动的模块信息 + * + * @param text 指定的文本 + */ + void updateModuleLog(String text) { + splash.updateModuleLog(text); + } + + void updateThanksLog(String text) { + splash.updateThanksLog(text); + } + + + public static void main(String[] args) { + SplashWindow splashWindow = new SplashWindow(); + splashWindow.setVisible(true); + } +} diff --git a/designer-realize/src/main/java/com/fr/start/fx/PrismImageLoader2.java b/designer-realize/src/main/java/com/fr/start/fx/PrismImageLoader2.java index 470b382c9..89509b994 100644 --- a/designer-realize/src/main/java/com/fr/start/fx/PrismImageLoader2.java +++ b/designer-realize/src/main/java/com/fr/start/fx/PrismImageLoader2.java @@ -1,6 +1,7 @@ package com.fr.start.fx; import com.fr.concurrent.NamedThreadFactory; +import com.fr.log.FineLoggerFactory; import com.sun.javafx.iio.ImageFrame; import com.sun.javafx.iio.ImageLoadListener; import com.sun.javafx.iio.ImageLoader; @@ -79,6 +80,7 @@ class PrismImageLoader2 implements com.sun.javafx.tk.ImageLoader { } @Override + @SuppressWarnings("squid:S2142") public PlatformImage getFrame(int index) { while (images[index] == null) { synchronized (this) { @@ -86,7 +88,7 @@ class PrismImageLoader2 implements com.sun.javafx.tk.ImageLoader { try { this.wait(); } catch (InterruptedException e) { - e.printStackTrace(); + FineLoggerFactory.getLogger().error(e.getMessage(), e); } } } @@ -125,6 +127,7 @@ class PrismImageLoader2 implements com.sun.javafx.tk.ImageLoader { } + @SuppressWarnings("squid:S244") private void loadAll(InputStream stream, int w, int h, boolean preserveRatio, boolean smooth) { ImageLoadListener listener = new PrismLoadListener(); diff --git a/designer-realize/src/main/java/com/fr/start/fx/SplashFxWindow.java b/designer-realize/src/main/java/com/fr/start/fx/SplashFxWindow.java index 073cee7ae..00ad51293 100644 --- a/designer-realize/src/main/java/com/fr/start/fx/SplashFxWindow.java +++ b/designer-realize/src/main/java/com/fr/start/fx/SplashFxWindow.java @@ -55,6 +55,7 @@ public class SplashFxWindow extends Application { * * @return 运行实例 */ + @SuppressWarnings("squid:S2142") public static SplashFxWindow waitForStartUpTest() { try { LATCH.await(); diff --git a/designer-realize/src/main/java/com/fr/start/module/DesignerActivator.java b/designer-realize/src/main/java/com/fr/start/module/DesignerActivator.java index 31e818b3e..822a332f3 100644 --- a/designer-realize/src/main/java/com/fr/start/module/DesignerActivator.java +++ b/designer-realize/src/main/java/com/fr/start/module/DesignerActivator.java @@ -25,6 +25,7 @@ import com.fr.design.actions.insert.flot.FormulaFloatAction; import com.fr.design.actions.insert.flot.ImageFloatAction; import com.fr.design.actions.insert.flot.TextBoxFloatAction; import com.fr.design.bridge.DesignToolbarProvider; +import com.fr.design.constants.DesignerLaunchStatus; import com.fr.design.form.parameter.FormParaDesigner; import com.fr.design.fun.ElementUIProvider; import com.fr.design.gui.controlpane.NameObjectCreator; @@ -98,8 +99,8 @@ import com.fr.stable.xml.ObjectXMLWriterFinder; import com.fr.start.BBSGuestPaneProvider; import com.fr.xml.ReportXMLUtils; -import java.awt.Image; -import java.awt.image.BufferedImage; +import java.awt.*; +import java.awt.image.*; import java.util.ArrayList; import java.util.List; import java.util.Set; @@ -115,7 +116,7 @@ public class DesignerActivator extends Activator { @Override public void start() { - List markers = rightCollectMutable(InterMutableKey.Path); + List markers = findMutable(InterMutableKey.Path); for (LocaleMarker marker : markers) { if (marker.match(LocaleScope.DESIGN)) { DesignI18nImpl.getInstance().addResource(marker.getPath()); @@ -128,7 +129,12 @@ public class DesignerActivator extends Activator { storePassport(); AlphaFineHelper.switchConfig4Locale(); } - + + @Override + public void afterAllStart() { + DesignerLaunchStatus.setStatus(DesignerLaunchStatus.DESIGNER_INIT_COMPLETE); + } + private void loadLogAppender() { logHandler = new LogHandler() { final DesignerLogAppender logAppender = new DesignerLogAppender(); diff --git a/designer-realize/src/main/java/com/fr/start/module/DesignerInitActivator.java b/designer-realize/src/main/java/com/fr/start/module/DesignerInitActivator.java deleted file mode 100644 index e9bea2692..000000000 --- a/designer-realize/src/main/java/com/fr/start/module/DesignerInitActivator.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.fr.start.module; - -import com.fr.module.Activator; -import com.fr.start.DesignerInitial; - -/** - * Created by juhaoyu on 2019-06-14. - */ -public class DesignerInitActivator extends Activator { - - @Override - public void start() { - - DesignerInitial.init(upFindSingleton(StartupArgs.class).get()); - } - - @Override - public void stop() { - - } -} diff --git a/designer-realize/src/main/java/com/fr/start/module/DesignerShowActivator.java b/designer-realize/src/main/java/com/fr/start/module/DesignerShowActivator.java index 33ef015c1..d41db181f 100644 --- a/designer-realize/src/main/java/com/fr/start/module/DesignerShowActivator.java +++ b/designer-realize/src/main/java/com/fr/start/module/DesignerShowActivator.java @@ -10,16 +10,16 @@ import com.fr.start.DesignerInitial; * Created by juhaoyu on 2019-06-14. */ public class DesignerShowActivator extends Activator { - + @Override public void start() { - - EventDispatcher.fire(ModuleEvent.MajorModuleStarting, Toolkit.i18nText("Fine-Design_Module_Name_Designer")); - DesignerInitial.show(); + DesignerInitial.init(findSingleton(StartupArgs.class).get()); + EventDispatcher.asyncFire(ModuleEvent.MajorModuleStarting, Toolkit.i18nText("Fine-Design_Module_Name_Designer")); + DesignerInitial.prepare(); } - + @Override public void stop() { - + // void } } diff --git a/designer-realize/src/main/java/com/fr/start/module/DesignerStartup.java b/designer-realize/src/main/java/com/fr/start/module/DesignerStartup.java index b1ad72251..c43fc8be8 100644 --- a/designer-realize/src/main/java/com/fr/start/module/DesignerStartup.java +++ b/designer-realize/src/main/java/com/fr/start/module/DesignerStartup.java @@ -1,11 +1,33 @@ package com.fr.start.module; +import com.fr.concurrent.NamedThreadFactory; +import com.fr.design.DesignerEnvManager; +import com.fr.design.fun.OemProcessor; +import com.fr.design.fun.impl.GlobalListenerProviderManager; +import com.fr.design.mainframe.messagecollect.StartupMessageCollector; +import com.fr.design.ui.util.UIUtil; +import com.fr.design.utils.DesignUtils; +import com.fr.design.utils.DesignerPort; +import com.fr.general.ComparatorUtils; +import com.fr.log.FineLoggerFactory; import com.fr.module.Activator; import com.fr.record.analyzer.EnableMetrics; import com.fr.record.analyzer.Metrics; -import com.fr.runtime.FineRuntime; +import com.fr.stable.BuildContext; +import com.fr.stable.ProductConstants; +import com.fr.stable.StableUtils; +import com.fr.start.OemHandler; import com.fr.start.ServerStarter; +import com.fr.start.SplashContext; +import com.fr.start.SplashStrategy; +import com.fr.start.common.SplashCommon; +import com.fr.start.server.FineEmbedServer; +import com.fr.value.NotNullLazyValue; +import org.jetbrains.annotations.NotNull; + +import java.io.File; +import java.util.concurrent.ExecutorService; /** * Created by juhaoyu on 2018/1/8. @@ -13,29 +35,117 @@ import com.fr.start.ServerStarter; @EnableMetrics public class DesignerStartup extends Activator { + private NotNullLazyValue startupArgsValue = new NotNullLazyValue() { + @NotNull + @Override + protected StartupArgs compute() { + return findSingleton(StartupArgs.class); + } + }; + + @Override + public void beforeAllStart() { + BuildContext.setBuildFilePath("/com/fr/stable/build.properties"); + // 检查是否是-Ddebug = true 启动 并切换对应的端口以及环境配置文件 + checkDebugStart(); + if (DesignUtils.isStarted()) { + // 如果端口被占用了 说明程序已经运行了一次,也就是说,已经建立一个监听服务器,现在只要给服务器发送命令就好了 + final String[] args = startupArgsValue.getValue().get(); + DesignUtils.clientSend(args); + FineLoggerFactory.getLogger().info("The Designer Has Been Started"); + System.exit(0); + return; + } + // 快快显示启动画面 + UIUtil.invokeAndWaitIfNeeded(new Runnable() { + @Override + public void run() { + SplashContext.getInstance().registerSplash(createSplash()); + SplashContext.getInstance().show(); + } + }); + } + @Override @Metrics public void start() { - startSub(PreStartActivator.class); - getSub("parallel").start(); + startSub(DesignerWorkspaceActivator.class); //designer模块启动好后,查看demo - browserDemo(); - startSub(DesignerShowActivator.class); - startSub(StartFinishActivator.class); - FineRuntime.startFinish(); + browserDemoIfNeeded(); + startupEmbedServerIfNeeded(); + } + + private void startupEmbedServerIfNeeded() { + if (DesignerEnvManager.getEnvManager().isEmbedServerLazyStartup() + || FineEmbedServer.isRunning()) { + return; + } + ExecutorService service = newSingleThreadExecutor(new NamedThreadFactory("FineEmbedServerStart")); + service.submit(new Runnable() { + @Override + public void run() { + FineEmbedServer.start(); + } + }); + service.shutdown(); } - private void browserDemo() { + @Override + public void afterAllStart() { + GlobalListenerProviderManager.getInstance().init(); + // 启动日志收集 + StartupMessageCollector.getInstance().recordStartupLog(); + } - if (getModule().leftFindSingleton(StartupArgs.class) != null && getModule().leftFindSingleton(StartupArgs.class).isDemo()) { + private SplashStrategy createSplash() { + OemProcessor oemProcessor = OemHandler.findOem(); + if (oemProcessor != null) { + SplashStrategy splashStrategy = null; + try { + splashStrategy = oemProcessor.createSplashStrategy(); + } catch (Throwable e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } + if (splashStrategy != null) { + return splashStrategy; + } + } + + return new SplashCommon(); + } + + private void browserDemoIfNeeded() { + + if (startupArgsValue.getValue().isDemo()) { ServerStarter.browserDemoURL(); } } + /** + * 在VM options里加入-Ddebug=true激活 + */ + private void checkDebugStart() { + + if (ComparatorUtils.equals("true", System.getProperty("debug"))) { + setDebugEnv(); + } + } + + /** + * 端口改一下,环境配置文件改一下。便于启动两个设计器,进行对比调试 + */ + private void setDebugEnv() { + + DesignUtils.setPort(DesignerPort.DEBUG_MESSAGE_PORT); + DesignerEnvManager.setEnvFile(new File(StableUtils.pathJoin( + ProductConstants.getEnvHome(), + ProductConstants.APP_NAME + "Env_debug.xml" + ))); + } @Override public void stop() { - + // void } } diff --git a/designer-realize/src/main/java/com/fr/start/module/DesignerWorkspaceActivator.java b/designer-realize/src/main/java/com/fr/start/module/DesignerWorkspaceActivator.java index e652cda6f..f5231eafe 100644 --- a/designer-realize/src/main/java/com/fr/start/module/DesignerWorkspaceActivator.java +++ b/designer-realize/src/main/java/com/fr/start/module/DesignerWorkspaceActivator.java @@ -6,12 +6,10 @@ import com.fr.event.Event; import com.fr.event.Listener; import com.fr.module.Activator; import com.fr.start.server.FineEmbedServer; -import com.fr.workspace.WorkContext; import com.fr.workspace.Workspace; import com.fr.workspace.WorkspaceEvent; import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; /** * Created by juhaoyu on 2019-06-14. @@ -22,7 +20,6 @@ public class DesignerWorkspaceActivator extends Activator { public void start() { registerEnvListener(); - startServer(WorkContext.getCurrent()); } /** @@ -36,7 +33,7 @@ public class DesignerWorkspaceActivator extends Activator { @Override public void on(Event event, Workspace current) { - getSub(EnvBasedModule.class).stop(); + stopSub(EnvBasedModule.class); } }); /*切换环境后,重新启动所有相关模块,最先执行*/ @@ -45,8 +42,7 @@ public class DesignerWorkspaceActivator extends Activator { @Override public void on(Event event, Workspace current) { - getSub(EnvBasedModule.class).start(); - startServer(current); + startSub(EnvBasedModule.class); } }); /*切换环境前,存储一下打开的所有文件对象,要先于 关闭相关模块部分 被触发*/ @@ -74,7 +70,8 @@ public class DesignerWorkspaceActivator extends Activator { // 切换后的环境是本地环境才启动内置服务器 if (current.isLocal()) { - ExecutorService service = Executors.newSingleThreadExecutor(new NamedThreadFactory("DesignerWorkspaceActivator")); + ExecutorService service = newSingleThreadExecutor( + new NamedThreadFactory("DesignerWorkspaceActivator")); service.submit(new Runnable() { @Override diff --git a/designer-realize/src/main/java/com/fr/start/module/DesignerWorkspaceProvider.java b/designer-realize/src/main/java/com/fr/start/module/DesignerWorkspaceProvider.java index e1779c3e2..ee57bb551 100644 --- a/designer-realize/src/main/java/com/fr/start/module/DesignerWorkspaceProvider.java +++ b/designer-realize/src/main/java/com/fr/start/module/DesignerWorkspaceProvider.java @@ -7,8 +7,10 @@ import com.fr.design.env.DesignerWorkspaceGenerator; import com.fr.design.env.DesignerWorkspaceInfo; import com.fr.log.FineLoggerFactory; import com.fr.module.Activator; +import com.fr.value.NotNullLazyValue; import com.fr.workspace.WorkContext; import com.fr.workspace.Workspace; +import org.jetbrains.annotations.NotNull; /** @@ -17,12 +19,20 @@ import com.fr.workspace.Workspace; */ public class DesignerWorkspaceProvider extends Activator { + private NotNullLazyValue startupArgs = new NotNullLazyValue() { + @NotNull + @Override + protected StartupArgs compute() { + return findSingleton(StartupArgs.class); + } + }; + @Override public void start() { //检查环境 DesignerEnvManager.checkNameEnvMap(); - if (getModule().leftFindSingleton(StartupArgs.class) != null && getModule().leftFindSingleton(StartupArgs.class).isDemo()) { + if (startupArgs.getValue().isDemo()) { DesignerEnvManager.getEnvManager().setCurrentEnv2Default(); } else { try { @@ -40,12 +50,15 @@ public class DesignerWorkspaceProvider extends Activator { EnvChangeEntrance.getInstance().dealEvnExceptionWhenStartDesigner(); } } - DesignerLaunchStatus.setStatus(DesignerLaunchStatus.WORKSPACE_INIT_COMPLETE); } @Override public void stop() { - + // void } + @Override + public void afterAllStart() { + DesignerLaunchStatus.setStatus(DesignerLaunchStatus.WORKSPACE_INIT_COMPLETE); + } } diff --git a/designer-realize/src/main/java/com/fr/start/module/PreStartActivator.java b/designer-realize/src/main/java/com/fr/start/module/PreStartActivator.java index 630f96b20..d3aec5897 100644 --- a/designer-realize/src/main/java/com/fr/start/module/PreStartActivator.java +++ b/designer-realize/src/main/java/com/fr/start/module/PreStartActivator.java @@ -2,28 +2,13 @@ package com.fr.start.module; import com.fr.design.DesignerEnvManager; import com.fr.design.RestartHelper; -import com.fr.design.fun.OemProcessor; import com.fr.design.i18n.Toolkit; import com.fr.design.utils.DesignUtils; -import com.fr.design.utils.DesignerPort; import com.fr.event.EventDispatcher; import com.fr.general.CloudCenter; -import com.fr.general.ComparatorUtils; import com.fr.general.GeneralContext; -import com.fr.log.FineLoggerFactory; import com.fr.module.Activator; import com.fr.module.ModuleEvent; -import com.fr.stable.BuildContext; -import com.fr.stable.OperatingSystem; -import com.fr.stable.ProductConstants; -import com.fr.stable.StableUtils; -import com.fr.start.OemHandler; -import com.fr.start.SplashContext; -import com.fr.start.SplashStrategy; -import com.fr.start.fx.SplashFx; -import com.fr.start.jni.SplashMac; - -import java.io.File; /** * Created by juhaoyu on 2018/1/8. @@ -32,24 +17,7 @@ public class PreStartActivator extends Activator { @Override public void start() { - - BuildContext.setBuildFilePath("/com/fr/stable/build.properties"); - // 如果端口被占用了 说明程序已经运行了一次,也就是说,已经建立一个监听服务器,现在只要给服务器发送命令就好了 - final String[] args = getModule().upFindSingleton(StartupArgs.class).get(); - // 检查是否是-Ddebug = true 启动 并切换对应的端口以及环境配置文件 - checkDebugStart(); - if (DesignUtils.isStarted()) { - DesignUtils.clientSend(args); - FineLoggerFactory.getLogger().info("The Designer Has Been Started"); - System.exit(0); - return; - } - RestartHelper.deleteRecordFilesWhenStart(); - - SplashContext.getInstance().registerSplash(createSplash()); - - SplashContext.getInstance().show(); //初始化 EventDispatcher.fire(ModuleEvent.MajorModuleStarting, Toolkit.i18nText("Fine-Design_Basic_Initializing")); // 完成初始化 @@ -64,38 +32,7 @@ public class PreStartActivator extends Activator { @Override public void stop() { - - } - - private void checkDebugStart() { - - if (isDebug()) { - setDebugEnv(); - } - } - - - /** - * 在VM options里加入-Ddebug=true激活 - * - * @return isDebug - */ - private boolean isDebug() { - - return ComparatorUtils.equals("true", System.getProperty("debug")); - } - - - //端口改一下,环境配置文件改一下。便于启动两个设计器,进行对比调试 - private void setDebugEnv() { - - DesignUtils.setPort(DesignerPort.DEBUG_MESSAGE_PORT); - String debugXMlFilePath = StableUtils.pathJoin( - ProductConstants.getEnvHome(), - ProductConstants.APP_NAME + "Env_debug.xml" - ); - DesignerEnvManager.setEnvFile( - new File(debugXMlFilePath)); + // void } private void initLanguage() { @@ -107,27 +44,4 @@ public class PreStartActivator extends Activator { return new String[]{".cpt", ".xls", ".xlsx", ".frm", ".form", ".cht", ".chart"}; } - - private SplashStrategy createSplash() { - - OemProcessor oemProcessor = OemHandler.findOem(); - if (oemProcessor != null) { - SplashStrategy splashStrategy = null; - try { - splashStrategy = oemProcessor.createSplashStrategy(); - } catch (Throwable e) { - FineLoggerFactory.getLogger().error(e.getMessage(), e); - } - if (splashStrategy != null) { - return splashStrategy; - } - } - // 这里可以开接口加载自定义启动画面 - if (OperatingSystem.isWindows()) { - return new SplashFx(); - } else if (OperatingSystem.isMacOS()) { - return new SplashMac(); - } - return new SplashFx(); - } } diff --git a/designer-realize/src/main/java/com/fr/start/module/StartFinishActivator.java b/designer-realize/src/main/java/com/fr/start/module/StartFinishActivator.java deleted file mode 100644 index 41f662a88..000000000 --- a/designer-realize/src/main/java/com/fr/start/module/StartFinishActivator.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.fr.start.module; - -import com.fr.design.fun.impl.GlobalListenerProviderManager; -import com.fr.module.Activator; - -/** - * Created by juhaoyu on 2018/1/8. - */ -public class StartFinishActivator extends Activator { - - @Override - public void start() { - GlobalListenerProviderManager.getInstance().init(); - } - - @Override - public void stop() { - } -} diff --git a/designer-realize/src/main/resources/com/fr/design/images/splash_10.png b/designer-realize/src/main/resources/com/fr/design/images/splash_10.png new file mode 100644 index 000000000..088d124b9 Binary files /dev/null and b/designer-realize/src/main/resources/com/fr/design/images/splash_10.png differ diff --git a/designer-realize/src/main/resources/com/fr/design/images/splash_10@2x.png b/designer-realize/src/main/resources/com/fr/design/images/splash_10@2x.png new file mode 100644 index 000000000..0ce87ae6f Binary files /dev/null and b/designer-realize/src/main/resources/com/fr/design/images/splash_10@2x.png differ