Browse Source

Merge branch 'fbp/feature' of ssh://code.fineres.com:7999/~vito/c-design into fbp/feature

fbp/feature
vito 2 months ago
parent
commit
24444ada6e
  1. 3
      designer-base/src/main/java/com/fr/design/ExtraDesignClassManager.java
  2. 4
      designer-base/src/main/java/com/fr/design/actions/file/PreferencePane.java
  3. 7
      designer-base/src/main/java/com/fr/design/data/BasicTableDataTreePane.java
  4. 33
      designer-base/src/main/java/com/fr/design/data/datapane/ChoosePane.java
  5. 7
      designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java
  6. 15
      designer-base/src/main/java/com/fr/design/data/datapane/auth/TableDataAuthHelper.java
  7. 11
      designer-base/src/main/java/com/fr/design/data/datapane/connect/ConnectionComboBoxPanel.java
  8. 5
      designer-base/src/main/java/com/fr/design/data/datapane/preview/ConnectionInfoBeanHelper.java
  9. 30
      designer-base/src/main/java/com/fr/design/debug/edt/StrictEDTException.java
  10. 130
      designer-base/src/main/java/com/fr/design/debug/edt/StrictEdtListeners.java
  11. 135
      designer-base/src/main/java/com/fr/design/debug/edt/StrictEdtManager.java
  12. 15
      designer-base/src/main/java/com/fr/design/debug/ui/UIMonitorPane.java
  13. 5
      designer-base/src/main/java/com/fr/design/gui/itree/refreshabletree/RefreshableJTree.java
  14. 56
      designer-base/src/main/java/com/fr/design/i18n/DesignExtendLanguageConfig.java
  15. 19
      designer-base/src/main/java/com/fr/design/utils/DesignUtils.java
  16. 128
      designer-base/src/main/resources/com/fr/design/data/tabledata/datacenter/web/data-choose.main.js
  17. 2
      designer-realize/src/main/java/com/fanruan/boot/env/function/app/DesignAppComponent.java

3
designer-base/src/main/java/com/fr/design/ExtraDesignClassManager.java

@ -4,6 +4,7 @@
package com.fr.design;
import com.fine.theme.icon.LazyIcon;
import com.fr.base.BaseUtils;
import com.fr.common.annotations.Open;
import com.fr.design.data.datapane.TableDataNameObjectCreator;
@ -143,7 +144,7 @@ public class ExtraDesignClassManager extends AbstractExtraClassManager implement
WidgetOption createT(ToolbarItemProvider provider) {
return WidgetOptionFactory.createByWidgetClass(
provider.nameForWidget(),
IOUtils.readIcon(provider.iconPathForWidget()),
new LazyIcon(provider.iconPathForWidget()),
provider.classForWidget()
);
}

4
designer-base/src/main/java/com/fr/design/actions/file/PreferencePane.java

