diff --git a/designer-form/src/main/java/com/fr/design/mainframe/share/ui/block/OnlineWidgetBlock.java b/designer-form/src/main/java/com/fr/design/mainframe/share/ui/block/OnlineWidgetBlock.java index 3eacc5226..61c913201 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/share/ui/block/OnlineWidgetBlock.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/share/ui/block/OnlineWidgetBlock.java @@ -337,41 +337,42 @@ public class OnlineWidgetBlock extends AbstractOnlineWidgetBlock { null, this ); - return; - } - //如果鼠标移动到布局内且布局不可编辑,画出编辑蒙层 - if (!isRightClickPopupMenuVisible() && (isMouseEnter || downloading)) { - Graphics2D g2d = (Graphics2D) g; - Composite oldComposite = g2d.getComposite(); - //画白色的编辑层 - g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 20 / 100.0F)); - g2d.setColor(COVER_COLOR); - g2d.fillRect(x, y, w, h); - g2d.setComposite(oldComposite); - //画编辑按钮图标 - BufferedImage image = (process > 0 || downloading) ? WIDGET_DOWNLOADING_ICON : WIDGET_DOWNLOAD_ICON; - g2d.drawImage( - image, - (x + w / 2 - 12), - (y + h / 2 - 16), - image.getWidth(), - image.getHeight(), - null, - this - ); - Stroke oldStroke = g2d.getStroke(); - g2d.setStroke(XCreatorConstants.STROKE); - g2d.setColor(Color.decode("#419BF9")); - double arcAngle = downloading ? (36 + 360 * 0.9 * process) : 0.0; - g2d.drawArc(x + w / 2 - 12, y + h / 2 - 16, 24, 24, 90, -(int) arcAngle); - g2d.setColor(Color.WHITE); - g2d.setStroke(oldStroke); - } + } else { + //如果鼠标移动到布局内且布局不可编辑,画出编辑蒙层 + if (!isRightClickPopupMenuVisible() && (isMouseEnter || downloading)) { + Graphics2D g2d = (Graphics2D) g; + Composite oldComposite = g2d.getComposite(); + //画白色的编辑层 + g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 20 / 100.0F)); + g2d.setColor(COVER_COLOR); + g2d.fillRect(x, y, w, h); + g2d.setComposite(oldComposite); + //画编辑按钮图标 + BufferedImage image = (process > 0 || downloading) ? WIDGET_DOWNLOADING_ICON : WIDGET_DOWNLOAD_ICON; + g2d.drawImage( + image, + (x + w / 2 - 12), + (y + h / 2 - 16), + image.getWidth(), + image.getHeight(), + null, + this + ); + Stroke oldStroke = g2d.getStroke(); + g2d.setStroke(XCreatorConstants.STROKE); + g2d.setColor(Color.decode("#419BF9")); + double arcAngle = downloading ? (36 + 360 * 0.9 * process) : 0.0; + g2d.drawArc(x + w / 2 - 12, y + h / 2 - 16, 24, 24, 90, -(int) arcAngle); + g2d.setColor(Color.WHITE); + g2d.setStroke(oldStroke); + } - boolean isUnusable = !getWidget().isCompatibleWithCurrentEnv(); - if (isUnusable) { - paintUnusableMask((Graphics2D) g); + boolean isUnusable = !getWidget().isCompatibleWithCurrentEnv(); + if (isUnusable) { + paintUnusableMask((Graphics2D) g); + } } + if (this.parentPane != null) { this.parentPane.refreshShowPaneUI(); } diff --git a/designer-form/src/main/java/com/fr/design/mainframe/share/ui/online/OnlineDownloadPackagePane.java b/designer-form/src/main/java/com/fr/design/mainframe/share/ui/online/OnlineDownloadPackagePane.java index 987cfface..1d4990c7d 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/share/ui/online/OnlineDownloadPackagePane.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/share/ui/online/OnlineDownloadPackagePane.java @@ -256,4 +256,12 @@ public class OnlineDownloadPackagePane extends OnlineWidgetSelectPane { } } } + + @Override + public void refreshShowPaneUI() { + if (downloadProgressPane != null && downloadProgressPane.isShowing()) { + downloadProgressPane.invalidate(); + downloadProgressPane.repaint(); + } + } } diff --git a/designer-form/src/main/java/com/fr/design/mainframe/share/ui/online/OnlineWidgetTabPane.java b/designer-form/src/main/java/com/fr/design/mainframe/share/ui/online/OnlineWidgetTabPane.java index cfa5d799f..ca0e8aa6a 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/share/ui/online/OnlineWidgetTabPane.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/share/ui/online/OnlineWidgetTabPane.java @@ -16,6 +16,7 @@ import com.fr.form.share.bean.OnlineShareWidget; import javax.swing.BorderFactory; import javax.swing.JButton; +import javax.swing.JComponent; import javax.swing.JPanel; import javax.swing.plaf.basic.BasicButtonUI; import java.awt.BorderLayout; @@ -44,6 +45,7 @@ public class OnlineWidgetTabPane extends JPanel { private boolean packagePaneCreated = false; private final List tabChangeListeners; private OnlineEmbedFilterShowPane embedFilterShowPane; + private OnlineWidgetPackagesShowPane widgetPackagesShowPane; public OnlineWidgetTabPane(OnlineShareWidget[] sharableWidgets, OnlineShareWidget[] sharableWidgetPackage) { tabChangeListeners = new ArrayList<>(); @@ -70,7 +72,8 @@ public class OnlineWidgetTabPane extends JPanel { ComponentCollector.getInstance().collectCmpPktClick(); //延迟组件包面板的初始化,防止组件面板里组件和缩略图和组件包面板里组件的缩略图一起加载 if (!packagePaneCreated) { - centerPane.add(new OnlineWidgetPackagesShowPane(sharableWidgetPackages), COMPONENT_PACKAGE); + widgetPackagesShowPane = new OnlineWidgetPackagesShowPane(sharableWidgetPackages); + centerPane.add(widgetPackagesShowPane, COMPONENT_PACKAGE); packagePaneCreated = true; } cardLayout.show(centerPane, COMPONENT_PACKAGE); @@ -89,6 +92,8 @@ public class OnlineWidgetTabPane extends JPanel { this.add(centerPane, BorderLayout.CENTER); } + + private JPanel createMiniShopEntryPane() { JPanel container = FRGUIPaneFactory.createBorderLayout_S_Pane(); container.setBorder(BorderFactory.createEmptyBorder(10, 0, 0, 0)); @@ -136,6 +141,10 @@ public class OnlineWidgetTabPane extends JPanel { if (embedFilterShowPane != null) { this.embedFilterShowPane.refreshUI(); } + + if (headGroup.getSelectedIndex() == COMPONENT_PACKAGE_TAB_INDEX && widgetPackagesShowPane != null) { + widgetPackagesShowPane.refreshShowPaneUI(); + } } diff --git a/designer-form/src/main/java/com/fr/design/mainframe/share/ui/online/mini/MiniComponentShopDialog.java b/designer-form/src/main/java/com/fr/design/mainframe/share/ui/online/mini/MiniComponentShopDialog.java index ab17b0de3..be2d72466 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/share/ui/online/mini/MiniComponentShopDialog.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/share/ui/online/mini/MiniComponentShopDialog.java @@ -106,6 +106,11 @@ public class MiniComponentShopDialog { if (frame == null) { frame = createFrame(); } + if (!frame.isVisible()) { + for (WindowListener listener: windowListeners) { + listener.windowOpened(null); + } + } frame.setVisible(true); } diff --git a/designer-form/src/main/java/com/fr/design/mainframe/share/ui/online/mini/bridge/NativeProductBridge.java b/designer-form/src/main/java/com/fr/design/mainframe/share/ui/online/mini/bridge/NativeProductBridge.java index 0da415a5d..e6a4f720c 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/share/ui/online/mini/bridge/NativeProductBridge.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/share/ui/online/mini/bridge/NativeProductBridge.java @@ -37,10 +37,15 @@ import java.util.Set; * Created by Starryi on 2021/12/20 */ public class NativeProductBridge { + private static final Map createdComponentInstallationTasks = new HashMap<>(); + private static final Map createdComponentsPackageInstallationTasks = new HashMap<>(); + private static final Map createdTemplateThemeInstallationTasks = new HashMap<>(); + + private static final Map startedComponentInstallationTasks = new HashMap<>(); + private static final Map startedComponentsPackageInstallationTasks = new HashMap<>(); + private static final Map startedTemplateThemeInstallationTasks = new HashMap<>(); + private final Object window; - private static final Map executingComponentInstallationTasks = new HashMap<>(); - private static final Map executingComponentsPackageInstallationTasks = new HashMap<>(); - private static final Map executingTemplateThemeInstallationTasks = new HashMap<>(); private final Map> componentDownloadTaskStartListeners = new HashMap<>(); private final Map> componentsPackageDownloadTaskStartListeners = new HashMap<>(); @@ -115,7 +120,7 @@ public class NativeProductBridge { boolean isPackage = widget.isWidgetPackage(); Map executingDownloadTask = - isPackage ? executingComponentsPackageInstallationTasks : executingComponentInstallationTasks; + isPackage ? startedComponentsPackageInstallationTasks : startedComponentInstallationTasks; NativeTaskBridge task = executingDownloadTask.get(uuid); if (task != null) { task.checkJSEnvChange(this.window); @@ -131,9 +136,22 @@ public class NativeProductBridge { OnlineShareWidget widget = OnlineShareWidget.parseFromJSONObject(object); int childrenCount = object.optInt("pkgsize", 0); if (childrenCount > 0) { - return new ComponentsPackageInstallationTask(this, window, widget, childrenCount); + if (createdComponentsPackageInstallationTasks.containsKey(widget.getUuid())) { + return createdComponentsPackageInstallationTasks.get(widget.getUuid()); + } else { + ComponentsPackageInstallationTask task = new ComponentsPackageInstallationTask(this, window, widget, childrenCount); + createdComponentsPackageInstallationTasks.put(widget.getUuid(), task); + return task; + } + } else { - return new ComponentInstallationTask(this, window, widget); + if (createdComponentInstallationTasks.containsKey(widget.getUuid())) { + return createdComponentInstallationTasks.get(widget.getUuid()); + } else { + ComponentInstallationTask task = new ComponentInstallationTask(this, window, widget); + createdComponentInstallationTasks.put(widget.getUuid(), task); + return task; + } } } @@ -165,7 +183,7 @@ public class NativeProductBridge { @JsAccessible @JSBridge public Object getExecutingThemeDownloadTask(String themePath) { - NativeTaskBridge task = (NativeTaskBridge) executingTemplateThemeInstallationTasks.get(themePath); + NativeTaskBridge task = startedTemplateThemeInstallationTasks.get(themePath); if (task != null) { task.checkJSEnvChange(this.window); } @@ -176,7 +194,13 @@ public class NativeProductBridge { @JsAccessible @JSBridge public Object createTemplateThemeDownloadTask(String themePath) { - return new TemplateThemeInstallationTask(this, window, themePath); + if (createdTemplateThemeInstallationTasks.containsKey(themePath)) { + return createdTemplateThemeInstallationTasks.get(themePath); + } else { + TemplateThemeInstallationTask task = new TemplateThemeInstallationTask(this, window, themePath); + createdTemplateThemeInstallationTasks.put(themePath, task); + return task; + } } public static class ComponentInstallationTask extends NativeTaskBridge { @@ -217,6 +241,9 @@ public class NativeProductBridge { @JSBridge @Override public void execute() { + if (isExecuting) { + return; + } super.execute(); SwingUtilities.invokeLater(new Runnable() { @Override @@ -257,7 +284,7 @@ public class NativeProductBridge { @Override protected void fireStartEvent(String event) { - executingComponentInstallationTasks.put(widget.getUuid(), this); + startedComponentInstallationTasks.put(widget.getUuid(), this); Set startListeners = env.componentDownloadTaskStartListeners.get(widget.getUuid()); SafeJSFunctionInvoker.invoke(startListeners, env.window); super.fireStartEvent(event); @@ -265,13 +292,15 @@ public class NativeProductBridge { @Override protected void fireFailureEvent(String event) { - executingComponentInstallationTasks.remove(widget.getUuid()); + startedComponentInstallationTasks.remove(widget.getUuid()); + createdComponentInstallationTasks.remove(widget.getUuid()); super.fireFailureEvent(event); } @Override protected void fireSuccessEvent(String event) { - executingComponentInstallationTasks.remove(widget.getUuid()); + startedComponentInstallationTasks.remove(widget.getUuid()); + createdComponentInstallationTasks.remove(widget.getUuid()); super.fireSuccessEvent(event); } } @@ -317,6 +346,9 @@ public class NativeProductBridge { @JSBridge @Override public void execute() { + if (isExecuting) { + return; + } super.execute(); SwingUtilities.invokeLater(new Runnable() { @Override @@ -373,7 +405,7 @@ public class NativeProductBridge { @Override protected void fireStartEvent(String event) { - executingComponentsPackageInstallationTasks.put(widget.getUuid(), this); + startedComponentsPackageInstallationTasks.put(widget.getUuid(), this); super.fireStartEvent(event); Set startListeners = env.componentsPackageDownloadTaskStartListeners.get(widget.getUuid()); @@ -382,13 +414,15 @@ public class NativeProductBridge { @Override protected void fireFailureEvent(String event) { - executingComponentsPackageInstallationTasks.remove(widget.getUuid()); + startedComponentsPackageInstallationTasks.remove(widget.getUuid()); + createdComponentsPackageInstallationTasks.remove(widget.getUuid()); super.fireFailureEvent(event); } @Override protected void fireSuccessEvent(String event) { - executingComponentsPackageInstallationTasks.remove(widget.getUuid()); + startedComponentsPackageInstallationTasks.remove(widget.getUuid()); + createdComponentsPackageInstallationTasks.remove(widget.getUuid()); super.fireSuccessEvent(event); } } @@ -426,6 +460,9 @@ public class NativeProductBridge { @JSBridge @Override public void execute() { + if (isExecuting) { + return; + } super.execute(); SwingUtilities.invokeLater(new Runnable() { @Override @@ -452,7 +489,7 @@ public class NativeProductBridge { @Override protected void fireStartEvent(String event) { - executingTemplateThemeInstallationTasks.put(themePath, this); + startedTemplateThemeInstallationTasks.put(themePath, this); Set startListeners = env.themeDownloadTaskStartListeners.get(themePath); SafeJSFunctionInvoker.invoke(startListeners, env.window); super.fireStartEvent(event); @@ -460,13 +497,15 @@ public class NativeProductBridge { @Override protected void fireFailureEvent(String event) { - executingTemplateThemeInstallationTasks.remove(themePath); + startedTemplateThemeInstallationTasks.remove(themePath); + createdTemplateThemeInstallationTasks.remove(themePath); super.fireFailureEvent(event); } @Override protected void fireSuccessEvent(String event) { - executingTemplateThemeInstallationTasks.remove(themePath); + startedTemplateThemeInstallationTasks.remove(themePath); + createdTemplateThemeInstallationTasks.remove(themePath); super.fireSuccessEvent(event); } } diff --git a/designer-form/src/main/java/com/fr/design/mainframe/share/ui/online/mini/bridge/NativeTaskBridge.java b/designer-form/src/main/java/com/fr/design/mainframe/share/ui/online/mini/bridge/NativeTaskBridge.java index 06c26c018..2929a3540 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/share/ui/online/mini/bridge/NativeTaskBridge.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/share/ui/online/mini/bridge/NativeTaskBridge.java @@ -18,6 +18,7 @@ public class NativeTaskBridge implements MiniShopNativeTask { private Object window; protected final Set statusCbs = new HashSet<>(); + protected boolean isExecuting = false; public NativeTaskBridge(Object window) { this.window = window; @@ -49,6 +50,9 @@ public class NativeTaskBridge implements MiniShopNativeTask { @JsAccessible @Override public void execute() { + if (!isExecuting) { + isExecuting = true; + } } @JSBridge @@ -68,10 +72,12 @@ public class NativeTaskBridge implements MiniShopNativeTask { SafeJSFunctionInvoker.invoke(statusCbs, window, "PROGRESS", event); } protected void fireSuccessEvent(String event) { + isExecuting = false; MiniShopNativeTaskManager.getInstance().removeCompletedTask(this); SafeJSFunctionInvoker.invoke(statusCbs, window, "SUCCESS", event); } protected void fireFailureEvent(String event) { + isExecuting = false; MiniShopNativeTaskManager.getInstance().removeCompletedTask(this); SafeJSFunctionInvoker.invoke(statusCbs, window, "FAILURE", event); } diff --git a/designer-form/src/main/java/com/fr/design/mainframe/share/ui/online/widgetpackage/OnlineWidgetPackagesShowPane.java b/designer-form/src/main/java/com/fr/design/mainframe/share/ui/online/widgetpackage/OnlineWidgetPackagesShowPane.java index 169759362..d133cd058 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/share/ui/online/widgetpackage/OnlineWidgetPackagesShowPane.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/share/ui/online/widgetpackage/OnlineWidgetPackagesShowPane.java @@ -48,6 +48,7 @@ public class OnlineWidgetPackagesShowPane extends AbstractOnlineWidgetShowPane { private JPanel detailPane; private String currentPackageId; private OnlineWidgetSelectPane onlineWidgetSelectPane; + private OnlineDownloadPackagePane onlineDownloadPackagePane; private UILabel downloadLabel; private final Map cachePanelMap = new HashMap<>(); @@ -109,15 +110,15 @@ public class OnlineWidgetPackagesShowPane extends AbstractOnlineWidgetShowPane { private void downLoadPackage() { downloadLabel.setVisible(false); detailPane.removeAll(); - OnlineDownloadPackagePane widgetSelectPane = new OnlineDownloadPackagePane(this, onlineWidgetSelectPane.getSharableWidgetProviders(), 50); - detailPane.add(widgetSelectPane, BorderLayout.CENTER); + onlineDownloadPackagePane = new OnlineDownloadPackagePane(this, onlineWidgetSelectPane.getSharableWidgetProviders(), 50); + detailPane.add(onlineDownloadPackagePane, BorderLayout.CENTER); cardLayout.show(centerPane, WIDGET_DETAIL); - cachePanelMap.put(currentPackageId, widgetSelectPane); + cachePanelMap.put(currentPackageId, onlineDownloadPackagePane); for (OnlineShareWidget onlineShareWidget : getSharableWidgetProviders()) { if (StringUtils.equals(onlineShareWidget.getId(), currentPackageId)) { - widgetSelectPane.downloadWidget(onlineShareWidget); + onlineDownloadPackagePane.downloadWidget(onlineShareWidget); break; } } @@ -193,4 +194,10 @@ public class OnlineWidgetPackagesShowPane extends AbstractOnlineWidgetShowPane { protected FilterPane createFilterPane() { return FilterPane.createOnlinePackageFilterPane(); } + + public void refreshShowPaneUI() { + if (onlineDownloadPackagePane != null && onlineDownloadPackagePane.isShowing()) { + onlineDownloadPackagePane.refreshShowPaneUI(); + } + } }