Browse Source

REPORT-111337 【设计器性能】设计器卡顿优化 打开模板动画优化

fix-lag
Destiny.Lin 5 months ago
parent
commit
a8eb36157d
  1. 55
      designer-base/src/main/java/com/fr/design/file/TemplateTreePane.java
  2. 15
      designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java
  3. 8
      designer-base/src/main/java/com/fr/design/mainframe/DesktopCardPane.java
  4. 30
      designer-base/src/main/java/com/fr/design/worker/check/CheckLockResult.java
  5. 66
      designer-base/src/main/java/com/fr/design/worker/check/CheckLockWorker.java

55
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)));
}
/**

15
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 {

8
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();

30
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;
}
}

66
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<CheckLockResult, Void> {
private static final int TIME_OUT = 50;
private boolean slowly = false;
private final Callable<CheckLockResult> doInBackground;
private CheckLockResult result;
public CheckLockWorker(Callable<CheckLockResult> 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);
}
Loading…
Cancel
Save