Browse Source

Pull request #7954: REPORT-66930 & REPORT-66254

Merge in DESIGN/design from ~STARRYI/design:release/11.0 to release/11.0

* commit 'a8572a9e0c37099316dff36c069459918b5d316b':
  REPORT-66306 组件包下载面板无遮罩阴影
  REPORT-66254 【组件商城风格优化】打开商城窗口到商城内容显示出来,期间大概有5秒空白状态,需要优化下
  REPORT-66930 【组件商城风格优化】网慢时多次点击下载出现多个弹窗
bugfix/11.0
starryi 3 years ago
parent
commit
c8f60f1198
  1. 67
      designer-form/src/main/java/com/fr/design/mainframe/share/ui/block/OnlineWidgetBlock.java
  2. 8
      designer-form/src/main/java/com/fr/design/mainframe/share/ui/online/OnlineDownloadPackagePane.java
  3. 11
      designer-form/src/main/java/com/fr/design/mainframe/share/ui/online/OnlineWidgetTabPane.java
  4. 5
      designer-form/src/main/java/com/fr/design/mainframe/share/ui/online/mini/MiniComponentShopDialog.java
  5. 73
      designer-form/src/main/java/com/fr/design/mainframe/share/ui/online/mini/bridge/NativeProductBridge.java
  6. 6
      designer-form/src/main/java/com/fr/design/mainframe/share/ui/online/mini/bridge/NativeTaskBridge.java
  7. 15
      designer-form/src/main/java/com/fr/design/mainframe/share/ui/online/widgetpackage/OnlineWidgetPackagesShowPane.java

67
designer-form/src/main/java/com/fr/design/mainframe/share/ui/block/OnlineWidgetBlock.java

@ -337,41 +337,42 @@ public class OnlineWidgetBlock extends AbstractOnlineWidgetBlock {
null, null,
this this
); );
return; } else {
} //如果鼠标移动到布局内且布局不可编辑,画出编辑蒙层
//如果鼠标移动到布局内且布局不可编辑,画出编辑蒙层 if (!isRightClickPopupMenuVisible() && (isMouseEnter || downloading)) {
if (!isRightClickPopupMenuVisible() && (isMouseEnter || downloading)) { Graphics2D g2d = (Graphics2D) g;
Graphics2D g2d = (Graphics2D) g; Composite oldComposite = g2d.getComposite();
Composite oldComposite = g2d.getComposite(); //画白色的编辑层
//画白色的编辑层 g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 20 / 100.0F));
g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 20 / 100.0F)); g2d.setColor(COVER_COLOR);
g2d.setColor(COVER_COLOR); g2d.fillRect(x, y, w, h);
g2d.fillRect(x, y, w, h); g2d.setComposite(oldComposite);
g2d.setComposite(oldComposite); //画编辑按钮图标
//画编辑按钮图标 BufferedImage image = (process > 0 || downloading) ? WIDGET_DOWNLOADING_ICON : WIDGET_DOWNLOAD_ICON;
BufferedImage image = (process > 0 || downloading) ? WIDGET_DOWNLOADING_ICON : WIDGET_DOWNLOAD_ICON; g2d.drawImage(
g2d.drawImage( image,
image, (x + w / 2 - 12),
(x + w / 2 - 12), (y + h / 2 - 16),
(y + h / 2 - 16), image.getWidth(),
image.getWidth(), image.getHeight(),
image.getHeight(), null,
null, this
this );
); Stroke oldStroke = g2d.getStroke();
Stroke oldStroke = g2d.getStroke(); g2d.setStroke(XCreatorConstants.STROKE);
g2d.setStroke(XCreatorConstants.STROKE); g2d.setColor(Color.decode("#419BF9"));
g2d.setColor(Color.decode("#419BF9")); double arcAngle = downloading ? (36 + 360 * 0.9 * process) : 0.0;
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.drawArc(x + w / 2 - 12, y + h / 2 - 16, 24, 24, 90, -(int) arcAngle); g2d.setColor(Color.WHITE);
g2d.setColor(Color.WHITE); g2d.setStroke(oldStroke);
g2d.setStroke(oldStroke); }
}
boolean isUnusable = !getWidget().isCompatibleWithCurrentEnv(); boolean isUnusable = !getWidget().isCompatibleWithCurrentEnv();
if (isUnusable) { if (isUnusable) {
paintUnusableMask((Graphics2D) g); paintUnusableMask((Graphics2D) g);
}
} }
if (this.parentPane != null) { if (this.parentPane != null) {
this.parentPane.refreshShowPaneUI(); this.parentPane.refreshShowPaneUI();
} }

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

