Browse Source

CHART-18997 处理下打开模板出错时情况

feature/10.0
hades 3 years ago
parent
commit
9abed876cd
  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. 5
      designer-base/src/main/java/com/fr/design/mainframe/OpenLoadingPane.java
  8. 2
      designer-base/src/main/java/com/fr/design/menu/MenuDef.java
  9. 44
      designer-base/src/main/java/com/fr/design/worker/open/OpenWorker.java

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

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

Loading…
Cancel
Save