Browse Source

Pull request #4059: CHART-18997 处理下打开模板出错时情况

Merge in DESIGN/design from ~HADES/design:feature/10.0 to feature/10.0

* commit '907e2957afe37bad882a49c5d1ae6dd1dfeb2f33':
  CHART-18997 处理下打开模板出错时情况
  CHART-18997 处理下打开模板出错时情况
feature/10.0
Hades 3 years ago
parent
commit
e7cbbd31d2
  1. 11
      designer-base/src/main/java/com/fr/design/actions/file/EditEnvAction.java
  2. 12
      designer-base/src/main/java/com/fr/design/actions/file/SwitchExistEnv.java
  3. 49
      designer-base/src/main/java/com/fr/design/dialog/link/MessageWithLink.java
  4. 29
      designer-base/src/main/java/com/fr/design/mainframe/DesktopCardPane.java
  5. 2
      designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java
  6. 11
      designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java
  7. 92
      designer-base/src/main/java/com/fr/design/mainframe/OpenFailedPane.java
  8. 5
      designer-base/src/main/java/com/fr/design/mainframe/OpenLoadingPane.java
  9. 2
      designer-base/src/main/java/com/fr/design/menu/MenuDef.java
  10. 44
      designer-base/src/main/java/com/fr/design/worker/open/OpenWorker.java
  11. BIN
      designer-base/src/main/resources/com/fr/design/images/mainframe/loading.gif
  12. BIN
      designer-base/src/main/resources/com/fr/design/images/mainframe/open_failed.png

11
designer-base/src/main/java/com/fr/design/actions/file/EditEnvAction.java

@ -3,6 +3,8 @@ package com.fr.design.actions.file;
import com.fr.design.EnvChangeEntrance;
import com.fr.design.actions.UpdateAction;
import com.fr.design.file.HistoryTemplateListCache;
import com.fr.design.mainframe.JTemplate;
import java.awt.event.ActionEvent;
@ -17,4 +19,13 @@ public class EditEnvAction extends UpdateAction {
public void actionPerformed(ActionEvent e) {
EnvChangeEntrance.getInstance().chooseEnv();
}
@Override
public void update() {
super.update();
JTemplate<?, ?> template = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate();
if (template != null) {
this.setEnabled(!template.isSaving());
}
}
}

12
designer-base/src/main/java/com/fr/design/actions/file/SwitchExistEnv.java

@ -1,10 +1,11 @@
package com.fr.design.actions.file;
import com.fr.base.svg.IconUtils;
import com.fr.design.DesignerEnvManager;
import com.fr.design.EnvChangeEntrance;
import com.fr.design.actions.UpdateAction;
import com.fr.design.env.DesignerWorkspaceInfo;
import com.fr.design.file.HistoryTemplateListCache;
import com.fr.design.mainframe.JTemplate;
import com.fr.design.menu.KeySetUtils;
import com.fr.design.menu.MenuDef;
import com.fr.design.menu.SeparatorDef;
@ -68,5 +69,14 @@ public class SwitchExistEnv extends MenuDef {
EnvChangeEntrance.getInstance().switch2Env(envName);
}
}
@Override
public void update() {
super.update();
JTemplate<?, ?> template = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate();
if (template != null) {
this.setEnabled(!template.isSaving());
}
}
}
}

49
designer-base/src/main/java/com/fr/design/dialog/link/MessageWithLink.java