11
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.BorderFactory;
import javax.swing.JButton; import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JPanel; import javax.swing.JPanel;
import javax.swing.plaf.basic.BasicButtonUI; import javax.swing.plaf.basic.BasicButtonUI;
import java.awt.BorderLayout; import java.awt.BorderLayout;
@ -44,6 +45,7 @@ public class OnlineWidgetTabPane extends JPanel {
private boolean packagePaneCreated = false; private boolean packagePaneCreated = false;
private final List<TabChangeListener> tabChangeListeners; private final List<TabChangeListener> tabChangeListeners;
private OnlineEmbedFilterShowPane embedFilterShowPane; private OnlineEmbedFilterShowPane embedFilterShowPane;
private OnlineWidgetPackagesShowPane widgetPackagesShowPane;
public OnlineWidgetTabPane(OnlineShareWidget[] sharableWidgets, OnlineShareWidget[] sharableWidgetPackage) { public OnlineWidgetTabPane(OnlineShareWidget[] sharableWidgets, OnlineShareWidget[] sharableWidgetPackage) {
tabChangeListeners = new ArrayList<>(); tabChangeListeners = new ArrayList<>();
@ -70,7 +72,8 @@ public class OnlineWidgetTabPane extends JPanel {
ComponentCollector.getInstance().collectCmpPktClick(); ComponentCollector.getInstance().collectCmpPktClick();
//延迟组件包面板的初始化,防止组件面板里组件和缩略图和组件包面板里组件的缩略图一起加载 //延迟组件包面板的初始化,防止组件面板里组件和缩略图和组件包面板里组件的缩略图一起加载
if (!packagePaneCreated) { if (!packagePaneCreated) {
centerPane.add(new OnlineWidgetPackagesShowPane(sharableWidgetPackages), COMPONENT_PACKAGE); widgetPackagesShowPane = new OnlineWidgetPackagesShowPane(sharableWidgetPackages);
centerPane.add(widgetPackagesShowPane, COMPONENT_PACKAGE);
packagePaneCreated = true; packagePaneCreated = true;
} }
cardLayout.show(centerPane, COMPONENT_PACKAGE); cardLayout.show(centerPane, COMPONENT_PACKAGE);
@ -89,6 +92,8 @@ public class OnlineWidgetTabPane extends JPanel {
this.add(centerPane, BorderLayout.CENTER); this.add(centerPane, BorderLayout.CENTER);
} }
private JPanel createMiniShopEntryPane() { private JPanel createMiniShopEntryPane() {
JPanel container = FRGUIPaneFactory.createBorderLayout_S_Pane(); JPanel container = FRGUIPaneFactory.createBorderLayout_S_Pane();
container.setBorder(BorderFactory.createEmptyBorder(10, 0, 0, 0)); container.setBorder(BorderFactory.createEmptyBorder(10, 0, 0, 0));
@ -136,6 +141,10 @@ public class OnlineWidgetTabPane extends JPanel {
if (embedFilterShowPane != null) { if (embedFilterShowPane != null) {
this.embedFilterShowPane.refreshUI(); this.embedFilterShowPane.refreshUI();
} }
if (headGroup.getSelectedIndex() == COMPONENT_PACKAGE_TAB_INDEX && widgetPackagesShowPane != null) {
widgetPackagesShowPane.refreshShowPaneUI();
}
} }

5
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) { if (frame == null) {
frame = createFrame(); frame = createFrame();
} }
if (!frame.isVisible()) {
for (WindowListener listener: windowListeners) {
listener.windowOpened(null);
}
}
frame.setVisible(true); frame.setVisible(true);
} }

73
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 * Created by Starryi on 2021/12/20
*/ */
public class NativeProductBridge { public class NativeProductBridge {
private static final Map<String, ComponentInstallationTask> createdComponentInstallationTasks = new HashMap<>();
private static final Map<String, ComponentsPackageInstallationTask> createdComponentsPackageInstallationTasks = new HashMap<>();
private static final Map<String, TemplateThemeInstallationTask> createdTemplateThemeInstallationTasks = new HashMap<>();
private static final Map<String, ComponentInstallationTask> startedComponentInstallationTasks = new HashMap<>();
private static final Map<String, ComponentsPackageInstallationTask> startedComponentsPackageInstallationTasks = new HashMap<>();
private static final Map<String, TemplateThemeInstallationTask> startedTemplateThemeInstallationTasks = new HashMap<>();
private final Object window; private final Object window;
private static final Map<String, ComponentInstallationTask> executingComponentInstallationTasks = new HashMap<>();
private static final Map<String, ComponentsPackageInstallationTask> executingComponentsPackageInstallationTasks = new HashMap<>();
private static final Map<String, TemplateThemeInstallationTask> executingTemplateThemeInstallationTasks = new HashMap<>();
private final Map<String, Set<Object>> componentDownloadTaskStartListeners = new HashMap<>(); private final Map<String, Set<Object>> componentDownloadTaskStartListeners = new HashMap<>();
private final Map<String, Set<Object>> componentsPackageDownloadTaskStartListeners = new HashMap<>(); private final Map<String, Set<Object>> componentsPackageDownloadTaskStartListeners = new HashMap<>();
@ -115,7 +120,7 @@ public class NativeProductBridge {
boolean isPackage = widget.isWidgetPackage(); boolean isPackage = widget.isWidgetPackage();
Map<String, ? extends NativeTaskBridge> executingDownloadTask = Map<String, ? extends NativeTaskBridge> executingDownloadTask =
isPackage ? executingComponentsPackageInstallationTasks : executingComponentInstallationTasks; isPackage ? startedComponentsPackageInstallationTasks : startedComponentInstallationTasks;
NativeTaskBridge task = executingDownloadTask.get(uuid); NativeTaskBridge task = executingDownloadTask.get(uuid);
if (task != null) { if (task != null) {
task.checkJSEnvChange(this.window); task.checkJSEnvChange(this.window);
@ -131,9 +136,22 @@ public class NativeProductBridge {
OnlineShareWidget widget = OnlineShareWidget.parseFromJSONObject(object); OnlineShareWidget widget = OnlineShareWidget.parseFromJSONObject(object);
int childrenCount = object.optInt("pkgsize", 0); int childrenCount = object.optInt("pkgsize", 0);
if (childrenCount > 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 { } 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 @JsAccessible
@JSBridge @JSBridge
public Object getExecutingThemeDownloadTask(String themePath) { public Object getExecutingThemeDownloadTask(String themePath) {
NativeTaskBridge task = (NativeTaskBridge) executingTemplateThemeInstallationTasks.get(themePath); NativeTaskBridge task = startedTemplateThemeInstallationTasks.get(themePath);
if (task != null) { if (task != null) {
task.checkJSEnvChange(this.window); task.checkJSEnvChange(this.window);
} }
@ -176,7 +194,13 @@ public class NativeProductBridge {
@JsAccessible @JsAccessible
@JSBridge @JSBridge
public Object createTemplateThemeDownloadTask(String themePath) { 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 { public static class ComponentInstallationTask extends NativeTaskBridge {
@ -217,6 +241,9 @@ public class NativeProductBridge {
@JSBridge @JSBridge
@Override @Override
public void execute() { public void execute() {
if (isExecuting) {
return;
}
super.execute(); super.execute();
SwingUtilities.invokeLater(new Runnable() { SwingUtilities.invokeLater(new Runnable() {
@Override @Override
@ -257,7 +284,7 @@ public class NativeProductBridge {
@Override @Override
protected void fireStartEvent(String event) { protected void fireStartEvent(String event) {
executingComponentInstallationTasks.put(widget.getUuid(), this); startedComponentInstallationTasks.put(widget.getUuid(), this);
Set<Object> startListeners = env.componentDownloadTaskStartListeners.get(widget.getUuid()); Set<Object> startListeners = env.componentDownloadTaskStartListeners.get(widget.getUuid());
SafeJSFunctionInvoker.invoke(startListeners, env.window); SafeJSFunctionInvoker.invoke(startListeners, env.window);
super.fireStartEvent(event); super.fireStartEvent(event);
@ -265,13 +292,15 @@ public class NativeProductBridge {
@Override @Override
protected void fireFailureEvent(String event) { protected void fireFailureEvent(String event) {
executingComponentInstallationTasks.remove(widget.getUuid()); startedComponentInstallationTasks.remove(widget.getUuid());
createdComponentInstallationTasks.remove(widget.getUuid());
super.fireFailureEvent(event); super.fireFailureEvent(event);
} }
@Override @Override
protected void fireSuccessEvent(String event) { protected void fireSuccessEvent(String event) {
executingComponentInstallationTasks.remove(widget.getUuid()); startedComponentInstallationTasks.remove(widget.getUuid());
createdComponentInstallationTasks.remove(widget.getUuid());
super.fireSuccessEvent(event); super.fireSuccessEvent(event);
} }
} }
@ -317,6 +346,9 @@ public class NativeProductBridge {
@JSBridge @JSBridge
@Override @Override
public void execute() { public void execute() {
if (isExecuting) {
return;
}
super.execute(); super.execute();
SwingUtilities.invokeLater(new Runnable() { SwingUtilities.invokeLater(new Runnable() {
@Override @Override
@ -373,7 +405,7 @@ public class NativeProductBridge {
@Override @Override
protected void fireStartEvent(String event) { protected void fireStartEvent(String event) {
executingComponentsPackageInstallationTasks.put(widget.getUuid(), this); startedComponentsPackageInstallationTasks.put(widget.getUuid(), this);
super.fireStartEvent(event); super.fireStartEvent(event);
Set<Object> startListeners = env.componentsPackageDownloadTaskStartListeners.get(widget.getUuid()); Set<Object> startListeners = env.componentsPackageDownloadTaskStartListeners.get(widget.getUuid());
@ -382,13 +414,15 @@ public class NativeProductBridge {
@Override @Override
protected void fireFailureEvent(String event) { protected void fireFailureEvent(String event) {
executingComponentsPackageInstallationTasks.remove(widget.getUuid()); startedComponentsPackageInstallationTasks.remove(widget.getUuid());
createdComponentsPackageInstallationTasks.remove(widget.getUuid());
super.fireFailureEvent(event); super.fireFailureEvent(event);
} }
@Override @Override
protected void fireSuccessEvent(String event) { protected void fireSuccessEvent(String event) {
executingComponentsPackageInstallationTasks.remove(widget.getUuid()); startedComponentsPackageInstallationTasks.remove(widget.getUuid());
createdComponentsPackageInstallationTasks.remove(widget.getUuid());
super.fireSuccessEvent(event); super.fireSuccessEvent(event);
} }
} }
@ -426,6 +460,9 @@ public class NativeProductBridge {
@JSBridge @JSBridge
@Override @Override
public void execute() { public void execute() {
if (isExecuting) {
return;
}
super.execute(); super.execute();
SwingUtilities.invokeLater(new Runnable() { SwingUtilities.invokeLater(new Runnable() {
@Override @Override
@ -452,7 +489,7 @@ public class NativeProductBridge {
@Override @Override
protected void fireStartEvent(String event) { protected void fireStartEvent(String event) {
executingTemplateThemeInstallationTasks.put(themePath, this); startedTemplateThemeInstallationTasks.put(themePath, this);
Set<Object> startListeners = env.themeDownloadTaskStartListeners.get(themePath); Set<Object> startListeners = env.themeDownloadTaskStartListeners.get(themePath);
SafeJSFunctionInvoker.invoke(startListeners, env.window); SafeJSFunctionInvoker.invoke(startListeners, env.window);
super.fireStartEvent(event); super.fireStartEvent(event);
@ -460,13 +497,15 @@ public class NativeProductBridge {
@Override @Override
protected void fireFailureEvent(String event) { protected void fireFailureEvent(String event) {
executingTemplateThemeInstallationTasks.remove(themePath); startedTemplateThemeInstallationTasks.remove(themePath);
createdTemplateThemeInstallationTasks.remove(themePath);
super.fireFailureEvent(event); super.fireFailureEvent(event);
} }
@Override @Override
protected void fireSuccessEvent(String event) { protected void fireSuccessEvent(String event) {
executingTemplateThemeInstallationTasks.remove(themePath); startedTemplateThemeInstallationTasks.remove(themePath);
createdTemplateThemeInstallationTasks.remove(themePath);
super.fireSuccessEvent(event); super.fireSuccessEvent(event);
} }
} }

6
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; private Object window;
protected final Set<Object> statusCbs = new HashSet<>(); protected final Set<Object> statusCbs = new HashSet<>();
protected boolean isExecuting = false;
public NativeTaskBridge(Object window) { public NativeTaskBridge(Object window) {
this.window = window; this.window = window;
@ -49,6 +50,9 @@ public class NativeTaskBridge implements MiniShopNativeTask {
@JsAccessible @JsAccessible
@Override @Override
public void execute() { public void execute() {
if (!isExecuting) {
isExecuting = true;
}
} }
@JSBridge @JSBridge
@ -68,10 +72,12 @@ public class NativeTaskBridge implements MiniShopNativeTask {
SafeJSFunctionInvoker.invoke(statusCbs, window, "PROGRESS", event); SafeJSFunctionInvoker.invoke(statusCbs, window, "PROGRESS", event);
} }
protected void fireSuccessEvent(String event) { protected void fireSuccessEvent(String event) {
isExecuting = false;
MiniShopNativeTaskManager.getInstance().removeCompletedTask(this); MiniShopNativeTaskManager.getInstance().removeCompletedTask(this);
SafeJSFunctionInvoker.invoke(statusCbs, window, "SUCCESS", event); SafeJSFunctionInvoker.invoke(statusCbs, window, "SUCCESS", event);
} }
protected void fireFailureEvent(String event) { protected void fireFailureEvent(String event) {
isExecuting = false;
MiniShopNativeTaskManager.getInstance().removeCompletedTask(this); MiniShopNativeTaskManager.getInstance().removeCompletedTask(this);
SafeJSFunctionInvoker.invoke(statusCbs, window, "FAILURE", event); SafeJSFunctionInvoker.invoke(statusCbs, window, "FAILURE", event);
} }

15
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 JPanel detailPane;
private String currentPackageId; private String currentPackageId;
private OnlineWidgetSelectPane onlineWidgetSelectPane; private OnlineWidgetSelectPane onlineWidgetSelectPane;
private OnlineDownloadPackagePane onlineDownloadPackagePane;
private UILabel downloadLabel; private UILabel downloadLabel;
private final Map<String, OnlineWidgetSelectPane> cachePanelMap = new HashMap<>(); private final Map<String, OnlineWidgetSelectPane> cachePanelMap = new HashMap<>();
@ -109,15 +110,15 @@ public class OnlineWidgetPackagesShowPane extends AbstractOnlineWidgetShowPane {
private void downLoadPackage() { private void downLoadPackage() {
downloadLabel.setVisible(false); downloadLabel.setVisible(false);
detailPane.removeAll(); detailPane.removeAll();
OnlineDownloadPackagePane widgetSelectPane = new OnlineDownloadPackagePane(this, onlineWidgetSelectPane.getSharableWidgetProviders(), 50); onlineDownloadPackagePane = new OnlineDownloadPackagePane(this, onlineWidgetSelectPane.getSharableWidgetProviders(), 50);
detailPane.add(widgetSelectPane, BorderLayout.CENTER); detailPane.add(onlineDownloadPackagePane, BorderLayout.CENTER);
cardLayout.show(centerPane, WIDGET_DETAIL); cardLayout.show(centerPane, WIDGET_DETAIL);
cachePanelMap.put(currentPackageId, widgetSelectPane); cachePanelMap.put(currentPackageId, onlineDownloadPackagePane);
for (OnlineShareWidget onlineShareWidget : getSharableWidgetProviders()) { for (OnlineShareWidget onlineShareWidget : getSharableWidgetProviders()) {
if (StringUtils.equals(onlineShareWidget.getId(), currentPackageId)) { if (StringUtils.equals(onlineShareWidget.getId(), currentPackageId)) {
widgetSelectPane.downloadWidget(onlineShareWidget); onlineDownloadPackagePane.downloadWidget(onlineShareWidget);
break; break;
} }
} }
@ -193,4 +194,10 @@ public class OnlineWidgetPackagesShowPane extends AbstractOnlineWidgetShowPane {
protected FilterPane createFilterPane() { protected FilterPane createFilterPane() {
return FilterPane.createOnlinePackageFilterPane(); return FilterPane.createOnlinePackageFilterPane();
} }
public void refreshShowPaneUI() {
if (onlineDownloadPackagePane != null && onlineDownloadPackagePane.isShowing()) {
onlineDownloadPackagePane.refreshShowPaneUI();
}
}
} }

Loading…
Cancel
Save