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 9775de2f5..4aee1941b 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 @@ -217,7 +217,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 +602,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); 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 04dab52b5..e10de8ab4 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 264d14fc2..b48433c5c 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/JTemplate.java b/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java index f2d051af2..852130c1e 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 @@ -40,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; @@ -688,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; } @@ -832,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/vcs/common/VcsHelper.java b/designer-base/src/main/java/com/fr/design/mainframe/vcs/common/VcsHelper.java index 05e18e691..bc6c4d372 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); @@ -46,8 +48,13 @@ public class VcsHelper { 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 +68,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 +83,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 +101,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,7 +112,7 @@ 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(); } @@ -115,7 +122,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 +141,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 +152,25 @@ public class VcsHelper { } + @Override + public void templateOpened(JTemplate jt) { + + } + + /** + * 模板保存时 处理. + * + * @param jt 模板 + */ + @Override + public void templateSaved(JTemplate jt) { + if (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/FileVersionRowPanel.java b/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/FileVersionRowPanel.java index a37a5cea6..cd01d409c 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()); }