diff --git a/designer-base/src/main/java/com/fr/design/actions/file/EditEnvAction.java b/designer-base/src/main/java/com/fr/design/actions/file/EditEnvAction.java
index a4b7c88034..d007e315fe 100644
--- a/designer-base/src/main/java/com/fr/design/actions/file/EditEnvAction.java
+++ b/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());
+ }
+ }
}
\ No newline at end of file
diff --git a/designer-base/src/main/java/com/fr/design/actions/file/SwitchExistEnv.java b/designer-base/src/main/java/com/fr/design/actions/file/SwitchExistEnv.java
index bc88f72fd0..c59a92b975 100644
--- a/designer-base/src/main/java/com/fr/design/actions/file/SwitchExistEnv.java
+++ b/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());
+ }
+ }
}
}
diff --git a/designer-base/src/main/java/com/fr/design/dialog/link/MessageWithLink.java b/designer-base/src/main/java/com/fr/design/dialog/link/MessageWithLink.java
index 8a1f55cbdf..889a0c3c9c 100644
--- a/designer-base/src/main/java/com/fr/design/dialog/link/MessageWithLink.java
+++ b/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", "
" + message + "" + linkName + "" + "");
- 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", "" + message + "" + linkName + "" + "");
+ 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;");
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 f940f89045..a2cc6f8065 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
@@ -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();
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java b/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java
index 8097d02f40..e55526408c 100644
--- a/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java
+++ b/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;
}
@@ -843,8 +843,10 @@ public class EastRegionContainerPane extends UIEastResizableContainer {
}
public void replaceContentPane(JComponent pane) {
- contentArea.remove(this.contentPane);
- contentArea.add(this.contentPane = pane);
+ if (pane != this.contentPane) {
+ contentArea.remove(this.contentPane);
+ contentArea.add(this.contentPane = pane);
+ }
if (popupDialog != null && isPoppedOut) {
popupDialog.replaceContentPane(this);
}
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 b374dbbf97..8d526971cb 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
@@ -115,6 +115,7 @@ public abstract class JTemplate>
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>
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();
}
}
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/OpenFailedPane.java b/designer-base/src/main/java/com/fr/design/mainframe/OpenFailedPane.java
new file mode 100644
index 0000000000..101585abb3
--- /dev/null
+++ b/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);
+ }
+
+
+
+}
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/OpenLoadingPane.java b/designer-base/src/main/java/com/fr/design/mainframe/OpenLoadingPane.java
index 5a81319739..9ee095c996 100644
--- a/designer-base/src/main/java/com/fr/design/mainframe/OpenLoadingPane.java
+++ b/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);
}
diff --git a/designer-base/src/main/java/com/fr/design/menu/MenuDef.java b/designer-base/src/main/java/com/fr/design/menu/MenuDef.java
index 55b80c0ec8..cee1658b91 100644
--- a/designer-base/src/main/java/com/fr/design/menu/MenuDef.java
+++ b/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) {
diff --git a/designer-base/src/main/java/com/fr/design/worker/open/OpenWorker.java b/designer-base/src/main/java/com/fr/design/worker/open/OpenWorker.java
index f166020513..2da4d335ec 100644
--- a/designer-base/src/main/java/com/fr/design/worker/open/OpenWorker.java
+++ b/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 extends SwingWorker {
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 extends SwingWorker {
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> templateCallable) {
this.templateCallable = templateCallable;
}
diff --git a/designer-base/src/main/resources/com/fr/design/images/mainframe/loading.gif b/designer-base/src/main/resources/com/fr/design/images/mainframe/loading.gif
new file mode 100644
index 0000000000..c77b4fe100
Binary files /dev/null and b/designer-base/src/main/resources/com/fr/design/images/mainframe/loading.gif differ
diff --git a/designer-base/src/main/resources/com/fr/design/images/mainframe/open_failed.png b/designer-base/src/main/resources/com/fr/design/images/mainframe/open_failed.png
new file mode 100644
index 0000000000..0d43a117fb
Binary files /dev/null and b/designer-base/src/main/resources/com/fr/design/images/mainframe/open_failed.png differ