diff --git a/designer-base/src/main/java/com/fr/design/EnvChangeEntrance.java b/designer-base/src/main/java/com/fr/design/EnvChangeEntrance.java index 110b97563c..93f2824547 100644 --- a/designer-base/src/main/java/com/fr/design/EnvChangeEntrance.java +++ b/designer-base/src/main/java/com/fr/design/EnvChangeEntrance.java @@ -22,9 +22,9 @@ import com.fr.start.server.ServerTray; import com.fr.workspace.WorkContext; import com.fr.workspace.WorkContextCallback; import com.fr.workspace.Workspace; -import com.fr.workspace.connect.AuthException; import com.fr.workspace.connect.WorkspaceConnectionInfo; import com.fr.workspace.engine.channel.http.FunctionalHttpRequest; +import com.fr.workspace.engine.exception.WorkspaceAuthException; import javax.swing.JOptionPane; import javax.swing.SwingUtilities; @@ -120,7 +120,7 @@ public class EnvChangeEntrance { } }); - } catch (AuthException | RegistEditionException e) { + } catch (WorkspaceAuthException | RegistEditionException e) { // String title = Toolkit.i18nText("Fine-Design_Basic_Remote_Connect_Auth_Failed"); // String title = Toolkit.i18nText("Fine-Design_Basic_Lic_Does_Not_Support_Remote"); strategy.showTip(new PopTip() { diff --git a/designer-base/src/main/java/com/fr/design/actions/community/FacebookFansAction.java b/designer-base/src/main/java/com/fr/design/actions/community/FacebookFansAction.java new file mode 100644 index 0000000000..9ab799bccd --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/actions/community/FacebookFansAction.java @@ -0,0 +1,41 @@ +package com.fr.design.actions.community; + +import com.fr.design.menu.MenuKeySet; +import com.fr.design.utils.BrowseUtils; +import com.fr.general.CloudCenter; +import com.fr.general.IOUtils; + +import javax.swing.KeyStroke; +import java.awt.event.ActionEvent; + +public class FacebookFansAction extends UpAction { + + public FacebookFansAction() { + this.setMenuKeySet(FACEBOOKFANS); + this.setName(getMenuKeySet().getMenuName()); + this.setMnemonic(getMenuKeySet().getMnemonic()); + this.setSmallIcon(IOUtils.readIcon("/com/fr/design/images/bbs/facebook.png")); + } + + @Override + public void actionPerformed(ActionEvent arg0) { + BrowseUtils.browser(CloudCenter.getInstance().acquireUrlByKind("facebook.fans.tw")); + } + + public static final MenuKeySet FACEBOOKFANS = new MenuKeySet() { + @Override + public char getMnemonic() { + return 'F'; + } + + @Override + public String getMenuName() { + return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Community_FaceBook_Fans"); + } + + @Override + public KeyStroke getKeyStroke() { + return null; + } + }; +} diff --git a/designer-base/src/main/java/com/fr/design/actions/file/PreferenceAction.java b/designer-base/src/main/java/com/fr/design/actions/file/PreferenceAction.java index eb652abb81..08273202d1 100644 --- a/designer-base/src/main/java/com/fr/design/actions/file/PreferenceAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/file/PreferenceAction.java @@ -4,9 +4,10 @@ import com.fr.design.DesignerEnvManager; import com.fr.design.actions.UpdateAction; import com.fr.design.dialog.BasicDialog; import com.fr.design.dialog.DialogActionAdapter; -import com.fr.design.file.HistoryTemplateListPane; +import com.fr.design.file.HistoryTemplateListCache; import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.DesignerFrame; +import com.fr.design.mainframe.DesignerFrameFileDealerPane; import com.fr.design.mainframe.JTemplate; import com.fr.design.menu.KeySetUtils; @@ -38,9 +39,10 @@ public class PreferenceAction extends UpdateAction { preferencePane.update(DesignerEnvManager.getEnvManager()); DesignerEnvManager.loadLogSetting(); DesignerEnvManager.getEnvManager().saveXMLFile(); - JTemplate jt = HistoryTemplateListPane.getInstance().getCurrentEditingTemplate(); + JTemplate jt = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); jt.refreshToolArea(); preferencePane.showRestartDialog(); + DesignerFrameFileDealerPane.getInstance().refreshDockingView(); } }); 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 9775de2f5f..447e6652b8 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 @@ -138,6 +138,7 @@ public class PreferencePane extends BasicPane { private UISpinner cachingTemplateSpinner; private UICheckBox openDebugComboBox; private UICheckBox useOptimizedUPMCheckbox; + private UICheckBox useUniverseDBMCheckbox; private UICheckBox joinProductImproveCheckBox; private UICheckBox autoPushUpdateCheckBox; @@ -197,6 +198,11 @@ public class PreferencePane extends BasicPane { 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")); + 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")); improvePane.add(joinProductImproveCheckBox); @@ -217,7 +223,7 @@ public class PreferencePane extends BasicPane { JPanel vcsPane = FRGUIPaneFactory.createVerticalTitledBorderPane(Toolkit.i18nText("Fine-Design_Vcs_Title")); generalPane.add(vcsPane); remindVcsLabel = new UILabel(Toolkit.i18nText("Fine-Design_Vcs_Remind")); - remindVcsLabel.setVisible(!VcsHelper.needInit()); + remindVcsLabel.setVisible(!VcsHelper.getInstance().needInit()); vcsEnableCheckBox = new UICheckBox(Toolkit.i18nText("Fine-Design_Vcs_SaveAuto")); saveCommitCheckBox = new UICheckBox(Toolkit.i18nText("Fine-Design_Vcs_No_Delete")); saveIntervalEditor = new IntegerEditor(60); @@ -602,7 +608,7 @@ public class PreferencePane extends BasicPane { defaultStringToFormulaBox.setSelected(false); } VcsConfigManager vcsConfigManager = designerEnvManager.getVcsConfigManager(); - if (VcsHelper.needInit()) { + if (VcsHelper.getInstance().needInit()) { vcsEnableCheckBox.setSelected(vcsConfigManager.isVcsEnable()); } else { vcsEnableCheckBox.setEnabled(false); @@ -639,6 +645,8 @@ public class PreferencePane extends BasicPane { openDebugComboBox.setSelected(designerEnvManager.isOpenDebug()); useOptimizedUPMCheckbox.setSelected(ServerPreferenceConfig.getInstance().isUseOptimizedUPM()); + useUniverseDBMCheckbox.setSelected(ServerPreferenceConfig.getInstance().isUseUniverseDBM()); + this.oracleSpace.setSelected(designerEnvManager.isOracleSystemSpace()); this.cachingTemplateSpinner.setValue(designerEnvManager.getCachingTemplateLimit()); this.joinProductImproveCheckBox.setSelected(designerEnvManager.isJoinProductImprove()); @@ -737,6 +745,7 @@ public class PreferencePane extends BasicPane { @Override public void run() { ServerPreferenceConfig.getInstance().setUseOptimizedUPM(useOptimizedUPMCheckbox.isSelected()); + ServerPreferenceConfig.getInstance().setUseUniverseDBM(useUniverseDBMCheckbox.isSelected()); } @Override diff --git a/designer-base/src/main/java/com/fr/design/actions/help/TutorialAction.java b/designer-base/src/main/java/com/fr/design/actions/help/TutorialAction.java index 58221a03a8..f5dc26f107 100644 --- a/designer-base/src/main/java/com/fr/design/actions/help/TutorialAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/help/TutorialAction.java @@ -1,7 +1,6 @@ package com.fr.design.actions.help; import com.fr.base.BaseUtils; -import com.fr.base.Utils; import com.fr.design.actions.UpdateAction; import com.fr.design.menu.MenuKeySet; import com.fr.general.CloudCenter; @@ -10,9 +9,7 @@ import com.fr.general.http.HttpToolbox; import com.fr.log.FineLoggerFactory; import com.fr.stable.CommonUtils; import com.fr.stable.ProductConstants; -import com.fr.stable.StableUtils; import com.fr.stable.StringUtils; -import com.fr.stable.os.OperatingSystem; import com.fr.third.org.apache.http.HttpStatus; import com.fr.third.org.apache.http.StatusLine; import com.fr.third.org.apache.http.client.methods.HttpGet; @@ -21,12 +18,10 @@ import javax.swing.KeyStroke; import java.awt.Desktop; import java.awt.event.ActionEvent; import java.awt.event.KeyEvent; -import java.io.File; -import java.io.IOException; import java.net.URI; public class TutorialAction extends UpdateAction { - + public TutorialAction() { this.setMenuKeySet(HELP_TUTORIAL); this.setName(getMenuKeySet().getMenuName()); @@ -35,27 +30,6 @@ public class TutorialAction extends UpdateAction { this.setAccelerator(getMenuKeySet().getKeyStroke()); } - private void nativeExcuteMacInstallHomePrograms(String appName) { - String installHome = StableUtils.getInstallHome(); - if(installHome == null) { - FineLoggerFactory.getLogger().error("Can not find the install home, please check it."); - } else { - String appPath = StableUtils.pathJoin(new String[]{installHome, "bin", appName}); - if(!(new File(appPath)).exists()) { - FineLoggerFactory.getLogger().error(appPath + " can not be found."); - } - - String cmd = "open " + appPath; - Runtime runtime = Runtime.getRuntime(); - - try { - runtime.exec(cmd); - } catch (IOException e) { - FineLoggerFactory.getLogger().error(e.getMessage(), e); - } - - } - } /** * 动作 * @param evt 事件 @@ -67,14 +41,10 @@ public class TutorialAction extends UpdateAction { Desktop.getDesktop().browse(new URI(helpURL)); return; } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); } } - - if (OperatingSystem.isUnix()) { - nativeExcuteMacInstallHomePrograms("helptutorial.app"); - } else { - Utils.nativeExcuteInstallHomePrograms("helptutorial.exe"); - } + FineLoggerFactory.getLogger().warn(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Offline_Helptutorial_Msg")); } // 生成帮助文档 sitecenter key, help.zh_CN.10 @@ -116,4 +86,4 @@ public class TutorialAction extends UpdateAction { } }; -} \ No newline at end of file +} diff --git a/designer-base/src/main/java/com/fr/design/actions/server/ConnectionListAction.java b/designer-base/src/main/java/com/fr/design/actions/server/ConnectionListAction.java index 89f2ac3c3f..76b11b2ff9 100644 --- a/designer-base/src/main/java/com/fr/design/actions/server/ConnectionListAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/server/ConnectionListAction.java @@ -1,6 +1,7 @@ package com.fr.design.actions.server; +import com.fr.config.ServerPreferenceConfig; import com.fr.data.impl.Connection; import com.fr.design.actions.UpdateAction; import com.fr.design.data.datapane.connect.ConnectionManagerPane; @@ -12,6 +13,7 @@ import com.fr.design.gui.NameInspector; import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.DesignerFrame; import com.fr.design.menu.MenuKeySet; +import com.fr.design.dcm.UniversalDatabaseOpener; import com.fr.file.ConnectionConfig; import com.fr.general.IOUtils; import com.fr.transaction.CallBackAdaptor; @@ -58,6 +60,14 @@ public class ConnectionListAction extends UpdateAction { * @param evt 事件 */ public void actionPerformed(ActionEvent evt) { + if (ServerPreferenceConfig.getInstance().isUseUniverseDBM()) { + UniversalDatabaseOpener.showUniverseDatabaseDialog(); + } else { + openDesignDatabaseManager(); + } + } + + private void openDesignDatabaseManager() { DesignerFrame designerFrame = DesignerContext.getDesignerFrame(); final ConnectionConfig datasourceManager = ConnectionConfig.getInstance(); final ConnectionManagerPane databaseManagerPane = new ConnectionManagerPane() { diff --git a/designer-base/src/main/java/com/fr/design/dcm/UniversalDatabaseComponent.java b/designer-base/src/main/java/com/fr/design/dcm/UniversalDatabaseComponent.java new file mode 100644 index 0000000000..3410af0444 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/dcm/UniversalDatabaseComponent.java @@ -0,0 +1,39 @@ +package com.fr.design.dcm; + +import com.fr.web.struct.AssembleComponent; +import com.fr.web.struct.Atom; +import com.fr.web.struct.browser.RequestClient; +import com.fr.web.struct.category.ScriptPath; +import com.fr.web.struct.category.StylePath; +import com.fr.web.struct.impl.FineUI; + +/** + * @author richie + * @version 10.0 + * Created by richie on 2019-05-16 + */ +public class UniversalDatabaseComponent extends AssembleComponent { + + public static final UniversalDatabaseComponent KEY = new UniversalDatabaseComponent(); + + private UniversalDatabaseComponent() { + + } + + @Override + public ScriptPath script(RequestClient req) { + return ScriptPath.build("/com/fr/design/dcm/index.js"); + } + + @Override + public StylePath style(RequestClient req) { + return StylePath.build("/com/fr/design/dcm/style.css"); + } + + @Override + public Atom[] refer() { + return new Atom[]{ + FineUI.KEY + }; + } +} diff --git a/designer-base/src/main/java/com/fr/design/dcm/UniversalDatabaseDialog.java b/designer-base/src/main/java/com/fr/design/dcm/UniversalDatabaseDialog.java new file mode 100644 index 0000000000..1a01a8641b --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/dcm/UniversalDatabaseDialog.java @@ -0,0 +1,32 @@ +package com.fr.design.dcm; + +import com.fr.design.dialog.BasicPane; +import com.fr.design.dialog.UIDialog; +import com.fr.design.utils.gui.GUICoreUtils; + +import javax.swing.*; +import java.awt.*; + +/** + * @author richie + * @version 10.0 + * Created by richie on 2019-05-16 + */ +public class UniversalDatabaseDialog extends UIDialog { + + public UniversalDatabaseDialog(Frame frame, BasicPane pane) { + super(frame); + setUndecorated(true); + JPanel panel = (JPanel) getContentPane(); + panel.setLayout(new BorderLayout()); + add(pane, BorderLayout.CENTER); + setSize(new Dimension(1000, 600)); + GUICoreUtils.centerWindow(this); + setResizable(false); + } + + @Override + public void checkValid() throws Exception { + + } +} diff --git a/designer-base/src/main/java/com/fr/design/dcm/UniversalDatabaseOpener.java b/designer-base/src/main/java/com/fr/design/dcm/UniversalDatabaseOpener.java new file mode 100644 index 0000000000..9239b9d4d4 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/dcm/UniversalDatabaseOpener.java @@ -0,0 +1,36 @@ +package com.fr.design.dcm; + +import com.fr.design.dialog.UIDialog; +import com.fr.design.mainframe.DesignerContext; + +import javax.swing.*; + +/** + * @author richie + * @version 10.0 + * Created by richie on 2019-05-16 + */ +public class UniversalDatabaseOpener { + + private static UIDialog dialog = null; + + public static UIDialog getDialog() { + return dialog; + } + + public static void showUniverseDatabaseDialog() { + UniversalDatabasePane upmPane = new UniversalDatabasePane(); + if (dialog == null) { + dialog = new UniversalDatabaseDialog(DesignerContext.getDesignerFrame(), upmPane); + } + dialog.setVisible(true); + } + + public static void closeWindow() { + if (dialog != null) { + dialog.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); + dialog.setVisible(false); + dialog = null; + } + } +} diff --git a/designer-base/src/main/java/com/fr/design/dcm/UniversalDatabasePane.java b/designer-base/src/main/java/com/fr/design/dcm/UniversalDatabasePane.java new file mode 100644 index 0000000000..e29a9f6698 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/dcm/UniversalDatabasePane.java @@ -0,0 +1,39 @@ +package com.fr.design.dcm; + +import com.fr.design.dialog.BasicPane; +import com.fr.design.ui.ModernUIPane; +import com.teamdev.jxbrowser.chromium.JSValue; +import com.teamdev.jxbrowser.chromium.events.ScriptContextAdapter; +import com.teamdev.jxbrowser.chromium.events.ScriptContextEvent; + +import java.awt.*; + +/** + * @author richie + * @version 10.0 + * Created by richie on 2019-05-16 + */ +public class UniversalDatabasePane extends BasicPane { + + private ModernUIPane modernUIPane; + + @Override + protected String title4PopupWindow() { + return "Database"; + } + + public UniversalDatabasePane() { + setLayout(new BorderLayout()); + modernUIPane = new ModernUIPane.Builder<>() + .withComponent(UniversalDatabaseComponent.KEY) + .prepare(new ScriptContextAdapter() { + @Override + public void onScriptContextCreated(ScriptContextEvent event) { + JSValue window = event.getBrowser().executeJavaScriptAndReturnValue("window"); + window.asObject().setProperty("DcmHelper", UniversalDcmBridge.getBridge(event.getBrowser())); + } + }) + .build(); + add(modernUIPane, BorderLayout.CENTER); + } +} diff --git a/designer-base/src/main/java/com/fr/design/dcm/UniversalDcmBridge.java b/designer-base/src/main/java/com/fr/design/dcm/UniversalDcmBridge.java new file mode 100644 index 0000000000..577acada97 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/dcm/UniversalDcmBridge.java @@ -0,0 +1,34 @@ +package com.fr.design.dcm; + +import com.fr.decision.webservice.bean.BaseBean; +import com.fr.design.bridge.exec.JSBridge; +import com.teamdev.jxbrowser.chromium.Browser; +import com.teamdev.jxbrowser.chromium.JSObject; + +/** + * @author richie + * @version 10.0 + * Created by richie on 2019-05-17 + * 桥接Java和JavaScript的类 + */ +public class UniversalDcmBridge { + + public static UniversalDcmBridge getBridge(Browser browser) { + return new UniversalDcmBridge(browser); + } + + private JSObject window; + + private UniversalDcmBridge(Browser browser) { + this.window = browser.executeJavaScriptAndReturnValue("window").asObject(); + } + + /** + * 获取所有的数据连接 + * @return 数据连接集合 + */ + @JSBridge + public BaseBean getConnections() { + return null; + } +} diff --git a/designer-base/src/main/java/com/fr/design/editor/editor/DateEditor.java b/designer-base/src/main/java/com/fr/design/editor/editor/DateEditor.java index 3b1abe6f00..c40161ba6c 100644 --- a/designer-base/src/main/java/com/fr/design/editor/editor/DateEditor.java +++ b/designer-base/src/main/java/com/fr/design/editor/editor/DateEditor.java @@ -153,6 +153,10 @@ public class DateEditor extends Editor { this.uiDatePicker.setSelectedItem(new Date()); } + public UIDatePicker getUiDatePicker() { + return uiDatePicker; + } + /** * Request focus */ 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 f790eca94f..528f6a56cf 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 @@ -41,17 +41,17 @@ public class HistoryTemplateListCache implements CallbackEvent { private List> historyList; private JTemplate editingTemplate; - private static volatile HistoryTemplateListCache THIS; + private static volatile HistoryTemplateListCache instacne; public static HistoryTemplateListCache getInstance() { - if (THIS == null) { + if (instacne == null) { synchronized (HistoryTemplateListCache.class) { - if (THIS == null) { - THIS = new HistoryTemplateListCache(); + if (instacne == null) { + instacne = new HistoryTemplateListCache(); } } } - return THIS; + return instacne; } private HistoryTemplateListCache() { @@ -66,8 +66,8 @@ public class HistoryTemplateListCache implements CallbackEvent { public void closeSelectedReport(JTemplate selected) { DesignModuleFactory.clearChartPropertyPane(); DesignTableDataManager.closeTemplate(selected); - //直接关闭模板的时候退出权限编辑 - if (DesignModeContext.isAuthorityEditing()) { + //直接关闭模板的时候(当且仅当设计器tab上只剩一个模板)退出权限编辑 + if (DesignModeContext.isAuthorityEditing() && historyList.size() <= 1) { DesignerContext.getDesignerFrame().closeAuthorityEditing(); } if (contains(selected) == -1) { diff --git a/designer-base/src/main/java/com/fr/design/gui/date/SingleObjectComboBoxModel.java b/designer-base/src/main/java/com/fr/design/gui/date/SingleObjectComboBoxModel.java index 788d1104e8..62cf793470 100644 --- a/designer-base/src/main/java/com/fr/design/gui/date/SingleObjectComboBoxModel.java +++ b/designer-base/src/main/java/com/fr/design/gui/date/SingleObjectComboBoxModel.java @@ -1,6 +1,7 @@ package com.fr.design.gui.date; import com.fr.log.FineLoggerFactory; +import com.fr.stable.StringUtils; import javax.swing.AbstractListModel; import javax.swing.ComboBoxModel; @@ -9,7 +10,7 @@ import java.util.Date; public class SingleObjectComboBoxModel extends AbstractListModel implements ComboBoxModel { private SimpleDateFormat dateFormat; - private String selectedDate = ""; + private String selectedDate = StringUtils.EMPTY; public SingleObjectComboBoxModel() { } @@ -28,6 +29,7 @@ public class SingleObjectComboBoxModel extends AbstractListModel implements Comb public void setSelectedItem(Object anItem) { if (anItem == null) { + selectedDate = StringUtils.EMPTY; return; } if (anItem instanceof Date) { diff --git a/designer-base/src/main/java/com/fr/design/gui/date/UIDatePicker.java b/designer-base/src/main/java/com/fr/design/gui/date/UIDatePicker.java index aa9cabd498..fb44f618f8 100644 --- a/designer-base/src/main/java/com/fr/design/gui/date/UIDatePicker.java +++ b/designer-base/src/main/java/com/fr/design/gui/date/UIDatePicker.java @@ -6,6 +6,7 @@ import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.general.ComparatorUtils; import com.fr.log.FineLoggerFactory; +import com.fr.stable.StringUtils; import javax.swing.BorderFactory; import javax.swing.JComboBox; @@ -157,7 +158,11 @@ public class UIDatePicker extends UIComboBox implements Serializable { * 设置当前选择的日期 */ public void setSelectedDate(Date date) throws ParseException { - this.setSelectedItem(dateFormat.format(date)); + if (date == null) { + this.setSelectedItem(null); + } else { + this.setSelectedItem(dateFormat.format(date)); + } } public void setSelectedItem(Object anObject) { @@ -215,8 +220,11 @@ public class UIDatePicker extends UIComboBox implements Serializable { try { String strDate = comboBox.getSelectedItem().toString(); synchronized (this) { - Date selectionDate = dateFormat.parse(strDate); - calendarPanel.setSelectedDate(selectionDate); + Date selectionDate = new Date(); + if (StringUtils.isNotBlank(strDate)) { + selectionDate = dateFormat.parse(strDate); + } + calendarPanel.setSelectedDate(selectionDate); calendarPanel.updateHMS(); } } catch (Exception e) { diff --git a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIToggleButton.java b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIToggleButton.java index 4b89752356..45c878419e 100644 --- a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIToggleButton.java +++ b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIToggleButton.java @@ -25,10 +25,13 @@ import com.fr.stable.StringUtils; * @since 2012-5-11下午4:28:24 */ public class UIToggleButton extends UIButton implements GlobalNameObserver{ + + private static final int ICON_COUNT = 2; private boolean isSelected; private boolean isEventBannded = false; private String toggleButtonName = ""; private GlobalNameListener globalNameListener = null; + private Icon[] icons; public UIToggleButton() { this(StringUtils.EMPTY); @@ -53,9 +56,9 @@ public class UIToggleButton extends UIButton implements GlobalNameObserver{ * @param icons */ public UIToggleButton(Icon[] icons) { - super(icons[0], null, icons[1]); - setSelectedIcon(icons[1]); + super(icons[0], null, null); setExtraPainted(true); + this.icons = icons; addActionListener(new AbstractAction() { @Override public void actionPerformed(ActionEvent e) { @@ -73,10 +76,10 @@ public class UIToggleButton extends UIButton implements GlobalNameObserver{ * @param icons */ public UIToggleButton(Icon[] icons, boolean needRelease) { - super(icons[0], null, icons[1]); + super(icons[0], null, null); setBorderPainted(true); - setSelectedIcon(icons[1]); setExtraPainted(true); + this.icons = icons; if (!needRelease) { addActionListener(new AbstractAction() { @Override @@ -92,6 +95,7 @@ public class UIToggleButton extends UIButton implements GlobalNameObserver{ addMouseListener(getMouseListener()); } + @Override public void setGlobalName(String name){ toggleButtonName = name ; } @@ -100,6 +104,7 @@ public class UIToggleButton extends UIButton implements GlobalNameObserver{ * * @return */ + @Override public boolean isSelected() { return isSelected; } @@ -115,12 +120,15 @@ public class UIToggleButton extends UIButton implements GlobalNameObserver{ super.setSelected(isSelected); if (this.isSelected != isSelected) { this.isSelected = isSelected; - repaint(); + refresh(isSelected); } } + + @Override protected void initListener(){ if(shouldResponseChangeListener()){ this.addChangeListener(new ChangeListener() { + @Override public void stateChanged(ChangeEvent e) { if (uiObserverListener == null) { return; @@ -138,10 +146,30 @@ public class UIToggleButton extends UIButton implements GlobalNameObserver{ if (this.isSelected != isSelected) { this.isSelected = isSelected; fireSelectedChanged(); - repaint(); + refresh(isSelected); } } + + + private void refresh(final boolean isSelected) { + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + Icon[] icons = UIToggleButton.this.icons; + if (icons != null && icons.length == ICON_COUNT) { + if (isSelected) { + UIToggleButton.this.setIcon(icons[1]); + } else { + UIToggleButton.this.setIcon(icons[0]); + } + } + UIToggleButton.this.repaint(); + } + }); + } + + protected MouseListener getMouseListener() { return new MouseAdapter() { @Override @@ -157,6 +185,7 @@ public class UIToggleButton extends UIButton implements GlobalNameObserver{ this.isEventBannded = ban; } + @Override protected void fireStateChanged() { } @@ -187,6 +216,7 @@ public class UIToggleButton extends UIButton implements GlobalNameObserver{ } } + @Override protected void paintOtherBorder(Graphics g) { Graphics2D g2d = (Graphics2D) g; g2d.setStroke(UIConstants.BS); @@ -200,6 +230,7 @@ public class UIToggleButton extends UIButton implements GlobalNameObserver{ * * @return 如果需要响应观察者事件则返回true,否则返回false */ + @Override public boolean shouldResponseChangeListener() { return true; } @@ -208,6 +239,7 @@ public class UIToggleButton extends UIButton implements GlobalNameObserver{ * * @param listener 观察者监听事件 */ + @Override public void registerNameListener(GlobalNameListener listener) { globalNameListener = listener; } diff --git a/designer-base/src/main/java/com/fr/design/gui/style/AlignmentPane.java b/designer-base/src/main/java/com/fr/design/gui/style/AlignmentPane.java index 11fbaf8c84..9bbca6d2bc 100644 --- a/designer-base/src/main/java/com/fr/design/gui/style/AlignmentPane.java +++ b/designer-base/src/main/java/com/fr/design/gui/style/AlignmentPane.java @@ -20,8 +20,10 @@ import com.fr.design.gui.ispinner.UISpinner; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.layout.TableLayout; import com.fr.design.layout.TableLayoutHelper; +import com.fr.design.utils.gui.UIComponentUtils; import com.fr.event.EventDispatcher; import com.fr.general.ComparatorUtils; +import com.fr.general.IOUtils; import com.fr.plugin.ExtraClassManager; import com.fr.plugin.context.PluginContext; import com.fr.plugin.manage.PluginFilter; @@ -94,11 +96,11 @@ public class AlignmentPane extends AbstractBasicStylePane implements GlobalNameO imageLayoutComboBox = new UIComboBox(LAYOUT); initTextRotationCombox(); - Icon[][] hAlignmentIconArray = {{BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/h_left_normal.png"), BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/h_left_normal_white.png")}, - {BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/h_center_normal.png"), BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/h_center_normal_white.png")}, - {BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/h_right_normal.png"), BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/h_right_normal_white.png")}, - {BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/h_s_normal.png"), BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/h_s_normal_white.png")}, - {BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/defaultAlignment.png"), BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/defaultAlignment_white.png")}}; + Icon[][] hAlignmentIconArray = {{IOUtils.readIcon("/com/fr/design/images/m_format/cellstyle/h_left_normal.png"), IOUtils.readIcon("/com/fr/design/images/m_format/cellstyle/h_left_normal_white.png")}, + {IOUtils.readIcon("/com/fr/design/images/m_format/cellstyle/h_center_normal.png"), IOUtils.readIcon("/com/fr/design/images/m_format/cellstyle/h_center_normal_white.png")}, + {IOUtils.readIcon("/com/fr/design/images/m_format/cellstyle/h_right_normal.png"), IOUtils.readIcon("/com/fr/design/images/m_format/cellstyle/h_right_normal_white.png")}, + {IOUtils.readIcon("/com/fr/design/images/m_format/cellstyle/h_s_normal.png"), IOUtils.readIcon("/com/fr/design/images/m_format/cellstyle/h_s_normal_white.png")}, + {IOUtils.readIcon("/com/fr/design/images/m_format/cellstyle/defaultAlignment.png"), IOUtils.readIcon("/com/fr/design/images/m_format/cellstyle/defaultAlignment_white.png")}}; Integer[] hAlignment = new Integer[]{Constants.LEFT, Constants.CENTER, Constants.RIGHT, Integer.valueOf(Constants.DISTRIBUTED), Constants.NULL}; hAlignmentPane = new UIButtonGroup(hAlignmentIconArray, hAlignment); hAlignmentPane.setAllToolTips(new String[]{com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Style_Alignment_Tooltips_Left"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Style_Alignment_Tooltips_Center"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Style_Alignment_Tooltips_Right"), @@ -106,9 +108,9 @@ public class AlignmentPane extends AbstractBasicStylePane implements GlobalNameO hPaneContainer = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 0)); vPaneContainer = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 0)); - Icon[][] vAlignmentIconArray = {{BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/v_top_normal.png"), BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/v_top_normal_white.png")}, - {BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/v_center_normal.png"), BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/v_center_normal_white.png")}, - {BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/v_down_normal.png"), BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/v_down_normal_white.png")}}; + Icon[][] vAlignmentIconArray = {{IOUtils.readIcon("/com/fr/design/images/m_format/cellstyle/v_top_normal.png"), IOUtils.readIcon("/com/fr/design/images/m_format/cellstyle/v_top_normal_white.png")}, + {IOUtils.readIcon("/com/fr/design/images/m_format/cellstyle/v_center_normal.png"), IOUtils.readIcon("/com/fr/design/images/m_format/cellstyle/v_center_normal_white.png")}, + {IOUtils.readIcon("/com/fr/design/images/m_format/cellstyle/v_down_normal.png"), IOUtils.readIcon("/com/fr/design/images/m_format/cellstyle/v_down_normal_white.png")}}; Integer[] vAlignment = new Integer[]{Constants.TOP, Constants.CENTER, Constants.BOTTOM}; vAlignmentPane = new UIButtonGroup(vAlignmentIconArray, vAlignment); vAlignmentPane.setAllToolTips(new String[]{com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Style_Alignment_Tooltips_Top"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Style_Alignment_Tooltips_Center"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Style_Alignment_Tooltips_Bottom")}); @@ -210,9 +212,11 @@ public class AlignmentPane extends AbstractBasicStylePane implements GlobalNameO private JPanel basicPane() { double f = TableLayout.FILL; double p = TableLayout.PREFERRED; + UILabel horizontalLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Style_Alignment_Pane_Horizontal") + " ", SwingConstants.LEFT); + UIComponentUtils.setLineWrap(horizontalLabel); Component[][] components = new Component[][]{ new Component[]{null, null}, - new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Style_Alignment_Pane_Horizontal") + " ", SwingConstants.LEFT), hPaneContainer}, + new Component[]{horizontalLabel, hPaneContainer}, new Component[]{null, null}, new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Style_Alignment_Pane_Vertical") + " ", SwingConstants.RIGHT), vPaneContainer}, new Component[]{null, null} @@ -304,6 +308,7 @@ public class AlignmentPane extends AbstractBasicStylePane implements GlobalNameO * * @param style the new style. */ + @Override public void populateBean(Style style) { hAlignmentPane.setSelectedItem(BaseUtils.getAlignment4Horizontal(style)); vAlignmentPane.setSelectedItem(style.getVerticalAlignment()); 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 3a52f4c502..9d5e713051 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 @@ -22,16 +22,18 @@ public class BorderIcon implements Icon { this.cellBorderStyle = cellBorderStyle; } + @Override public int getIconHeight() { return height; } + @Override public int getIconWidth() { return width; } - public static void drawLine(Graphics g, double x1, double y1, double x2, + private void drawLine(Graphics g, double x1, double y1, double x2, double y2, int lineStyle, Color color) { g.setColor(color); x1--; @@ -63,6 +65,7 @@ public class BorderIcon implements Icon { } } + @Override public void paintIcon(Component c, Graphics g, int x, int y) { int defaultWidth = c.getWidth(); int defaultHeight = c.getHeight(); @@ -81,9 +84,9 @@ public class BorderIcon implements Icon { cellBorderStyle.getBottomColor()); drawLine(gr, x1, y1, x1, y2, cellBorderStyle.getLeftStyle(), cellBorderStyle.getLeftColor()); - drawLine(gr, defaultWidth / 2, x1, defaultWidth / 2, x2, + drawLine(gr, defaultWidth / 2, y1, defaultWidth / 2, y2, cellBorderStyle.getVerticalStyle(), cellBorderStyle.getVerticalColor()); - drawLine(gr, y1, defaultHeight / 2, y2, defaultHeight / 2, + drawLine(gr, x1, defaultHeight / 2, x2, defaultHeight / 2, cellBorderStyle.getHorizontalStyle(), cellBorderStyle.getHorizontalColor()); } 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 04dab52b50..e10de8ab42 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 @@ -37,6 +37,7 @@ import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.mainframe.loghandler.LogMessageBar; import com.fr.design.mainframe.toolbar.ToolBarMenuDock; import com.fr.design.mainframe.toolbar.ToolBarMenuDockPlus; +import com.fr.design.mainframe.vcs.common.VcsHelper; import com.fr.design.menu.MenuManager; import com.fr.design.menu.ShortCut; import com.fr.design.utils.gui.GUICoreUtils; @@ -924,6 +925,7 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta } jt.addJTemplateActionListener(this); jt.addTargetModifiedListener(this); + jt.addJTemplateActionListener(VcsHelper.getInstance()); centerTemplateCardPane.showJTemplate(jt); setTitle(); layeredPane.repaint(); 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 264d14fc2c..b48433c5ce 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 @@ -2,6 +2,7 @@ package com.fr.design.mainframe; import com.fr.base.BaseUtils; import com.fr.base.vcs.DesignerMode; +import com.fr.cluster.engine.base.FineClusterConfig; import com.fr.design.DesignModelAdapter; import com.fr.design.DesignerEnvManager; import com.fr.design.ExtraDesignClassManager; @@ -26,6 +27,7 @@ import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.layout.TableLayout; import com.fr.design.layout.TableLayoutHelper; +import com.fr.design.mainframe.vcs.common.VcsHelper; import com.fr.design.mainframe.vcs.ui.FileVersionsPanel; import com.fr.design.menu.KeySetUtils; import com.fr.design.menu.ShortCut; @@ -49,7 +51,6 @@ import com.fr.stable.StringUtils; import com.fr.stable.project.ProjectConstants; import com.fr.third.org.apache.commons.io.FilenameUtils; import com.fr.workspace.WorkContext; -import com.fr.design.mainframe.vcs.common.VcsHelper; import javax.swing.BorderFactory; import javax.swing.JDialog; @@ -79,6 +80,9 @@ import static javax.swing.JOptionPane.WARNING_MESSAGE; public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarStateChangeListener, ResponseDataSourceChange { + private static final String FILE = "file"; + private static volatile DesignerFrameFileDealerPane THIS; + static { GeneralContext.listenPluginRunningChanged(new PluginEventListener() { @@ -95,10 +99,6 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt }); } - private static final String FILE = "file"; - - private static volatile DesignerFrameFileDealerPane THIS; - private List otherToolbarStateChangeListeners = new ArrayList<>(); private FileOperations selectedOperation; @@ -118,25 +118,6 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt private VcsAction vcsAction = new VcsAction(); - /** - * 刷新 - */ - public void refresh() { - selectedOperation.refresh(); - } - - public static DesignerFrameFileDealerPane getInstance() { - - if (THIS == null) { - synchronized (DesignerFrameFileDealerPane.class) { - if (THIS == null) { - THIS = new DesignerFrameFileDealerPane(); - } - } - } - return THIS; - } - private DesignerFrameFileDealerPane() { setLayout(new BorderLayout()); @@ -164,6 +145,24 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt stateChange(); } + public static DesignerFrameFileDealerPane getInstance() { + + if (THIS == null) { + synchronized (DesignerFrameFileDealerPane.class) { + if (THIS == null) { + THIS = new DesignerFrameFileDealerPane(); + } + } + } + return THIS; + } + + /** + * 刷新 + */ + public void refresh() { + selectedOperation.refresh(); + } public final void setCurrentEditingTemplate(JTemplate jt) { @@ -202,15 +201,31 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt for (ShortCut shortCut : extraShortCuts) { toolbarDef.addShortCut(shortCut); } - if (VcsHelper.needInit()) { - toolbarDef.addShortCut(vcsAction); - } + addVcsAction(toolbarDef); toolbarDef.updateToolBar(toolBar); resetActionStatus(); refresh(); } + /** + * 添加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 { + vcsAction.setName(Toolkit.i18nText("Fine-Design_Vcs_Title")); + } + toolbarDef.addShortCut(vcsAction); + + } + } + + private void resetActionStatus() { newFolderAction.setEnabled(false); @@ -255,6 +270,41 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt } } + private boolean isCurrentEditing(String path) { + JTemplate jt = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); + String editing = jt.getEditingFILE().getPath(); + return ComparatorUtils.equals(editing, path); + } + + /** + * 按钮状态改变 + */ + @Override + public void stateChange() { + + int selectedPathNum = TemplateTreePane.getInstance().countSelectedPath(); + + // 新建文件夹,重命名操作,在explorer中打开三个操作在选中单个文件夹或者文件时可用,其他情况不可用 + boolean singleSelected = selectedPathNum == 1; + newFolderAction.setEnabled(singleSelected); + renameAction.setEnabled(singleSelected); + showInExplorerAction.setEnabled(singleSelected); + // 删除操作在至少选中一个时可用 + boolean selected = selectedPathNum > 0; + delFileAction.setEnabled(selected); + // 刷新操作始终可用 + refreshTreeAction.setEnabled(true); + //触发vcsAction变化 + vcsAction.fireVcsActionChange(); + + // 其他状态 + otherStateChange(); + } + + public FileOperations getSelectedOperation() { + return selectedOperation; + } + /* * 新建文件夹 */ @@ -287,8 +337,8 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt * 版本管理 */ private class VcsAction extends UpdateAction { + public VcsAction() { - this.setName(Toolkit.i18nText("Fine-Design_Vcs_Title")); this.setSmallIcon(VcsHelper.VCS_LIST_PNG); } @@ -303,6 +353,40 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt closeOpenedTemplate(path, isCurrentEditing); FileVersionsPanel fileVersionTablePanel = FileVersionsPanel.getInstance(); fileVersionTablePanel.showFileVersionsPane(); + stateChange(); + + } + + /** + * 版本管理可用状态的监控 + */ + private void fireVcsActionChange() { + if (!DesignerEnvManager.getEnvManager().getVcsConfigManager().isVcsEnable() || VcsHelper.getInstance().isUnSelectedTemplate() || FineClusterConfig.getInstance().isCluster()) { + setEnabled(false); + return; + } + + + + + if (WorkContext.getCurrent() != null) { + if (!WorkContext.getCurrent().isLocal()) { + //当前环境为远程环境时 + FileNode node = TemplateTreePane.getInstance().getTemplateFileTree().getSelectedFileNode(); + if (selectedOperation.getFilePath() != null) { + if (node.getLock() != null && !ComparatorUtils.equals(node.getUserID(), node.getLock())) { + setEnabled(false); + } else { + setEnabled(true); + } + } else { + setEnabled(false); + } + } else { + //当前环境为本地环境时 + setEnabled(selectedOperation.getFilePath() != null); + } + } } private void closeOpenedTemplate(String path, boolean isCurrentEditing) { @@ -321,12 +405,6 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt } - private boolean isCurrentEditing(String path) { - JTemplate jt = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); - String editing = jt.getEditingFILE().getPath(); - return ComparatorUtils.equals(editing, path); - } - /** * 在系统资源管理器中打开 */ @@ -428,62 +506,6 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt } } - /** - * 按钮状态改变 - */ - @Override - public void stateChange() { - - int selectedPathNum = TemplateTreePane.getInstance().countSelectedPath(); - - // 新建文件夹,重命名操作,在explorer中打开三个操作在选中单个文件夹或者文件时可用,其他情况不可用 - boolean singleSelected = selectedPathNum == 1; - newFolderAction.setEnabled(singleSelected); - renameAction.setEnabled(singleSelected); - showInExplorerAction.setEnabled(singleSelected); - // 删除操作在至少选中一个时可用 - boolean selected = selectedPathNum > 0; - delFileAction.setEnabled(selected); - // 刷新操作始终可用 - refreshTreeAction.setEnabled(true); - handleVcsAction(); - - // 其他状态 - otherStateChange(); - } - - private void handleVcsAction() { - if (!DesignerEnvManager.getEnvManager().getVcsConfigManager().isVcsEnable() || VcsHelper.isUnSelectedTemplate()) { - vcsAction.setEnabled(false); - return; - } - - if (WorkContext.getCurrent() != null) { - if (!WorkContext.getCurrent().isLocal()) { - //当前环境为远程环境时 - FileNode node = TemplateTreePane.getInstance().getTemplateFileTree().getSelectedFileNode(); - if (selectedOperation.getFilePath() != null) { - if (node.getLock() != null && !ComparatorUtils.equals(node.getUserID(), node.getLock())) { - vcsAction.setEnabled(false); - } else { - vcsAction.setEnabled(true); - } - } else { - vcsAction.setEnabled(false); - } - } else { - //当前环境为本地环境时 - vcsAction.setEnabled(selectedOperation.getFilePath() != null); - } - } - } - - - - public FileOperations getSelectedOperation() { - return selectedOperation; - } - /** * 重命名对话框 * 支持快捷键Enter,ESC diff --git a/designer-base/src/main/java/com/fr/design/mainframe/DesktopCardPane.java b/designer-base/src/main/java/com/fr/design/mainframe/DesktopCardPane.java index 94a1427b08..8b32d14273 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/DesktopCardPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/DesktopCardPane.java @@ -30,7 +30,7 @@ public class DesktopCardPane extends BasicPane implements TargetModifiedListener // 判断是否切换设计器状态到禁止拷贝剪切 if (jt.getTarget().getAttrMark(DesignBanCopyAttrMark.XML_TAG) != null) { DesignModeContext.switchTo(DesignerMode.BAN_COPY_AND_CUT); - } else if (!DesignModeContext.isVcsMode()){ + } else if (!DesignModeContext.isVcsMode() && !DesignModeContext.isAuthorityEditing()){ DesignModeContext.switchTo(DesignerMode.NORMAL); } DesignerFrameFileDealerPane.getInstance().setCurrentEditingTemplate(jt); @@ -38,7 +38,8 @@ public class DesktopCardPane extends BasicPane implements TargetModifiedListener component.onLostFocus(); remove(component); } - add(component = jt, BorderLayout.CENTER); + component = jt; + add(component, BorderLayout.CENTER); validate(); repaint(); revalidate(); diff --git a/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java b/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java index a8ec61abc8..852130c1e0 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java @@ -12,6 +12,7 @@ import com.fr.design.DesignModelAdapter; import com.fr.design.DesignState; import com.fr.design.DesignerEnvManager; import com.fr.design.ExtraDesignClassManager; +import com.fr.design.actions.AllowAuthorityEditAction; import com.fr.design.actions.TableDataSourceAction; import com.fr.design.actions.edit.RedoAction; import com.fr.design.actions.edit.UndoAction; @@ -39,7 +40,6 @@ import com.fr.design.mainframe.template.info.TemplateProcessInfo; import com.fr.design.mainframe.template.info.TimeConsumeTimer; import com.fr.design.mainframe.toolbar.ToolBarMenuDockPlus; import com.fr.design.mainframe.toolbar.VcsScene; -import com.fr.design.mainframe.vcs.common.VcsHelper; import com.fr.design.menu.MenuDef; import com.fr.design.menu.NameSeparator; import com.fr.design.menu.ShortCut; @@ -112,7 +112,7 @@ public abstract class JTemplate> // 判断是否切换设计器状态到禁止拷贝剪切 if (t.getAttrMark(DesignBanCopyAttrMark.XML_TAG) != null) { DesignModeContext.switchTo(com.fr.design.base.mode.DesignerMode.BAN_COPY_AND_CUT); - } else if (!DesignModeContext.isVcsMode()) { + } else if (!DesignModeContext.isVcsMode() && !DesignModeContext.isAuthorityEditing()) { DesignModeContext.switchTo(com.fr.design.base.mode.DesignerMode.NORMAL); } this.template = t; @@ -687,10 +687,6 @@ public abstract class JTemplate> this.saved = true; this.authoritySaved = true; DesignerContext.getDesignerFrame().setTitle(); - if (DesignerEnvManager.getEnvManager().getVcsConfigManager().isVcsEnable()) { - VcsHelper.dealWithVcs(this); - - } this.fireJTemplateSaved(); return true; } @@ -831,7 +827,7 @@ public abstract class JTemplate> // Process the listeners last to first, notifying // those that are interested in this event - for (int i = listeners.length - 2; i >= 0; i -= 2) { + for (int i = listeners.length - 1; i >= 0; i -= 1) { if (listeners[i] == JTemplateActionListener.class) { ((JTemplateActionListener) listeners[i + 1]).templateSaved(this); } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/loghandler/DesignerLogHandler.java b/designer-base/src/main/java/com/fr/design/mainframe/loghandler/DesignerLogHandler.java index 35abeb82cc..79e94d3991 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/loghandler/DesignerLogHandler.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/loghandler/DesignerLogHandler.java @@ -44,14 +44,6 @@ public class DesignerLogHandler { private static final SimpleDateFormat LOG_SIMPLE_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - private static final int INFO_INT = Level.INFO.toInt(); - - private static final int ERROR_INT = Level.ERROR.toInt(); - - private static final int WARN_INT = Level.WARN.toInt(); - - private static final int DEBUG_INT = Level.DEBUG.toInt(); - private static final int GAP_X = -150; private static final int INFO_GAP_Y = -60; @@ -127,12 +119,12 @@ public class DesignerLogHandler { JPopupMenu jPopupMenu = new JPopupMenu(); int logLevelInt = Log4jConfig.getInstance().getRootLevel().toInt(); - if (logLevelInt <= INFO_INT) { + if (logLevelInt <= DesignerLogger.INFO_INT) { jPopupMenu.add(showInfo); jPopupMenu.add(showError); jPopupMenu.add(showServer); jPopupMenu.show(caption, caption.getWidth() + GAP_X, INFO_GAP_Y); - } else if (logLevelInt == ERROR_INT) { + } else if (logLevelInt == DesignerLogger.ERROR_INT) { jPopupMenu.add(showError); jPopupMenu.add(showServer); jPopupMenu.show(caption, caption.getWidth() + GAP_X, ERRO_GAP_Y); @@ -241,11 +233,11 @@ public class DesignerLogHandler { int intLevel = event.getLevel().toInt(); Date date = new Date(event.getTimeStamp()); ThrowableInformation information = event.getThrowableInformation(); - if (intLevel == INFO_INT && showInfo.isSelected()) { + if (intLevel == DesignerLogger.INFO_INT && showInfo.isSelected()) { printMessage(event.getRenderedMessage(), intLevel, date, information == null ? null : information.getThrowable()); - } else if (intLevel == ERROR_INT && showError.isSelected()) { + } else if (intLevel == DesignerLogger.ERROR_INT && showError.isSelected()) { printMessage(event.getRenderedMessage(), intLevel, date, information == null ? null : information.getThrowable()); - } else if (intLevel == WARN_INT && showServer.isSelected()) { + } else if (intLevel == DesignerLogger.WARN_INT && showServer.isSelected()) { printMessage(event.getRenderedMessage(), intLevel, date, information == null ? null : information.getThrowable()); } } @@ -253,11 +245,11 @@ public class DesignerLogHandler { public void printStackTrace(String message, Level level, Date date) { int intLevel = level.toInt(); - if (intLevel == INFO_INT && showInfo.isSelected()) { + if (intLevel == DesignerLogger.INFO_INT && showInfo.isSelected()) { printMessage(message, intLevel, date); - } else if (intLevel == ERROR_INT && showError.isSelected()) { + } else if (intLevel == DesignerLogger.ERROR_INT && showError.isSelected()) { printMessage(message, intLevel, date); - } else if (intLevel == WARN_INT && showServer.isSelected()) { + } else if (intLevel == DesignerLogger.WARN_INT && showServer.isSelected()) { printMessage(message, intLevel, date); } @@ -287,13 +279,13 @@ public class DesignerLogHandler { private void log(String str, int style) { SimpleAttributeSet attrSet = new SimpleAttributeSet(); - if (style == ERROR_INT) { + if (style == DesignerLogger.ERROR_INT) { StyleConstants.setForeground(attrSet, new Color(247, 148, 29)); StyleConstants.setBold(attrSet, true); - } else if (style == WARN_INT) { + } else if (style == DesignerLogger.WARN_INT) { StyleConstants.setForeground(attrSet, Color.red); StyleConstants.setBold(attrSet, true); - } else if (style == INFO_INT) { + } else if (style == DesignerLogger.INFO_INT) { StyleConstants.setForeground(attrSet, Color.black); StyleConstants.setBold(attrSet, false); } else { @@ -310,9 +302,9 @@ public class DesignerLogHandler { private String appendLocaleMark(String str, int style) { - if (style == ERROR_INT) { + if (style == DesignerLogger.ERROR_INT) { str = com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Alert") + ":" + str + "\n"; - } else if (style == WARN_INT) { + } else if (style == DesignerLogger.WARN_INT) { str = com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Seriously") + ":" + str + "\n"; } else { str = com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Normal") + ":" + str + "\n"; @@ -323,11 +315,11 @@ public class DesignerLogHandler { private void setMessage(String message, int level) { LogMessageBar.getInstance().setMessage(message); - if (level == DesignerLogHandler.INFO_INT && showInfo.isSelected()) { + if (level == DesignerLogger.INFO_INT && showInfo.isSelected()) { caption.infoAdd(); - } else if (level == DesignerLogHandler.ERROR_INT && showError.isSelected()) { + } else if (level == DesignerLogger.ERROR_INT && showError.isSelected()) { caption.errorAdd(); - } else if (level == DesignerLogHandler.WARN_INT && showServer.isSelected()) { + } else if (level == DesignerLogger.WARN_INT && showServer.isSelected()) { caption.serverAdd(); } } @@ -368,9 +360,4 @@ public class DesignerLogHandler { }; } - - public void printLoggingEvent(LoggingEvent event) { - - logHandlerArea.printStackTrace(event); - } } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/loghandler/DesignerLogger.java b/designer-base/src/main/java/com/fr/design/mainframe/loghandler/DesignerLogger.java new file mode 100644 index 0000000000..b2b35da1cd --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/mainframe/loghandler/DesignerLogger.java @@ -0,0 +1,82 @@ +package com.fr.design.mainframe.loghandler; + +import com.fr.log.FineLoggerFactory; +import com.fr.third.apache.log4j.Level; +import com.fr.third.apache.log4j.spi.LoggingEvent; +import com.fr.third.apache.log4j.spi.ThrowableInformation; + +/** + * 设计器日志记录 + */ +public class DesignerLogger { + public static final int INFO_INT = Level.INFO.toInt(); + + public static final int ERROR_INT = Level.ERROR.toInt(); + + public static final int WARN_INT = Level.WARN.toInt(); + + /** + * 记录LoggingEvent对象 + * + * @param event + */ + public static void log(LoggingEvent event) { + if (event == null) { + return; + } + LogParser.parse(event).log(event); + } + + public enum LogParser { + DEFAULT(-1) { + @Override + public void log(LoggingEvent event) { + + } + }, + INFO(Level.INFO.toInt()) { + @Override + public void log(LoggingEvent event) { + FineLoggerFactory.getLogger().info(event.getRenderedMessage()); + } + }, + WARN(Level.WARN.toInt()) { + @Override + public void log(LoggingEvent event) { + ThrowableInformation information = event.getThrowableInformation(); + FineLoggerFactory.getLogger().warn(event.getRenderedMessage(), information == null ? null : information.getThrowable()); + } + }, + + ERROR(Level.ERROR.toInt()) { + @Override + public void log(LoggingEvent event) { + ThrowableInformation information = event.getThrowableInformation(); + FineLoggerFactory.getLogger().error(event.getRenderedMessage(), information == null ? null : information.getThrowable()); + } + }; + private int level; + + LogParser(int level) { + this.level = level; + } + + public int getLevel() { + return level; + } + + public static LogParser parse(LoggingEvent event) { + int intLevel = event.getLevel().toInt(); + for (LogParser logParser : values()) { + if (logParser.getLevel() == intLevel) { + return logParser; + } + } + return DEFAULT; + + } + + public void log(LoggingEvent event) { + } + } +} \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/DownMenuStyleDefinePane.java b/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/DownMenuStyleDefinePane.java index ff76e5fed5..c5e19e8819 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/DownMenuStyleDefinePane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/DownMenuStyleDefinePane.java @@ -2,7 +2,6 @@ package com.fr.design.mainframe.mobile.ui; import com.fr.base.GraphHelper; import com.fr.base.Icon; -import com.fr.base.IconManager; import com.fr.design.constants.LayoutConstants; import com.fr.design.designer.IntervalConstants; import com.fr.design.gui.ilable.UILabel; @@ -11,6 +10,7 @@ import com.fr.design.layout.TableLayoutHelper; import com.fr.design.mainframe.widget.UITitleSplitLine; import com.fr.design.mainframe.widget.preview.MobileTemplatePreviewPane; import com.fr.form.ui.CardSwitchButton; +import com.fr.form.ui.WidgetInfoConfig; import com.fr.form.ui.container.cardlayout.WCardTagLayout; import com.fr.general.FRFont; import com.fr.general.cardtag.mobile.DownMenuStyle; @@ -40,6 +40,7 @@ public class DownMenuStyleDefinePane extends StyleDefinePaneWithSelectConf { super(tagLayout); } + @Override protected void createExtraConfPane(JPanel centerPane) { JPanel panel = FRGUIPaneFactory.createVerticalFlowLayout_Pane(true, FlowLayout.LEADING, 0, 0); panel.setBorder(BorderFactory.createEmptyBorder(0, 20, 5, 20)); @@ -134,12 +135,13 @@ public class DownMenuStyleDefinePane extends StyleDefinePaneWithSelectConf { private static final int GAP = 6; private static final String PAINT_ICON = "fund_white"; private static final String ICON_PATH = "/com/fr/web/images/fund_white.png"; - private LineDescription splitLine; + private transient LineDescription splitLine; public DownMenuStylePreviewPane() { this.setBackground(Color.decode("#3888EE")); } + @Override public void repaint() { super.repaint(); } @@ -172,7 +174,7 @@ public class DownMenuStyleDefinePane extends StyleDefinePaneWithSelectConf { g2d.setColor(oldColor); } Icon icon = new Icon(PAINT_ICON, ICON_PATH); - g2d.drawImage(IconManager.getIconManager().getDefaultIconImage(icon), (eachWidth - ICON_OFFSET) / 2, (panelHeight - ICON_OFFSET - GAP - fontHeight) / 2, null); + g2d.drawImage(WidgetInfoConfig.getInstance().getIconManager().getDefaultIconImage(icon), (eachWidth - ICON_OFFSET) / 2, (panelHeight - ICON_OFFSET - GAP - fontHeight) / 2, null); g2d.drawString(displayName, (eachWidth - width) / 2, (panelHeight + ICON_OFFSET + GAP - fontHeight) / 2 + ascent); Stroke oldStroke = g2d.getStroke(); if (splitLine.getLineStyle() != 0) { @@ -187,6 +189,7 @@ public class DownMenuStyleDefinePane extends StyleDefinePaneWithSelectConf { } + @Override public void populateConfig(MobileTemplateStyle templateStyle) { super.populateConfig(templateStyle); this.splitLine = ((DownMenuStyle) templateStyle).getSplitLine(); diff --git a/designer-base/src/main/java/com/fr/design/mainframe/template/info/TemplateInfoCollector.java b/designer-base/src/main/java/com/fr/design/mainframe/template/info/TemplateInfoCollector.java index 0996c260ce..330b9304a8 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/template/info/TemplateInfoCollector.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/template/info/TemplateInfoCollector.java @@ -1,6 +1,7 @@ package com.fr.design.mainframe.template.info; import com.fr.base.FRContext; +import com.fr.base.io.XMLReadHelper; import com.fr.design.DesignerEnvManager; import com.fr.log.FineLoggerFactory; import com.fr.stable.ProductConstants; @@ -12,12 +13,15 @@ import com.fr.stable.xml.XMLTools; import com.fr.stable.xml.XMLWriter; import com.fr.stable.xml.XMLableReader; import com.fr.third.javax.xml.stream.XMLStreamException; -import com.fr.workspace.WorkContext; +import com.fr.third.org.apache.commons.io.FileUtils; +import java.io.ByteArrayOutputStream; import java.io.File; +import java.io.FileInputStream; import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.FileReader; +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -132,13 +136,24 @@ public class TemplateInfoCollector implements XMLReadable, XMLWriter { if (!getInfoFile().exists()) { return; } - try { - XMLableReader xmlReader = XMLableReader.createXMLableReader(new FileReader(getInfoFile())); - xmlReader.readXMLObject(this); - } catch (XMLStreamException e) { - FineLoggerFactory.getLogger().error(e.getMessage(), e); + + XMLableReader reader = null; + try (InputStream in = new FileInputStream(getInfoFile())) { + // XMLableReader 还是应该考虑实现 Closable 接口的,这样就能使用 try-with 语句了 + reader = XMLReadHelper.createXMLableReader(in, XMLPrintWriter.XML_ENCODER); + reader.readXMLObject(this); } catch (FileNotFoundException e) { // do nothing + } catch (XMLStreamException | IOException e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } finally { + try { + if (reader != null) { + reader.close(); + } + } catch (XMLStreamException e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } } } @@ -160,8 +175,12 @@ public class TemplateInfoCollector implements XMLReadable, XMLWriter { */ private void saveInfo() { try { - FileOutputStream out = new FileOutputStream(getInfoFile()); + ByteArrayOutputStream out = new ByteArrayOutputStream(); XMLTools.writeOutputStreamXML(this, out); + out.flush(); + out.close(); + String fileContent = new String(out.toByteArray(), StandardCharsets.UTF_8); + FileUtils.writeStringToFile(getInfoFile(), fileContent, StandardCharsets.UTF_8); } catch (Exception ex) { FineLoggerFactory.getLogger().error(ex.getMessage()); } 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 c26dce9a02..7e0d6b3597 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 @@ -13,6 +13,7 @@ import com.fr.design.actions.community.BBSAction; import com.fr.design.actions.community.BugAction; import com.fr.design.actions.community.CenterAction; import com.fr.design.actions.community.CusDemandAction; +import com.fr.design.actions.community.FacebookFansAction; import com.fr.design.actions.community.NeedAction; import com.fr.design.actions.community.QuestionAction; import com.fr.design.actions.community.SignAction; @@ -151,7 +152,6 @@ public abstract class ToolBarMenuDock { } }; - private static final String FINEREPORT = "FineReport"; private static final int MENUBAR_HEIGHT = 22; private static final List PLUGIN_LISTENERS = new ArrayList<>(); @@ -543,6 +543,9 @@ public abstract class ToolBarMenuDock { shortCuts.add(new CusDemandAction()); shortCuts.add(new CenterAction()); shortCuts.add(new SignAction()); + if (Locale.TAIWAN.equals(GeneralContext.getLocale())) { + shortCuts.add(new FacebookFansAction()); + } return shortCuts.toArray(new ShortCut[shortCuts.size()]); } 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 05e18e691e..fa649b66a5 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 @@ -1,5 +1,6 @@ package com.fr.design.mainframe.vcs.common; +import com.fr.cluster.engine.base.FineClusterConfig; import com.fr.design.DesignerEnvManager; import com.fr.design.file.HistoryTemplateListCache; import com.fr.design.file.TemplateTreePane; @@ -7,6 +8,7 @@ import com.fr.design.gui.itree.filetree.TemplateFileTree; import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.DesignerFrameFileDealerPane; import com.fr.design.mainframe.JTemplate; +import com.fr.design.mainframe.JTemplateActionListener; import com.fr.design.mainframe.vcs.VcsConfigManager; import com.fr.design.mainframe.vcs.ui.FileVersionTable; import com.fr.general.IOUtils; @@ -28,7 +30,7 @@ import static com.fr.stable.StableUtils.pathJoin; /** * Created by XiaXiang on 2019/4/17. */ -public class VcsHelper { +public class VcsHelper implements JTemplateActionListener { public final static Color TABLE_SELECT_BACKGROUND = new Color(0xD8F2FD); public final static Color COPY_VERSION_BTN_COLOR = new Color(0x419BF9); @@ -42,12 +44,18 @@ public class VcsHelper { public final static Icon VCS_DELETE_PNG = IOUtils.readIcon("/com/fr/design/images/vcs/icon_delete.png"); public final static Icon VCS_USER_PNG = IOUtils.readIcon("/com/fr/design/images/vcs/icon_user@1x.png"); public final static Icon VCS_REVERT = IOUtils.readIcon("/com/fr/design/images/vcs/icon_revert.png"); + public final static int OFFSET = 2; private final static String VCS_DIR = "vcs"; public final static String VCS_CACHE_DIR = pathJoin(VCS_DIR, "cache"); private static final int MINUTE = 60 * 1000; private final static String VCS_PLUGIN_ID = "com.fr.plugin.vcs.v10"; + private static final VcsHelper instance = new VcsHelper(); - private static int containsFolderCounts() { + public static VcsHelper getInstance() { + return instance; + } + + private int containsFolderCounts() { TemplateFileTree fileTree = TemplateTreePane.getInstance().getTemplateFileTree(); if (fileTree.getSelectionPaths() == null) { return 0; @@ -61,13 +69,13 @@ public class VcsHelper { return fileTree.getSelectionPaths().length - fileTree.getSelectedTemplatePaths().length; } - public static String getCurrentUsername() { + public String getCurrentUsername() { return WorkContext.getCurrent().isLocal() ? Toolkit.i18nText("Fine-Design_Vcs_Local_User") : WorkContext.getCurrent().getConnection().getUserName(); } - private static int selectedTemplateCounts() { + private int selectedTemplateCounts() { TemplateFileTree fileTree = TemplateTreePane.getInstance().getTemplateFileTree(); if (fileTree.getSelectionPaths() == null) { return 0; @@ -76,11 +84,11 @@ public class VcsHelper { return fileTree.getSelectedTemplatePaths().length; } - public static boolean isUnSelectedTemplate() { - return VcsHelper.containsFolderCounts() + VcsHelper.selectedTemplateCounts() != 1; + public boolean isUnSelectedTemplate() { + return containsFolderCounts() + selectedTemplateCounts() != 1; } - public static String getEditingFilename() { + private String getEditingFilename() { JTemplate jt = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); String editingFilePath = jt.getEditingFILE().getPath(); if (editingFilePath.startsWith(ProjectConstants.REPORTLETS_NAME)) { @@ -94,7 +102,7 @@ public class VcsHelper { return editingFilePath; } - public static boolean needDeleteVersion(VcsEntity entity) { + private boolean needDeleteVersion(VcsEntity entity) { VcsConfigManager configManager = DesignerEnvManager.getEnvManager().getVcsConfigManager(); if (entity == null || !configManager.isUseInterval()) { return false; @@ -105,9 +113,9 @@ public class VcsHelper { return new Date().getTime() - entity.getTime().getTime() < DesignerEnvManager.getEnvManager().getVcsConfigManager().getSaveInterval() * MINUTE; } - public static boolean needInit() { + public boolean needInit() { PluginContext context = PluginManager.getContext(VCS_PLUGIN_ID); - return context == null || !context.isActive(); + return context == null || !context.isRunning(); } /** @@ -115,7 +123,7 @@ public class VcsHelper { * * @param jt */ - public static void dealWithVcs(final JTemplate jt) { + public void fireVcs(final JTemplate jt) { new Thread(new Runnable() { @Override public void run() { @@ -134,8 +142,8 @@ public class VcsHelper { } else { operator.saveVersion(getCurrentUsername(), fileName, StringUtils.EMPTY, latestFileVersion + 1); } - VcsEntity oldEntity = WorkContext.getCurrent().get(VcsOperator.class).getFileVersionByIndex(fileName, 1); - if (VcsHelper.needDeleteVersion(oldEntity)) { + VcsEntity oldEntity = WorkContext.getCurrent().get(VcsOperator.class).getFileVersionByIndexAndUsername(fileName, getCurrentUsername(), 1); + if (needDeleteVersion(oldEntity)) { operator.deleteVersion(oldEntity.getFilename(), oldEntity.getVersion()); } @@ -145,4 +153,25 @@ public class VcsHelper { } + @Override + public void templateOpened(JTemplate jt) { + + } + + /** + * 模板保存时 处理. + * + * @param jt 模板 + */ + @Override + public void templateSaved(JTemplate jt) { + if (needInit() && DesignerEnvManager.getEnvManager().getVcsConfigManager().isVcsEnable() && !FineClusterConfig.getInstance().isCluster()) { + fireVcs(jt); + } + } + + @Override + public void templateClosed(JTemplate jt) { + + } } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/EditFileVersionDialog.java b/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/EditFileVersionDialog.java index 76bededaa5..105a9b872a 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/EditFileVersionDialog.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/EditFileVersionDialog.java @@ -7,8 +7,11 @@ import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.itextarea.UITextArea; import com.fr.design.layout.TableLayoutHelper; import com.fr.design.mainframe.DesignerContext; +import com.fr.design.mainframe.DesignerFrameFileDealerPane; import com.fr.design.utils.gui.GUICoreUtils; +import com.fr.log.FineLoggerFactory; import com.fr.report.entity.VcsEntity; +import com.fr.stable.StringUtils; import com.fr.workspace.WorkContext; import com.fr.workspace.server.vcs.VcsOperator; @@ -81,6 +84,9 @@ public class EditFileVersionDialog extends UIDialog { entity.setCommitMsg(msgTestArea.getText()); WorkContext.getCurrent().get(VcsOperator.class).updateVersion(entity); setVisible(false); + String path = DesignerFrameFileDealerPane.getInstance().getSelectedOperation().getFilePath(); + FileVersionTable table = FileVersionTable.getInstance(); + table.updateModel(table.getSelectedRow(), WorkContext.getCurrent().get(VcsOperator.class).getVersions(path.replaceFirst("/", StringUtils.EMPTY))); } }); 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 a7f7f5ef0a..125d4bc4e0 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 @@ -8,6 +8,7 @@ import com.fr.design.mainframe.JTemplate; import com.fr.design.mainframe.vcs.common.VcsHelper; 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.StringUtils; import com.fr.workspace.WorkContext; @@ -53,9 +54,13 @@ public class FileVersionCellEditor extends AbstractCellEditor implements TableCe //先关闭当前打开的模板版本 JTemplate jt = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); jt.stopEditing(); - MutilTempalteTabPane.getInstance().setIsCloseCurrent(true); - MutilTempalteTabPane.getInstance().closeFormat(jt); - MutilTempalteTabPane.getInstance().closeSpecifiedTemplate(jt); + //只有模板路径一致时关闭当前模板 + if (ComparatorUtils.equals(fileOfVersion, jt.getPath())) { + MutilTempalteTabPane.getInstance().setIsCloseCurrent(true); + MutilTempalteTabPane.getInstance().closeFormat(jt); + MutilTempalteTabPane.getInstance().closeSpecifiedTemplate(jt); + } + //再打开cache中的模板 DesignerContext.getDesignerFrame().openTemplate(new VcsCacheFileNodeFile(new FileNode(fileOfVersion, false))); @@ -63,7 +68,7 @@ public class FileVersionCellEditor extends AbstractCellEditor implements TableCe double height = editor.getPreferredSize().getHeight(); if (table.getRowHeight(row) != height) { - table.setRowHeight(row, (int) 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 c1cc23fc45..40fa02c1fe 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 @@ -1,5 +1,6 @@ package com.fr.design.mainframe.vcs.ui; +import com.fr.design.mainframe.vcs.common.VcsHelper; import com.fr.report.entity.VcsEntity; import javax.swing.JPanel; @@ -34,7 +35,7 @@ public class FileVersionCellRender implements TableCellRenderer { double height = editor.getPreferredSize().getHeight(); if (table.getRowHeight(row) != height) { - table.setRowHeight(row, (int) height); + table.setRowHeight(row, (int) height + VcsHelper.OFFSET); } return editor; } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/FileVersionDialog.java b/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/FileVersionDialog.java index 33076a07f0..15d8bae63e 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/FileVersionDialog.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/FileVersionDialog.java @@ -1,5 +1,6 @@ package com.fr.design.mainframe.vcs.ui; +import com.fr.analysis.cloud.DateUtils; import com.fr.design.dialog.UIDialog; import com.fr.design.editor.editor.DateEditor; import com.fr.design.gui.date.UIDatePicker; @@ -14,6 +15,7 @@ import com.fr.workspace.WorkContext; import com.fr.workspace.server.vcs.VcsOperator; import javax.swing.AbstractAction; +import javax.swing.BorderFactory; import javax.swing.Box; import javax.swing.JPanel; import java.awt.BorderLayout; @@ -45,7 +47,7 @@ public class FileVersionDialog extends UIDialog { upBox.setBorder(VcsHelper.EMPTY_BORDER); upBox.add(new UILabel(Toolkit.i18nText("Fine-Design_Vcs_buildTime") + " ")); upBox.add(Box.createHorizontalGlue()); - dateEditor = new DateEditor(new Date(), true, StringUtils.EMPTY, UIDatePicker.STYLE_CN_DATE1); + dateEditor = new VcsDateEditor(new Date(), true, StringUtils.EMPTY, UIDatePicker.STYLE_CN_DATE1); upBox.add(dateEditor); Box downBox = Box.createHorizontalBox(); downBox.setBorder(VcsHelper.EMPTY_BORDER); @@ -62,8 +64,10 @@ public class FileVersionDialog extends UIDialog { @Override public void actionPerformed(ActionEvent e) { FileVersionDialog.this.setVisible(false); - Date date = dateEditor.getValue(); - List vcsEntities = WorkContext.getCurrent().get(VcsOperator.class).getFilterVersions(fileName, date, new Date(date.getTime() + DELAY), textField.getText()); + Date editorDate = dateEditor.getValue(); + Date start = editorDate == null ? new Date(0) : editorDate; + Date end = editorDate == null ? DateUtils.getLastHour() : new Date(start.getTime() + DELAY); + List vcsEntities = WorkContext.getCurrent().get(VcsOperator.class).getFilterVersions(fileName, start, end, textField.getText()); FileVersionTable.getInstance().updateModel(1, vcsEntities); } @@ -74,16 +78,29 @@ public class FileVersionDialog extends UIDialog { FileVersionDialog.this.setVisible(false); } }); + VcsLabel resetLabel = new VcsLabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Vcs_resetValue"), VcsHelper.COPY_VERSION_BTN_COLOR); + resetLabel.setBorder(BorderFactory.createEmptyBorder(10, 160, 0, 10)); + resetLabel.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + dateEditor.setValue(null); + textField.setText(null); + FileVersionDialog.this.repaint(); + } + }); panel.add(upBox, BorderLayout.NORTH); panel.add(downBox, BorderLayout.CENTER); panel.add(buttonPane, BorderLayout.SOUTH); - add(panel); - setSize(new Dimension(230, 105)); - centerWindow(this); + JPanel filterPane = new JPanel(new BorderLayout()); + filterPane.add(resetLabel, BorderLayout.NORTH); + filterPane.add(panel, BorderLayout.CENTER); + add(filterPane); + setSize(new Dimension(230, 125)); + centerWindow(frame); } private void centerWindow(Window window) { - window.setLocation(0, 95); + this.setLocation(window.getX(), 95); } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/FileVersionFirstRowPanel.java b/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/FileVersionFirstRowPanel.java index 9d892ba535..ff0a93fa8b 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/FileVersionFirstRowPanel.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/FileVersionFirstRowPanel.java @@ -15,7 +15,7 @@ public class FileVersionFirstRowPanel extends JPanel { super(new BorderLayout()); Box upPane = Box.createVerticalBox(); upPane.setBorder(new EmptyBorder(5, 10, 5, 10)); - upPane.add(new UILabel(Toolkit.i18nText("Fine-Design_Vcs_Local_User"))); + upPane.add(new UILabel(Toolkit.i18nText("Fine-Design_Vcs_Current"))); add(upPane, BorderLayout.CENTER); } } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/FileVersionRowPanel.java b/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/FileVersionRowPanel.java index a37a5cea66..cd01d409c4 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/FileVersionRowPanel.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/FileVersionRowPanel.java @@ -63,7 +63,7 @@ public class FileVersionRowPanel extends JPanel { public void actionPerformed(ActionEvent evt) { if (JOptionPane.showConfirmDialog(null, Toolkit.i18nText("Fine-Design_Vcs_Version_Revert_Confirm"), Toolkit.i18nText("Fine-Design_Vcs_Version_Revert_Title"), JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) { - vcsEntity.setUsername(VcsHelper.getCurrentUsername()); + vcsEntity.setUsername(VcsHelper.getInstance().getCurrentUsername()); WorkContext.getCurrent().get(VcsOperator.class).rollbackTo(vcsEntity); FileVersionsPanel.getInstance().exitVcs(vcsEntity.getFilename()); } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/VcsDateEditor.java b/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/VcsDateEditor.java new file mode 100644 index 0000000000..74b65ecfe2 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/VcsDateEditor.java @@ -0,0 +1,37 @@ +package com.fr.design.mainframe.vcs.ui; + +import com.fr.design.editor.editor.DateEditor; +import com.fr.log.FineLoggerFactory; + +import java.text.ParseException; +import java.util.Date; + +/** + * Created by XiaXiang on 2019/5/14. + */ +public class VcsDateEditor extends DateEditor { + private Date tempValue; + + public VcsDateEditor(Date value, boolean format, String name, int dateFormat) { + super(value, format, name, dateFormat); + this.tempValue = value; + } + + @Override + public Date getValue() { + if (tempValue == null) { + return null; + } + return super.getValue(); + } + + @Override + public void setValue(Date value) { + this.tempValue = value; + try { + getUiDatePicker().setSelectedDate(value); + } catch (ParseException parseException) { + FineLoggerFactory.getLogger().error(parseException.getMessage(), parseException); + } + } +} diff --git a/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/VcsLabel.java b/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/VcsLabel.java new file mode 100755 index 0000000000..a0180a1379 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/VcsLabel.java @@ -0,0 +1,32 @@ +package com.fr.design.mainframe.vcs.ui; + + +import com.fr.design.gui.ilable.ActionLabel; +import com.fr.design.gui.ilable.UILabel; + +import java.awt.Color; +import java.awt.Graphics; + +/** + * Created by XiaXiang on 2019/5/15. + */ +public class VcsLabel extends ActionLabel { + + + public VcsLabel(String text, Color color) { + super(text); + this.setForeground(color); + } + + public void paintComponent(Graphics g) { + if (ui != null) { + Graphics scratchGraphics = (g == null) ? null : g.create(); + try { + ui.update(scratchGraphics, this); + } + finally { + scratchGraphics.dispose(); + } + } + } +} \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/ui/Assistant.java b/designer-base/src/main/java/com/fr/design/ui/Assistant.java index 7a51c188c4..3962692c73 100644 --- a/designer-base/src/main/java/com/fr/design/ui/Assistant.java +++ b/designer-base/src/main/java/com/fr/design/ui/Assistant.java @@ -6,8 +6,14 @@ import com.teamdev.jxbrowser.chromium.BrowserContext; import com.teamdev.jxbrowser.chromium.ProtocolService; import com.teamdev.jxbrowser.chromium.URLResponse; +import javax.activation.MimetypesFileTypeMap; import java.io.DataInputStream; +import java.io.File; +import java.io.IOException; import java.io.InputStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; /** * @author richie @@ -41,7 +47,15 @@ public class Assistant { if (path.endsWith(".js")) { return "text/javascript"; } - return "text/html"; + if (path.endsWith(".svg")) { + return "image/svg+xml"; + } + Path file = new File(path).toPath(); + try { + return Files.probeContentType(file); + } catch (IOException e) { + return "text/html"; + } } public static void setEmbProtocolHandler(Browser browser, EmbProtocolHandler handler) { @@ -49,6 +63,6 @@ public class Assistant { ProtocolService protocolService = browserContext.getProtocolService(); // 支持读取jar包中文件的自定义协议————emb:/com/fr/design/images/bbs.png protocolService.setProtocolHandler("emb", handler); - //protocolService.setProtocolHandler("file", handler); + protocolService.setProtocolHandler("file", handler); } } diff --git a/designer-base/src/main/java/com/fr/design/ui/EmbProtocolHandler.java b/designer-base/src/main/java/com/fr/design/ui/EmbProtocolHandler.java index 94456df97f..04d2f0f853 100644 --- a/designer-base/src/main/java/com/fr/design/ui/EmbProtocolHandler.java +++ b/designer-base/src/main/java/com/fr/design/ui/EmbProtocolHandler.java @@ -2,6 +2,8 @@ package com.fr.design.ui; import com.fr.base.TemplateUtils; import com.fr.general.IOUtils; +import com.fr.log.FineLoggerFactory; +import com.fr.stable.EncodeConstants; import com.fr.stable.StringUtils; import com.fr.third.org.apache.commons.codec.net.URLCodec; import com.fr.third.org.apache.commons.io.FileUtils; @@ -15,11 +17,14 @@ import com.teamdev.jxbrowser.chromium.ProtocolHandler; import com.teamdev.jxbrowser.chromium.URLRequest; import com.teamdev.jxbrowser.chromium.URLResponse; +import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileInputStream; +import java.io.IOException; import java.io.InputStream; import java.io.StringReader; import java.net.URI; +import java.nio.charset.StandardCharsets; import java.util.Map; /** @@ -51,21 +56,20 @@ public class EmbProtocolHandler implements ProtocolHandler { @Override public URLResponse onRequest(URLRequest req) { + InputStream inputStream = null; try { String path = req.getURL(); if (path.startsWith("file:")) { String url = new URLCodec().decode(path); String filePath = TemplateUtils.renderParameter4Tpl(url, map); File file = new File(URI.create(filePath).getPath()); - InputStream inputStream = new FileInputStream(file); - if (path.endsWith(".svg")) { - System.out.println(path); - } - return Assistant.inputStream2Response(inputStream, "file:///" + file.getAbsolutePath()); - } - else if (path.startsWith("emb:dynamic")) { + inputStream = IOUtils.readResource(file.getAbsolutePath()); + String text = IOUtils.inputStream2String(inputStream, EncodeConstants.ENCODING_UTF_8); + text = TemplateUtils.renderParameter4Tpl(text, map); + return Assistant.inputStream2Response(new ByteArrayInputStream(text.getBytes(StandardCharsets.UTF_8)), path); + } else if (path.startsWith("emb:dynamic")) { URLResponse response = new URLResponse(); - response.setData(htmlText().getBytes()); + response.setData(htmlText(map).getBytes()); response.getHeaders().setHeader("Content-Type", "text/html"); return response; } else { @@ -75,16 +79,24 @@ public class EmbProtocolHandler implements ProtocolHandler { } else { path = path.substring(4); } - InputStream inputStream = IOUtils.readResource(path); + inputStream = IOUtils.readResource(path); return Assistant.inputStream2Response(inputStream, path); } - } catch (Exception ignore) { - ignore.printStackTrace(); + } catch (Exception e) { + FineLoggerFactory.getLogger().info(e.getMessage()); + } finally { + if (inputStream != null) { + try { + inputStream.close(); + } catch (IOException e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } + } } return null; } - private String htmlText() { + private String htmlText(Map map) { PathGroup pathGroup = AtomBuilder.create().buildAssembleFilePath(ModernRequestClient.KEY, component); StylePath[] stylePaths = pathGroup.toStylePathGroup(); StringBuilder styleText = new StringBuilder(); @@ -106,6 +118,13 @@ public class EmbProtocolHandler implements ProtocolHandler { } } result = result.replaceAll("##script##", scriptText.toString()); + if (map != null) { + for (Map.Entry entry : map.entrySet()) { + String key = entry.getKey(); + String value = entry.getValue(); + result = result.replaceAll("\\$\\{" + key + "}", value); + } + } return result; } } diff --git a/designer-base/src/main/java/com/fr/design/ui/ModernUIPane.java b/designer-base/src/main/java/com/fr/design/ui/ModernUIPane.java index 99a4fe97cf..4a92d3715c 100644 --- a/designer-base/src/main/java/com/fr/design/ui/ModernUIPane.java +++ b/designer-base/src/main/java/com/fr/design/ui/ModernUIPane.java @@ -52,6 +52,8 @@ public class ModernUIPane extends BasicPane { toolbar.add(openDebugButton); UIButton reloadButton = new UIButton(Toolkit.i18nText("Fine-Design_Basic_Reload")); toolbar.add(reloadButton); + UIButton closeButton = new UIButton(Toolkit.i18nText("Fine-Design_Basic_Close_Window")); + toolbar.add(closeButton); openDebugButton.addActionListener(new ActionListener() { @Override @@ -66,6 +68,13 @@ public class ModernUIPane extends BasicPane { browser.reloadIgnoringCache(); } }); + + closeButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + SwingUtilities.getWindowAncestor(ModernUIPane.this).setVisible(false); + } + }); BrowserPreferences.setChromiumSwitches("--remote-debugging-port=9222"); initializeBrowser(); add(new BrowserView(browser), BorderLayout.CENTER); @@ -107,6 +116,16 @@ public class ModernUIPane extends BasicPane { browser.loadURL(url); } + /** + * 转向一个新的地址,相当于重新加载 + * @param url 新的地址 + * @param map 初始化参数 + */ + public void redirect(String url, Map map) { + Assistant.setEmbProtocolHandler(browser, new EmbProtocolHandler(map)); + browser.loadURL(url); + } + @Override protected String title4PopupWindow() { return "Modern"; diff --git a/designer-base/src/main/java/com/fr/design/upm/UpmBridge.java b/designer-base/src/main/java/com/fr/design/upm/UpmBridge.java index 3d0f28613a..6a4b752fd1 100644 --- a/designer-base/src/main/java/com/fr/design/upm/UpmBridge.java +++ b/designer-base/src/main/java/com/fr/design/upm/UpmBridge.java @@ -2,6 +2,7 @@ package com.fr.design.upm; import com.fr.base.passport.FinePassportManager; import com.fr.config.MarketConfig; +import com.fr.config.ServerPreferenceConfig; import com.fr.decision.webservice.v10.plugin.helper.category.impl.UpmResourceLoader; import com.fr.design.bridge.exec.JSBridge; import com.fr.design.bridge.exec.JSCallback; @@ -10,6 +11,7 @@ import com.fr.design.extra.PluginUtils; import com.fr.design.extra.exe.GetInstalledPluginsExecutor; import com.fr.design.extra.exe.GetPluginCategoriesExecutor; import com.fr.design.extra.exe.GetPluginFromStoreExecutor; +import com.fr.design.extra.exe.GetPluginPrefixExecutor; import com.fr.design.extra.exe.PluginLoginExecutor; import com.fr.design.extra.exe.ReadUpdateOnlineExecutor; import com.fr.design.extra.exe.SearchOnlineExecutor; @@ -60,12 +62,34 @@ public class UpmBridge { this.window = browser.executeJavaScriptAndReturnValue("window").asObject(); } - public void startDownload(final JSFunction callback) { + /** + * 更新插件管理中心资源文件,这个方法仅仅是为了语义上的作用(更新) + * @param callback 安装完成后的回调函数 + */ + @JSBridge + public void update(final JSFunction callback) { + callback.invoke(window, "start", Toolkit.i18nText("Fine-Design_Basic_Update_Plugin_Manager_Download_Start")); + try { + UpmResourceLoader.INSTANCE.download(); + UpmResourceLoader.INSTANCE.install(); + callback.invoke(window, "success", Toolkit.i18nText("Fine-Design_Basic_Update_Plugin_Manager_Download_Success")); + EventDispatcher.fire(DownloadEvent.UPDATE, "success"); + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + callback.invoke(window, "error", Toolkit.i18nText("Fine-Design_Basic_Update_Plugin_Manager_Download_Error")); + } + } + /** + * 下载并安装插件管理中心的资源文件 + * @param callback 安装完成后的回调函数 + */ + @JSBridge + public void startDownload(final JSFunction callback) { + callback.invoke(window, "start", Toolkit.i18nText("Fine-Design_Basic_Update_Plugin_Manager_Download_Start")); new SwingWorker(){ @Override protected Void doInBackground() throws Exception { - callback.invoke(window, Toolkit.i18nText("Fine-Design_Basic_Update_Plugin_Manager_Download_Start")); UpmResourceLoader.INSTANCE.download(); UpmResourceLoader.INSTANCE.install(); return null; @@ -75,10 +99,10 @@ public class UpmBridge { protected void done() { try { get(); - callback.invoke(window, Toolkit.i18nText("Fine-Design_Basic_Update_Plugin_Manager_Download_Success")); + callback.invoke(window, "success", Toolkit.i18nText("Fine-Design_Basic_Update_Plugin_Manager_Download_Success")); EventDispatcher.fire(DownloadEvent.SUCCESS, "success"); } catch (Exception e) { - callback.invoke(window, Toolkit.i18nText("Fine-Design_Basic_Update_Plugin_Manager_Download_Error")); + callback.invoke(window, "error", Toolkit.i18nText("Fine-Design_Basic_Update_Plugin_Manager_Download_Error")); FineLoggerFactory.getLogger().error(e.getMessage(), e); EventDispatcher.fire(DownloadEvent.ERROR, "error"); } @@ -86,6 +110,15 @@ public class UpmBridge { }.execute(); } + /** + * 获取upm的版本信息 + * @return 版本信息 + */ + @JSBridge + public String getVersion() { + return ServerPreferenceConfig.getInstance().getOptimizedUPMVersion(); + } + @JSBridge public String i18nText(String key) { return Toolkit.i18nText(key); @@ -107,6 +140,12 @@ public class UpmBridge { callback.invoke(window, StringUtils.EMPTY); } + @JSBridge + public void getPluginPrefix(final JSFunction callback) { + UpmTaskWorker task = new UpmTaskWorker<>(new JSCallback(UpmBrowserExecutor.create(window, callback)), new GetPluginPrefixExecutor()); + task.execute(); + } + /** * 在线获取插件分类 * @@ -403,4 +442,27 @@ public class UpmBridge { FineLoggerFactory.getLogger().info(e.getMessage()); } } + + /** + * 使用系统浏览器打开网页 + * @param url 要打开的网页 + */ + @JSBridge + public void openShopUrlAtWebBrowser(String url) { + if (Desktop.isDesktopSupported()) { + try { + //创建一个URI实例,注意不是URL + URI uri = URI.create(url); + //获取当前系统桌面扩展 + Desktop desktop = Desktop.getDesktop(); + //判断系统桌面是否支持要执行的功能 + if (desktop.isSupported(Desktop.Action.BROWSE)) { + //获取系统默认浏览器打开链接 + desktop.browse(uri); + } + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } + } + } } diff --git a/designer-base/src/main/java/com/fr/design/upm/UpmShowPane.java b/designer-base/src/main/java/com/fr/design/upm/UpmShowPane.java index e64e5f02ea..57b225920a 100644 --- a/designer-base/src/main/java/com/fr/design/upm/UpmShowPane.java +++ b/designer-base/src/main/java/com/fr/design/upm/UpmShowPane.java @@ -38,8 +38,14 @@ public class UpmShowPane extends BasicPane { window.asObject().setProperty("PluginHelper", UpmBridge.getBridge(event.getBrowser())); } }) - .withURL(UpmFinder.getMainResourcePath()) + .withURL(UpmFinder.getMainResourcePath(), UpmUtils.renderMap()) .build(); + EventDispatcher.listen(DownloadEvent.UPDATE, new Listener() { + @Override + public void on(Event event, String param) { + modernUIPane.redirect(UpmFinder.getMainResourcePath(), UpmUtils.renderMap()); + } + }); } else { modernUIPane = new ModernUIPane.Builder<>() .withComponent(WarnComponent.KEY) @@ -53,7 +59,7 @@ public class UpmShowPane extends BasicPane { EventDispatcher.listen(DownloadEvent.SUCCESS, new Listener() { @Override public void on(Event event, String param) { - modernUIPane.redirect(UpmFinder.getMainResourcePath()); + modernUIPane.redirect(UpmFinder.getMainResourcePath(), UpmUtils.renderMap()); } }); } diff --git a/designer-base/src/main/java/com/fr/design/upm/UpmUtils.java b/designer-base/src/main/java/com/fr/design/upm/UpmUtils.java index a74f0f616e..d27b6721a4 100644 --- a/designer-base/src/main/java/com/fr/design/upm/UpmUtils.java +++ b/designer-base/src/main/java/com/fr/design/upm/UpmUtils.java @@ -1,7 +1,14 @@ package com.fr.design.upm; +import com.fr.common.annotations.Negative; +import com.fr.config.ServerPreferenceConfig; +import com.fr.general.CloudCenter; +import com.fr.stable.StringUtils; + import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** * @author richie @@ -18,4 +25,20 @@ public class UpmUtils { } return list.toArray(new String[0]); } + + @Negative(until = "2019-08-30") + public static Map renderMap() { + Map map4Tpl = new HashMap<>(); + map4Tpl.put("version", ServerPreferenceConfig.getInstance().getOptimizedUPMVersion()); + map4Tpl.put("new_version", fetchLatestVersion()); + return map4Tpl; + } + + private static String fetchLatestVersion() { + String version = CloudCenter.getInstance().acquireUrlByKind("upm.script.version"); + if (StringUtils.isBlank(version)) { + version = "1.0"; + } + return version; + } } diff --git a/designer-base/src/main/java/com/fr/design/upm/event/DownloadEvent.java b/designer-base/src/main/java/com/fr/design/upm/event/DownloadEvent.java index e07156b83e..25b4f0a9ea 100644 --- a/designer-base/src/main/java/com/fr/design/upm/event/DownloadEvent.java +++ b/designer-base/src/main/java/com/fr/design/upm/event/DownloadEvent.java @@ -9,5 +9,5 @@ import com.fr.event.Event; */ public enum DownloadEvent implements Event { - SUCCESS, ERROR + SUCCESS, ERROR, UPDATE } diff --git a/designer-base/src/main/java/com/fr/design/upm/loader/UpmDesignResourceLoader.java b/designer-base/src/main/java/com/fr/design/upm/loader/UpmDesignResourceLoader.java deleted file mode 100644 index 93857dc8bc..0000000000 --- a/designer-base/src/main/java/com/fr/design/upm/loader/UpmDesignResourceLoader.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.fr.design.upm.loader; - -import com.fr.decision.webservice.bean.plugin.store.ProjectInfoBean; -import com.fr.decision.webservice.v10.plugin.helper.category.impl.BaseResourceLoader; - -/** - * @author richie - * @version 10.0 - * Created by richie on 2019-04-18 - */ -public class UpmDesignResourceLoader extends BaseResourceLoader { - - @Override - public String getPluginPath() { - return "upm/plugin_design.html"; - } - - @Override - public void checkResourceExist(ProjectInfoBean projectInfoBean) throws Exception { - - } - - @Override - public String getDownloadPath() throws Exception { - return "http://fanruan-market.oss-cn-shanghai.aliyuncs.com/upm/1.0/upm-10.0.zip"; - } -} diff --git a/designer-base/src/main/java/com/fr/env/RemoteEnvPane.java b/designer-base/src/main/java/com/fr/env/RemoteEnvPane.java index b0f3e9dd48..0d4839d6da 100644 --- a/designer-base/src/main/java/com/fr/env/RemoteEnvPane.java +++ b/designer-base/src/main/java/com/fr/env/RemoteEnvPane.java @@ -19,8 +19,8 @@ import com.fr.log.FineLoggerFactory; import com.fr.stable.StringUtils; import com.fr.third.guava.base.Strings; import com.fr.workspace.WorkContext; -import com.fr.workspace.connect.AuthException; import com.fr.workspace.connect.WorkspaceConnectionInfo; +import com.fr.workspace.engine.exception.WorkspaceAuthException; import javax.swing.BorderFactory; import javax.swing.BoxLayout; @@ -523,7 +523,7 @@ public class RemoteEnvPane extends BasicBeanPane { DesignerEnvManager.getEnvManager().setCertificatePass(connection.getCertSecretKey()); try { return WorkContext.getConnector().testConnection(connection); - } catch (AuthException ignored) { + } catch (WorkspaceAuthException ignored) { return null; } } @@ -532,27 +532,9 @@ public class RemoteEnvPane extends BasicBeanPane { protected void done() { okButton.setEnabled(true); try { - TestConnectionResult result = TestConnectionResult.parse(get(), connection); - if (result == TestConnectionResult.Fully_Success) { - message.setText(Toolkit.i18nText("Fine-Design_Basic_Remote_Connect_Successful")); - uiLabel.setIcon(UIManager.getIcon("OptionPane.informationIcon")); - } - - if (result == TestConnectionResult.Partly_Sucess) { - message.setText(Toolkit.i18nText("Fine-Design_Basic_Remote_Design_Version_Inconsistence_Test")); - uiLabel.setIcon(UIManager.getIcon("OptionPane.warningIcon")); - } - - if (result == TestConnectionResult.Fully_Failed) { - message.setText(Toolkit.i18nText("Fine-Design_Basic_Remote_Connect_Failed")); - uiLabel.setIcon(UIManager.getIcon("OptionPane.errorIcon")); - } - - if (result == TestConnectionResult.Auth_Failed) { - message.setText(Toolkit.i18nText("Fine-Design_Basic_Remote_Connect_Auth_Failed")); - uiLabel.setIcon(UIManager.getIcon("OptionPane.errorIcon")); - } + message.setText(result.getText()); + uiLabel.setIcon(result.getIcon()); } catch (InterruptedException | ExecutionException e) { FineLoggerFactory.getLogger().error(e, e.getMessage()); message.setText(Toolkit.i18nText("Fine-Design_Basic_Remote_Connect_Failed")); diff --git a/designer-base/src/main/java/com/fr/env/TestConnectionResult.java b/designer-base/src/main/java/com/fr/env/TestConnectionResult.java index 357d4f38cb..5362dbbd83 100644 --- a/designer-base/src/main/java/com/fr/env/TestConnectionResult.java +++ b/designer-base/src/main/java/com/fr/env/TestConnectionResult.java @@ -1,62 +1,104 @@ package com.fr.env; +import com.fr.design.i18n.Toolkit; import com.fr.log.FineLoggerFactory; import com.fr.stable.AssistUtils; import com.fr.workspace.WorkContext; import com.fr.workspace.connect.WorkspaceConnectionInfo; import com.fr.workspace.engine.channel.http.FunctionalHttpRequest; +import javax.swing.Icon; +import javax.swing.UIManager; + /** * 测试连接的结果。 * 不改变原有逻辑的情况下,加入一层转化。 * 根据这里的转化结果,判断需要提示哪些内容。 - * + *

* created by Harrison on 2018/12/20 **/ public enum TestConnectionResult { /** * 完全成功, 版本匹配,测试连接成功。 */ - Fully_Success, + FULLY_SUCCESS { + @Override + public Icon getIcon() { + return UIManager.getIcon("OptionPane.informationIcon"); + } + + @Override + public String getText() { + return Toolkit.i18nText("Fine-Design_Basic_Remote_Connect_Successful"); + } + }, /** * 不完全成功,版本不匹配,但测试连接成功。 */ - Partly_Sucess, + PARTLY_SUCCESS { + @Override + public Icon getIcon() { + return UIManager.getIcon("OptionPane.warningIcon"); + } + + @Override + public String getText() { + return Toolkit.i18nText("Fine-Design_Basic_Remote_Design_Version_Inconsistence_Test"); + } + }, /** * 完全失败,直接没连上 */ - Fully_Failed, + FULLY_FAILED { + @Override + public Icon getIcon() { + return UIManager.getIcon("OptionPane.errorIcon"); + } + + @Override + public String getText() { + return Toolkit.i18nText("Fine-Design_Basic_Remote_Connect_Failed"); + } + }, /** * 验证 Token 失败 */ - Auth_Failed; + AUTH_FAILED { + @Override + public Icon getIcon() { + return UIManager.getIcon("OptionPane.errorIcon"); + } + + @Override + public String getText() { + return Toolkit.i18nText("Fine-Design_Basic_Remote_Connect_Auth_Failed"); + } + }; + + public abstract Icon getIcon(); + + public abstract String getText(); public static TestConnectionResult parse(Boolean value, WorkspaceConnectionInfo info) { if (value == null) { - return Auth_Failed; + return AUTH_FAILED; } - if (!value) { - return Fully_Failed; + return FULLY_FAILED; } try { - String serverVersion = new FunctionalHttpRequest(info).getServerVersion(); if (AssistUtils.equals(serverVersion, WorkContext.getVersion())) { - return Fully_Success; + return FULLY_SUCCESS; } - - return Partly_Sucess; + return PARTLY_SUCCESS; } catch (Exception e) { - // 发生异常,说明没连接上。返回完全失败。 FineLoggerFactory.getLogger().error(e.getMessage()); - return Fully_Failed; + return FULLY_FAILED; } - - } } diff --git a/designer-base/src/main/resources/com/fr/design/dcm/index.js b/designer-base/src/main/resources/com/fr/design/dcm/index.js new file mode 100644 index 0000000000..5f6220c748 --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/dcm/index.js @@ -0,0 +1,2 @@ +!function(e){var t={};function i(s){if(t[s])return t[s].exports;var o=t[s]={i:s,l:!1,exports:{}};return e[s].call(o.exports,o,o.exports,i),o.l=!0,o.exports}i.m=e,i.c=t,i.d=function(e,t,s){i.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:s})},i.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.t=function(e,t){if(1&t&&(e=i(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var s=Object.create(null);if(i.r(s),Object.defineProperty(s,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)i.d(s,o,function(t){return e[t]}.bind(null,o));return s},i.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(t,"a",t),t},i.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},i.p="",i(i.s=0)}([function(e,t,i){BI.DOM.ready(()=>{const e=i(5).default;BI.createWidget({type:e,element:"body"})})},function(e,t,i){},function(e,t){const i=BI.Constants.getConstant("dec.constant.database.conf.connect.form.redis.value"),s=BI.inherit(BI.Widget,{render:()=>({type:"bi.vertical",cls:"bi-plugin-redis",bgap:10,items:[{type:"bi.left",height:30,items:[{type:"bi.label",text:"数据库地址:",height:24,width:115,textAlign:"left"},{type:"bi.label",text:i.url,height:24}]},{type:"bi.left",height:30,items:[{type:"bi.label",text:"端口:",height:24,width:115,textAlign:"left"},{type:"bi.label",text:i.port,height:24}]},{type:"bi.left",height:30,items:[{type:"bi.label",text:"密码:",height:24,width:115,textAlign:"left"},{type:"bi.label",text:"********",height:24}]}]})});BI.shortcut("fr.plugin.redis.preview",s),BI.constant("dec.constant.database.conf.connect.form.redis.preview","fr.plugin.redis.preview")},function(e,t){const i=BI.inherit(BI.Widget,{render(){const{maxActive:e,maxIdle:t,numActive:i,numIdle:s}=this.options;return{type:"bi.left",items:[{type:"bi.left",cls:"right-status-item",items:[{type:"bi.vertical",cls:"right-status-board",items:[{type:"bi.vertical",cls:"right-status-board-item",items:[{type:"bi.label",cls:"right-status-text",extraCls:"card-font1",text:i},{type:"bi.label",cls:"right-status-text",text:"/"},{type:"bi.label",cls:"right-status-text",text:e}]},{type:"bi.label",text:"Redis连接数"}]}]}]}}});BI.shortcut("fr.plugin.redis.pool",i),BI.constant("dec.constant.database.conf.connect.form.redis.pool","fr.plugin.redis.pool")},function(e,t,i){},function(e,t,i){"use strict";i.r(t);const s="bi.icon_label",o="bi.label",r="bi.button",n="bi.editor",l="bi.vtape",a="bi.htape",c="bi.layout",d="bi.vertical",h="bi.left",p=[],m={childContext:["tab","linkList","linkSelected","linkUpdate","moreLinkSelected","statusSelected","connectionNameErr"],state:()=>({tab:"数据连接管理",linkList:p,linkSelected:{},linkUpdate:{},moreLinkSelected:"",statusSelected:"",connectionNameErr:""}),computed:{},actions:{setLinkList(e){this.model.linkList=e}}};BI.model("fr.model.main",BI.inherit(Fix.Model,m));const b=BI.inherit(Fix.Model,{context:["tab"],actions:{setTab(e){this.model.tab=e}}});BI.model("fr.model.title.item",b);function u(e,t){return e===t?{color:"#3685f2","border-bottom":"solid 2px #3685f2"}:{color:"#3d4d66","border-bottom":"none"}}const g=BI.inherit(BI.Widget,{props:{text:""},_store:()=>BI.Models.getModel("fr.model.title.item"),watch:{tab(e){const{text:t}=this.options;this.element.css(u(t,e))}},render(){const{text:e}=this.options;return{type:o,cls:"title-item",text:e}},mounted(){const{text:e}=this.options;this.element.css(u("数据连接管理",e)),this.element.on("click",()=>{this.store.setTab(e)})}});BI.shortcut("fr.title.item",g);const y={data:[{connectionId:"8c1c52f1-3d0a-429e-b35f-ee1e085a8b72",database:"",connectionName:"FRDemo",driver:"org.sqlite.JDBC",url:"jdbc:sqlite://${ENV_HOME}/../help/FRDemo.db",user:"",password:"",queryType:"",newCharsetName:"null",originalCharsetName:"",validationQuery:"",schema:"",testOnBorrow:!0,maxActive:50,options:"null",port:0,authType:"",creator:"designer",principal:"",keyPath:"",databaseType:"designer",privilegeDetailBeanList:"null"}]},f=window.parent.Dec,v=window.PluginHelper;const x=["数据连接管理","连接池状态"],I={render(){return{type:h,cls:"title",items:[...BI.map(x,(e,t)=>({type:"fr.title.item",text:t})),{type:"bi.icon_button",cls:"close-button",handler(){!function(){if(v)return v.closeWindow();console.log("关闭窗口")}()},invisible:!0,ref:e=>{this.CloseButton=e}}]}},mounted(){v&&v.isDesigner()&&this.CloseButton.setVisible(!0)}};BI.shortcut("fr.title",BI.inherit(BI.Widget,I));const k="dec.constant.database.conf.connect.list",B=["APACHE KYLIN","DERBY","HP Vertica","IBM DB2","INFORMIX","Microsoft SQL Server","MySQL","Oracle","Privotal Greenplum Database","Postgresql","GaussDB 200"];BI.constant(k,[]);var E=k;const w=[{text:"APACHE KYLIN",databaseType:"apache-kylin",driver:"org.apache.kylin.jdbc.Driver",url:"jdbc:kylin://:/"},{text:"DERBY",databaseType:"derby",driver:"org.apache.derby.jdbc.ClientDriver",url:"jdbc:derby://localhost:1527/"},{text:"HP Vertica",databaseType:"hp-vertica",driver:"com.vertica.jdbc.Driver",url:"jdbc:vertica://ip:port/databaseName"},{text:"IBM DB2",databaseType:"ibm-db2",driver:"com.ibm.db2.jcc.DB2Driver",url:"jdbc:db2://hostname:port/dbname"},{text:"INFORMIX",databaseType:"informix",driver:"com.informix.jdbc.IfxDriver",url:"jdbc:informix-sqli://{host}:{port}/{database}:INFORMIXSERVER={server}"},{text:"Microsoft SQL Server",databaseType:"sql-server",driver:"com.microsoft.sqlserver.jdbc.SQLServerDriver",url:"jdbc:sqlserver://localhost:1433;databaseName="},{text:"Oracle",databaseType:"oracle",driver:"oracle.jdbc.driver.OracleDriver",url:"jdbc:oracle:thin:@localhost:1521:databaseName"},{text:"Privotal Greenplum Database",databaseType:"pivotal-greenplum-database",driver:"org.postgresql.Driver",url:"jdbc:postgresql://hostname:port/dbname"},{text:"Postgresql",databaseType:"postgresql",driver:"org.postgresql.Driver",url:"jdbc:postgresql://hostname:port/dbname"},{text:"GaussDB 200",databaseType:"hw-libr-a",driver:"org.postgresql.Driver",url:"jdbc:postgresql://hostname:port/dbname"},{text:"MySQL",databaseType:"mysql",driver:"com.mysql.jdbc.Driver",drivers:["com.mysql.jdbc.Driver","org.gjt.mm.mysql.Driver"],url:"jdbc:mysql://localhost/dbname"},{text:"其他",databaseType:"other",driver:"org.h2.Driver",drivers:["org.h2.Driver","com.fr.third.org.hsqldb.jdbcDriver","org.sqlite.JDBC"],url:"jdbc:h2://${ENV_HOME}/../databaseName"},{text:"ADS",databaseType:"ads",driver:"com.mysql.jdbc.Driver",url:"jdbc:mysql://hostname:port/my_ads_db"},{text:"Amazon Redshift",databaseType:"amazon-redshift",driver:"com.amazon.redshift.jdbc4.Driver",drivers:["com.amazon.redshift.jdbc4.Driver","com.amazon.redshift.jdbc41.Driver"],url:"jdbc:redshift://endpoint:port/database"},{text:"APACHE IMPALA",databaseType:"apache-impala",driver:"com.cloudera.impala.jdbc41.Driver",url:"jdbc:impala://hostname:port/_impala_builtins"},{text:"APACHE KYLIN",databaseType:"apache-kylin",driver:"org.apache.kylin.jdbc.Driver",url:"jdbc:kylin://:/"},{text:"APACHE Phoenix",databaseType:"apache-phoenix",driver:"org.apache.phoenix.jdbc.PhoenixDriver",url:"jdbc:phoenix:hostname:port/dbname"},{text:"DERBY",databaseType:"derby",driver:"org.apache.derby.jdbc.ClientDriver",url:"jdbc:derby://localhost:1527/"},{text:"Gbase 8A",databaseType:"gbase-8a",driver:"com.gbase.jdbc.Driver",url:"jdbc:gbase://hostname:port/dbname"},{text:"Gbase 8S",databaseType:"gbase-8s",driver:"com.gbasedbt.jdbc.IfxDriver",url:"jdbc:gbasedbt-sqli://{host}:{port}/{database}"},{text:"Gbase 8T",databaseType:"gbase-8t",driver:"com.informix.jdbc.IfxDriver",url:"jdbc:informix-sqli://{host}:{port}/{database}:INFORMIXSERVER={server}"},{text:"H2",databaseType:"h2",driver:"org.h2.Driver",url:"jdbc:h2://${ENV_HOME}/../databaseName"},{text:"华为云DWS",databaseType:"hw-dws",driver:"org.postgresql.Driver",url:"jdbc:postgresql://hostname:port/dbname"},{text:"FusionInsight elk",databaseType:"hw-elk",driver:"org.postgresql.Driver",url:"jdbc:postgresql://hostname:port/dbname"},{text:"FusionInsight HD",databaseType:"hw-fusioninsight-hd",driver:"org.apache.hive.jdbc.HiveDriver",url:"jdbc:hive2://10.135.0.110:24002,10.135.0.67:24002,10.135.0.66:24002/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2;sasl.qop=auth-conf;auth=KERBEROS;zk.principal=zookeeper/hadoop;principal=hive/hadoop.hadoop.com@HADOOP.COM;"},{text:"GaussDB 200",databaseType:"hw-libr-a",driver:"org.postgresql.Driver",url:"jdbc:postgresql://hostname:port/dbname"},{text:"Hadoop Hive",databaseType:"hadoop-hive",driver:"org.apache.hive.jdbc.HiveDriver",url:"jdbc:hive2://hostname:port/databasename"},{text:"Hbase",databaseType:"hbase",driver:"org.apache.phoenix.jdbc.PhoenixDriver",url:"jdbc:phoenix:hostname:port/dbname"},{text:"HP Vertica",databaseType:"hp-vertica",driver:"com.vertica.jdbc.Driver",url:"jdbc:vertica://ip:port/databaseName"},{text:"Hsql",databaseType:"hsql",driver:"com.fr.third.org.hsqldb.jdbcDriver",url:"jdbc:hsqldb:file:[PATH_TO_DB_FILES]"},{text:"IBM DB2",databaseType:"ibm-db2",driver:"com.ibm.db2.jcc.DB2Driver",url:"jdbc:db2://hostname:port/dbname"},{text:"INFORMIX",databaseType:"informix",driver:"com.informix.jdbc.IfxDriver",url:"jdbc:informix-sqli://{host}:{port}/{database}:INFORMIXSERVER={server}"},{text:"KINGBASE",databaseType:"kingbase",driver:"com.kingbase.Driver",url:"jdbc:kingbase://hostname:port"},{text:"Microsoft SQL Server",databaseType:"sql-server",driver:"com.microsoft.sqlserver.jdbc.SQLServerDriver",url:"jdbc:sqlserver://localhost:1433;databaseName="},{text:"MySQL",databaseType:"mysql",driver:"com.mysql.jdbc.Driver",drivers:["com.mysql.jdbc.Driver","org.gjt.mm.mysql.Driver"],url:"jdbc:mysql://localhost/dbname"},{text:"Oracle",databaseType:"oracle",driver:"oracle.jdbc.driver.OracleDriver",url:"jdbc:oracle:thin:@localhost:1521:databaseName"},{text:"Pivotal Greenplum Database",databaseType:"pivotal-greenplum-database",driver:"org.postgresql.Driver",url:"jdbc:postgresql://hostname:port/dbname"},{text:"Postgresql",databaseType:"postgresql",driver:"org.postgresql.Driver",url:"jdbc:postgresql://hostname:port/dbname"},{text:"Presto",databaseType:"presto",driver:"com.facebook.presto.jdbc.PrestoDriver",url:"jdbc:presto://host:port/catalog"},{text:"SAP HANA",databaseType:"sap-hana",driver:"com.sap.db.jdbc.Driver",url:"jdbc:sap://hostname:port?reconnect=true"},{text:"SAP Sybase",databaseType:"sap-sybase",driver:"com.sybase.jdbc4.jdbc.SybDriver",url:"jdbc:sybase:Tds:hostname:2638/databasename"},{text:"SPARK",databaseType:"spark",driver:"org.apache.hive.jdbc.HiveDriver",url:"jdbc:hive2://hostname:port/databasename"},{text:"Sqlite",databaseType:"sqlite",driver:"org.sqlite.JDBC",url:"jdbc:sqlite:[PATH_TO_DB_FILES]"},{text:"TeraData",databaseType:"teradata",driver:"com.ncr.teradata.TeraDriver",url:"jdbc:teradata://localhost/CLIENT_CHARSET=EUC_CN,TMODE=TERA,CHARSET=ASCII,LOB_SUPPORT"},{text:"TRANSWARP INCEPTOR",databaseType:"transwarp-inceptor",driver:"org.apache.hive.jdbc.HiveDriver",url:"jdbc:hive2://hostname:port/databasename"}],N=(e,t)=>{const i=BI.Constants.getConstant(E);let s=0;const o=t.replace(/[0-9]/g,""),r=BI.some(i,(e,t)=>t===o)?o:"数据连接";return e.forEach(e=>{if(e.isSelected=!1,e.connectionName.startsWith(r)){const t=e.connectionName.replace(r,"0"),i=parseInt(t,10)+1;i>s&&(s=i)}}),`${r}${s>0?s:""}`};var T=new class{confirm(e,t){const i=BI.UUID();return BI.Popovers.create(i,{type:"bi.bar_popover",size:"normal",header:"提示",width:450,height:220,body:{type:"bi.left",cls:"comfirm-content",items:[{type:"bi.layout",cls:"comfirm-icon",width:50,height:50},{type:"bi.label",text:e}]},listeners:[{eventName:"EVENT_CONFIRM",action(){t&&t(!0)}},{eventName:"EVENT_CANCEL",action(){t&&t(!1)}}]}).open(i),i}loading(e){const t={type:"bi.center_adapt",cls:"show-content",items:[{type:d,items:[{type:"bi.layout",cls:"loading-icon",width:100,height:100},{type:o,text:e}]}]};return this.show(t)}success(e){const t={type:"bi.center_adapt",cls:"show-content",items:[{type:d,items:[{type:"bi.layout",cls:"success-icon",width:100,height:100},{type:o,text:e}]}]};return this.show(t,1e3)}error(e){const t={type:"bi.center_adapt",cls:"show-content",items:[{type:d,items:[{type:"bi.layout",cls:"error-icon",width:100,height:100},{type:o,text:e}]}]};return this.show(t,2e3)}linkFail(e,t,i){let s=null,n=null;const l=BI.UUID(),a=this,p={type:d,items:[{type:"bi.center_adapt",cls:"show-content",tgap:10,items:[{type:d,items:[{type:c,cls:"error-icon",width:100,height:100},{type:o,text:e},{type:h,cls:"buttons",items:[{type:r,text:"详细信息",level:"ignore",handler(){const e="详细信息"===this.getText();s.element.css({height:e?"290":"220"}),n.setVisible(e),this.setText(e?"收起信息":"详细信息")}},{type:r,text:"返回",level:"ignore",handler(){a.close(l)}},{type:r,text:"重新连接",handler(){a.close(l),i&&i()}}]}]}]},{type:o,cls:"show-more",text:t,invisible:!0,ref(e){n=e}}]};return BI.Popovers.create(l,{type:"bi.popover",cls:"popover-notitle",extraCls:"bi-custom-show",size:"normal",width:450,height:220,body:p,ref(e){s=e}}).open(l),l}close(e){BI.Popovers.close(e)}show(e,t=0){const i=BI.UUID();return BI.Popovers.create(i,{type:"bi.popover",cls:"popover-notitle",extraCls:"bi-custom-show",size:"normal",width:450,height:220,body:e}).open(i),t>0&&setTimeout(()=>{this.close(i)},t),i}};function C(e){return e.connectionId?new Promise((t,i)=>{try{!function(e,t){console.log("%cdata: ","color: MidnightBlue; background: Aquamarine;",e),f?f.reqPost("/v10/config/connection",e,e=>{t(e.data)}):t("success")}(e,e=>{t(e)})}catch(e){i(e)}}):new Promise((t,i)=>{try{!function(e,t){console.log("%cdata: ","color: MidnightBlue; background: Aquamarine;",e),f?f.reqPut("/v10/config/connection",e,e=>{t(e.data)}):t("success")}(e,e=>{t(e)})}catch(e){i(e)}})}const S={context:["tab","linkList","linkSelected","linkUpdate","connectionNameErr"],actions:{setLinkSelected(e){this.noSaveConfirm(()=>{this._setLinkSelected(e)})},_setLinkSelected(e){this.model.linkList.forEach(t=>{t.isSelected=t.connectionName===e,t.connectionName===e&&(this.model.linkSelected=Object.assign({},t,{isSelected:!1}))}),this.model.linkList=[...this.model.linkList],this.model.linkUpdate=this.model.linkSelected},onIconClick(e,t){switch(e){case"删除":!function(e,t){console.log("%cid: ","color: MidnightBlue; background: Aquamarine;",e),f?f.reqDeleta(`/v10/config/connection/${e}`,e=>{t(e.data)}):t("success")}(t,()=>{this.model.linkList=[...this.model.linkList.filter(e=>e.connectionId!==t)],this.model.linkSelected={},this.model.linkUpdate={}});break;case"测试连接":this._textLink(t);break;case"复制":this.noSaveConfirm(()=>{this.copyLink(t)})}},_textLink(e){const t=T.loading("正在测试连接,请稍候..."),i=this.model.linkList.find(t=>t.connectionId===e);var s,o;s=i,o=(s=>{T.close(t),s&&s.errorCode?T.linkFail(`${i.connectionName}测试连接失败`,s.errorMsg,()=>{this._textLink(e)}):T.success("连接成功")}),console.log("%cdata: ","color: MidnightBlue; background: Aquamarine;",s),f?f.reqPost("/v10/config/connection/test",s,e=>{o(e)}):setTimeout(()=>{o({errorCode:"500",errorMsg:"createConnectionThread not start!"})},2e3)},copyLink(e){const t=BI.find(this.model.linkList,(t,i)=>i.connectionId===e).connectionName,i=N(this.model.linkList,t);let s={};this.model.linkList.forEach(t=>{t.connectionId===e&&(s=t)});const o=Object.assign({},s,{isSelected:!0,connectionName:i,connectionId:""});this.model.linkList=[o,...this.model.linkList],this.model.linkSelected=Object.assign({},o),this.model.linkUpdate=Object.assign({},o)},setLinkUpdate(e){this.model.linkUpdate=e},setEdit(e){this.model.linkSelected=Object.assign({},this.model.linkSelected,{isSelected:e}),this.model.linkUpdate=this.model.linkSelected},setCancel(){const e=this.model.linkSelected,t=this.model.linkList;e.connectionId?this.setEdit(!1):(this.model.linkList=[...t.filter(e=>!!e.connectionId)],this.model.linkList.length>0?(this.model.linkList[0].isSelected=!0,this.model.linkSelected=Object.assign({},this.model.linkList[0],{isSelected:!1})):this.model.linkSelected={},this.model.linkUpdate=this.model.linkSelected)},setNewLink(e){w.some(t=>t.text===e)||BI.Constants.getConstant(`dec.constant.database.conf.connect.form.${e.toLowerCase()}.edit`)?this.noSaveConfirm(()=>{this._setNewLink(e)}):T.error("找不到该连接的配置信息")},_setNewLink(e){const t=N(this.model.linkList,e);let i={};w.forEach(t=>{t.text===e&&(i=t)}),this.model.linkList=[Object.assign({connectionName:t,isSelected:!0},i,{text:e}),...this.model.linkList],this.model.linkSelected=Object.assign({},i,{connectionName:t,isSelected:!0,text:e}),this.model.linkUpdate=Object.assign({},i,{connectionName:t,text:e})},setConnectionNameErr(e){this.model.connectionNameErr=e},noSaveConfirm(e){this.model.linkSelected&&this.model.linkSelected.isSelected?T.confirm("当前设置尚未保存,是否保存?",t=>{t?this.saveLink():this.setCancel(),e()}):e()},saveLink(){const e=this.model.linkUpdate.text?BI.Constants.getConstant(`dec.constant.database.conf.connect.form.${this.model.linkUpdate.text.toLowerCase()}.value`):{};C(Object.assign({},this.model.linkUpdate,e)).then(()=>{this.setEdit(!1)})}}};BI.model("fr.model.linkset",BI.inherit(Fix.Model,S));var j="fr.model.linkset";const _={_store:()=>BI.Models.getModel(j),render(){const{cls:e,title:t,id:i}=this.options,o=this;let r=null,n=null;return"删除"===t?{type:"bi.bubble_combo",direction:"bottom",ref(){n=this},el:{type:s,cls:e,extraCls:"action-icon",height:24,width:26,title:t,ref(e){r=e}},popup:{type:"bi.text_bubble_bar_popup_view",text:"确定删除该数据连接?",listeners:[{eventName:BI.BubblePopupBarView.EVENT_CLICK_TOOLBAR_BUTTON,action(e){n.hideView(),e&&o.store.onIconClick(t,i)}}]},listeners:[{eventName:BI.BubbleCombo.EVENT_EXPAND,action(){r.element.css({visibility:"visible"})}},{eventName:BI.BubbleCombo.EVENT_AFTER_HIDEVIEW,action(){r.element.css({visibility:"hidden"})}}]}:{type:s,cls:e,extraCls:"action-icon",height:24,width:26,title:t}},mounted(){const{title:e,id:t}=this.options;"删除"!==e?this.element.on("click",i=>{i.stopPropagation(),this.store.onIconClick(e,t)}):this.element.on("click",e=>{e.stopPropagation()})}};BI.shortcut("fr.component.linkSet.left.item.icon",BI.inherit(BI.Widget,_));const L={props:{title:"",id:"",creator:""},_store:()=>BI.Models.getModel(j),render(){const{title:e,extraCls:t,creator:i,text:r,id:n}=this.options;return{type:h,cls:"left-item",extraCls:t,items:[{type:s,cls:"link-font",height:24,width:26,text:"连接",title:e},{type:o,cls:"link-title",textAlign:"left",text:e,title:e},{type:h,cls:"icons",items:[{type:"fr.component.linkSet.left.item.icon",cls:"link-text-font",title:"测试连接",id:n},{type:"fr.component.linkSet.left.item.icon",cls:"copy-font",title:"复制",id:n},{type:"fr.component.linkSet.left.item.icon",cls:"info-font",title:`类型:${"DESIGNER"===r?"其他":r} \r\n创建者:${i}`,id:n},{type:"fr.component.linkSet.left.item.icon",cls:"delete-font",title:"删除",id:n}]}]}},mounted(){const{title:e}=this.options;this.element.on("click",()=>{this.store.setLinkSelected(e)})}};BI.shortcut("fr.component.linkSet.left.item",BI.inherit(BI.Widget,L));let D=null;const A={_store:()=>BI.Models.getModel(j),watch:{linkList(e){D.populate(BI.createItems((e=>{const t=[];return e.forEach(e=>{t.push({type:"fr.component.linkSet.left.item",extraCls:e.isSelected?"left-item-selected":"",title:e.connectionName,id:e.connectionId,creator:e.creator,text:e.text?e.text:"默认"})}),t})(e)))}},render:()=>({type:d,ref(e){D=e}})};BI.shortcut("fr.component.linkset.left",BI.inherit(BI.Widget,A));const M={render(){const{text:e,name:t,selected:i}=this.options;return{type:d,cls:"link-item",width:120,height:117,items:[{type:"bi.img",width:120,height:90,src:`./img/${t}.jpg`},{type:c,cls:"selected",invisible:!i,width:30,height:30},{type:o,cls:"text",text:e}]}},mounted(){const{text:e}=this.options;this.element.on("click",()=>{this.fireEvent("EVENT_SELECT",e)})}};BI.shortcut("fr.component.linkSet.morelink.item",BI.inherit(BI.Widget,M));let O=null;const U={render:()=>({type:l,cls:"more-link",items:[{el:{type:d,items:[{type:"bi.search_editor",width:300,watermark:"搜索"}]},height:30},{type:h,cls:"more-link-item",ref(e){O=e}}]}),mounted(){this._renderItems()},_renderItems(e=""){const t=w.slice(12,45),i=[],s=this;t.forEach(t=>{i.push({type:"fr.component.linkSet.morelink.item",text:t.text,name:t.databaseType,selected:e===t.text,listeners:[{eventName:"EVENT_SELECT",action(e){s._renderItems(e),s.fireEvent("EVENT_SELECT",e)}}]})}),O.populate(BI.createItems(i))}};BI.shortcut("fr.component.linkSet.morelink",BI.inherit(BI.Widget,U));let q=null,V="";const P={_store:()=>BI.Models.getModel(j),render(){let e=null;return{type:"bi.combo",cls:"select",trigger:"click",adjustYOffset:4,el:{type:"bi.button",text:"新建数据连接",height:24},popup:{el:{type:"bi.button_group",cls:"database-link-items",items:[...BI.map([...B,...BI.Constants.getConstant(E)],(e,t)=>({type:"bi.text_item",height:24,width:152,text:t,title:t,value:t})),{type:"bi.text_item",cls:"link-item",height:24,width:152,text:"更多数据连接...",title:"更多数据连接...",value:"more"},{type:"bi.text_item",cls:"link-item",height:24,width:152,text:"其他",title:"其他",value:"其他"}],layouts:[{type:d}]},maxHeight:400},listeners:[{eventName:"EVENT_CHANGE",action:t=>{"more"===t?(e=>{const t=BI.UUID();let i=null;BI.Popovers.create(t,{type:"bi.bar_popover",size:"normal",header:"更多数据连接",width:550,height:500,body:{type:"fr.component.linkSet.morelink",listeners:[{eventName:"EVENT_SELECT",action(e){V=e,q.setEnable(!0)}}]},footer:{type:"bi.right_vertical_adapt",lgap:10,items:[{type:"bi.button",text:"取消",value:1,level:"ignore",handler(e){i.close(e)}},{type:"bi.button",text:"确定",disabled:!0,value:0,ref(e){q=e},handler(t){i.close(t),e&&e(V)}}]},ref(e){i=e}}).open(t)})(e=>{this.store.setNewLink(e)}):this.store.setNewLink(t),e.hideView()}}],ref(){e=this}}}};BI.shortcut("fr.linkset.select",BI.inherit(BI.Widget,P));const H={render:()=>({type:"bi.center_adapt",items:[{type:d,width:260,height:180,items:[{type:c,cls:"data-connection-background",width:260,height:130},{type:o,cls:"bi-tips",height:20,text:"请选择左侧数据连接或点击新建数据连接"},{type:o,cls:"bi-tips",height:20,text:"平台仅支持使用JDBC的数据连接的管理"}]}]})};BI.shortcut("fr.component.right.nothing",BI.inherit(BI.Widget,H));const R={_store:()=>BI.Models.getModel(j),render(){const e=this.model.linkSelected,t=this.model.linkList,i=this,{isEdit:s}=this.options;return{type:h,height:40,cls:"right-title",items:[{type:o,cls:"right-title-text",text:`数据连接(${e.text?e.text:"默认"})`},{type:r,cls:"right-title-button",invisible:s,text:"编辑",handler(){i.store.setEdit(!0)}},{type:r,cls:"right-title-button",invisible:!s,text:"保存",handler(){BI.find(t,(e,t)=>i.model.linkUpdate.connectionName===t.connectionName&&t.connectionId!==i.model.linkUpdate.connectionId)?i.store.setConnectionNameErr("数据连接名已存在"):i.store.saveLink()}},{type:r,cls:"right-title-button",invisible:!s,level:"ignore",text:"取消",handler(){i.store.setCancel()}}]}}};BI.shortcut("fr.component.right.title",BI.inherit(BI.Widget,R));const G="fr.shared.component.both.side",W={render(){const{leftText:e,rightText:t}=this.options;return{type:a,cls:"both-side",height:24,items:[{el:{type:o,cls:"left",textAlign:"left",text:e},width:115},{type:o,textAlign:"left",text:t}]}}};BI.shortcut(G,BI.inherit(BI.Widget,W));var F=G;const $={render(){const{text:e}=this.options;return{type:o,cls:"shared-component-title",textAlign:"left",text:e}}};BI.shortcut("fr.shared.component.title",BI.inherit(BI.Widget,$));const Q={_store:()=>BI.Models.getModel(j),render(){const e=this.model.linkSelected;return{type:d,cls:"right-show",items:[{type:F,leftText:"数据连接名",rightText:e.connectionName},{type:F,leftText:"驱动器",rightText:e.driver},{type:F,leftText:"URL",rightText:e.url},{type:F,leftText:"编码",rightText:""===e.originalCharsetName?"自动":e.originalCharsetName},{type:F,leftText:"用户名",rightText:e.user},{type:F,leftText:"密码",rightText:e.password},{type:"fr.shared.component.title",text:"连接池属性"},{type:F,leftText:"SQL验证查询",rightText:e.validationQuery},{type:F,leftText:"获取连接前校验",rightText:e.testOnBorrow?"是":"否"},{type:F,leftText:"最大连接数量",rightText:e.maxActive}]}}};BI.shortcut("fr.component.right.show",BI.inherit(BI.Widget,Q));BI.constant("bi.constant.database.conf.charset.list",[{text:"自动",value:""},{text:"GBK",value:"GBK"},{text:"BIG5",value:"BIG5"},{text:"ISO-8859-1",value:"ISO-8859-1"},{text:"UTF-8",value:"UTF-8"},{text:"UTF-16",value:"UTF-16"},{text:"EUC_JP",value:"EUC_JP"},{text:"EUC_KR",value:"EUC_KR"},{text:"CP850",value:"CP850"}]);const z={render(){const{text:e,form:t,hint:i,height:s}=this.options;return{type:a,cls:"both-side",height:s||24,items:[{el:{type:o,cls:"left",textAlign:"left",text:e},width:115},t,{type:o,cls:"hint",textAlign:"left",text:i}]}}};BI.shortcut("fr.shared.component.form.item",BI.inherit(BI.Widget,z));var K="fr.shared.component.form.item";function X(e){const t=[];return e.drivers&&e.drivers.length>0?e.drivers.forEach(e=>{t.push({text:e,value:e})}):t.push({text:e.driver,value:e.driver}),t}let Y=null;const J={_store:()=>BI.Models.getModel(j),watch:{connectionNameErr(e){e?BI.Bubbles.show("singleBubble",e,Y,{level:"error"}):BI.Bubbles.hide("singleBubble")}},render(){const e=this.model.linkSelected,t=this;return{type:d,cls:"right-show",items:[{type:K,text:"数据连接名",hint:"*修改数据连接名会影响相关数据表和仪表板",form:{type:n,cls:"bi-border",width:300,value:e.connectionName,ref(e){Y=e},listeners:[{eventName:BI.Editor.EVENT_CHANGE,action(){t.store.setLinkUpdate(Object.assign({},t.model.linkUpdate,{connectionName:this.getValue()}))}},{eventName:BI.Editor.EVENT_FOCUS,action(){t.store.setConnectionNameErr("")}}]}},{type:K,text:"第一步",height:400,form:{type:d,cls:"right-form",items:[{type:K,text:"驱动器",form:{type:"bi.text_value_combo",cls:"bi-border",width:300,text:e.driver,items:X(e),listeners:[{eventName:BI.TextValueCombo.EVENT_CHANGE,action(){t.store.setLinkUpdate(Object.assign({},t.model.linkUpdate,{driver:this.getValue()[0]}))}}]}},{type:K,text:"URL",form:{type:n,cls:"bi-border",watermark:"请输入",width:300,value:e.url,listeners:[{eventName:BI.Editor.EVENT_CHANGE,action(){t.store.setLinkUpdate(Object.assign({},t.model.linkUpdate,{url:this.getValue()}))}}]}},{type:K,text:"编码",form:{type:"bi.text_value_combo",cls:"bi-border",width:300,text:""===e.originalCharsetName?"自动":e.originalCharsetName,items:BI.Constants.getConstant("bi.constant.database.conf.charset.list"),listeners:[{eventName:BI.TextValueCombo.EVENT_CHANGE,action(){t.store.setLinkUpdate(Object.assign({},t.model.linkUpdate,{originalCharsetName:this.getValue()[0]}))}}]}},{type:K,text:"用户名",form:{type:n,cls:"bi-border",allowBlank:!0,watermark:"请输入",width:300,value:e.user,listeners:[{eventName:BI.Editor.EVENT_CHANGE,action(){t.store.setLinkUpdate(Object.assign({},t.model.linkUpdate,{user:this.getValue()}))}}]}},{type:K,text:"密码",form:{type:n,cls:"bi-border",inputType:"password",allowBlank:!0,watermark:"请输入",width:300,value:e.password,listeners:[{eventName:BI.Editor.EVENT_CHANGE,action(){t.store.setLinkUpdate(Object.assign({},t.model.linkUpdate,{password:this.getValue()}))}}]}},{type:"fr.shared.component.title",text:"连接池属性"},{type:K,text:"SQL验证查询",height:100,form:{type:"bi.textarea_editor",cls:"bi-border",allowBlank:!0,watermark:"请输入",width:300,height:100,value:e.validationQuery,listeners:[{eventName:BI.Editor.EVENT_CHANGE,action(){t.store.setLinkUpdate(Object.assign({},t.model.linkUpdate,{validationQuery:this.getValue()}))}}]}},{type:K,text:"获取连接前校验",form:{type:"bi.multi_select_item",text:"是",selected:e.testOnBorrow,width:60,listeners:[{eventName:BI.Editor.EVENT_CHANGE,action(){t.store.setLinkUpdate(Object.assign({},t.model.linkUpdate,{testOnBorrow:this.isSelected()}))}}]}},{type:K,text:"最大活动连接数",form:{type:n,cls:"bi-border",allowBlank:!0,watermark:"请输入",width:60,value:e.maxActive,errorText:"请输入有效的正整数",validationChecker:e=>!!/^\+?[1-9][0-9]*$/.test(e),listeners:[{eventName:BI.Editor.EVENT_CHANGE,action(){t.store.setLinkUpdate(Object.assign({},t.model.linkUpdate,{maxActive:this.getValue()}))}}]}}]}},{type:K,text:"第二步",form:{type:r,text:"测试连接",level:"ignore"}},{type:K,text:"第三步",form:{type:K,text:"模式",form:{type:n,cls:"bi-border",width:300,disabled:!0}}}]}}};BI.shortcut("fr.component.right.edit",BI.inherit(BI.Widget,J));const Z={_store:()=>BI.Models.getModel(j),render(){const e=this.model.linkSelected,t=this;return{type:d,cls:"right-show",items:[{type:K,text:"数据连接名",hint:"*修改数据连接名会影响相关数据表和仪表板",form:{type:n,cls:"bi-border",width:300,value:e.connectionName,listeners:[{eventName:BI.Editor.EVENT_CHANGE,action(){t.store.setLinkUpdate(Object.assign({},t.model.linkUpdate,{connectionName:this.getValue()}))}}]}},{type:K,text:"驱动器",form:{type:"bi.text_value_combo",cls:"bi-border",width:300,text:e.driver,items:X(e),listeners:[{eventName:BI.TextValueCombo.EVENT_CHANGE,action(){t.store.setLinkUpdate(Object.assign({},t.model.linkUpdate,{driver:this.getValue()[0]}))}}]}},{type:K,text:"URL",form:{type:n,cls:"bi-border",watermark:"请输入",width:300,value:e.url,listeners:[{eventName:BI.Editor.EVENT_CHANGE,action(){t.store.setLinkUpdate(Object.assign({},t.model.linkUpdate,{url:this.getValue()}))}}]}},{type:K,text:"编码",form:{type:"bi.text_value_combo",cls:"bi-border",width:300,text:""===e.originalCharsetName?"自动":e.originalCharsetName,items:BI.Constants.getConstant("bi.constant.database.conf.charset.list"),listeners:[{eventName:BI.TextValueCombo.EVENT_CHANGE,action(){t.store.setLinkUpdate(Object.assign({},t.model.linkUpdate,{originalCharsetName:this.getValue()[0]}))}}]}},{type:K,text:"用户名",form:{type:n,cls:"bi-border",allowBlank:!0,watermark:"请输入",width:300,value:e.user,listeners:[{eventName:BI.Editor.EVENT_CHANGE,action(){t.store.setLinkUpdate(Object.assign({},t.model.linkUpdate,{user:this.getValue()}))}}]}},{type:K,text:"密码",form:{type:n,cls:"bi-border",inputType:"password",allowBlank:!0,watermark:"请输入",width:300,value:e.password,listeners:[{eventName:BI.Editor.EVENT_CHANGE,action(){t.store.setLinkUpdate(Object.assign({},t.model.linkUpdate,{password:this.getValue()}))}}]}},{type:"fr.shared.component.title",text:"连接池属性"},{type:K,text:"SQL验证查询",height:100,form:{type:"bi.textarea_editor",cls:"bi-border",allowBlank:!0,watermark:"请输入",width:300,height:100,value:e.validationQuery,listeners:[{eventName:BI.Editor.EVENT_CHANGE,action(){t.store.setLinkUpdate(Object.assign({},t.model.linkUpdate,{validationQuery:this.getValue()}))}}]}},{type:K,text:"获取连接前校验",form:{type:"bi.multi_select_item",text:"是",selected:e.testOnBorrow,width:60,listeners:[{eventName:BI.Editor.EVENT_CHANGE,action(){t.store.setLinkUpdate(Object.assign({},t.model.linkUpdate,{testOnBorrow:this.isSelected()}))}}]}},{type:K,text:"最大活动连接数",form:{type:n,cls:"bi-border",allowBlank:!0,watermark:"请输入",width:60,value:e.maxActive,errorText:"请输入有效的正整数",validationChecker:e=>!!/^\+?[1-9][0-9]*$/.test(e),listeners:[{eventName:BI.Editor.EVENT_CHANGE,action(){t.store.setLinkUpdate(Object.assign({},t.model.linkUpdate,{maxActive:this.getValue()}))}}]}},{type:K,text:"测试连接",form:{type:r,text:"测试连接",level:"ignore"}}]}}};BI.shortcut("fr.component.right.edit.mysql",BI.inherit(BI.Widget,Z));let ee=null;const te=e=>{const t=BI.Constants.getConstant(E),i=BI.some(t,(t,i)=>i===e.text);let s="mysql"===e.databaseType?"fr.component.right.edit.mysql":"fr.component.right.edit";i&&(s=BI.Constants.getConstant(`dec.constant.database.conf.connect.form.${e.text.toLowerCase()}.edit`));const o=i?BI.Constants.getConstant(`dec.constant.database.conf.connect.form.${e.text.toLowerCase()}.preview`):"fr.component.right.show";ee.populate(BI.createItems([{type:"fr.component.right.title",isEdit:e.isSelected,linkSelected:e},{type:e.isSelected?s:o,linkSelected:e}]))},ie={_store:()=>BI.Models.getModel(j),watch:{linkSelected(e){te(e)}},render:()=>({type:d,cls:"right-content",ref(e){ee=e}}),mounted(){const e=this.model.linkSelected;te(e)}};BI.shortcut("fr.component.right.detail",BI.inherit(BI.Widget,ie));let se=null;const oe={_store:()=>BI.Models.getModel(j),watch:{linkSelected(e){se.populate(BI.createItems([{type:e&&e.connectionName?"fr.component.right.detail":"fr.component.right.nothing"}]))}},render:()=>({type:d,cls:"database-right",ref(e){se=e}}),mounted(){se.populate(BI.createItems([{type:"fr.component.right.nothing"}]))}};BI.shortcut("fr.component.right",BI.inherit(BI.Widget,oe));const re={_store:()=>BI.Models.getModel(j),watch:{tab(e){this.setVisible("数据连接管理"===e)}},render:()=>({type:a,cls:"linkset",items:[{el:{type:l,cls:"database-left",items:[{el:{type:h,cls:"select-group",items:[{type:"fr.linkset.select"}]},height:40},{type:"fr.component.linkset.left",cls:"left-list"}]},width:280},{type:"fr.component.right"}]})};BI.shortcut("fr.linkset",BI.inherit(BI.Widget,re));BI.model("fr.model.linkstatus",BI.inherit(Fix.Model,{context:["tab","linkList"],actions:{}}));const ne={context:["tab","linkList","statusSelected"],state:()=>({selected:""}),actions:{setStatusSelected(e){this.model.statusSelected=e}}};BI.model("fr.model.linkstatus.left",BI.inherit(Fix.Model,ne));const le={props:{title:"",id:"",creator:""},_store:()=>BI.Models.getModel("fr.model.linkstatus.left"),render(){const{title:e,extraCls:t,creator:i,text:s,id:r}=this.options;return{type:h,cls:"left-item",extraCls:t,items:[{type:o,cls:"link-title",textAlign:"left",text:e,title:e}]}},mounted(){const{title:e}=this.options;this.element.on("click",()=>{this.store.setStatusSelected(e)})}};BI.shortcut("fr.component.linkStatus.left.item",BI.inherit(BI.Widget,le));let ae=null;const ce={_store:()=>BI.Models.getModel("fr.model.linkstatus.left"),watch:{linkList(e){const t=e.length>0?e[0].connectionName:"";this.store.setStatusSelected(t)},statusSelected(e){const t=this.model.linkList;ae.populate(BI.createItems(((e,t="")=>{const i=[];return e.forEach(e=>{i.push({type:"fr.component.linkStatus.left.item",extraCls:e.connectionName===t?"left-item-selected":"",title:e.connectionName,id:e.connectionId,creator:e.creator,text:e.text?e.text:"默认"})}),i})(t,e)))}},render:()=>({type:d,ref(e){ae=e}})};BI.shortcut("fr.component.linkStatus.left",BI.inherit(BI.Widget,ce));const de={context:["linkList","statusSelected"],state:()=>({selected:""}),actions:{}};BI.model("fr.model.linkstatus.right",BI.inherit(Fix.Model,de));const he={render(){const{maxActive:e,maxIdle:t,numActive:i,numIdle:s}=this.options;return{type:h,items:[{type:h,cls:"right-status-item",items:[{type:d,cls:"right-status-board",items:[{type:d,cls:"right-status-board-item",items:[{type:o,cls:"right-status-text",extraCls:"card-font1",text:i},{type:o,cls:"right-status-text",text:"/"},{type:o,cls:"right-status-text",text:e}]},{type:o,height:20,text:"活动连接数"}]}]},{type:h,cls:"right-status-right",items:[{type:d,cls:"right-status-board",items:[{type:d,cls:"right-status-board-item",items:[{type:o,cls:"right-status-text",extraCls:"card-font2",text:s},{type:o,cls:"right-status-text",text:"/"},{type:o,cls:"right-status-text",text:t}]},{type:o,height:20,text:"空闲连接数"}]}]}]}}};BI.shortcut("fr.component.linkStatus.right.card",BI.inherit(BI.Widget,he));let pe=null,me=null;const be={_store:()=>BI.Models.getModel("fr.model.linkstatus.right"),watch:{statusSelected(e){const t=BI.find(this.model.linkList,(t,i)=>i.connectionName===e),i=BI.Constants.getConstant(E),s=t.text&&BI.some(i,(e,i)=>i===t.text)?BI.Constants.getConstant(`dec.constant.database.conf.connect.form.${t.text.toLowerCase()}.pool`):"fr.component.linkStatus.right.card";!function(e,t){console.log("%cname: ","color: MidnightBlue; background: Aquamarine;",e),f?f.reqDeleta(`/v10/config/connection/pool/info?connectionName=${e}`,e=>{t(e.data)}):t({maxActive:50,maxIdle:10,numActive:0,numIdle:0})}(name,e=>{me.populate(BI.createItems([Object.assign({type:s},e)]))}),pe.setText(`数据连接(${e})`)}},render:()=>({type:d,cls:"database-right",items:[{type:h,height:40,cls:"right-status-title",items:[{type:o,text:"数据连接"}],ref(e){pe=e}},{type:d,cls:"right-status-body",ref(e){me=e}}]}),mounted(){}};BI.shortcut("fr.component.linkStatus.right",BI.inherit(BI.Widget,be));const ue={_store:()=>BI.Models.getModel("fr.model.linkstatus"),watch:{tab(e){this.setVisible("连接池状态"===e)}},render:()=>({type:a,cls:"linkStatus",items:[{el:{type:l,cls:"database-left",items:[{el:{type:h,cls:"select-group",items:[{type:o,cls:"status-title",text:"数据连接"}]},height:40},{type:"fr.component.linkStatus.left",cls:"left-list"}]},width:280},{type:"fr.component.linkStatus.right"}]}),mounted(){this.setVisible(!1)}};BI.shortcut("fr.linkstatus",BI.inherit(BI.Widget,ue));i(1);const ge={url:"192.168.1.22",port:6379,password:"123456"},ye=BI.inherit(BI.Widget,{render:()=>({type:"bi.vertical",cls:"bi-plugin-redis",bgap:10,items:[{type:"bi.left",height:30,items:[{type:"bi.label",text:"数据库地址:",height:24,width:115,textAlign:"left"},{type:"bi.editor",cls:"bi-border",watermark:"数据库地址",value:ge.url,allowBlank:!0,width:300,height:24}]},{type:"bi.left",height:30,items:[{type:"bi.label",text:"端口:",height:24,width:115,textAlign:"left"},{type:"bi.editor",cls:"bi-border",watermark:"端口",allowBlank:!0,width:300,height:24,value:ge.port,errorText:"请输入有效的正整数",validationChecker:e=>!!/^\+?[1-9][0-9]*$/.test(e)}]},{type:"bi.left",height:30,items:[{type:"bi.label",text:"密码:",height:24,width:115,textAlign:"left"},{type:"bi.editor",cls:"bi-border",inputType:"password",value:ge.password,allowBlank:!0,width:300,height:24}]}]})});BI.shortcut("fr.plugin.redis.edit",ye);BI.config("dec.constant.database.conf.connect.list",e=>[...e,"Redis"]),BI.constant("dec.constant.database.conf.connect.form.redis.value",ge),BI.constant("dec.constant.database.conf.connect.form.redis.edit","fr.plugin.redis.edit");i(2),i(3),i(4);const fe=BI.inherit(BI.Widget,{_store:()=>BI.Models.getModel("fr.model.main"),render:()=>({type:l,cls:"database-connection-layout",items:[{el:{type:"fr.title"},height:40},{type:"fr.linkset"},{type:"fr.linkstatus"}]}),mounted(){var e;e=(e=>{this.store.setLinkList(e)}),f?f.reqGet("/v10/config/connection/list","getInstalledPlugins",t=>{e(t.data)}):e(y.data)}});BI.shortcut("fr.main",fe);t.default="fr.main"}]); +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/dcm/style.css b/designer-base/src/main/resources/com/fr/design/dcm/style.css new file mode 100644 index 0000000000..5208edfa3b --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/dcm/style.css @@ -0,0 +1,276 @@ +.bi-plugin-redis { + padding: 20px; } + +.database-connection-layout { + width: 100%; + height: 100%; + background-color: #f7f8fa; } + .database-connection-layout .title { + background-color: #fff; + border-bottom: 1px solid #e8eaed; } + .database-connection-layout .title .title-item { + height: 39px; + line-height: 39px; + padding-left: 15px; + padding-right: 15px; + text-align: center; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; + position: relative; + flex-shrink: 0; + font-weight: 700; + cursor: pointer; } + .database-connection-layout .title .close-button { + position: absolute !important; + right: 5px; + top: 5px; + width: 30px; + height: 30px; + cursor: pointer; + background-image: url(./img/icon_close9x9_normal.png); + background-repeat: no-repeat; + background-position: center; } + .database-connection-layout .linkset { + margin: 10px; + bottom: 0px; + background-color: #ffffff; } + .database-connection-layout .linkStatus { + margin: 10px; + top: 40px; + background-color: #ffffff; } + +.database-left { + border-right: 1px solid #e8eaed; } + .database-left .select-group { + border-bottom: 1px solid #e8eaed; } + .database-left .select-group .select { + margin: 10px; } + .database-left .select-group .select .database-link-items { + padding-left: 10px; } + .database-left .select-group .select .database-link-items .link-item { + border-top: 1px solid #e8eaed; } + .database-left .select-group .status-title { + font-weight: 700; + margin-left: 12px; + margin-top: 12px; } + .database-left .left-list { + margin: 10px; } + .database-left .left-list .left-item { + height: 24px; + line-height: 24px; + cursor: pointer; } + .database-left .left-list .left-item:hover { + background-color: rgba(54, 133, 242, 0.05); } + .database-left .left-list .left-item:hover .icons .action-icon { + visibility: visible !important; } + .database-left .left-list .left-item .icons { + float: right !important; } + .database-left .left-list .left-item .icons .action-icon { + visibility: hidden; } + .database-left .left-list .left-item .icons .b-font { + font-size: 16px; } + .database-left .left-list .left-item-selected { + background-color: rgba(54, 133, 242, 0.05); } + .database-left .left-list .left-item-selected .link-title { + color: #3685f2; } + +.database-right { + min-width: 400px; + overflow: auto; } + .database-right .bi-flex-center-adapt-layout { + height: 100%; } + .database-right .bi-flex-center-adapt-layout .data-connection-background { + background: url(./img/resources.png) center center no-repeat; + background-size: contain; } + .database-right .right-status-title { + border-bottom: 1px solid #e8eaed; + color: #3d4d66; + line-height: 40px; + padding-left: 10px; + font-weight: 700; } + .database-right .right-status-body { + margin: 10px 30px 0px 30px; + height: 50%; } + .database-right .right-status-body .right-status-item { + height: 150px; + width: 50%; + top: 0; + left: 0; + position: absolute !important; } + .database-right .right-status-body .right-status-item .right-status-board { + margin-left: 25px; + position: relative !important; + left: -25px; } + .database-right .right-status-body .right-status-right { + height: 150px; + width: 50%; + top: 0; + right: 0; + position: absolute !important; } + .database-right .right-status-body .right-status-right .right-status-board { + margin-right: 25px; + position: relative !important; + left: 25px; } + .database-right .right-status-body .right-status-board { + background-color: #f7f8fa; + color: #3d4d66; + width: 100%; + height: 100%; } + .database-right .right-status-body .right-status-board .right-status-board-item { + text-align: center; + margin-top: 38px; } + .database-right .right-status-body .right-status-board .right-status-board-item .right-status-text { + display: inline-block; } + .database-right .right-status-body .right-status-board .right-status-board-item .card-font1 { + color: #13CD66; + font-size: 32px; } + .database-right .right-status-body .right-status-board .right-status-board-item .card-font2 { + color: #3685F2; + font-size: 32px; } + .database-right .right-content { + height: 100%; } + .database-right .right-content .right-title { + border-bottom: 1px solid #e8eaed; + color: #3d4d66; + line-height: 40px; + padding-left: 10px; } + .database-right .right-content .right-title .right-title-text { + font-weight: 700; } + .database-right .right-content .right-title .right-title-button { + float: right !important; + margin-right: 10px; + margin-top: 8px; } + .database-right .right-content .right-show { + margin: 10px; } + .database-right .right-content .right-show .right-form { + width: 100%; } + +.both-side { + line-height: 24px; + margin-bottom: 10px; } + .both-side .left { + white-space: nowrap; + text-overflow: ellipsis; + position: relative; + flex-shrink: 0; + font-weight: 700; } + .both-side .hint { + padding-left: 5px; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; + position: relative; + flex-shrink: 0; + margin-left: 5px; + color: #9ea6b2; } + +.shared-component-title { + height: 24px; + line-height: 24px; + margin-bottom: 10px; + color: #9ea6b2; + border-bottom: 1px solid #e8eaed; } + +.comfirm-content { + margin-top: 40px; + margin-left: 20px; } + .comfirm-content .comfirm-icon { + background-image: url(./img/warning.png); + background-size: contain; + margin-right: 12px; } + .comfirm-content .bi-text { + height: 50px; + line-height: 50px; + margin-left: 12px; } + +.more-link .more-link-item { + width: 538px; + overflow: hidden auto; + left: -10px !important; + right: 0px; + top: 10px; + bottom: 0px; + position: absolute; + height: 380px; } + .more-link .more-link-item .link-item { + margin-left: 10px; + margin-bottom: 10px; + cursor: pointer; + border: solid 1px #fff; } + .more-link .more-link-item .link-item:hover { + border: solid 1px #3480f2; } + .more-link .more-link-item .link-item .selected { + position: absolute !important; + right: -1px; + top: -1px; + height: 30px; + width: 30px; + background: url(./img/database-selected.png) center center no-repeat; + background-size: contain; } + .more-link .more-link-item .link-item .text { + height: 27px; + line-height: 27px; + padding-left: 2px; + padding-right: 2px; + text-align: center; + white-space: nowrap; + background: #F0F3F7; } + +.popover-notitle .bi-header-background { + display: none; } + +.popover-notitle .bi-absolute-layout { + top: 0px !important; } + +.bi-custom-show .show-content { + text-align: center; } + .bi-custom-show .show-content .loading-icon { + display: block; + background: url(./img/loading.gif) center center no-repeat; + background-size: contain; + margin: 0 auto; + margin-bottom: 18px; } + .bi-custom-show .show-content .success-icon { + display: block; + background: url(./img/success.png) center center no-repeat; + background-size: contain; + margin: 0 auto; + margin-bottom: 18px; } + .bi-custom-show .show-content .error-icon { + display: block; + background: url(./img/error.png) center center no-repeat; + background-size: contain; + margin: 0 auto; + margin-bottom: 18px; } + .bi-custom-show .show-content .buttons { + margin-top: 18px; } + .bi-custom-show .show-content .buttons div { + margin: 0 4px; } + +.bi-custom-show .show-more { + text-align: left !important; + height: 73px; + background: #F2F4F7; + margin-bottom: 10px; + padding: 5px; + margin-top: 10px; } + +.link-font .b-font:before { + content: "\e759"; + color: inherit; } + +.link-text-font .b-font:before { + content: "\e763"; + color: inherit; } + +.info-font .b-font:before { + content: "\e63c"; + color: inherit; } + +.delete-font .b-font:before { + content: "\e6c4"; + color: inherit; } + + +/*# sourceMappingURL=style.css.map*/ \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/images/bbs/facebook.png b/designer-base/src/main/resources/com/fr/design/images/bbs/facebook.png new file mode 100644 index 0000000000..9e5dc8af2c Binary files /dev/null and b/designer-base/src/main/resources/com/fr/design/images/bbs/facebook.png differ diff --git a/designer-base/src/main/resources/com/fr/design/ui/update/push/pushUpdate.css b/designer-base/src/main/resources/com/fr/design/ui/update/push/pushUpdate.css index 521c8cdbbf..58c03ecba5 100644 --- a/designer-base/src/main/resources/com/fr/design/ui/update/push/pushUpdate.css +++ b/designer-base/src/main/resources/com/fr/design/ui/update/push/pushUpdate.css @@ -5,7 +5,7 @@ body { background-size: 100% 100% !important; -moz-background-size: 100% 100% !important; - font-family: PingFangSC-Regular, Georgia, "Nimbus Roman No9 L", "Songti SC", "Noto Serif CJK SC", "Source Han Serif SC", "Source Han Serif CN", STSong, "AR PL New Sung", "AR PL SungtiL GB", NSimSun, SimSun, "TW\-Sung", "WenQuanYi Bitmap Song", "AR PL UMing CN", "AR PL UMing HK", "AR PL UMing TW", "AR PL UMing TW MBE", PMingLiU, MingLiU, serif !important; + font-family: "PingFang SC", "Microsoft YaHei", "Myriad Pro", "OpenSans", Verdana, SimSun, sans-serif !important; } .close-btn { @@ -27,7 +27,7 @@ body { } .font-bold { - font-weight: bold; + font-weight: 500; } .title { diff --git a/designer-base/src/main/resources/com/fr/design/upm/warn.js b/designer-base/src/main/resources/com/fr/design/upm/warn.js index 1eb5fb6407..be4b069097 100644 --- a/designer-base/src/main/resources/com/fr/design/upm/warn.js +++ b/designer-base/src/main/resources/com/fr/design/upm/warn.js @@ -4,7 +4,7 @@ window.onload = function () { text: PluginHelper.i18nText("Fine-Design_Basic_Update_Plugin_Manager_Resource_Warn"), height: 30 }); - let callback = function(text) { + let callback = function(status, text) { download.setValue(text); }; let buttonOK = BI.createWidget({ diff --git a/designer-chart/src/main/java/com/fr/design/chart/axis/MinMaxValuePane.java b/designer-chart/src/main/java/com/fr/design/chart/axis/MinMaxValuePane.java index a84cfd693e..79323d73de 100644 --- a/designer-chart/src/main/java/com/fr/design/chart/axis/MinMaxValuePane.java +++ b/designer-chart/src/main/java/com/fr/design/chart/axis/MinMaxValuePane.java @@ -35,9 +35,9 @@ public class MinMaxValuePane extends JPanel { minValueField = new UITextField(6); maxCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Custom_Max_Value")); maxValueField = new UITextField(6); - isCustomMainUnitBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Custom_Main_Graduation_Unit")); + isCustomMainUnitBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Custom_Main_Type")); mainUnitField = new UITextField(6); - isCustomSecUnitBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Custom_Second_Graduation_Unit")); + isCustomSecUnitBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Custom_Second_Type")); secUnitField = new UITextField(6); double p = TableLayout.PREFERRED; diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/XTreeEditor.java b/designer-form/src/main/java/com/fr/design/designer/creator/XTreeEditor.java index c5672b389f..bde83a176b 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/XTreeEditor.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/XTreeEditor.java @@ -73,7 +73,7 @@ public class XTreeEditor extends XWidgetCreator { crp = (CRPropertyDescriptor[]) ArrayUtils.add(crp, new CRPropertyDescriptor("ajax", this.data.getClass()).setI18NName( com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Widget_Load_By_Async")).putKeyValue(XCreatorConstants.PROPERTY_CATEGORY, - "Advanced")); + "Fine-Design_Basic_Advanced")); crp = this.addAllowEdit(crp); crp = this.addCustomData(crp); diff --git a/designer-form/src/main/java/com/fr/design/mainframe/widget/ui/FormWidgetCardPane.java b/designer-form/src/main/java/com/fr/design/mainframe/widget/ui/FormWidgetCardPane.java index 65e2f66598..3e70f7d0f6 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/widget/ui/FormWidgetCardPane.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/widget/ui/FormWidgetCardPane.java @@ -28,6 +28,7 @@ import com.fr.design.widget.Operator; import com.fr.design.widget.ui.designer.component.WidgetAbsoluteBoundPane; import com.fr.design.widget.ui.designer.component.WidgetBoundPane; import com.fr.design.widget.ui.designer.component.WidgetCardTagBoundPane; +import com.fr.form.ui.FormWidgetHelper; import com.fr.form.ui.Widget; import com.fr.form.ui.container.WScaleLayout; import com.fr.form.ui.container.WTitleLayout; @@ -102,6 +103,7 @@ public class FormWidgetCardPane extends AbstractAttrNoScrollPane { /** * 后台初始化所有事件. */ + @Override public void initAllListeners() { } @@ -113,7 +115,7 @@ public class FormWidgetCardPane extends AbstractAttrNoScrollPane { initListener(this); } - + @Override protected void initContentPane() { } @@ -214,13 +216,23 @@ public class FormWidgetCardPane extends AbstractAttrNoScrollPane { Widget widget = currentEditorDefinePane.updateBean(); if (ComparatorUtils.equals(getGlobalName(), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Basic")) && widgetPropertyPane != null) { UITextField widgetNameField = widgetPropertyPane.getWidgetNameField(); - if (designer.getTarget().isNameExist(widgetNameField.getText()) && !ComparatorUtils.equals(widgetNameField.getText(), widget.getWidgetName())) { - widgetNameField.setText(widget.getWidgetName()); + String toSetWidgetName = widgetNameField.getText(); + String currentWidgetName = widget.getWidgetName(); + // 设置的组件名和当前组件名相同 直接返回 + if (ComparatorUtils.equals(toSetWidgetName, currentWidgetName)) { + return; + } + String containerName = designer.getTarget().getContainer().getWidgetName(); + Widget existWidget = FormWidgetHelper.findWidgetByName(widget, widgetNameField.getText()); + // 判断设置的组件名是否和容器同名以及组件是否在容器在存在 满足任何其一 抛出提示 + boolean exist = ComparatorUtils.equals(containerName, toSetWidgetName) || existWidget != null; + if (exist) { + widgetNameField.setText(currentWidgetName); JOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Widget_Rename_Failure"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Joption_News"), JOptionPane.ERROR_MESSAGE, BaseUtils.readIcon("com/fr/design/form/images/joption_failure.png")); return; } widgetPropertyPane.update(widget); - xCreator.resetCreatorName(widget.getWidgetName()); + xCreator.resetCreatorName(toSetWidgetName); xCreator.resetVisible(widget.isVisible()); designer.getEditListenerTable().fireCreatorModified(xCreator, DesignerEvent.CREATOR_RENAMED); return; 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 db91d0a39e..b16aa1b420 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 @@ -174,6 +174,7 @@ public abstract class ElementCasePane extends Tar private CellSelection cellNeedTOFormat = null; private FormatBrushAction formatBrushAction; private ActionListener keyListener = new ActionListener() { + @Override public void actionPerformed(ActionEvent e) { if (!formatBrush.isSelected()) { DesignerContext.setFormatState(DesignerContext.FORMAT_STATE_ONCE); @@ -188,6 +189,7 @@ public abstract class ElementCasePane extends Tar } }; private ActionListener escKey = new ActionListener() { + @Override public void actionPerformed(ActionEvent e) { cancelFormatBrush(); } @@ -212,6 +214,7 @@ public abstract class ElementCasePane extends Tar /** * 取消格式化 */ + @Override public void cancelFormat() { return; } @@ -240,7 +243,6 @@ public abstract class ElementCasePane extends Tar verScrollBar = new DynamicScrollBar(Adjustable.VERTICAL, this, this.resolution); horScrollBar = new DynamicScrollBar(Adjustable.HORIZONTAL, this, this.resolution); this.add(RGridLayout.VerticalBar, this.verScrollBar); -// this.add(RGridLayout.HorizontalBar, this.horScrollBar); // Init input/action map defaultly. initInputActionMap(); @@ -253,7 +255,7 @@ public abstract class ElementCasePane extends Tar initFormatBrush(); } - + @Override public int getMenuState() { return DesignState.WORK_SHEET; } @@ -265,6 +267,7 @@ public abstract class ElementCasePane extends Tar formatBrush.setSelected(DesignerContext.getFormatState() != DesignerContext.FORMAT_STATE_NULL); formatBrush.removeActionListener(formatBrushAction); formatBrush.addMouseListener(new MouseAdapter() { + @Override public void mouseClicked(MouseEvent e) { //如果没有格式刷,点击时就是想使用格式刷 if (e.getClickCount() == 1) { @@ -528,8 +531,8 @@ public abstract class ElementCasePane extends Tar FineLoggerFactory.getLogger().info("Nothing to release"); } this.selection = selection; - fireSelectionChanged(); } + fireSelectionChanged(); } @@ -1210,6 +1213,7 @@ public abstract class ElementCasePane extends Tar /** * 请求焦点 */ + @Override public void requestFocus() { super.requestFocus(); this.getGrid().requestFocus(); @@ -1338,6 +1342,7 @@ public abstract class ElementCasePane extends Tar * * @return 返回正在编辑的状态. */ + @Override public EditingState createEditingState() { return new ElementCaseEditingState(this.selection, this.verScrollBar.getValue(), this.horScrollBar.getValue(), this.resolution); } @@ -1380,7 +1385,6 @@ public abstract class ElementCasePane extends Tar ElementCasePane.this.getVerticalScrollBar().setValue(this.verticalValue); ElementCasePane.this.getHorizontalScrollBar().setValue(this.horizontalValue); -// ElementCasePane.this.setResolution(this.resolution); HistoryTemplateListPane.getInstance().getCurrentEditingTemplate().setScale(this.resolution); // 重绘. ElementCasePane.this.repaint(); diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/InformationCollector.java b/designer-realize/src/main/java/com/fr/design/mainframe/InformationCollector.java index 775f402d8e..83cb7dd335 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/InformationCollector.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/InformationCollector.java @@ -205,7 +205,7 @@ public class InformationCollector implements XMLReadable, XMLWriter { TemplateInfoCollector.getInstance().sendTemplateInfo(); ErrorInfoUploader.getInstance().sendErrorInfo(); } - }, SEND_DELAY, TimeUnit.SECONDS); + }, SEND_DELAY, TimeUnit.MILLISECONDS); } /** diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/SheetNameTabPane.java b/designer-realize/src/main/java/com/fr/design/mainframe/SheetNameTabPane.java index 09f1ff9e1b..9fdc9d5a8c 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/SheetNameTabPane.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/SheetNameTabPane.java @@ -3,6 +3,8 @@ package com.fr.design.mainframe; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.awt.event.ComponentAdapter; +import java.awt.event.ComponentEvent; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; @@ -24,7 +26,7 @@ import com.fr.base.GraphHelper; import com.fr.base.vcs.DesignerMode; import com.fr.design.actions.UpdateAction; import com.fr.design.constants.UIConstants; -import com.fr.design.file.HistoryTemplateListPane; +import com.fr.design.file.HistoryTemplateListCache; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.ibutton.UIButtonUI; import com.fr.design.menu.MenuDef; @@ -35,6 +37,7 @@ import com.fr.design.utils.gui.GUICoreUtils; import com.fr.design.utils.gui.GUIPaintUtils; import com.fr.general.ComparatorUtils; +import com.fr.general.IOUtils; import com.fr.main.impl.WorkBook; import com.fr.poly.PolyDesigner; import com.fr.report.poly.PolyWorkSheet; @@ -52,15 +55,15 @@ public class SheetNameTabPane extends JComponent implements MouseListener, Mouse private static final Color LINE_COLOR = new Color(0xababab); - private static final Icon ADD_WORK_SHEET = BaseUtils.readIcon("com/fr/base/images/oem/addworksheet.png"); - protected static final Icon ADD_POLY_SHEET = BaseUtils.readIcon("com/fr/design/images/sheet/addpolysheet.png"); - private static final Icon WORK_SHEET_ICON = BaseUtils.readIcon("com/fr/base/images/oem/worksheet.png"); - private static final Icon POLY_SHEET_ICON = BaseUtils.readIcon("com/fr/design/images/sheet/polysheet.png"); - private static final Image DESIGN_IMAGE = BaseUtils.readImage("com/fr/design/images/sheet/left_right_btn.png"); - private static final Icon LEFT_ICON = BaseUtils.readIcon("com/fr/design/images/sheet/left_normal@1x.png"); - private static final Icon RIGHT_ICON = BaseUtils.readIcon("com/fr/design/images/sheet/right_normal@1x.png"); - private static final Icon DISABLED_LEFT_ICON = BaseUtils.readIcon("com/fr/design/images/sheet/left_hover@1x.png"); - private static final Icon DISABLED_RIGHT_ICON = BaseUtils.readIcon("com/fr/design/images/sheet/right_hover@1x.png"); + private static final Icon ADD_WORK_SHEET = IOUtils.readIcon("com/fr/base/images/oem/addworksheet.png"); + protected static final Icon ADD_POLY_SHEET = IOUtils.readIcon("com/fr/design/images/sheet/addpolysheet.png"); + private static final Icon WORK_SHEET_ICON = IOUtils.readIcon("com/fr/base/images/oem/worksheet.png"); + private static final Icon POLY_SHEET_ICON = IOUtils.readIcon("com/fr/design/images/sheet/polysheet.png"); + private static final Icon LEFT_ICON = IOUtils.readIcon("com/fr/design/images/sheet/left_normal@1x.png"); + private static final Icon RIGHT_ICON = IOUtils.readIcon("com/fr/design/images/sheet/right_normal@1x.png"); + private static final Icon DISABLED_LEFT_ICON = IOUtils.readIcon("com/fr/design/images/sheet/left_hover@1x.png"); + private static final Icon DISABLED_RIGHT_ICON = IOUtils.readIcon("com/fr/design/images/sheet/right_hover@1x.png"); + private static final int NUM = 10; private static final int ICON_SEP_DISTANCE = 8; private static final int TOOLBAR_HEIGHT = 16; @@ -144,6 +147,7 @@ public class SheetNameTabPane extends JComponent implements MouseListener, Mouse this.setBorder(null); this.setForeground(new Color(99, 99, 99)); leftButton = new UIButton(LEFT_ICON) { + @Override public Dimension getPreferredSize() { return new Dimension(super.getPreferredSize().width, TOOLBAR_HEIGHT); } @@ -163,6 +167,7 @@ public class SheetNameTabPane extends JComponent implements MouseListener, Mouse leftButton.set4ToolbarButton(); leftButton.setDisabledIcon(DISABLED_LEFT_ICON); rightButton = new UIButton(RIGHT_ICON) { + @Override public Dimension getPreferredSize() { return new Dimension(super.getPreferredSize().width, TOOLBAR_HEIGHT); } @@ -197,7 +202,14 @@ public class SheetNameTabPane extends JComponent implements MouseListener, Mouse } } }); - + + DesignerContext.getDesignerFrame().addComponentListener(new ComponentAdapter(){ + @Override public void componentResized(ComponentEvent e) { + for (int i = 0; i < lastOneIndex * NUM; i++) { + moveLeft(); + } + } + }); } private ActionListener createLeftButtonActionListener() { @@ -205,27 +217,31 @@ public class SheetNameTabPane extends JComponent implements MouseListener, Mouse @Override public void actionPerformed(ActionEvent e) { - int s = scrollIndex; - if (s == lastOneIndex && s != 0) { - scrollIndex--; - lastOneIndex--; - repaint(); - } else { - while (s > lastOneIndex && showCount != 0) { - scrollIndex++; - lastOneIndex++; - repaint(); - } - while (s < lastOneIndex && scrollIndex > 0) { - scrollIndex--; - lastOneIndex--; - repaint(); - } - } + moveLeft(); } }; } + private void moveLeft() { + int s = scrollIndex; + if (s == lastOneIndex && s != 0) { + scrollIndex--; + lastOneIndex--; + repaint(); + } else { + while (s > lastOneIndex && showCount != 0) { + scrollIndex++; + lastOneIndex++; + repaint(); + } + while (s < lastOneIndex && scrollIndex > 0) { + scrollIndex--; + lastOneIndex--; + repaint(); + } + } + } + /** * 设置选择index * @@ -282,6 +298,7 @@ public class SheetNameTabPane extends JComponent implements MouseListener, Mouse * * @param e 鼠标事件 */ + @Override public void mouseDragged(MouseEvent e) { if (isAuthorityEditing) { return; @@ -295,6 +312,7 @@ public class SheetNameTabPane extends JComponent implements MouseListener, Mouse * * @param e 鼠标事件 */ + @Override public void mouseMoved(MouseEvent e) { } @@ -423,15 +441,6 @@ public class SheetNameTabPane extends JComponent implements MouseListener, Mouse } generalPath.closePath(); g2d.fill(generalPath); -// g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); -// g2d.setPaint(UIConstants.LINE_COLOR); -// if (selectedIndex == scrollIndex) { -// g2d.draw(new Line2D.Double(x[0], y[0], x[1], y[1])); -// } -// g2d.draw(new Line2D.Double(x[1], y[1], x[2], y[2])); -// g2d.draw(new Line2D.Double(x[2], y[2], x[3], y[3])); -// g2d.draw(new Line2D.Double(x[3], y[3], x[4], y[4])); -// g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF); sheeticon.paintIcon(this, g2d, (int) textX + charWidth, 2); // peter:画字符 g2d.setPaint(getForeground()); @@ -470,13 +479,6 @@ public class SheetNameTabPane extends JComponent implements MouseListener, Mouse g2d.fill(generalPath); g2d.setPaint(LINE_COLOR); -// if (i == scrollIndex) { -// g2d.draw(new Line2D.Double(x[0], y[0], x[1], y[1])); -// } -// g2d.draw(new Line2D.Double(x[1], y[1], x[2], y[2])); -// g2d.draw(new Line2D.Double(x[2], y[2], x[3], y[3])); -// g2d.draw(new Line2D.Double(x[3], y[3], x[4], y[4])); -// g2d.draw(new Line2D.Double(x[4], y[4], x[5], y[5])); double startX = textX > 0 ? textX - 1 : textX; g2d.drawRect((int)startX, 0, width, (int)textHeight); @@ -560,6 +562,7 @@ public class SheetNameTabPane extends JComponent implements MouseListener, Mouse * * @param e 鼠标事件 */ + @Override public void mouseClicked(MouseEvent e) { } @@ -568,6 +571,7 @@ public class SheetNameTabPane extends JComponent implements MouseListener, Mouse * * @param evt 鼠标事件 */ + @Override public void mousePressed(MouseEvent evt) { isReleased = false; int reportcount = reportComposite.getEditingWorkBook().getReportCount(); @@ -586,7 +590,7 @@ public class SheetNameTabPane extends JComponent implements MouseListener, Mouse boolean needRefreshPropertiesPane = getSelectedIndex() != i; setSelectedIndex(i); if (needRefreshPropertiesPane) { - HistoryTemplateListPane.getInstance().getCurrentEditingTemplate().refreshEastPropertiesPane(); + HistoryTemplateListCache.getInstance().getCurrentEditingTemplate().refreshEastPropertiesPane(); } isBlank = false; @@ -629,11 +633,11 @@ public class SheetNameTabPane extends JComponent implements MouseListener, Mouse } } - + protected void addInsertGridShortCut(MenuDef def){ def.addShortCut(new GridReportInsertAction()); } - + protected void firstInsertActionPerformed(){ new GridReportInsertAction().actionPerformed(null); } @@ -644,6 +648,7 @@ public class SheetNameTabPane extends JComponent implements MouseListener, Mouse * * @param e 鼠标事件 */ + @Override public void mouseReleased(MouseEvent e) { this.isReleased = true; this.setReleasedXY(e.getX(), e.getY()); @@ -737,6 +742,7 @@ public class SheetNameTabPane extends JComponent implements MouseListener, Mouse * * @param e 鼠标事件 */ + @Override public void mouseEntered(MouseEvent e) { } @@ -745,6 +751,7 @@ public class SheetNameTabPane extends JComponent implements MouseListener, Mouse * * @param e 鼠标事件 */ + @Override public void mouseExited(MouseEvent e) { } @@ -772,7 +779,7 @@ public class SheetNameTabPane extends JComponent implements MouseListener, Mouse protected abstract class SheetInsertAction extends UpdateAction { SheetInsertAction() { this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Insert") + getTemplateReportType()); - this.setSmallIcon(BaseUtils.readIcon("/com/fr/base/images/cell/control/add.png")); + this.setSmallIcon(IOUtils.readIcon("/com/fr/base/images/cell/control/add.png")); } @Override @@ -945,7 +952,7 @@ public class SheetNameTabPane extends JComponent implements MouseListener, Mouse private class CopySheetAction extends UpdateAction { CopySheetAction() { this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Copy")); - this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_edit/copy.png")); + this.setSmallIcon(IOUtils.readIcon("/com/fr/design/images/m_edit/copy.png")); } @Override diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/messagecollect/entity/FileEntityBuilder.java b/designer-realize/src/main/java/com/fr/design/mainframe/messagecollect/entity/FileEntityBuilder.java index 2555a26329..c8ac3b32c0 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/messagecollect/entity/FileEntityBuilder.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/messagecollect/entity/FileEntityBuilder.java @@ -1,47 +1,42 @@ package com.fr.design.mainframe.messagecollect.entity; +import com.fr.config.MarketConfig; +import com.fr.design.DesignerEnvManager; import com.fr.general.CloudCenter; +import com.fr.general.CloudClient; import com.fr.general.IOUtils; import com.fr.general.http.HttpToolbox; import com.fr.json.JSONArray; -import com.fr.json.JSONException; import com.fr.json.JSONObject; import com.fr.log.FineLoggerFactory; import com.fr.stable.CommonUtils; +import com.fr.stable.CoreConstants; import com.fr.stable.EncodeConstants; import com.fr.stable.StableUtils; import com.fr.stable.StringUtils; import com.fr.third.jodd.datetime.JDateTime; -import com.fr.third.org.apache.http.HttpEntity; -import com.fr.third.org.apache.http.HttpResponse; -import com.fr.third.org.apache.http.client.HttpClient; -import com.fr.third.org.apache.http.client.methods.HttpPut; -import com.fr.third.org.apache.http.entity.FileEntity; -import com.fr.third.org.apache.http.impl.client.DefaultHttpClient; -import com.fr.third.org.apache.http.util.EntityUtils; import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; +import java.net.URLEncoder; import java.util.HashMap; -import java.util.Map; import java.util.UUID; -import static com.fr.third.org.apache.http.HttpStatus.SC_OK; - /** * @author alex sung * @date 2019/4/8 */ public class FileEntityBuilder { - private static final String INTELLI_OPERATION_URL = "intelli.operation.url"; - private static final String OPERATION_URL = "https://cloud.fanruan.com/config/protect/operation"; - private static final String ATTR_SIGNATURE = "signature"; - private static final String ATTR_KEY = "key"; private static final String FOCUS_POINT_FILE_ROOT_PATH = "FocusPoint"; + private static final String FOCUS_POINT_FILE_UPLOAD_TOPIC = "__fine_intelli_file_upload__"; + private static final String FILE_FROM = "design"; + private static final String FOCUS_POINT_FILE_UPLOAD_TYPE = "FocusPoint"; + private static final String FOCUS_POINT_FILE_UPLOAD_URL = CloudCenter.getInstance().acquireUrlByKind("design.feedback"); + private static final String FOCUS_POINT_URL_KEY = "focuspoint"; /** * 文件夹路径 @@ -61,6 +56,9 @@ public class FileEntityBuilder { } public File generateZipFile(String pathName) { + if (pathName == null) { + return null; + } File zipFile = null; try { zipFile = new File(pathName + ".zip"); @@ -100,53 +98,40 @@ public class FileEntityBuilder { /** * 上传文件到云中心 - * @param file 待上传文件 + * + * @param file 待上传文件 * @param keyFileName 目标文件 * @throws IOException */ public static void uploadFile(File file, String keyFileName) throws IOException { + CloudClient client = CloudClient.getInstance(); String today = new JDateTime().toString("YYYY-MM-DD"); - HttpClient httpclient = new DefaultHttpClient(); - try { - String signedUrl = generateSignedUploadUrl(FOCUS_POINT_FILE_ROOT_PATH + File.separator + today + File.separator +keyFileName); - if(StringUtils.isEmpty(signedUrl)){ - FineLoggerFactory.getLogger().error("signedUrl is null."); - return; - } - HttpPut httpPost = new HttpPut(signedUrl); - httpPost.addHeader("Content-Type","application/octet-stream"); - FileEntity fileEntity = new FileEntity(file); - httpPost.setEntity(fileEntity); - HttpResponse response = httpclient.execute(httpPost); + String filePath = FOCUS_POINT_FILE_ROOT_PATH + CoreConstants.SEPARATOR + today + CoreConstants.SEPARATOR + keyFileName; + String bbsUserName = MarketConfig.getInstance().getBbsUsername(); + String uuid = DesignerEnvManager.getEnvManager().getUUID(); + String name = bbsUserName == null ? uuid : bbsUserName; - int statusCode = response.getStatusLine().getStatusCode(); - if (statusCode == SC_OK) { - HttpEntity resEntity = response.getEntity(); - EntityUtils.consume(resEntity); - } else { - HttpEntity entity = response.getEntity(); - String result = EntityUtils.toString(entity, "utf-8"); - FineLoggerFactory.getLogger().info("upload file result:" + result); - } - } catch (Exception e) { - FineLoggerFactory.getLogger().error(e.getMessage(), e); - } + client.uploadFile(file, filePath, name, FILE_FROM); + addMessageQueue(filePath, bbsUserName, uuid); } - private static String generateSignedUploadUrl(String fileKeyName) throws IOException { - String url = CloudCenter.getInstance().acquireUrlByKind(INTELLI_OPERATION_URL, OPERATION_URL); - Map parameters = new HashMap(); - parameters.put(ATTR_KEY, fileKeyName); - parameters.put(ATTR_SIGNATURE, String.valueOf(CommonUtils.signature())); - String responseText = HttpToolbox.get(url, parameters); + private static void addMessageQueue(String filePath, String userName, String uuid) { + JSONObject uploadInfo = new JSONObject(FOCUS_POINT_FILE_UPLOAD_URL); + String focusPointUrl = uploadInfo.optString(FOCUS_POINT_URL_KEY); try { - JSONObject data = new JSONObject(responseText); - if ("success".equals(data.optString("status"))) { - return data.optString("url"); + HashMap params = new HashMap<>(); + params.put("topic", FOCUS_POINT_FILE_UPLOAD_TOPIC); + params.put("username", URLEncoder.encode(userName, EncodeConstants.ENCODING_UTF_8)); + params.put("uuid", uuid); + params.put("filepath", filePath); + params.put("timestamp", String.valueOf(System.currentTimeMillis())); + params.put("signature", String.valueOf(CommonUtils.signature())); + params.put("type", FOCUS_POINT_FILE_UPLOAD_TYPE); + if(StringUtils.isNotEmpty(focusPointUrl)){ + HttpToolbox.post(focusPointUrl, params); } - } catch (JSONException e) { - FineLoggerFactory.getLogger().error("Illegal response text."+e, e.getMessage()); + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); } - return null; } } diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/messagecollect/impl/AbstractSendDataToCloud.java b/designer-realize/src/main/java/com/fr/design/mainframe/messagecollect/impl/AbstractSendDataToCloud.java index da98e47784..77f370d9d0 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/messagecollect/impl/AbstractSendDataToCloud.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/messagecollect/impl/AbstractSendDataToCloud.java @@ -98,9 +98,11 @@ public abstract class AbstractSendDataToCloud implements XMLable { } private void generateThisPageFile(DataList points) { - File file = null; try { JSONArray jsonArray = dealWithSendFunctionContent(points); + if (jsonArray == null) { + return; + } //生成json文件 fileEntityBuilder.generateFile(jsonArray, getFileEntityBuilder().getFolderName()); } catch (Exception e) { diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/messagecollect/impl/FocusPointMessageUploader.java b/designer-realize/src/main/java/com/fr/design/mainframe/messagecollect/impl/FocusPointMessageUploader.java index 33adf8e2de..62f822af58 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/messagecollect/impl/FocusPointMessageUploader.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/messagecollect/impl/FocusPointMessageUploader.java @@ -1,7 +1,5 @@ package com.fr.design.mainframe.messagecollect.impl; -import com.fr.config.MarketConfig; -import com.fr.design.DesignerEnvManager; import com.fr.design.mainframe.messagecollect.entity.FileEntityBuilder; import com.fr.design.mainframe.messagecollect.utils.MessageCollectUtils; import com.fr.intelli.record.FocusPoint; @@ -24,8 +22,6 @@ import java.util.UUID; public class FocusPointMessageUploader extends AbstractSendDataToCloud { private static final String TAG = "FocusPointMessageTag"; - private static final String SEPARATOR = "_"; - private static final String FOCUS_POINT = "FocusPoint"; private static final long DELTA = 24 * 3600 * 1000L; private static volatile FocusPointMessageUploader instance; @@ -42,6 +38,9 @@ public class FocusPointMessageUploader extends AbstractSendDataToCloud { @Override public JSONArray dealWithSendFunctionContent(DataList focusPoints) { + if (focusPoints == null) { + return null; + } JSONArray ja = new JSONArray(); for(T t:focusPoints.getList()){ FocusPoint focusPoint = (FocusPoint)t; @@ -91,17 +90,8 @@ public class FocusPointMessageUploader extends AbstractSendDataToCloud { } private void generatePath() { - DesignerEnvManager envManager = DesignerEnvManager.getEnvManager(); - String bbsUserName = MarketConfig.getInstance().getBbsUsername(); - String uuid = envManager.getUUID(); - //文件夹名称的格式是: "FocusPoint" + 大版本号 + 小版本号 + uuid + bbsUserName + randomUuid,均以下划线分隔 - StringBuilder sb = new StringBuilder(); - sb.append(FOCUS_POINT).append(SEPARATOR). - append(ProductConstants.MAIN_VERSION).append(SEPARATOR). - append(ProductConstants.MINOR_VERSION).append(SEPARATOR). - append(uuid).append(SEPARATOR).append(bbsUserName).append(SEPARATOR). - append(UUID.randomUUID()); - String folderName = StableUtils.pathJoin(ProductConstants.getEnvHome(), sb.toString()); + //文件夹名称是uuid.zip,版本信息已经在edition中体现了 + String folderName = StableUtils.pathJoin(ProductConstants.getEnvHome(), String.valueOf(UUID.randomUUID())); setFileEntityBuilder(new FileEntityBuilder(folderName)); } } 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 dac28a627a..10a1ee0bdf 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 @@ -5,7 +5,7 @@ import com.fr.decision.webservice.utils.DecisionServiceConstants; import com.fr.design.EnvChangeEntrance; import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.DesignerContext; -import com.fr.design.mainframe.loghandler.DesignerLogHandler; +import com.fr.design.mainframe.loghandler.DesignerLogger; import com.fr.event.EventDispatcher; import com.fr.log.FineLoggerFactory; import com.fr.report.RemoteDesignConstants; @@ -46,7 +46,7 @@ public class DesignerSocketIO { if (ArrayUtils.isNotEmpty(objects)) { try { LoggingEvent event = SerializerHelper.deserialize((byte[]) objects[0]); - DesignerLogHandler.getInstance().printLoggingEvent(event); + DesignerLogger.log(event); } catch (Exception e) { FineLoggerFactory.getLogger().error(e.getMessage(), e); } diff --git a/designer-realize/src/main/java/com/fr/design/report/freeze/RepeatColPane.java b/designer-realize/src/main/java/com/fr/design/report/freeze/RepeatColPane.java index 100b306d8e..b4ff4f9efd 100644 --- a/designer-realize/src/main/java/com/fr/design/report/freeze/RepeatColPane.java +++ b/designer-realize/src/main/java/com/fr/design/report/freeze/RepeatColPane.java @@ -21,8 +21,10 @@ public class RepeatColPane extends FreezeAndRepeatPane { @Override public void populateBean(FT ob) { - ((ColSpinner)start).setValue((ob.getFrom() + 1)); - ((ColSpinner)end).setValue((ob.getTo() + 1)); + if (ob.getFrom() <= ob.getTo()) { + ((ColSpinner)start).setValue((ob.getFrom() + 1)); + ((ColSpinner)end).setValue((ob.getTo() + 1)); + } } @Override diff --git a/designer-realize/src/main/java/com/fr/design/report/freeze/RepeatRowPane.java b/designer-realize/src/main/java/com/fr/design/report/freeze/RepeatRowPane.java index e46a59a6e9..5ae39ec25c 100644 --- a/designer-realize/src/main/java/com/fr/design/report/freeze/RepeatRowPane.java +++ b/designer-realize/src/main/java/com/fr/design/report/freeze/RepeatRowPane.java @@ -21,8 +21,10 @@ public class RepeatRowPane extends FreezeAndRepeatPane { @Override public void populateBean(FT ob) { - ((RowSpinner)start).setValue((ob.getFrom() + 1)); - ((RowSpinner)end).setValue((ob.getTo() + 1)); + if (ob.getFrom() <= ob.getTo()) { + ((RowSpinner)start).setValue((ob.getFrom() + 1)); + ((RowSpinner)end).setValue((ob.getTo() + 1)); + } } @Override diff --git a/designer-realize/src/main/java/com/fr/grid/GridUtils.java b/designer-realize/src/main/java/com/fr/grid/GridUtils.java index dfe7a5f2d2..11e907fc64 100644 --- a/designer-realize/src/main/java/com/fr/grid/GridUtils.java +++ b/designer-realize/src/main/java/com/fr/grid/GridUtils.java @@ -12,6 +12,7 @@ import com.fr.general.ComparatorUtils; import com.fr.grid.selection.CellSelection; import com.fr.grid.selection.FloatSelection; import com.fr.grid.selection.Selection; +import com.fr.poly.creator.ECBlockPane; import com.fr.report.ReportHelper; import com.fr.report.cell.CellElement; import com.fr.report.cell.FloatElement; @@ -48,8 +49,7 @@ public class GridUtils { //peter:下面这几个量是在Drag列的时候用. public final static int DRAG_CELL_SIZE = 1; //peter:drag的时候改变格子的宽度. - public final static int DRAG_SELECT_UNITS = 2; //peter:drag的时候,选中单元格. -// public static int resolution = (int) (ScreenResolution.getScreenResolution()* JSliderPane.getInstance().resolutionTimes); + public final static int DRAG_SELECT_UNITS = 2; //peter:drag的时候,选中单元格.// public static int resolution = (int) (ScreenResolution.getScreenResolution()* JSliderPane.getInstance().resolutionTimes); /** * Is above float element.(the return may be null).
@@ -125,7 +125,6 @@ public class GridUtils { */ public static double[] caculateFloatElementLocations(FloatElement floatElement, DynamicUnitList columnWidthList, DynamicUnitList rowHeightList, int verticalValue, int horizentalValue) { -// int resolution = ScreenResolution.getScreenResolution(); int resolution = (int) (ScreenResolution.getScreenResolution() * JSliderPane.getInstance().resolutionTimes); double floatX = columnWidthList.getRangeValue(horizentalValue, 0).toPixD(resolution) + floatElement.getLeftDistance().toPixD(resolution); @@ -180,7 +179,6 @@ public class GridUtils { private static int cc_selected_column_or_row(double mouseEvtPosition, int beginValue, int value, DynamicUnitList sizeList) { double tmpIntIndex = 0; int selectedCellIndex = 0; -// int resolution = ScreenResolution.getScreenResolution(); int resolution = (int) (ScreenResolution.getScreenResolution() * JSliderPane.getInstance().resolutionTimes); if (mouseEvtPosition < 0) { selectedCellIndex = value; @@ -239,7 +237,6 @@ public class GridUtils { private static int cc_selected_column_or_row_withresolution(double mouseEvtPosition, int beginValue, int value, DynamicUnitList sizeList, int resolution) { double tmpIntIndex = 0; int selectedCellIndex = 0; -// int resolution = ScreenResolution.getScreenResolution(); if (mouseEvtPosition < 0) { selectedCellIndex = value; for (; true; selectedCellIndex--) { @@ -311,6 +308,7 @@ public class GridUtils { public static boolean canMove(ElementCasePane reportPane, int cellColumn, int cellRow) { if (reportPane.mustInVisibleRange()) { Grid grid = reportPane.getGrid(); + checkGridCount(reportPane); int verticalEndValue = grid.getVerticalValue() + grid.getVerticalExtent() - 1; int horizontalEndValue = grid.getHorizontalValue() + grid.getHorizontalExtent() - 1; if (cellColumn > horizontalEndValue) { @@ -323,6 +321,16 @@ public class GridUtils { return true; } + /** + *聚合报表的报表块增加单元格的数量时 当单元格拉动一半会自动扩展成完整的单元格 + * 该单元格不被记录 check下重新计算下单元格数量 + */ + private static void checkGridCount(Object obj) { + if (obj instanceof ECBlockPane) { + ((ECBlockPane) obj).getTarget().firePropertyChange(); + } + } + /** * 选择一个Cell, 支持Merge. */ 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 cea537592e..17eff62baf 100644 --- a/designer-realize/src/main/java/com/fr/start/SplashContext.java +++ b/designer-realize/src/main/java/com/fr/start/SplashContext.java @@ -167,7 +167,7 @@ public class SplashContext { private static String getSplashPath() { Locale locale = DesignerEnvManager.getEnvManager().getLanguage(); - if (Locale.US.equals(locale) || Locale.KOREA.equals(locale)) { + if (Locale.US.equals(locale) || Locale.KOREA.equals(locale) || Locale.TAIWAN.equals(locale)) { return "/com/fr/design/images/splash_10_en.gif"; } else if (Locale.JAPAN.equals(locale)) { return "/com/fr/design/images/splash_10_jp.gif";