diff --git a/designer-base/src/main/java/com/fr/design/EnvChangeEntrance.java b/designer-base/src/main/java/com/fr/design/EnvChangeEntrance.java
index e2a08bbbc3..33be0b7fc4 100644
--- a/designer-base/src/main/java/com/fr/design/EnvChangeEntrance.java
+++ b/designer-base/src/main/java/com/fr/design/EnvChangeEntrance.java
@@ -2,8 +2,6 @@ package com.fr.design;
import com.fr.common.report.ReportState;
import com.fr.design.backup.EnvBackupHelper;
-import com.fr.design.mainframe.manager.clip.TemplateTreeClipboard;
-import com.fr.design.plugin.remind.PluginErrorDesignReminder;
import com.fr.design.data.DesignTableDataManager;
import com.fr.design.dialog.BasicDialog;
import com.fr.design.dialog.DialogActionAdapter;
@@ -52,7 +50,6 @@ import com.fr.workspace.engine.base.FineObjectPool;
import com.fr.workspace.engine.channel.http.FunctionalHttpRequest;
import com.fr.workspace.engine.exception.WorkspaceConnectionException;
import com.fr.workspace.engine.rpc.WorkspaceProxyPool;
-import static javax.swing.JOptionPane.QUESTION_MESSAGE;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
@@ -68,9 +65,10 @@ import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Optional;
-import java.util.Properties;
import java.util.Set;
+import static javax.swing.JOptionPane.QUESTION_MESSAGE;
+
public class EnvChangeEntrance {
private static final String BRANCH_TAG = "#";
private static final String BRANCH_BEGIN = "-";
@@ -158,11 +156,11 @@ public class EnvChangeEntrance {
}
/**
- * 由云端运维,触发切换埋点
- * 内部空实现
- * 见 实现
+ * 异步提交埋点
+ *
*/
private void triggerSwitchMetric() {
+ EnvSwitcherSubmitTask.asyncSubmit();
}
/**
diff --git a/designer-base/src/main/java/com/fr/design/EnvSwitcherSubmitTask.java b/designer-base/src/main/java/com/fr/design/EnvSwitcherSubmitTask.java
new file mode 100644
index 0000000000..33edfc66cb
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/EnvSwitcherSubmitTask.java
@@ -0,0 +1,214 @@
+package com.fr.design;
+
+import com.fr.concurrent.FineExecutors;
+import com.fr.concurrent.NamedThreadFactory;
+import com.fr.design.mainframe.SiteCenterToken;
+import com.fr.design.metric.AbstractDesignerMetric;
+import com.fr.general.CloudCenter;
+import com.fr.general.http.HttpToolbox;
+import com.fr.json.JSONArray;
+import com.fr.json.JSONObject;
+import com.fr.log.FineLoggerFactory;
+import com.fr.stable.StringUtils;
+import com.fr.workspace.Workspace;
+import com.fr.workspace.WorkspaceSwitchProcess;
+import com.fr.workspace.WorkspaceSwitchStatics;
+import com.fr.workspace.switcher.WorkspaceSwitchHistory;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.TreeSet;
+import java.util.concurrent.ExecutorService;
+
+/**
+ * 设计器环境切换埋点提交
+ *
+ * @author Bruce.Deng
+ * @since 11.0
+ * Created on 2024/9/5
+ */
+public class EnvSwitcherSubmitTask extends AbstractDesignerMetric {
+
+ private static final String TAG_MODULE = "module";
+ private static final String TAG_SELF_USED = "selfUsed";
+ private static final String TAG_SUB = "sub";
+ private static final String WORK_DIRECTORY_TYPE_BEFORE_SWITCHING = "workDirectoryTypeBeforeSwitching";
+ private static final String WORK_DIRECTORY_TYPE_AFTER_SWITCHING = "workDirectoryTypeAfterSwitching";
+ private static final String SWITCH_COMPLETED = "switchCompleted";
+ private static final String EXCHANGE_TIME = "exchangeTime";
+ private static final String START_SLOW_MODULE_NAME = "startSlowModuleName";
+ private static final String STOP_SLOW_MODULE_NAME = "stopSlowModuleName";
+ private static final int MIN_LIMIT = 100;
+ private static final String SWITCH_TABLE_SUFFIX = "record_of_fbp_remoteSwitch/single";
+ private final ExecutorService service;
+
+ private EnvSwitcherSubmitTask() {
+ service = FineExecutors.newSingleThreadExecutor(new NamedThreadFactory("DesignEnvSwitchMetricSubmit"));
+ }
+
+ /**
+ * 异步提交环境切换的埋点
+ */
+ public static void asyncSubmit() {
+ new EnvSwitcherSubmitTask().run();
+ }
+
+ /**
+ * 执行任务
+ */
+ private void run() {
+
+ WorkspaceSwitchHistory.consume(workspaceSwitchProcesses -> {
+ Iterator workspaceSwitchProcessIterator = workspaceSwitchProcesses.descendingIterator();
+ while (workspaceSwitchProcessIterator.hasNext()) {
+ WorkspaceSwitchProcess next = workspaceSwitchProcessIterator.next();
+ // 过滤掉 source 为空的启动过程
+ if (next != null && next.getSource() != null) {
+ submitProcess(next);
+ }
+ // 提交之后要移除掉
+ workspaceSwitchProcessIterator.remove();
+ }
+ });
+ }
+
+ private void submitProcess(WorkspaceSwitchProcess process) {
+ service.submit(new Runnable() {
+ @Override
+ public void run() {
+ collectAndSubmit(process);
+ }
+ });
+ }
+
+ private void collectAndSubmit(WorkspaceSwitchProcess process) {
+ Map para = new HashMap<>();
+ para.put("token", SiteCenterToken.generateToken());
+ para.put("content", collect(process));
+ try {
+ HttpToolbox.post(getUrl(), para);
+ FineLoggerFactory.getLogger().debug("[EnvSwitcher] submit env switcher metric to cloud.");
+ } catch (Throwable t) {
+ FineLoggerFactory.getLogger().debug(t,"[EnvSwitcher] failed to submit env switcher metric to cloud.");
+ }
+ }
+
+ private JSONObject collect(WorkspaceSwitchProcess process) {
+ JSONObject info = new JSONObject();
+ addDefaultMetric(info);
+ addMeta(info, process);
+ addStatics(info, process.getStatics());
+ return info;
+ }
+
+ private static void addMeta(JSONObject info, WorkspaceSwitchProcess process) {
+ Workspace source = process.getSource();
+ info.put(WORK_DIRECTORY_TYPE_BEFORE_SWITCHING, workspaceType(source));
+ Workspace target = process.getTarget();
+ info.put(WORK_DIRECTORY_TYPE_AFTER_SWITCHING, workspaceType(target));
+ info.put(SWITCH_COMPLETED, switchCompleted(process));
+ }
+
+ @NotNull
+ private static String switchCompleted(WorkspaceSwitchProcess process) {
+
+ return process.isSwitchSuccess() ? "yes" : "no";
+ }
+
+ @NotNull
+ private static String workspaceType(Workspace workspace) {
+
+ return workspace.isLocal() ? "local" : "remote";
+ }
+
+ private void addStatics(JSONObject info, WorkspaceSwitchStatics statics) {
+ info.put(EXCHANGE_TIME, statics.getElapsed());
+ JSONObject startSlowModuleName = convert2CloudModel(statics.getStartModuleUsed());
+ info.put(START_SLOW_MODULE_NAME, startSlowModuleName);
+ JSONObject stopSlowModuleName = convert2CloudModel(statics.getStopModuleUsed());
+ info.put(STOP_SLOW_MODULE_NAME, stopSlowModuleName);
+ }
+
+ /* convert */
+
+ @NotNull
+ private JSONObject convert2CloudModel(JSONObject moduleUsedJO) {
+
+ TreeSet entries = convert2SortSet(moduleUsedJO);
+ return convert2JO(entries);
+ }
+
+ @NotNull
+ private static JSONObject convert2JO(TreeSet startEntries) {
+
+ JSONObject moduleNames = new JSONObject();
+ startEntries.stream()
+ .filter((e) -> e.getSelfUsed() > MIN_LIMIT)
+ .forEach((e) -> moduleNames.put(e.getModuleName(), e.getSelfUsed()));
+ return moduleNames;
+ }
+
+ @NotNull
+ private TreeSet convert2SortSet(JSONObject moduleUsedJO) {
+
+ TreeSet entries = new TreeSet<>(Comparator.comparingInt(Entry::getSelfUsed));
+ sortBySelfUsed(moduleUsedJO, entries);
+ return entries;
+ }
+
+ /**
+ * 循环处理 JSON, 并降序排序
+ *
+ * @param moduleUsed 模块用时 {@link com.fr.module.engine.FineModule}
+ * @param entries 降序排序的树集合
+ */
+ private void sortBySelfUsed(JSONObject moduleUsed, TreeSet entries) {
+
+ if (moduleUsed == null || moduleUsed.isEmpty()) {
+ return;
+ }
+
+ String moduleName = moduleUsed.optString(TAG_MODULE);
+ int selfUsed = moduleUsed.optInt(TAG_SELF_USED);
+ entries.add(new Entry(moduleName, selfUsed));
+
+ JSONArray subModules = moduleUsed.optJSONArray(TAG_SUB);
+ if (subModules != null) {
+ int length = subModules.length();
+ for (int i = 0; i < length; i++) {
+ JSONObject subModuleUsed = subModules.optJSONObject(i);
+ sortBySelfUsed(subModuleUsed, entries);
+ }
+ }
+ }
+
+ private String getUrl() {
+ String monitorEntry = CloudCenter.getInstance().acquireUrlByKind("cloud.monitor.api.entrypoint");
+ String url = (StringUtils.isNotEmpty(monitorEntry) ? monitorEntry : DEFAULT_MONITOR_URL)
+ + SWITCH_TABLE_SUFFIX;
+ return url;
+ }
+
+ private static class Entry {
+
+ private final String moduleName;
+
+ private final Integer selfUsed;
+
+ public Entry(String moduleName, Integer selfUsed) {
+ this.moduleName = moduleName;
+ this.selfUsed = selfUsed;
+ }
+
+ public String getModuleName() {
+ return moduleName;
+ }
+
+ public Integer getSelfUsed() {
+ return selfUsed;
+ }
+ }
+}
diff --git a/designer-base/src/main/java/com/fr/design/constants/UIConstants.java b/designer-base/src/main/java/com/fr/design/constants/UIConstants.java
index 792ab91365..b47b8d94f9 100644
--- a/designer-base/src/main/java/com/fr/design/constants/UIConstants.java
+++ b/designer-base/src/main/java/com/fr/design/constants/UIConstants.java
@@ -4,7 +4,6 @@
package com.fr.design.constants;
import com.fine.theme.icon.LazyIcon;
-import com.fr.base.svg.IconUtils;
import com.fr.base.svg.SVGLoader;
import com.fr.general.IOUtils;
import com.fr.stable.Constants;
@@ -27,7 +26,6 @@ import java.awt.image.BufferedImage;
*/
public interface UIConstants {
- public static final Icon CPT_ICON = IOUtils.readIcon("/com/fr/base/images/oem/cpt.png");
public static final Icon BLACK_ICON = IOUtils.readIcon("/com/fr/base/images/cell/blank.gif");
public static final String EMPTY_ICON = StringUtils.EMPTY;
@@ -153,67 +151,17 @@ public interface UIConstants {
public static final Color CHECK_BOX_TIP_FONT_COLOR = new Color(51, 51, 52, (int)Math.round(0.5 * 255));
public static final BufferedImage DRAG_BAR = IOUtils.readImage("com/fr/design/images/control/bar.png");
- public static final BufferedImage DRAG_BAR_LIGHT = IOUtils.readImage("com/fr/design/images/control/bar-light.png");
public static final Image ARROW_NORTH = SVGLoader.load("/com/fr/design/standard/arrowlinear/up_arrow.svg");
public static final Image ARROW_SOUTH = SVGLoader.load("/com/fr/design/standard/arrowlinear/down_arrow.svg");
public static final Image ARROW_EAST = SVGLoader.load("/com/fr/design/standard/arrowlinear/east_arrow.svg");
public static final Image ARROW_WEST = SVGLoader.load("/com/fr/design/standard/arrowlinear/west_arrow.svg");
-
- public static final BufferedImage DRAG_BAR_RIGHT = IOUtils.readImage("com/fr/design/images/control/barm.png");
- public static final BufferedImage DRAG_BAR_LEFT = IOUtils.readImage("com/fr/design/images/control/barl.png");
- public static final Image DRAG_UP_NORMAL = SVGLoader.load("/com/fr/design/standard/triangle.arrow/up_normal.svg");
- public static final Image DRAG_UP_PRESS = SVGLoader.load("/com/fr/design/standard/triangle.arrow/up_hover.svg");
- public static final Image DRAG_DOWN_NORMAL = SVGLoader.load("/com/fr/design/standard/triangle.arrow/down_normal.svg");
- public static final Image DRAG_DOWN_PRESS = SVGLoader.load("/com/fr/design/standard/triangle.arrow/down_hover.svg");
- public static final Image DRAG_RIGHT_NORMAL = SVGLoader.load("/com/fr/design/standard/drag/right_normal.svg");
- public static final Image DRAG_RIGHT_PRESS = SVGLoader.load("/com/fr/design/standard/drag/right_pressed.svg");
- public static final Image DRAG_LEFT_NORMAL = SVGLoader.load("/com/fr/design/standard/drag/left_normal.svg");
- public static final Image DRAG_LEFT_PRESS = SVGLoader.load("/com/fr/design/standard/drag/left_pressed.svg");
public static final BufferedImage DRAG_DOT = IOUtils.readImage("com/fr/design/images/control/dot.png");
- public static final Image DRAG_LINE = SVGLoader.load("/com/fr/design/standard/dot_line_normal.svg");
- public static final BufferedImage ACCESSIBLE_EDITOR_DOT = IOUtils.readImage("com/fr/design/images/control/dot.png");
- public static final BufferedImage DRAG_DOT_VERTICAL = IOUtils.readImage("com/fr/design/images/control/dotv.png");
- public static final Image POP_BUTTON_DOWN = SVGLoader.load("/com/fr/design/standard/poparrow/pop_down_arrow.svg");
- public static final Image POP_BUTTON_UP = SVGLoader.load("/com/fr/design/standard/poparrow/pop_up_arrow.svg");
- public static final BufferedImage DRAG_DOWN_SELECTED_SMALL = IOUtils.readImage("com/fr/design/images/buttonicon/downSelected.png");
- public static final BufferedImage DRAG_LEFT_NORMAL_SMALL = IOUtils.readImage("com/fr/design/images/buttonicon/leftNormal.png");
public static final BufferedImage WATERMARK_BACKGROUND = IOUtils.readImage("/com/fr/design/images/dialog/watermark/" + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_WaterMark_Background_Icon_File_Name"));
public static final int MODEL_NORMAL = 0;
public static final int MODEL_PRESS = 1;
- public static final Icon ARROW_DOWN_ICON = IconUtils.readIcon("/com/fr/design/standard/arrowlinear/down_arrow.svg");
- public static final Icon ARROW_UP_ICON = IOUtils.readIcon("com/fr/design/images/buttonicon/arrowup.png");
- public static final Icon YES_ICON = IOUtils.readIcon("com/fr/design/images/buttonicon/yes.png");
- public static final Icon CHOOSEN_ICON = IOUtils.readIcon("com/fr/design/images/buttonicon/select_item.png");
- public static final Icon PRE_WIDGET_ICON = IOUtils.readIcon("com/fr/design/images/buttonicon/prewidget.png");
- public static final Icon PRE_WIDGET_NORMAL_ICON = IconUtils.readIcon("com/fr/design/images/buttonicon/prewidget");
- public static final Icon EDIT_NORMAL_ICON = IconUtils.readIcon("/com/fr/design/standard/uimode/edit");
- public static final Icon EDIT_PRESSED_ICON = IconUtils.readIcon("/com/fr/design/standard/uimode/edit_pressed.svg");
- public static final Icon HIDE_NORMAL_ICON = IconUtils.readIcon("/com/fr/design/standard/uimode/hide");
- public static final Icon HIDE_PRESSED_ICON = IconUtils.readIcon("/com/fr/design/standard/uimode/hide_pressed.svg");
- public static final Icon VIEW_NORMAL_ICON = IconUtils.readIcon("/com/fr/design/standard/uimode/view");
- //public static final Icon VIEW_PRESSED_ICON = IconUtils.readIcon("/com/fr/design/standard/uimode/view");
-
- public static final Icon RUN_BIG_ICON = IconUtils.readIcon("/com/fr/design/standard/preview/run24.svg");
- public static final Icon RUN_SMALL_ICON = IconUtils.readIcon("/com/fr/design/standard/preview/runs.svg");
- public static final Icon PAGE_BIG_ICON = IconUtils.readIcon("/com/fr/design/standard/preview/pageb24.svg");
- public static final Icon WRITE_BIG_ICON = IconUtils.readIcon("/com/fr/design/standard/preview/writeb24.svg");
- public static final Icon ANA_BIG_ICON = IconUtils.readIcon("/com/fr/design/standard/preview/anab24.svg");
- public static final Icon PAGE_SMALL_ICON = IconUtils.readIcon("/com/fr/design/standard/preview/pages.svg");
- public static final Icon WRITE_SMALL_ICON = IconUtils.readIcon("/com/fr/design/standard/preview/writes.svg");
- public static final Icon ANA_SMALL_ICON = IconUtils.readIcon("/com/fr/design/standard/preview/anas.svg");
-
- public static final Icon REFRESH_ICON = IOUtils.readIcon("com/fr/design/images/buttonicon/refresh.png");
- public static final Icon FONT_ICON = IOUtils.readIcon("/com/fr/design/images/gui/color/foreground.png");
- public static final Icon AUTO_FONT_ICON = IOUtils.readIcon("/com/fr/design/images/gui/color/autoForeground.png");
- public static final Icon HISTORY_ICON = IOUtils.readIcon("com/fr/design/images/buttonicon/history.png");
- public static final Icon DELETE_ICON = IOUtils.readIcon("com/fr/design/images/m_file/close.png");
- public static final Icon EDIT_ICON = IOUtils.readIcon("com/fr/design/images/m_file/edit.png");
- public static final Icon SEARCH_ICON = IOUtils.readIcon("/com/fr/design/images/data/search.png");
- public static final Icon BLACK_SEARCH_ICON = IOUtils.readIcon("/com/fr/design/images/data/black_search.png");
- public static final Icon CLEAR_ICON = IOUtils.readIcon("/com/fr/design/images/data/source/delete.png");
- public static final Icon LIST_EDIT_ICON = IOUtils.readIcon("/com/fr/design/images/control/edit.png");
- public static final Icon LIST_EDIT_WHITE_ICON = IOUtils.readIcon("/com/fr/design/images/control/edit_white.png");
+ public static final Icon ARROW_DOWN_ICON = new LazyIcon("down_arrow");
+ public static final Icon ARROW_UP_ICON = new LazyIcon("up_arrow");
public static final Color PRESSED_DARK_GRAY = new Color(127, 127, 127);
public static final Color GRDIENT_DARK_GRAY = new Color(45, 45, 45);
public static final Color BARNOMAL = new Color(232, 232, 233);
@@ -222,7 +170,6 @@ public interface UIConstants {
public static final int BUTTON_GROUP_ARC = 0;
public static final int LARGEARC = 6;
public static final Stroke BS = new BasicStroke(1f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND, 2f, new float[]{3, 1}, 0);
- public static final Icon PREVIEW_DOWN = IconUtils.readIcon("/com/fr/design/standard/preview_down_icon");
public static final int CLOSE_AUTHORITY_HEIGHT_AND_WIDTH = 24;
public static final Icon CLOSE_OF_AUTHORITY = new LazyIcon("platform_close", CLOSE_AUTHORITY_HEIGHT_AND_WIDTH).disabled();
public static final Icon CLOSE_OVER_AUTHORITY = new LazyIcon("platform_close", CLOSE_AUTHORITY_HEIGHT_AND_WIDTH);
diff --git a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIPreviewButton.java b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIPreviewButton.java
index 50bbc1440d..2438e4a3fb 100644
--- a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIPreviewButton.java
+++ b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIPreviewButton.java
@@ -1 +1 @@
-package com.fr.design.gui.ibutton;
import com.fr.design.constants.UIConstants;
import com.fr.stable.Constants;
import com.fr.design.utils.gui.GUICoreUtils;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
/**
* Author : daisy
* Date: 13-8-1
* Time: 下午3:41
*/
public class UIPreviewButton extends JPanel {
private static final int START_X = -7;
protected UIButton upButton;
protected UIButton downButton;
protected void upButtonClickEvent() {
// do nothing
}
protected void downButtonClickEvent() {
// do nothing
}
public UIPreviewButton() {
this(new UIButton(), new UIButton());
}
public UIPreviewButton(UIButton up, UIButton down) {
upButton = up;
downButton = down;
upButton.setRoundBorder(true, Constants.CENTER);
downButton.setRoundBorder(true, Constants.CENTER);
upButton.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
downButton.getModel().setPressed(true);
downButton.getModel().setSelected(true);
downButton.repaint();
}
@Override
public void mouseReleased(MouseEvent e) {
downButton.getModel().setPressed(false);
downButton.getModel().setSelected(false);
downButton.repaint();
}
@Override
public void mouseClicked(MouseEvent e) {
upButtonClickEvent();
}
});
downButton.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
upButton.getModel().setPressed(true);
upButton.getModel().setSelected(true);
upButton.repaint();
}
@Override
public void mouseReleased(MouseEvent e) {
upButton.getModel().setPressed(false);
upButton.getModel().setSelected(false);
upButton.repaint();
}
@Override
public void mouseClicked(MouseEvent e) {
downButtonClickEvent();
}
});
this.setLayout(new FlowLayout(FlowLayout.CENTER,5,0));
this.add(upButton);
this.add(downButton);
}
public UIPreviewButton(Icon left, Icon right) {
this();
upButton.setIcon(left);
downButton.setIcon(right);
}
public UIButton getUpButton() {
return upButton;
}
public void setExtraPainted(boolean isExtraPainted) {
if (!isExtraPainted) {
upButton.setBackground(null);
downButton.setBackground(null);
upButton.setOpaque(false);
downButton.setOpaque(false);
}
}
public UIButton getDownButton() {
return downButton;
}
public void set4Toolbar() {
upButton.setNormalPainted(false);
downButton.setNormalPainted(false);
upButton.setBorderPaintedOnlyWhenPressed(true);
downButton.setBorderPaintedOnlyWhenPressed(true);
}
protected void showPopWindow(JPopupMenu menu) {
GUICoreUtils.showPopupMenu(menu, this, START_X, getY() + getHeight() - 3);
}
public static void main(String... args) {
JFrame jf = new JFrame("test");
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel content = (JPanel) jf.getContentPane();
content.setLayout(null);
UIPreviewButton bb = new UIPreviewButton(UIConstants.PAGE_BIG_ICON, UIConstants.PREVIEW_DOWN);
bb.setBounds(20, 20, bb.getPreferredSize().width, bb.getPreferredSize().height);
content.add(bb);
GUICoreUtils.centerWindow(jf);
jf.setSize(100, 100);
jf.setVisible(true);
}
}
\ No newline at end of file
+package com.fr.design.gui.ibutton;
import com.fr.design.constants.UIConstants;
import com.fr.stable.Constants;
import com.fr.design.utils.gui.GUICoreUtils;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
/**
* Author : daisy
* Date: 13-8-1
* Time: 下午3:41
*/
public class UIPreviewButton extends JPanel {
private static final int START_X = -7;
protected UIButton upButton;
protected UIButton downButton;
protected void upButtonClickEvent() {
// do nothing
}
protected void downButtonClickEvent() {
// do nothing
}
public UIPreviewButton() {
this(new UIButton(), new UIButton());
}
public UIPreviewButton(UIButton up, UIButton down) {
upButton = up;
downButton = down;
upButton.setRoundBorder(true, Constants.CENTER);
downButton.setRoundBorder(true, Constants.CENTER);
upButton.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
downButton.getModel().setPressed(true);
downButton.getModel().setSelected(true);
downButton.repaint();
}
@Override
public void mouseReleased(MouseEvent e) {
downButton.getModel().setPressed(false);
downButton.getModel().setSelected(false);
downButton.repaint();
}
@Override
public void mouseClicked(MouseEvent e) {
upButtonClickEvent();
}
});
downButton.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
upButton.getModel().setPressed(true);
upButton.getModel().setSelected(true);
upButton.repaint();
}
@Override
public void mouseReleased(MouseEvent e) {
upButton.getModel().setPressed(false);
upButton.getModel().setSelected(false);
upButton.repaint();
}
@Override
public void mouseClicked(MouseEvent e) {
downButtonClickEvent();
}
});
this.setLayout(new FlowLayout(FlowLayout.CENTER,5,0));
this.add(upButton);
this.add(downButton);
}
public UIPreviewButton(Icon left, Icon right) {
this();
upButton.setIcon(left);
downButton.setIcon(right);
}
public UIButton getUpButton() {
return upButton;
}
public void setExtraPainted(boolean isExtraPainted) {
if (!isExtraPainted) {
upButton.setBackground(null);
downButton.setBackground(null);
upButton.setOpaque(false);
downButton.setOpaque(false);
}
}
public UIButton getDownButton() {
return downButton;
}
public void set4Toolbar() {
upButton.setNormalPainted(false);
downButton.setNormalPainted(false);
upButton.setBorderPaintedOnlyWhenPressed(true);
downButton.setBorderPaintedOnlyWhenPressed(true);
}
protected void showPopWindow(JPopupMenu menu) {
GUICoreUtils.showPopupMenu(menu, this, START_X, getY() + getHeight() - 3);
}
}
\ No newline at end of file
diff --git a/designer-base/src/main/java/com/fr/design/gui/icontainer/UIEastResizableContainer.java b/designer-base/src/main/java/com/fr/design/gui/icontainer/UIEastResizableContainer.java
index b3d6e054d5..00c708baec 100644
--- a/designer-base/src/main/java/com/fr/design/gui/icontainer/UIEastResizableContainer.java
+++ b/designer-base/src/main/java/com/fr/design/gui/icontainer/UIEastResizableContainer.java
@@ -54,6 +54,7 @@ public class UIEastResizableContainer extends JPanel {
private static final int DRAG_GAP_SIZE = 10;
private Point dragPoint;
+ private boolean dragging;
public UIEastResizableContainer() {
this(new JPanel(), new JPanel());
@@ -71,12 +72,20 @@ public class UIEastResizableContainer extends JPanel {
public void mousePressed(MouseEvent e) {
if (isEnableDrag(e)) {
dragPoint = e.getPoint();
+ dragging = true;
}
}
@Override
public void mouseDragged(MouseEvent e) {
- resizePanel(e);
+ if (dragging) {
+ resizePanel(e);
+ }
+ }
+
+ @Override
+ public void mouseReleased(MouseEvent e) {
+ dragging = false;
}
};
diff --git a/designer-base/src/main/java/com/fr/design/gui/imenu/UICheckBoxMenuItem.java b/designer-base/src/main/java/com/fr/design/gui/imenu/UICheckBoxMenuItem.java
index fba8bfd7f4..376338358d 100644
--- a/designer-base/src/main/java/com/fr/design/gui/imenu/UICheckBoxMenuItem.java
+++ b/designer-base/src/main/java/com/fr/design/gui/imenu/UICheckBoxMenuItem.java
@@ -1,5 +1,6 @@
package com.fr.design.gui.imenu;
+import com.fine.theme.icon.LazyIcon;
import com.fr.design.constants.UIConstants;
public class UICheckBoxMenuItem extends UIMenuItem {
@@ -19,7 +20,7 @@ public class UICheckBoxMenuItem extends UIMenuItem {
public void setSelected(boolean b) {
super.setSelected(b);
if (this.isSelected()) {
- setIcon(UIConstants.CHOOSEN_ICON);
+ setIcon(new LazyIcon("checkbox_checked"));
} else {
setIcon(UIConstants.BLACK_ICON);
}
diff --git a/designer-base/src/main/java/com/fr/design/gui/itextfield/UISearchTextField.java b/designer-base/src/main/java/com/fr/design/gui/itextfield/UISearchTextField.java
index b3cc839a34..9ffeebd10e 100644
--- a/designer-base/src/main/java/com/fr/design/gui/itextfield/UISearchTextField.java
+++ b/designer-base/src/main/java/com/fr/design/gui/itextfield/UISearchTextField.java
@@ -1,6 +1,7 @@
package com.fr.design.gui.itextfield;
+import com.fine.theme.icon.LazyIcon;
import com.fr.design.constants.UIConstants;
import com.fr.design.gui.ilable.UILabel;
@@ -25,8 +26,8 @@ import java.awt.geom.RoundRectangle2D;
*/
public class UISearchTextField extends UITextField {
- private UILabel iconLabel = new UILabel(UIConstants.BLACK_SEARCH_ICON);
- private UILabel clearLabel = new UILabel(UIConstants.CLEAR_ICON);
+ private UILabel iconLabel = new UILabel(new LazyIcon("search"));
+ private UILabel clearLabel = new UILabel(new LazyIcon("clear"));
private UILabel infoLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Search"));
private Dimension iconSize;
private Dimension infoSize;
@@ -268,29 +269,4 @@ public class UISearchTextField extends UITextField {
this.showClearIcon = showClearIcon;
this.repaint();
}
-
- public static void main(String[] args) {
- JPanel p = new JPanel(new FlowLayout(FlowLayout.LEFT));
- UISearchTextField comp = new UISearchTextField(20);
- p.add(comp);
- comp = new UISearchTextField(20);
- comp.setShowClearIcon(false);
- p.add(comp);
- comp = new UISearchTextField(20);
- comp.setIconPosition(SwingConstants.RIGHT);
- p.add(comp);
- comp = new UISearchTextField(20);
- comp.setShowClearIcon(false);
- comp.setIconPosition(SwingConstants.RIGHT);
- p.add(comp);
- p.add(new JTextField(20));
- JFrame frame = new JFrame();
- frame.setTitle("UITextField");
- frame.setContentPane(p);
- frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
- frame.setSize(300, 200);
- frame.setLocationRelativeTo(null);
- frame.setVisible(true);
- }
-
}
\ No newline at end of file
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/RecyclePane.java b/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/RecyclePane.java
index 20d7843034..aca6ad2409 100644
--- a/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/RecyclePane.java
+++ b/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/RecyclePane.java
@@ -2,9 +2,9 @@ package com.fr.design.mainframe.vcs.ui;
import com.fine.theme.icon.LazyIcon;
import com.fine.theme.light.ui.FineRoundBorder;
+import com.fine.theme.utils.FineUIScale;
import com.formdev.flatlaf.ui.FlatUIUtils;
import com.formdev.flatlaf.util.ScaledEmptyBorder;
-import com.fr.base.svg.IconUtils;
import com.fr.design.dialog.BasicDialog;
import com.fr.design.dialog.FineJOptionPane;
import com.fr.design.gui.ilable.UILabel;
@@ -121,11 +121,11 @@ public class RecyclePane extends AbstractSupportSelectTablePane
if (isNeedSearch()) {
searchTextField = new UITextField();
searchTextField.setPlaceholder(Toolkit.i18nText("Fine-Design_Vcs_Start_Search"));
- searchTextField.setColumns(COLUMNS_COUNT);
+ searchTextField.setPreferredSize(new Dimension(FineUIScale.scale(150), super.getPreferredSize().height));
UILabel searchLabel = new UILabel(ICON_SEARCH);
searchLabel.setBorder(new ScaledEmptyBorder(0, 4, 0, 4));
searchTextField.setBorder(null);
- leftPane = row(cell(searchLabel), cell(searchTextField).weight(1)).with(it -> {
+ leftPane = row(cell(searchLabel), cell(searchTextField)).with(it -> {
it.setBorder(new FineRoundBorder());
it.setOpaque(true);
it.setBackground(FlatUIUtils.getUIColor("background.normal", Color.WHITE));
diff --git a/designer-base/src/main/java/com/fr/design/metric/AbstractDesignerMetric.java b/designer-base/src/main/java/com/fr/design/metric/AbstractDesignerMetric.java
new file mode 100644
index 0000000000..97c9cfac48
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/metric/AbstractDesignerMetric.java
@@ -0,0 +1,39 @@
+package com.fr.design.metric;
+
+import com.fanruan.carina.Carina;
+import com.fanruan.config.bbs.FineBBSConfigProvider;
+import com.fr.config.MarketConfig;
+import com.fr.design.DesignerEnvManager;
+import com.fr.general.GeneralUtils;
+import com.fr.json.JSONObject;
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * 设计器埋点抽象
+ *
+ * @author Bruce.Deng
+ * @since 11.0
+ * Created on 2024/9/10
+ */
+public abstract class AbstractDesignerMetric {
+
+ public static final String TIME = "time";
+
+ public static final String DESIGNER_ID = "designerId";
+
+ public static final String DESIGNER_VERSION = "designerVersion";
+
+ public static final String USERID = "userId";
+
+ public static final String APPID = "appId";
+
+ public static final String DEFAULT_MONITOR_URL = "https://cloud.fanruan.com/api/monitor/";
+
+ protected void addDefaultMetric(@NotNull JSONObject info) {
+ info.put(TIME, System.currentTimeMillis());
+ info.put(DESIGNER_ID, DesignerEnvManager.getEnvManager().getUUID());
+ info.put(DESIGNER_VERSION, GeneralUtils.getVersion());
+ info.put(USERID, Carina.config(FineBBSConfigProvider.class).getBbsUid());
+ info.put(APPID, MarketConfig.getInstance().getCloudOperationMaintenanceId());
+ }
+}
diff --git a/designer-base/src/main/java/com/fr/design/report/fit/BaseFitAttrPane.java b/designer-base/src/main/java/com/fr/design/report/fit/BaseFitAttrPane.java
index d68113bed2..f74dd10e75 100644
--- a/designer-base/src/main/java/com/fr/design/report/fit/BaseFitAttrPane.java
+++ b/designer-base/src/main/java/com/fr/design/report/fit/BaseFitAttrPane.java
@@ -82,8 +82,6 @@ public abstract class BaseFitAttrPane extends BasicBeanPane {
protected void initComponents() {
//添加以下设置
initItemChoose();
- //服务器配置-PC端自适应属性面板中需要添加提示
- initPrompt();
this.setLayout(new BorderLayout());
this.add(contentJPanel);
}
@@ -112,8 +110,6 @@ public abstract class BaseFitAttrPane extends BasicBeanPane {
}
- protected void initPrompt() {
- }
protected void refresh() {
validate();
diff --git a/designer-base/src/main/java/com/fr/design/roleAuthority/RoleTree.java b/designer-base/src/main/java/com/fr/design/roleAuthority/RoleTree.java
index 743dc4a754..92aeebe9ab 100644
--- a/designer-base/src/main/java/com/fr/design/roleAuthority/RoleTree.java
+++ b/designer-base/src/main/java/com/fr/design/roleAuthority/RoleTree.java
@@ -33,6 +33,8 @@ import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
+import static com.fine.theme.utils.FineUIScale.scale;
+
/**
* Author : daisy
* Time: 下午3:32
@@ -48,7 +50,7 @@ public class RoleTree extends UserObjectRefreshJTree {
this.setCellRenderer(roleTreeRenderer);
this.setEnabled(true);
this.setEditable(true);
- this.setRowHeight(20);
+ this.setRowHeight(scale(20));
this.setDigIn(true);
Handler handler = createHandlerForRoleTree();
this.replaceMouseListener(this, handler, 0);
diff --git a/designer-base/src/main/java/com/fr/design/style/color/ColorSelectDetailPane.java b/designer-base/src/main/java/com/fr/design/style/color/ColorSelectDetailPane.java
index 0f6631073d..cf63669c0a 100644
--- a/designer-base/src/main/java/com/fr/design/style/color/ColorSelectDetailPane.java
+++ b/designer-base/src/main/java/com/fr/design/style/color/ColorSelectDetailPane.java
@@ -78,7 +78,6 @@ public class ColorSelectDetailPane extends BasicPane {
// 颜色选择器面板
selectedPanel = new JColorChooser(this.color);
- selectedPanel.setPreferredSize(new Dimension(selectedPanel.getWidth(), FineUIScale.scale(SELECT_PANEL_HEIGHT)));
selectedPanel.setPreviewPanel(new JPanel());
swatchChooserPanel = new SwatchChooserPanel();
@@ -130,12 +129,11 @@ public class ColorSelectDetailPane extends BasicPane {
column(
2,
cell(new UILabel(i18nText("Fine-Design_Basic_Preview"))),
- cell(previewPanel).with(it -> {
+ cell(previewPanel).weight(1).with(it -> {
it.setBorder(new FineRoundBorder());
- it.setPreferredSize(new Dimension(this.getPreferredSize().width, FineUIScale.scale(120)));
it.setBackground(FlatUIUtils.getUIColor("background.normal", Color.WHITE));
})
- )).with(it -> it.setBorder(new ScaledEmptyBorder(0, 10, 0, 10)))
+ ).weight(1)).weight(1).with(it -> it.setBorder(new ScaledEmptyBorder(0, 10, 0, 10)))
).getComponent();
}
diff --git a/designer-base/src/main/java/com/fr/design/style/color/ColorSelectDialog.java b/designer-base/src/main/java/com/fr/design/style/color/ColorSelectDialog.java
index e9ee892bf0..6e87e6a12c 100644
--- a/designer-base/src/main/java/com/fr/design/style/color/ColorSelectDialog.java
+++ b/designer-base/src/main/java/com/fr/design/style/color/ColorSelectDialog.java
@@ -16,6 +16,8 @@ import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
+import static com.fine.swing.ui.layout.Layouts.cell;
+import static com.fine.swing.ui.layout.Layouts.column;
import static com.fine.theme.utils.FineUIScale.scale;
@@ -86,8 +88,7 @@ public class ColorSelectDialog extends MiddleChartDialog{
private void initComponent() {
this.setLayout(new BorderLayout());
- this.add(pane,BorderLayout.NORTH);
- this.setBasicDialogSize(scale(545),scale(500));
+ this.setBasicDialogSize(545,500);
this.setResizable(false);
this.applyClosingAction();
@@ -95,8 +96,6 @@ public class ColorSelectDialog extends MiddleChartDialog{
JPanel buttonPane = new JPanel();
buttonPane.setLayout(new FlowLayout(FlowLayout.RIGHT));
- this.add(buttonPane, BorderLayout.SOUTH);
-
ok = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Button_OK"));
cancel = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Button_Cancel"));
@@ -121,6 +120,7 @@ public class ColorSelectDialog extends MiddleChartDialog{
}
});
+ this.add(column(10, cell(pane).weight(1), cell(buttonPane)).getComponent());
this.setTitle(pane.title4PopupWindow());
GUICoreUtils.setWindowCenter(getOwner(), this);
}
diff --git a/designer-base/src/main/java/com/fr/design/style/color/CustomChooserPanel.java b/designer-base/src/main/java/com/fr/design/style/color/CustomChooserPanel.java
index d6b2df3023..26ca6bb61f 100644
--- a/designer-base/src/main/java/com/fr/design/style/color/CustomChooserPanel.java
+++ b/designer-base/src/main/java/com/fr/design/style/color/CustomChooserPanel.java
@@ -599,7 +599,7 @@ class CustomChooserPanel extends AbstractColorChooserPanel implements ColorSelec
protected void buildChooser() {
setLayout(new BorderLayout(10, 0));
setPreferredSize(new Dimension((int) this.getPreferredSize().getWidth(), scale(180)));
- add(buildRightPanel(), BorderLayout.CENTER);
+ Container rightPane = buildRightPanel();
JPanel container = new JPanel();
container.setLayout(new FlowLayout(FlowLayout.LEFT, 10, 0));
@@ -628,7 +628,7 @@ class CustomChooserPanel extends AbstractColorChooserPanel implements ColorSelec
slider.setSize(scale(new Dimension(12, 180)));
trackPanel.setSize(scale(new Dimension(12, 180)));
- add(container, BorderLayout.WEST);
+ add(row(cell(container).weight(1), cell(rightPane).weight(1)).getComponent());
slider.addChangeListener(new SliderChangeListener());
updateTextFields();
diff --git a/designer-chart/src/main/java/com/fr/design/chart/series/PlotSeries/UIGroupExtensionPane.java b/designer-chart/src/main/java/com/fr/design/chart/series/PlotSeries/UIGroupExtensionPane.java
index 056be99452..2edcfc13b4 100644
--- a/designer-chart/src/main/java/com/fr/design/chart/series/PlotSeries/UIGroupExtensionPane.java
+++ b/designer-chart/src/main/java/com/fr/design/chart/series/PlotSeries/UIGroupExtensionPane.java
@@ -1,15 +1,14 @@
package com.fr.design.chart.series.PlotSeries;
+import com.fine.theme.icon.LazyIcon;
import com.fr.chart.base.MapSvgXMLHelper;
import com.fr.design.constants.LayoutConstants;
-import com.fr.design.constants.UIConstants;
import com.fr.design.dialog.BasicPane;
import com.fr.design.dialog.DialogActionAdapter;
import com.fr.design.dialog.UIDialog;
import com.fr.design.event.ChangeEvent;
import com.fr.design.event.ChangeListener;
import com.fr.design.gui.frpane.UIExtensionPane;
-import com.fr.design.gui.ibutton.UIButton;
import com.fr.design.gui.icontainer.UIScrollPane;
import com.fr.design.gui.ilable.BoldFontTextLabel;
import com.fr.design.gui.ilable.UILabel;
@@ -33,8 +32,6 @@ import javax.swing.event.ListDataListener;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import java.awt.*;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
@@ -50,8 +47,6 @@ import java.util.List;
* 可收缩的面板,只有两层
*/
public class UIGroupExtensionPane extends BasicPane {
- public static final String EDIT = "edit";
- public static final String DELETE = "delete";
private static final int BUTTONWIDTH = 16;
private static final int DIALOG_WIDTH = 140;
private static final int DIALOG_HEIGHT = 100;
@@ -350,8 +345,8 @@ public class UIGroupExtensionPane extends BasicPane {
JComponent c = (JComponent) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
Border border = null;
c.setBorder(border);
- UILabel editLabel = new UILabel(UIConstants.EDIT_ICON);
- UILabel deleteLabel = new UILabel(UIConstants.DELETE_ICON);
+ UILabel editLabel = new UILabel(new LazyIcon("edit"));
+ UILabel deleteLabel = new UILabel(new LazyIcon("remove"));
JPanel editPane = GUICoreUtils.createFlowPane(new Component[]{editLabel, deleteLabel}, FlowLayout.LEFT, LayoutConstants.HGAP_LARGE);
editPane.setBackground(isSelected ? c.getBackground() : null);
@@ -548,40 +543,4 @@ public class UIGroupExtensionPane extends BasicPane {
}
}
}
-
- /**
- * 测试程序
- * @param args 参数
- */
- public static void main(String[] args) {
- JFrame f = new JFrame();
- f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
- Container c = f.getContentPane();
- c.setBackground(Color.WHITE);
- c.setLayout(new BoxLayout(c, BoxLayout.Y_AXIS));
- final UIGroupExtensionPane g = new UIGroupExtensionPane(new String[]{"title1", "title2", "title3"});
- c.add(g, BorderLayout.CENTER);
- JPanel pp = new JPanel(new FlowLayout());
- c.add(pp, BorderLayout.SOUTH);
- UIButton test = new UIButton("add1");
-
- test.addActionListener(new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent e) {
- g.addData("test111", 0);
- }
- });
- pp.add(test);
- UIButton test2 = new UIButton("add2");
- test2.addActionListener(new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent e) {
- g.addData("test222", 1);
- }
- });
- pp.add(test2);
- f.setSize(360, 500);
- f.setLocation(200, 100);
- f.setVisible(true);
- }
}
\ No newline at end of file
diff --git a/designer-chart/src/main/java/com/fr/van/chart/custom/component/ChartImageCheckOutPane.java b/designer-chart/src/main/java/com/fr/van/chart/custom/component/ChartImageCheckOutPane.java
index 0715be73a4..960d19f9b6 100644
--- a/designer-chart/src/main/java/com/fr/van/chart/custom/component/ChartImageCheckOutPane.java
+++ b/designer-chart/src/main/java/com/fr/van/chart/custom/component/ChartImageCheckOutPane.java
@@ -33,6 +33,7 @@ public class ChartImageCheckOutPane extends BasicPane implements UIObserver {
private static final int ICON_WIDTH = 56;
private static final int ICON_HEIGHT = 50;
private final ArrayList changeListeners = new ArrayList();
+ private static final String CHART_ICON_PREFIX = "icon_";
public ChartImageCheckOutPane(CustomPlotType type){
this(type, false);
@@ -66,8 +67,13 @@ public class ChartImageCheckOutPane extends BasicPane implements UIObserver {
this.add(row(flex(), cell(checkBox)).getComponent(), BorderLayout.NORTH);
}
+ /**
+ * 图表iconId注册时设置为"icon_" + 图表类型
+ * @param customPlotType
+ * @return
+ */
private String getIconId(CustomPlotType customPlotType) {
- return CustomPlotFactory.getTypeIconId(customPlotType);
+ return CHART_ICON_PREFIX + customPlotType.getType();
}
public JCheckBox getCheckBox() {
diff --git a/designer-realize/src/main/java/com/fanruan/boot/env/DesignEnvChooseComponent.java b/designer-realize/src/main/java/com/fanruan/boot/env/DesignEnvChooseComponent.java
index d655e511f1..cfc29edad3 100644
--- a/designer-realize/src/main/java/com/fanruan/boot/env/DesignEnvChooseComponent.java
+++ b/designer-realize/src/main/java/com/fanruan/boot/env/DesignEnvChooseComponent.java
@@ -1,8 +1,6 @@
package com.fanruan.boot.env;
-import com.fr.design.ConfigHelper;
import com.fanruan.boot.key.StartupArgsShell;
-import com.fr.design.mem.MemConfigRepositoryBuilder;
import com.fanruan.carina.Carina;
import com.fanruan.carina.annotions.FineComponent;
import com.fanruan.carina.annotions.Start;
@@ -15,15 +13,18 @@ import com.fanruan.config.realm.local.LocalConfigRepositoryBuilder;
import com.fr.base.operator.org.OrganizationOperator;
import com.fr.base.rpc.encrypt.EncryptOperator;
import com.fr.decision.service.context.ServiceContext;
+import com.fr.design.ConfigHelper;
import com.fr.design.DesignerEnvManager;
import com.fr.design.EnvChangeEntrance;
import com.fr.design.PluginClassRefreshManager;
+import com.fr.design.backup.DesignContext;
import com.fr.design.constants.DesignerLaunchStatus;
import com.fr.design.editlock.ConnectionLockChangeChecker;
import com.fr.design.editlock.ServerTableDataLockChangeChecker;
import com.fr.design.env.DesignerWorkspaceGenerator;
import com.fr.design.env.DesignerWorkspaceInfo;
import com.fr.design.file.HistoryTemplateListCache;
+import com.fr.design.mem.MemConfigRepositoryBuilder;
import com.fr.design.plugin.remind.PluginErrorDesignReminder;
import com.fr.env.utils.WorkspaceUtils;
import com.fr.event.Event;
@@ -36,12 +37,12 @@ import com.fr.report.lock.DefaultLockInfoOperator;
import com.fr.report.lock.LocalLockInfoOperator;
import com.fr.report.lock.LockInfoOperator;
import com.fr.report.lock.ServerLockInfoOperator;
-import com.fr.design.backup.DesignContext;
import com.fr.start.module.StartupArgs;
import com.fr.value.NotNullLazyValue;
import com.fr.workspace.WorkContext;
import com.fr.workspace.Workspace;
import com.fr.workspace.WorkspaceEvent;
+import com.fr.workspace.WorkspaceSwitchProcess;
import com.fr.workspace.base.WorkspaceKey;
import com.fr.workspace.pool.WorkRPCRegister;
import com.fr.workspace.pool.WorkRPCType;
@@ -101,6 +102,8 @@ import com.fr.workspace.server.vcs.v2.scheduler.VcsAutoCleanOperator;
import com.fr.workspace.server.vcs.v2.scheduler.VcsAutoCleanService;
import org.jetbrains.annotations.NotNull;
+import java.util.Optional;
+
/**
* 环境选择模块
*
@@ -118,10 +121,20 @@ public class DesignEnvChooseComponent extends ResourceAffiliate {
BootstrapFactory.get().reboot("design_env_prepare");
// 环境切换后,等到模块重启更新一下当前的系统信息
WorkplaceConstants.updateBean();
+ recordModuleStartStop();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
+
+ private void recordModuleStartStop() {
+
+ WorkspaceSwitchProcess process = WorkContext.getSwitcher().getProcess();
+ Optional.ofNullable(process)
+ .ifPresent((e) -> e.recordModuleStartUsed(() -> BootstrapFactory.get().profileStart("design_env_prepare")));
+ Optional.ofNullable(process)
+ .ifPresent((e) -> e.recordModuleStopUsed(() -> BootstrapFactory.get().profileStop("design_env_prepare")));
+ }
};
private Listener beforeSwitch4Max = new Listener(Integer.MAX_VALUE) {
diff --git a/designer-realize/src/main/java/com/fanruan/boot/pre/DesignPreStartComponent.java b/designer-realize/src/main/java/com/fanruan/boot/pre/DesignPreStartComponent.java
index 06459b8fe3..d77bafc3b4 100644
--- a/designer-realize/src/main/java/com/fanruan/boot/pre/DesignPreStartComponent.java
+++ b/designer-realize/src/main/java/com/fanruan/boot/pre/DesignPreStartComponent.java
@@ -23,6 +23,7 @@ import com.fr.base.function.UITerminator;
import com.fr.carina.util.CarinaResourceUtils;
import com.fr.carina.util.provider.CarinaResourceProvider;
import com.fr.design.DesignerEnvManager;
+import com.fr.design.constants.DesignerLaunchStatus;
import com.fr.design.deeplink.DeepLinkManager;
import com.fr.design.fun.OemProcessor;
import com.fr.design.mainframe.messagecollect.StartErrorMessageCollector;
@@ -236,6 +237,7 @@ public class DesignPreStartComponent {
PreLoadService.getInstance().addUIFuture(initLookAndFeel);
showSplash();
+ DesignerLaunchStatus.setStatusAndAsyncFire(DesignerLaunchStatus.UI_PRE_INIT_COMPLETE);
}
/**
diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/AuthorityToolBarPane.java b/designer-realize/src/main/java/com/fr/design/mainframe/AuthorityToolBarPane.java
index c0679a7053..7e1853c09e 100644
--- a/designer-realize/src/main/java/com/fr/design/mainframe/AuthorityToolBarPane.java
+++ b/designer-realize/src/main/java/com/fr/design/mainframe/AuthorityToolBarPane.java
@@ -1,6 +1,7 @@
package com.fr.design.mainframe;
import com.fine.theme.utils.FineUIScale;
+import com.formdev.flatlaf.util.ScaledEmptyBorder;
import com.fr.common.inputevent.InputEventBaseOnOS;
import com.fr.design.beans.BasicBeanPane;
import com.fr.design.file.HistoryTemplateListPane;
@@ -37,7 +38,10 @@ import java.awt.event.MouseListener;
import java.util.List;
import static com.fine.swing.ui.layout.Layouts.cell;
+import static com.fine.swing.ui.layout.Layouts.column;
+import static com.fine.swing.ui.layout.Layouts.flex;
import static com.fine.swing.ui.layout.Layouts.row;
+import static com.fine.theme.utils.FineUIScale.scale;
/**
* Author : daisy
@@ -134,14 +138,14 @@ public class AuthorityToolBarPane extends BasicBeanPane extends BasicBeanPane exportPane) {
- tabPaneBuilder.addTab(new ImageExportPane().getTitle(), new ImageExportPane());
- paneList.add(new ImageExportPane());
+ tabPaneBuilder.addTab(exportPane.getTitle(), exportPane);
+ paneList.add(exportPane);
}
@Override
diff --git a/designer-realize/src/main/java/com/fr/design/webattr/ServerFitAttrPane.java b/designer-realize/src/main/java/com/fr/design/webattr/ServerFitAttrPane.java
index 33da70327f..4e7944c98e 100644
--- a/designer-realize/src/main/java/com/fr/design/webattr/ServerFitAttrPane.java
+++ b/designer-realize/src/main/java/com/fr/design/webattr/ServerFitAttrPane.java
@@ -79,15 +79,6 @@ public class ServerFitAttrPane extends BaseFitAttrPane {
};
}
- /**
- * 服务器配置-PC端自适应属性面板中需要添加提示
- */
- @Override
- protected void initPrompt() {
- UILabel uiLabel = new UILabel(Toolkit.i18nText("Fine-Designer_Fit_Attr_Pane_Hint"));
- FineUIStyle.setStyle(uiLabel, FineUIStyle.LABEL_TIP);
- uiLabel.setBorder(new ScaledEmptyBorder(5, 5, 5, 0));
- contentJPanel.add(uiLabel);
- }
+
}
diff --git a/designer-realize/src/main/java/com/fr/start/CarinaDesigner.java b/designer-realize/src/main/java/com/fr/start/CarinaDesigner.java
index 5e44ed8425..775eaf06fa 100644
--- a/designer-realize/src/main/java/com/fr/start/CarinaDesigner.java
+++ b/designer-realize/src/main/java/com/fr/start/CarinaDesigner.java
@@ -10,11 +10,9 @@ import com.fanruan.gui.UiInspector;
import com.fr.base.StateHubContext;
import com.fr.design.backup.DesignContext;
import com.fr.design.carton.SwitchForSwingChecker;
-
import com.fr.design.carton.latency.DesignerLatencyMetric;
import com.fr.design.mainframe.DesignerUIModeConfig;
import com.fr.log.FineLoggerFactory;
-
import com.fr.runtime.FineRuntime;
import com.fr.start.common.DesignerStartupContext;
import com.fr.start.module.StartupArgs;
@@ -65,6 +63,7 @@ public class CarinaDesigner extends MainDesigner{
FineLoggerFactory.getLogger().info("Designer started.Time used {} ms", DesignerStartupContext.getRecorder().getTime(TimeUnit.MILLISECONDS));
DesignerStartupContext.getRecorder().stop();
+ DesignerStartupMetric.getInstance().asyncSubmit();
SwitchForSwingChecker.initThreadMonitoring();
DesignerLatencyMetric.getInstance().start();
}
diff --git a/designer-realize/src/main/java/com/fr/start/DesignerStartupMetric.java b/designer-realize/src/main/java/com/fr/start/DesignerStartupMetric.java
new file mode 100644
index 0000000000..2dc2712799
--- /dev/null
+++ b/designer-realize/src/main/java/com/fr/start/DesignerStartupMetric.java
@@ -0,0 +1,94 @@
+package com.fr.start;
+
+import com.fr.concurrent.FineExecutors;
+import com.fr.concurrent.NamedThreadFactory;
+import com.fr.design.mainframe.SiteCenterToken;
+import com.fr.design.metric.AbstractDesignerMetric;
+import com.fr.general.CloudCenter;
+import com.fr.general.http.HttpToolbox;
+import com.fr.json.JSONObject;
+import com.fr.json.revise.EmbedJson;
+import com.fr.log.FineLoggerFactory;
+import com.fr.stable.StringUtils;
+import com.fr.start.common.DesignerStartupContext;
+import com.fr.startup.metric.DesignerMetrics;
+import com.fr.startup.metric.DesignerStartupModel;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * fbp设计器启动埋点提交
+ *
+ * @author Bruce.Deng
+ * @since 11.0
+ * Created on 2024/9/5
+ */
+public class DesignerStartupMetric extends AbstractDesignerMetric {
+
+ private static final String LANDING_TIME = "landingTime";
+ private static final String STARTING_TIME = "startingTime";
+ private static final String MODE = "mode";
+ private static final String INFO = "info";
+ private static volatile DesignerStartupMetric instance = new DesignerStartupMetric();
+ private static final String DESIGNER_START_TABLE_SUFFIX = "record_of_fbp_designerStartTime/single";
+
+ private DesignerStartupMetric() {
+ }
+
+ /**
+ * 获取单例
+ */
+ public static DesignerStartupMetric getInstance() {
+ return instance;
+ }
+
+ /**
+ * 延迟5分钟提交埋点数据
+ *
+ */
+ public void asyncSubmit() {
+ ScheduledExecutorService scheduledExecutorService = FineExecutors.newSingleThreadScheduledExecutor(new NamedThreadFactory("DesignerStartupMetricSubmit"));
+ scheduledExecutorService.schedule(new Runnable() {
+ @Override
+ public void run() {
+ collectAndSubmit();
+ }
+ }, 5, TimeUnit.MINUTES);
+ scheduledExecutorService.shutdown();
+ }
+
+ private void collectAndSubmit() {
+ Map para = new HashMap<>();
+ para.put("token", SiteCenterToken.generateToken());
+ para.put("content", collect());
+ try {
+ HttpToolbox.post(getUrl(), para);
+ FineLoggerFactory.getLogger().debug("[DesignerStartup] submit designer startup metric to cloud.");
+ } catch (Throwable t) {
+ FineLoggerFactory.getLogger().debug(t,"[DesignerStartup] failed to submit designer startup metric to cloud.");
+ }
+ }
+
+ private String getUrl() {
+ String monitorEntry = CloudCenter.getInstance().acquireUrlByKind("cloud.monitor.api.entrypoint");
+ String url = (StringUtils.isNotEmpty(monitorEntry) ? monitorEntry : DEFAULT_MONITOR_URL)
+ + DESIGNER_START_TABLE_SUFFIX;
+ return url;
+ }
+
+ private JSONObject collect() {
+ JSONObject info = new JSONObject();
+ DesignerMetrics designerMetrics = DesignerStartupContext.getInstance().getDesignerMetrics();
+ DesignerStartupModel model = designerMetrics.getModel();
+ info.put(LANDING_TIME, model.getLandingTime());
+ info.put(STARTING_TIME, model.getStartingTime());
+ info.put(MODE, model.getMode());
+ info.put(INFO, EmbedJson.encode(model.getInfo()));
+ addDefaultMetric(info);
+ return info;
+ }
+
+}