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 a4b7c8803..d007e315f 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 bc88f72fd..c59a92b97 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 8a1f55cbd..889a0c3c9 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 f940f8904..a2cc6f806 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 8097d02f4..3bf9848de 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; } 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 b374dbbf9..8d526971c 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 000000000..101585abb --- /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 5a8131973..9ee095c99 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 55b80c0ec..cee1658b9 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 f16602051..2da4d335e 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 000000000..c77b4fe10 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 000000000..0d43a117f Binary files /dev/null and b/designer-base/src/main/resources/com/fr/design/images/mainframe/open_failed.png differ