@ -9,6 +9,7 @@ import java.awt.Font;
import java.net.URI;
import javax.swing.JEditorPane;
import javax.swing.event.HyperlinkEvent;
import javax.swing.event.HyperlinkListener;
/**
* 用来构建JOptionPane带超链的消息提示
@ -19,31 +20,45 @@ import javax.swing.event.HyperlinkEvent;
*/
public class MessageWithLink extends JEditorPane {
private static final UILabel LABEL = new UILabel();
public MessageWithLink(String message, String linkName, String link) {
super("text/html", "<html><body style=\"" + getStyle() + "\">" + message + "<a href=\"" + link + "\">" + linkName + "</a>" + "</body></html>");
addHyperlinkListener(e -> {
if (e.getEventType().equals(HyperlinkEvent.EventType.ACTIVATED)) {
try {
Desktop.getDesktop().browse(URI.create(link));
} catch (Exception exception) {
FineLoggerFactory.getLogger().error(exception.getMessage(), exception);
}
}
});
setEditable(false);
setBorder(null);
this(message, linkName, link, LABEL.getBackground(), LABEL.getFont());
}
public MessageWithLink(String linkName, String link ) {
this(StringUtils.EMPTY, linkName, link);
}
private static StringBuilder getStyle() {
// 构建和相同风格样式
UILabel label = new UILabel();
Font font = label.getFont();
Color color = label.getBackground();
public MessageWithLink(String message, String linkName, String link, Color color) {
this(message, linkName, link, color, LABEL.getFont());
}
public MessageWithLink(String message, String linkName, String link, Color color, Font font) {
super("text/html", "<html><body style=\"" + generateStyle(color, font) + "\">" + message + "<a href=\"" + link + "\">" + linkName + "</a>" + "</body></html>");
initListener(link);
setEditable(false);
setBorder(null);
}
protected void initListener(String link) {
addHyperlinkListener(new HyperlinkListener() {
@Override
public void hyperlinkUpdate(HyperlinkEvent e) {
if (e.getEventType().equals(HyperlinkEvent.EventType.ACTIVATED)) {
try {
Desktop.getDesktop().browse(URI.create(link));
} catch (Exception exception) {
FineLoggerFactory.getLogger().error(exception.getMessage(), exception);
}
}
}
});
}
private static StringBuilder generateStyle(Color color, Font font) {
// 构建相同风格样式
StringBuilder style = new StringBuilder("font-family:" + font.getFamily() + ";");
style.append("font-weight:").append(font.isBold() ? "bold" : "normal").append(";");
style.append("font-size:").append(font.getSize()).append("pt;");

29
designer-base/src/main/java/com/fr/design/mainframe/DesktopCardPane.java

@ -21,10 +21,16 @@ import javax.swing.JLayeredPane;
*/
public class DesktopCardPane extends BasicPane implements TargetModifiedListener {
private static final int CONTENT_LAYER = 0;
private static final int TRANSPARENT_LAYER = 1;
private static final int LOADING_LAYER = 2;
private static final int FAILED_LAYER = 3;
private static final long serialVersionUID = 1L;
private JTemplate<?, ?> component;
private TransparentPane transparentPane = new TransparentPane();
private OpenLoadingPane loadingPane = new OpenLoadingPane();
private OpenFailedPane failedPane = new OpenFailedPane();
private JLayeredPane layeredPane = new JLayeredPane() {
@Override
public void doLayout() {
@ -36,8 +42,9 @@ public class DesktopCardPane extends BasicPane implements TargetModifiedListener
protected DesktopCardPane() {
setLayout(new BorderLayout());
layeredPane.add(transparentPane, 1);
layeredPane.add(loadingPane, 2);
layeredPane.add(transparentPane, TRANSPARENT_LAYER);
layeredPane.add(failedPane, FAILED_LAYER);
add(layeredPane, BorderLayout.CENTER);
}
protected void showJTemplate(final JTemplate<?, ?> jt) {
@ -53,7 +60,7 @@ public class DesktopCardPane extends BasicPane implements TargetModifiedListener
layeredPane.remove(component);
}
component = jt;
layeredPane.add(component, 0);
layeredPane.add(component, CONTENT_LAYER);
checkSavingAndOpening(jt);
add(layeredPane, BorderLayout.CENTER);
validate();
@ -69,18 +76,34 @@ public class DesktopCardPane extends BasicPane implements TargetModifiedListener
showCover();
} else if (jt.isOpening()) {
showOpenStatus();
} else if (jt.isOpenFailed()) {
showOpenFailedCover();
} else {
hideCover();
}
}
/**
* 让loadingPane懒加载
*/
private void checkLoadingPane() {
if (layeredPane.getComponent(LOADING_LAYER) != loadingPane) {
layeredPane.add(loadingPane, LOADING_LAYER);
}
}
private void showOpenStatus() {
DesignerContext.getDesignerFrame().refreshUIToolBar();
DesignerFrameFileDealerPane.getInstance().stateChange();
EastRegionContainerPane.getInstance().updateAllPropertyPane();
checkLoadingPane();
layeredPane.moveToFront(loadingPane);
}
public void showOpenFailedCover() {
layeredPane.moveToFront(failedPane);
}
public void showCover() {
layeredPane.moveToFront(transparentPane);
DesignerContext.getDesignerFrame().refreshUIToolBar();

2
designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java

@ -794,7 +794,7 @@ public class EastRegionContainerPane extends UIEastResizableContainer {
public void setEnabled(boolean isEnabled) {
JTemplate<?, ?> template = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate();
if (template != null) {
this.isEnabled = isEnabled && !template.isOpening() && !template.isSaving();
this.isEnabled = isEnabled && template.checkEnable();
} else {
this.isEnabled = isEnabled;
}

11
designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java

@ -115,6 +115,7 @@ public abstract class JTemplate<T extends BaseBook, U extends BaseUndoState<?>>
protected TimeConsumeTimer consumeTimer = new TimeConsumeTimer();
private volatile boolean saving = false;
private volatile boolean opening = false;
private volatile boolean openFailed = false;
private PluginEventListener pluginListener;
@ -1585,8 +1586,16 @@ public abstract class JTemplate<T extends BaseBook, U extends BaseUndoState<?>>
this.opening = opening;
}
public boolean isOpenFailed() {
return openFailed;
}
public void setOpenFailed(boolean openFailed) {
this.openFailed = openFailed;
}
public boolean checkEnable() {
return !isSaving() && !isOpening();
return !isSaving() && !isOpening() && !isOpenFailed();
}
}

92
designer-base/src/main/java/com/fr/design/mainframe/OpenFailedPane.java

@ -0,0 +1,92 @@
package com.fr.design.mainframe;
import com.fr.design.dialog.link.MessageWithLink;
import com.fr.design.file.HistoryTemplateListCache;
import com.fr.design.gui.ilable.UILabel;
import com.fr.design.i18n.Toolkit;
import com.fr.general.IOUtils;
import com.fr.stable.StringUtils;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.LayoutManager;
import javax.swing.JPanel;
import javax.swing.event.HyperlinkEvent;
import javax.swing.event.HyperlinkListener;
/**
* @author hades
* @version 10.0
* Created by hades on 2021/4/20
*/
public class OpenFailedPane extends JPanel {
private UILabel label;
private MessageWithLink link;
public OpenFailedPane() {
this.setLayout(new LayoutManager() {
@Override
public void addLayoutComponent(String name, Component comp) {
}
@Override
public void removeLayoutComponent(Component comp) {
}
@Override
public Dimension preferredLayoutSize(Container parent) {
return parent.getPreferredSize();
}
@Override
public Dimension minimumLayoutSize(Container parent) {
return null;
}
@Override
public void layoutContainer(Container parent) {
int width = parent.getParent().getWidth();
int height = parent.getParent().getHeight();
int labelWidth = label.getPreferredSize().width;
int labelHeight = label.getPreferredSize().height;
int labelX = (width - labelWidth) / 2;
int labelY = (height - labelHeight) / 2;
int linkWidth = link.getPreferredSize().width;
int linkHeight = link.getPreferredSize().height;
int linkX = (width - linkWidth) / 2;
int linkY = (height - labelHeight) / 2 + labelHeight;
label.setBounds(labelX, labelY, labelWidth, labelHeight);
link.setBounds(linkX, linkY, linkWidth, linkHeight);
}
});
this.setBackground(Color.WHITE);
label = new UILabel(IOUtils.readIcon("/com/fr/design/images/mainframe/open_failed.png"), UILabel.CENTER);
link = new MessageWithLink(Toolkit.i18nText("Fine-Design_Open_Failed_Tip"), Toolkit.i18nText("Fine-Design_Open_Failed_Retry"), StringUtils.EMPTY, Color.WHITE) {
@Override
protected void initListener(String link) {
addHyperlinkListener(new HyperlinkListener() {
@Override
public void hyperlinkUpdate(HyperlinkEvent e) {
if (e.getEventType().equals(HyperlinkEvent.EventType.ACTIVATED)) {
// 重试
JTemplate<?, ?> template = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate();
template = JTemplateFactory.createJTemplate(template.getEditingFILE());
DesignerContext.getDesignerFrame().addAndActivateJTemplate(template);
HistoryTemplateListCache.getInstance(). setCurrentEditingTemplate(template);
}
}
});
}
};
link.setBackground(Color.WHITE);
this.add(label);
this.add(link);
}
}

5
designer-base/src/main/java/com/fr/design/mainframe/OpenLoadingPane.java

@ -1,7 +1,6 @@
package com.fr.design.mainframe;
import com.fr.design.gui.ilable.UILabel;
import com.fr.general.IOUtils;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
@ -17,6 +16,8 @@ import javax.swing.JPanel;
*/
public class OpenLoadingPane extends JPanel {
private static final ImageIcon LOADING_ICON = new ImageIcon(OpenLoadingPane.class.getResource("/com/fr/design/images/mainframe/loading.gif"));
private UILabel loadingLabel;
public OpenLoadingPane() {
@ -53,7 +54,7 @@ public class OpenLoadingPane extends JPanel {
}
});
setBackground(Color.WHITE);
loadingLabel = new UILabel(new ImageIcon(IOUtils.readImage("com/fr/plugin/chart/vanchart/export/loading.png")));
loadingLabel = new UILabel(LOADING_ICON);
add(loadingLabel);
}

2
designer-base/src/main/java/com/fr/design/menu/MenuDef.java

@ -411,7 +411,7 @@ public class MenuDef extends ShortCut {
JTemplate<?, ?> template = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate();
boolean flag = true;
if (template != null) {
flag = !template.isSaving() && !template.isOpening();
flag = template.checkEnable();
}
component.setEnabled(flag);
if (!flag) {

44
designer-base/src/main/java/com/fr/design/worker/open/OpenWorker.java

@ -1,11 +1,15 @@
package com.fr.design.worker.open;
import com.fr.chart.exception.ChartNotFoundException;
import com.fr.design.dialog.FineJOptionPane;
import com.fr.design.file.HistoryTemplateListCache;
import com.fr.design.i18n.Toolkit;
import com.fr.design.mainframe.DesignerContext;
import com.fr.design.mainframe.DesignerFrameFileDealerPane;
import com.fr.design.mainframe.EastRegionContainerPane;
import com.fr.design.mainframe.JTemplate;
import com.fr.design.worker.WorkerManager;
import com.fr.exception.DecryptTemplateException;
import com.fr.file.FILE;
import com.fr.general.ComparatorUtils;
import com.fr.log.FineLoggerFactory;
@ -13,7 +17,9 @@ import java.util.concurrent.Callable;
import java.util.concurrent.CancellationException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import javax.swing.JOptionPane;
import javax.swing.SwingWorker;
import javax.swing.UIManager;
/**
* 模板打开的worker
@ -54,11 +60,34 @@ public class OpenWorker<T> extends SwingWorker<T, Void> {
result = get();
} catch (CancellationException ignored) {
return;
} catch (Exception e) {
FineLoggerFactory.getLogger().error(e.getMessage(), e);
} catch (Throwable t) {
processFailed();
Throwable cause = t.getCause();
if (cause instanceof DecryptTemplateException) {
FineJOptionPane.showMessageDialog(
DesignerContext.getDesignerFrame(),
Toolkit.i18nText("Fine-Design_Encrypt_Decrypt_Exception"),
Toolkit.i18nText("Fine-Design_Basic_Alert"),
JOptionPane.WARNING_MESSAGE,
UIManager.getIcon("OptionPane.errorIcon")
);
}
if (cause instanceof ChartNotFoundException) {
FineJOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(),
Toolkit.i18nText("Fine-Design_Chart_Not_Found_Exception"),
Toolkit.i18nText("Fine-Design_Basic_Error"),
JOptionPane.ERROR_MESSAGE,
UIManager.getIcon("OptionPane.errorIcon"));
}
FineLoggerFactory.getLogger().error(t.getMessage(), t);
return;
}
this.template.setOpening(false);
// 后续动作
processResult();
}
private void processResult() {
this.template.setOpening(false);
if (slowly && templateCallable != null) {
try {
JTemplate<?, ?> book = templateCallable.call();
@ -89,6 +118,15 @@ public class OpenWorker<T> extends SwingWorker<T, Void> {
WorkerManager.getInstance().removeWorker(taskName);
}
private void processFailed() {
this.template.setOpenFailed(true);
this.template.setOpening(false);
DesignerContext.getDesignerFrame().getCenterTemplateCardPane().showOpenFailedCover();
DesignerFrameFileDealerPane.getInstance().stateChange();
WorkerManager.getInstance().removeWorker(taskName);
}
public void addCallBack(Callable<JTemplate<?, ?>> templateCallable) {
this.templateCallable = templateCallable;
}

BIN
designer-base/src/main/resources/com/fr/design/images/mainframe/loading.gif

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

BIN
designer-base/src/main/resources/com/fr/design/images/mainframe/open_failed.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Loading…
Cancel
Save