diff --git a/designer-base/src/main/java/com/fr/design/file/TemplateTreePane.java b/designer-base/src/main/java/com/fr/design/file/TemplateTreePane.java index 5dfedc266..9d6886056 100644 --- a/designer-base/src/main/java/com/fr/design/file/TemplateTreePane.java +++ b/designer-base/src/main/java/com/fr/design/file/TemplateTreePane.java @@ -19,6 +19,8 @@ import com.fr.design.mainframe.JTemplate; import com.fr.design.mainframe.manager.search.TemplateTreeSearchManager; import com.fr.design.mainframe.manager.search.searcher.control.pane.TemplateSearchRemindPane; import com.fr.design.mainframe.vcs.common.VcsHelper; +import com.fr.design.worker.check.CheckLockResult; +import com.fr.design.worker.check.CheckLockWorker; import com.fr.file.FILE; import com.fr.file.FileNodeFILE; import com.fr.file.filetree.FileNode; @@ -65,6 +67,7 @@ import java.util.concurrent.ExecutionException; import java.util.stream.Collectors; import com.fr.workspace.server.vcs.VcsOperator; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -236,21 +239,53 @@ public class TemplateTreePane extends JPanel implements FileOperations { if (node == null) { return; } + String reportPath = reportletsTree.getSelectedTemplatePath(); final String selectedFilePath = StableUtils.pathJoin(ProjectConstants.REPORTLETS_NAME, reportPath); + CheckLockWorker checkLockWorker = getCheckLockWorker(node, selectedFilePath); + checkLockWorker.execute(); + CheckLockResult checkLockResult = checkLockWorker.getResult(); + processLockResult(checkLockResult, node ,selectedFilePath); + } + + @NotNull + private CheckLockWorker getCheckLockWorker(FileNode node, String selectedFilePath) { String lock = node.getLock(); - boolean showLockInfo = needShowLockInfo(lock, selectedFilePath, node); - if (showLockInfo) { - UserInfo userInfo = WorkContext.getCurrent().get(LockInfoOperator.class).getUserInfo(selectedFilePath); - node.setLock(UUID.randomUUID().toString()); - // 对于开发者预览占位锁定 定位到tab中 - checkDevelopForBiddenTemplate(selectedFilePath); - LockInfoDialog.show(userInfo); - return; + CheckLockWorker checkLockWorker = new CheckLockWorker(() -> { + boolean showLockInfo = needShowLockInfo(lock, selectedFilePath, node); + UserInfo userInfo = null; + if (showLockInfo) { + userInfo = WorkContext.getCurrent().get(LockInfoOperator.class).getUserInfo(selectedFilePath); + } + return new CheckLockResult(showLockInfo, userInfo); + }) { + @Override + public void dealResultWhenSlowly(CheckLockResult result) { + processLockResult(result, node, selectedFilePath); + } + }; + return checkLockWorker; + } + + private void processLockResult(CheckLockResult checkLockResult, FileNode node, String selectedFilePath) { + if (checkLockResult != null) { + boolean showLockInfo = checkLockResult.isLock(); + if (showLockInfo) { + node.setLock(UUID.randomUUID().toString()); + // 对于开发者预览占位锁定 定位到tab中 + checkDevelopForBiddenTemplate(selectedFilePath); + LockInfoDialog.show(checkLockResult.getUserInfo()); + DesignerContext.getDesignerFrame().hideCover(); + return; + } else { + node.setLock(null); + } + DesignerContext.getDesignerFrame().openTemplate(new FileNodeFILE(new FileNode(selectedFilePath, false))); } else { - node.setLock(null); + if (!reportletsTree.getSelectedFileNode().isDirectory()) { + DesignerContext.getDesignerFrame().showOpenStatusLightly(); + } } - DesignerContext.getDesignerFrame().openTemplate(new FileNodeFILE(new FileNode(selectedFilePath, 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 afa1a3bcb..ec5e0dfce 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 @@ -1178,6 +1178,21 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta DesignerExiter.getInstance().execute(); } + + /** + * 动作较轻的打开状态动画 + */ + public void showOpenStatusLightly() { + getCenterTemplateCardPane().showOpenStatusLightly(); + } + + /** + * 隐藏动画 + */ + public void hideCover() { + getCenterTemplateCardPane().hideCover(); + } + // harry:添加程序外拖拽文件进来打开的功能 class FileDropTargetListener implements DropTargetListener { 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 9757b0f0b..75592e185 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 @@ -128,6 +128,13 @@ public class DesktopCardPane extends BasicPane implements TargetModifiedListener layeredPane.moveToFront(loadingPane); } + /** + * 动作较轻的动画展示(用于展示的前置准备动作) + */ + public void showOpenStatusLightly() { + layeredPane.moveToFront(loadingPane); + } + public void showOpenFailedCover(String text) { failedPane.setFailedTip(text); layeredPane.moveToFront(failedPane); @@ -155,6 +162,7 @@ public class DesktopCardPane extends BasicPane implements TargetModifiedListener public void hideCover() { recoverToolBar(); transparentPane.stop(); + component.setVisible(true); layeredPane.moveToFront(component); EastRegionContainerPane.getInstance().updateAllPropertyPane(); JComponent downPane = WestRegionContainerPane.getInstance().getDownPane(); diff --git a/designer-base/src/main/java/com/fr/design/worker/check/CheckLockResult.java b/designer-base/src/main/java/com/fr/design/worker/check/CheckLockResult.java new file mode 100644 index 000000000..bd3a00c66 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/worker/check/CheckLockResult.java @@ -0,0 +1,30 @@ +package com.fr.design.worker.check; + +import com.fr.workspace.base.UserInfo; + +/** + * 信息检查结果 + * + * @author Destiny.Lin + * @since 11.0 + * Created on 2024/1/8 + */ +public class CheckLockResult { + + private boolean lock = false; + private UserInfo userInfo; + + + public CheckLockResult(boolean lock, UserInfo userInfo) { + this.lock = lock; + this.userInfo = userInfo; + } + + public boolean isLock() { + return lock; + } + + public UserInfo getUserInfo() { + return userInfo; + } +} diff --git a/designer-base/src/main/java/com/fr/design/worker/check/CheckLockWorker.java b/designer-base/src/main/java/com/fr/design/worker/check/CheckLockWorker.java new file mode 100644 index 000000000..ed8f625df --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/worker/check/CheckLockWorker.java @@ -0,0 +1,66 @@ +package com.fr.design.worker.check; + +import com.fr.log.FineLoggerFactory; + +import javax.swing.SwingWorker; +import java.util.concurrent.Callable; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; + +/** + * 检查的Worker + * + * @author Destiny.Lin + * @since 11.0 + * Created on 2024/1/8 + */ +public abstract class CheckLockWorker extends SwingWorker { + + private static final int TIME_OUT = 50; + private boolean slowly = false; + private final Callable doInBackground; + private CheckLockResult result; + + public CheckLockWorker(Callable doInBackground) { + this.doInBackground = doInBackground; + } + @Override + protected CheckLockResult doInBackground() throws Exception { + return this.doInBackground.call(); + } + + @Override + protected void done() { + try { + result = get(); + if (slowly) { + dealResultWhenSlowly(result); + } + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + /** + * 获取结果 + */ + public CheckLockResult getResult() { + if (result != null) { + return result; + } + try { + return this.get(TIME_OUT, TimeUnit.MILLISECONDS); + } catch (TimeoutException e) { + slowly = true; + } catch (Exception exception) { + FineLoggerFactory.getLogger().error(exception.getMessage(), exception); + } + return null; + } + + + /** + * 如果获取结果超过TIME_OUT,则通过这个方式处理后续 + */ + public abstract void dealResultWhenSlowly(CheckLockResult result); +}