@ -45,6 +45,7 @@ import com.fr.design.mainframe.vcs.ui.VcsMovePanel;
import com.fr.design.os.impl.SupportOSImpl;
import com.fr.design.ui.util.UIUtil;
import com.fr.design.unit.UnitConvertUtil;
import com.fr.design.utils.DesignUtils;
import com.fr.design.utils.gui.GUICoreUtils;
import com.fr.design.widget.FRWidgetFactory;
import com.fr.env.SetupDataDesignerRemoteOperator;
@ -53,7 +54,6 @@ import com.fr.general.FRFont;
import com.fr.general.Inter;
import com.fr.general.log.Log4jConfig;
import com.fr.io.attr.ImageExportAttr;
import com.fr.locale.InterProviderFactory;
import com.fr.log.FineLoggerFactory;
import com.fr.report.ReportConfigManager;
import com.fr.report.ReportConfigManagerProvider;
@ -792,7 +792,7 @@ public class PreferencePane extends BasicPane {
}
private UIDictionaryComboBox<Locale> createLanguageComboBox() {
Map<Locale, String> map = InterProviderFactory.getProvider().getSupportLocaleMap();
Map<Locale, String> map = DesignUtils.getAvailableLanguages();
int size = map.size();
Locale[] keys = new Locale[size];
String[] values = new String[size];

7
designer-base/src/main/java/com/fr/design/data/BasicTableDataTreePane.java

@ -38,6 +38,7 @@ import com.fr.general.NameObject;
import com.fr.log.FineLoggerFactory;
import com.fr.stable.StringUtils;
import com.fr.workspace.WorkContext;
import com.fr.workspace.server.repository.connection.ConnectionRepository;
import javax.swing.AbstractButton;
import javax.swing.Action;
@ -471,11 +472,11 @@ public abstract class BasicTableDataTreePane extends DockingView implements Resp
new SwingWorker<Boolean, Void>() {
@Override
protected Boolean doInBackground() throws Exception {
// 获取无权限连接名称集合
Collection<String> noAuthConnections = TableDataAuthHelper.getNoAuthConnections();
// 获取有权限的连接名称集合
Collection<String> authConnections = ConnectionRepository.getInstance().getConnNames();
// 获取当前数据集对应的数据连接名称
String connectionName = TableDataAuthHelper.getConnectionNameByDBTableData((DBTableData) wrapper.getTableData());
return !noAuthConnections.contains(connectionName);
return authConnections.contains(connectionName);
}
@Override

33
designer-base/src/main/java/com/fr/design/data/datapane/ChoosePane.java

@ -1,9 +1,7 @@
package com.fr.design.data.datapane;
import com.fanruan.config.impl.data.ConnectionConfigProviderFactory;
import com.fr.base.TableData;
import com.fr.data.core.DataCoreUtils;
import com.fr.data.core.db.DBUtils;
import com.fr.data.core.db.TableProcedure;
import com.fr.data.core.db.dialect.Dialect;
import com.fr.data.core.db.dialect.DialectFactory;
@ -39,14 +37,9 @@ import com.fr.general.IOUtils;
import com.fr.log.FineLoggerFactory;
import com.fr.stable.StringUtils;
import com.fr.workspace.WorkContext;
import com.fr.workspace.server.repository.authority.RemoteAuthorityRepository;
import com.fr.workspace.server.repository.connection.ConnectionRepository;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTree;
import javax.swing.SwingWorker;
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.PopupMenuEvent;
@ -56,21 +49,14 @@ import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeCellRenderer;
import javax.swing.tree.TreePath;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.*;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.CancellationException;
/**
@ -339,20 +325,7 @@ public class ChoosePane extends BasicBeanPane<DataBaseItems> implements Refresha
}
private List<String> getHasAuthConnections() {
List<String> authConnections = new ArrayList<>();
Set<String> allConnections = new HashSet<>(ConnectionRepository.getInstance().getConnNames());
// 待实现
Collection<String> noAuthConnections = RemoteAuthorityRepository.getInstance().getNoAuthConnections();
if (noAuthConnections == null) {
return authConnections;
}
for (String name : allConnections) {
if (!noAuthConnections.contains(name)) {
authConnections.add(name);
}
}
return authConnections;
return ConnectionRepository.getInstance().getConnNames();
}
/**

7
designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java

@ -71,6 +71,7 @@ import com.fr.plugin.observer.PluginEventListener;
import com.fr.stable.StringUtils;
import com.fr.stable.core.PropertyChangeAdapter;
import com.fr.workspace.WorkContext;
import com.fr.workspace.server.repository.connection.ConnectionRepository;
import org.jetbrains.annotations.NotNull;
import javax.swing.Icon;
@ -1056,11 +1057,11 @@ public class TableDataTreePane extends BasicTableDataTreePane {
new SwingWorker<Boolean, Void>() {
@Override
protected Boolean doInBackground() throws Exception {
// 获取无权限连接名称集合
Collection<String> noAuthConnections = TableDataAuthHelper.getNoAuthConnections();
// 获取有权限的连接名称集合
Collection<String> authConnections = ConnectionRepository.getInstance().getConnNames();
// 获取当前数据集对应的数据连接名称
String connectionName = TableDataAuthHelper.getConnectionNameByDBTableData((DBTableData) wrapper.getTableData());
return !noAuthConnections.contains(connectionName);
return authConnections.contains(connectionName);
}
@Override

15
designer-base/src/main/java/com/fr/design/data/datapane/auth/TableDataAuthHelper.java

@ -6,11 +6,6 @@ import com.fr.data.impl.DBTableData;
import com.fr.data.impl.NameDatabaseConnection;
import com.fr.stable.StringUtils;
import com.fr.workspace.WorkContext;
import com.fr.workspace.server.connection.DBConnectAuth;
import com.fr.workspace.server.repository.authority.RemoteAuthorityRepository;
import java.util.Collection;
import java.util.Collections;
/**
* 数据连接权限相关的工具类
@ -28,16 +23,6 @@ public class TableDataAuthHelper {
return !WorkContext.getCurrent().isLocal() && tableData instanceof DBTableData;
}
/**
* 获取无权限数据连接集合
* 远程下需要调用RPC为耗时操作谨慎使用
* @return
*/
public static Collection<String> getNoAuthConnections() {
// 获取无权限连接集合
Collection<String> noAuthConnections = RemoteAuthorityRepository.getInstance().getNoAuthConnections();
return noAuthConnections == null ? Collections.emptyList() : noAuthConnections;
}
/**
* 通过数据集获取其数据连接的名称

11
designer-base/src/main/java/com/fr/design/data/datapane/connect/ConnectionComboBoxPanel.java

@ -13,7 +13,6 @@ import com.fr.design.gui.ibutton.UILockButton;
import com.fr.report.LockItem;
import com.fr.stable.StringUtils;
import com.fr.workspace.WorkContext;
import com.fr.workspace.server.repository.authority.RemoteAuthorityRepository;
import javax.swing.SwingUtilities;
import java.awt.Dimension;
@ -22,7 +21,6 @@ import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
@ -80,19 +78,10 @@ public class ConnectionComboBoxPanel extends ItemEditableComboBoxPanel {
* 刷新ComboBox.items
*/
protected Iterator<String> items() {
Collection<String> noAuthConnections = RemoteAuthorityRepository.getInstance().getNoAuthConnections();
nameList = new ArrayList<>();
if (noAuthConnections == null) {
return nameList.iterator();
}
final Map<String, Connection> connectionMap = ConnectionInfoBeanHelper.getCurrentConnectionMap();
for (Map.Entry<String, Connection> connectionEntry : connectionMap.entrySet()) {
String conName = connectionEntry.getKey();
if (noAuthConnections.contains(conName)) {
continue;
}
filterConnection(connectionEntry.getValue(), conName, nameList);
}
return nameList.iterator();

5
designer-base/src/main/java/com/fr/design/data/datapane/preview/ConnectionInfoBeanHelper.java

@ -40,6 +40,7 @@ import com.fr.workspace.server.repository.WorkplaceConstants;
import com.fr.workspace.server.repository.connection.ConnectionCacheEvent;
import com.fr.workspace.server.repository.connection.ConnectionRepository;
import com.fr.workspace.server.repository.tabledata.DataEncryptionHelper;
import org.jetbrains.annotations.Nullable;
import java.util.HashMap;
import java.util.Map;
@ -123,8 +124,12 @@ public class ConnectionInfoBeanHelper {
/**
* 根据bean创建连接
*/
@Nullable
public static Connection createConnection(ConnectionInfoBean infoBean) {
try {
if (infoBean == null) {
return null;
}
Connection connection = cache.get(VALUE).get(infoBean.getConnectionName());
if (connection != null) {
connection.setConnectionName(infoBean.getConnectionName());

30
designer-base/src/main/java/com/fr/design/debug/edt/StrictEDTException.java

@ -0,0 +1,30 @@
package com.fr.design.debug.edt;
/**
* Swing组件严格限制EDT运行
*
* @author vito
* @since 11.0
* Created on 2023/8/9
*/
public class StrictEDTException extends RuntimeException {
public StrictEDTException() {
}
public StrictEDTException(String message) {
super(message);
}
public StrictEDTException(String message, Throwable cause) {
super(message, cause);
}
public StrictEDTException(Throwable cause) {
super(cause);
}
public StrictEDTException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}
}

130
designer-base/src/main/java/com/fr/design/debug/edt/StrictEdtListeners.java

@ -0,0 +1,130 @@
package com.fr.design.debug.edt;
import com.fr.design.ui.util.EdtInvocationManager;
import com.fr.log.FineLoggerFactory;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.awt.event.HierarchyEvent;
import java.awt.event.HierarchyListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
/**
* Swing组件严格限制EDT运行监听器
*
* @author vito
* @since 11.0
* Created on 2023/8/9
*/
public class StrictEdtListeners implements HierarchyListener, PropertyChangeListener, ComponentListener, MouseListener,
MouseWheelListener, MouseMotionListener, KeyListener {
@Override
public void componentResized(ComponentEvent e) {
checkEventDispatchThread();
}
@Override
public void componentMoved(ComponentEvent e) {
checkEventDispatchThread();
}
@Override
public void componentShown(ComponentEvent e) {
checkEventDispatchThread();
}
@Override
public void componentHidden(ComponentEvent e) {
checkEventDispatchThread();
}
@Override
public void hierarchyChanged(HierarchyEvent e) {
checkEventDispatchThread();
}
@Override
public void keyTyped(KeyEvent e) {
checkEventDispatchThread();
}
@Override
public void keyPressed(KeyEvent e) {
checkEventDispatchThread();
}
@Override
public void keyReleased(KeyEvent e) {
checkEventDispatchThread();
}
@Override
public void mouseClicked(MouseEvent e) {
checkEventDispatchThread();
}
@Override
public void mousePressed(MouseEvent e) {
checkEventDispatchThread();
}
@Override
public void mouseReleased(MouseEvent e) {
checkEventDispatchThread();
}
@Override
public void mouseEntered(MouseEvent e) {
checkEventDispatchThread();
}
@Override
public void mouseExited(MouseEvent e) {
checkEventDispatchThread();
// redispatchMouseEvent(e);
}
@Override
public void mouseDragged(MouseEvent e) {
checkEventDispatchThread();
}
@Override
public void mouseMoved(MouseEvent e) {
checkEventDispatchThread();
}
@Override
public void mouseWheelMoved(MouseWheelEvent e) {
checkEventDispatchThread();
}
@Override
public void propertyChange(PropertyChangeEvent e) {
checkEventDispatchThread();
}
/**
* 检查当前是否处于EDT中并发出告警
*/
public static void checkEventDispatchThread() {
if (!EdtInvocationManager.getInstance().isEventDispatchThread()) {
String s = String.format(
"[StrictEDT] The current operation can only be in an EDT (Event Dispatch Thread). Current thread is: %s",
Thread.currentThread().getName()
);
StrictEDTException strictEdtException = new StrictEDTException(s);
FineLoggerFactory.getLogger().warn(s, strictEdtException);
}
}
}

135
designer-base/src/main/java/com/fr/design/debug/edt/StrictEdtManager.java

@ -0,0 +1,135 @@
package com.fr.design.debug.edt;
import com.fanruan.gui.InspectorWindow;
import com.fr.design.mainframe.DesignerContext;
import com.fr.log.FineLoggerFactory;
import org.jetbrains.annotations.NotNull;
import java.awt.AWTEvent;
import java.awt.Component;
import java.awt.Container;
import java.awt.Toolkit;
import java.awt.Window;
import java.awt.event.AWTEventListener;
import java.awt.event.ContainerEvent;
/**
* 严格UI线程运行管理器
*
* @author vito
* @since 11.0
* Created on 2024/12/20
*/
public class StrictEdtManager {
private static final StrictEdtListeners LISTENERS = new StrictEdtListeners();
private static void installContainerEDTCheckers(@NotNull final Container component, int level) {
if (FineLoggerFactory.getLogger().isDebugEnabled()) {
for (int i = 0; i < level; i++) {
FineLoggerFactory.getLogger().debug(" ");
}
FineLoggerFactory.getLogger().debug(component.toString());
}
int count = component.getComponentCount();
level += 1;
for (int i = 0; i < count; i++) {
Component comp = component.getComponent(i);
addEDTCheckersListener(comp);
if (comp instanceof Container) {
installContainerEDTCheckers((Container) comp, level);
}
}
}
private static void addEDTCheckersListener(Component comp) {
comp.addHierarchyListener(LISTENERS);
comp.addPropertyChangeListener(LISTENERS);
comp.addComponentListener(LISTENERS);
comp.addMouseListener(LISTENERS);
comp.addMouseMotionListener(LISTENERS);
comp.addKeyListener(LISTENERS);
}
private static void installEDTCheckers(Container container, int level) {
installContainerEDTCheckers(container, level);
level += 1;
if (container instanceof Window) {
Window[] children = ((Window) container).getOwnedWindows();
for (Window child : children) {
if (child instanceof InspectorWindow) {
continue;
}
installEDTCheckers(child, level);
}
}
}
private static final AWTEventListener AWT_EVENT_LISTENER = (AWTEvent event) -> {
if (event instanceof ContainerEvent) {
Component child = event.getID() == ContainerEvent.COMPONENT_ADDED ? ((ContainerEvent) event).getChild() : null;
if (child != null) {
addEDTCheckersListener(child);
}
}
};
/**
* 监听组件警告不在EDT中执行的UI操作
*/
public static void install() {
// 监听当前的组件
installEDTCheckers(DesignerContext.getDesignerFrame(), 0);
// 监听新增的组件
Toolkit.getDefaultToolkit().addAWTEventListener(AWT_EVENT_LISTENER, AWTEvent.CONTAINER_EVENT_MASK);
FineLoggerFactory.getLogger().info("[StrictEDT] install Strict EDT Checkers");
}
private static void uninstallContainerEDTCheckers(@NotNull final Container component, int level) {
int count = component.getComponentCount();
level += 1;
for (int i = 0; i < count; i++) {
Component comp = component.getComponent(i);
removeEDTCheckersListener(comp);
if (comp instanceof Container) {
uninstallContainerEDTCheckers((Container) comp, level);
}
}
}
private static void removeEDTCheckersListener(Component comp) {
comp.removeHierarchyListener(LISTENERS);
comp.removePropertyChangeListener(LISTENERS);
comp.removeComponentListener(LISTENERS);
comp.removeMouseListener(LISTENERS);
comp.removeMouseMotionListener(LISTENERS);
comp.removeKeyListener(LISTENERS);
}
private static void removeEDTCheckers(Container container, int level) {
uninstallContainerEDTCheckers(container, level);
level += 1;
if (container instanceof Window) {
Window[] children = ((Window) container).getOwnedWindows();
for (Window child : children) {
if (child instanceof InspectorWindow) {
continue;
}
removeEDTCheckers(child, level);
}
}
}
/**
* 监听组件警告不在EDT中执行的UI操作
*/
public static void uninstall() {
// 取消监听新增的组件
Toolkit.getDefaultToolkit().removeAWTEventListener(AWT_EVENT_LISTENER);
// 解除监听当前的组件
removeEDTCheckers(DesignerContext.getDesignerFrame(), 0);
FineLoggerFactory.getLogger().info("[StrictEDT] uninstall Strict EDT Checkers");
}
}

15
designer-base/src/main/java/com/fr/design/debug/ui/UIMonitorPane.java

@ -8,6 +8,7 @@ import com.formdev.flatlaf.util.ScaledEmptyBorder;
import com.fr.base.extension.FileExtension;
import com.fr.design.border.FineBorderFactory;
import com.fr.design.carton.latency.LatencyLevel;
import com.fr.design.debug.edt.StrictEdtManager;
import com.fr.design.dialog.BasicDialog;
import com.fr.design.dialog.BasicPane;
import com.fr.design.gui.ibutton.UIButton;
@ -61,6 +62,7 @@ public class UIMonitorPane extends JPanel {
private DefaultTableModel model;
private UICheckBox inspector;
private UICheckBox strictEDTChecker;
private UICheckBox monitor;
public UIMonitorPane() {
@ -73,6 +75,7 @@ public class UIMonitorPane extends JPanel {
UITableScrollPane tablePane = initLatencyTable();
Row topSettingRow = initTopSettingRow();
inspector = new UICheckBox("Open UI Inspector");
strictEDTChecker = new UICheckBox("Open Strict EDT Checker");
monitor = new UICheckBox("Open Latency Monitor");
JPanel monitorPane = column(10,
@ -81,6 +84,7 @@ public class UIMonitorPane extends JPanel {
add(column(10,
cell(FineUIUtils.wrapComponentWithTitle(inspector, "UI Inspector")),
cell(FineUIUtils.wrapComponentWithTitle(strictEDTChecker, "Strict EDT Checker")),
cell(FineUIUtils.wrapComponentWithTitle(monitorPane, "UI Latency Monitor"))
).getComponent(), BorderLayout.CENTER);
@ -94,14 +98,21 @@ public class UIMonitorPane extends JPanel {
inspector.setSelected(UIInspectorHolder.getInstance().isInstalled());
monitor.setSelected(UILatencyWorker.getInstance().isMonitoring());
// 注册事件监听
inspector.addChangeListener(e -> {
inspector.addActionListener(e -> {
if (inspector.isSelected()) {
UIInspectorHolder.getInstance().install();
} else {
UIInspectorHolder.getInstance().uninstall();
}
});
monitor.addChangeListener(e -> {
strictEDTChecker.addActionListener(e -> {
if (strictEDTChecker.isSelected()) {
StrictEdtManager.install();
} else {
StrictEdtManager.uninstall();
}
});
monitor.addActionListener(e -> {
topSettingRow.setVisible(monitor.isSelected());
tablePane.setVisible(monitor.isSelected());
if (monitor.isSelected()) {

5
designer-base/src/main/java/com/fr/design/gui/itree/refreshabletree/RefreshableJTree.java

@ -108,17 +108,18 @@ public abstract class RefreshableJTree extends CheckBoxTree {
for (int i = 0; i < nodes.length; i++) {
treeNode.add(nodes[i]);
}
DefaultTreeModel treeModel = (DefaultTreeModel) RefreshableJTree.this.getModel();
// 主要耗时是用在了treeUI的渲染上了,所以把这个放到工作线程里面
if (treeNode.getChildCount() >= 1 && ((ExpandMutableTreeNode) treeNode.getFirstChild()).getUserObject() == PENDING) {
treeNode.remove(0);
}
treeModel.nodeStructureChanged(treeNode);
return System.currentTimeMillis() - startTime;
}
@Override
protected void done() {
DefaultTreeModel treeModel = (DefaultTreeModel) RefreshableJTree.this.getModel();
treeModel.nodeStructureChanged(treeNode);
RefreshableJTree.this.updateUI();
// 恢复Tree的可用性
RefreshableJTree.this.setEnabled(true);

56
designer-base/src/main/java/com/fr/design/i18n/DesignExtendLanguageConfig.java

@ -0,0 +1,56 @@
package com.fr.design.i18n;
import com.fr.config.ConfigContext;
import com.fr.config.DefaultConfiguration;
import com.fr.config.Identifier;
import com.fr.config.holder.factory.Holders;
import com.fr.config.holder.impl.MapConf;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
/**
* 设计器语言扩展配置
*
* @author obo
* @since 11.0
* Created on 2024/09/26
*/
public class DesignExtendLanguageConfig extends DefaultConfiguration {
private static volatile DesignExtendLanguageConfig designExtendLanguageConfig = null;
/**
* 获取实例
*/
public static DesignExtendLanguageConfig getInstance() {
if (designExtendLanguageConfig == null) {
designExtendLanguageConfig = ConfigContext.getConfigInstance(DesignExtendLanguageConfig.class);
}
return designExtendLanguageConfig;
}
/**
* 设计器扩展的语言
* key为localeString例如en_US或envalue为改语言对应的国际化翻译key
*/
@Identifier("extendDesignLocales")
private MapConf<Map<String, String>> extendDesignLocales = Holders.map(new HashMap<>(), String.class, String.class);
public Map<String, String> getExtendedDesignLocales() {
return Collections.unmodifiableMap(extendDesignLocales.get());
}
public void setExtendedDesignLocales(Map<String, String> map) {
extendDesignLocales.set(map);
}
@Override
public Object clone() throws CloneNotSupportedException {
DesignExtendLanguageConfig cloned = (DesignExtendLanguageConfig) super.clone();
cloned.extendDesignLocales = ( MapConf<Map<String, String>>) extendDesignLocales.clone();
return cloned;
}
}

19
designer-base/src/main/java/com/fr/design/utils/DesignUtils.java

@ -13,6 +13,7 @@ import com.fr.design.deeplink.DeepLinkCore;
import com.fr.design.dialog.FineJOptionPane;
import com.fr.design.fun.DefaultValueAdjustProvider;
import com.fr.design.fun.DesignerEnvProcessor;
import com.fr.design.i18n.DesignExtendLanguageConfig;
import com.fr.design.i18n.Toolkit;
import com.fr.design.mainframe.DesignerContext;
import com.fr.design.ui.util.UIUtil;
@ -21,10 +22,13 @@ import com.fr.file.FileFILE;
import com.fr.general.ComparatorUtils;
import com.fr.general.FRFont;
import com.fr.general.GeneralContext;
import com.fr.general.LocaleType;
import com.fr.general.SupportLocale;
import com.fr.log.FineLoggerFactory;
import com.fr.plugin.injectable.PluginModule;
import com.fr.stable.ArrayUtils;
import com.fr.stable.CommonCodeUtils;
import com.fr.stable.CommonUtils;
import com.fr.stable.StableUtils;
import com.fr.stable.StringUtils;
import com.fr.stable.bridge.ObjectHolder;
@ -52,7 +56,10 @@ import java.net.ServerSocket;
import java.net.Socket;
import java.net.URI;
import java.nio.charset.StandardCharsets;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
@ -491,4 +498,16 @@ public class DesignUtils {
return Utils.getAvailableFontFamilyNames4Report();
}
/**
* 获取设计器可用的开放的语言配置包括默认开放的五种语言和finedb扩展项
* @return Locale和翻译对应的key
*/
public static Map<Locale, String> getAvailableLanguages() {
Map<Locale, String> map = new LinkedHashMap<>(SupportLocale.getInstance().getLocaleMap());
map.remove(LocaleType.RU.getLocale());
for (Map.Entry<String, String> entry : DesignExtendLanguageConfig.getInstance().getExtendedDesignLocales().entrySet()) {
map.put(CommonUtils.stringToLocale(entry.getKey()), entry.getValue());
}
return Collections.unmodifiableMap(map);
}
}

128
designer-base/src/main/resources/com/fr/design/data/tabledata/datacenter/web/data-choose.main.js

File diff suppressed because one or more lines are too long

2
designer-realize/src/main/java/com/fanruan/boot/env/function/app/DesignAppComponent.java vendored

@ -10,7 +10,6 @@ import com.fr.design.mainframe.App;
import com.fr.design.mainframe.AppGroup;
import com.fr.design.mainframe.JTemplateFactory;
import com.fr.nx.app.designer.CptxApp;
import com.fr.workspace.server.repository.authority.RemoteAuthorityRepository;
import java.util.ArrayList;
import java.util.List;
@ -44,7 +43,6 @@ public class DesignAppComponent {
*/
@Stop
public void stop() {
RemoteAuthorityRepository.getInstance().invalidCache();
List<App> appList = new ArrayList<>(Carina.getApplicationContext().group(AppGroup.class).getAll());
for (App app : appList) {
JTemplateFactory.remove(app);

Loading…
Cancel
Save