@ -0,0 +1,339 @@
|
||||
package com.fr.design; |
||||
|
||||
import com.fr.base.FRContext; |
||||
import com.fr.design.env.DesignerWorkspaceInfo; |
||||
import com.fr.design.env.DesignerWorkspaceType; |
||||
import com.fr.design.env.RemoteWorkspace; |
||||
import com.fr.design.i18n.Toolkit; |
||||
import com.fr.design.mainframe.DesignerContext; |
||||
import com.fr.env.VersionCheckMessageDialog; |
||||
import com.fr.general.ComparatorUtils; |
||||
import com.fr.general.GeneralUtils; |
||||
import com.fr.invoke.Reflect; |
||||
import com.fr.json.JSONArray; |
||||
import com.fr.json.JSONObject; |
||||
import com.fr.locale.InterProviderFactory; |
||||
import com.fr.log.FineLoggerFactory; |
||||
import com.fr.plugin.context.PluginContext; |
||||
import com.fr.plugin.context.PluginMarker; |
||||
import com.fr.plugin.manage.PluginManager; |
||||
import com.fr.plugin.manage.control.PluginControllerHelper; |
||||
import com.fr.plugin.manage.control.PluginTaskCallback; |
||||
import com.fr.plugin.manage.control.PluginTaskResult; |
||||
import com.fr.plugin.manage.control.ProgressCallback; |
||||
import com.fr.rpc.Result; |
||||
import com.fr.stable.StringUtils; |
||||
import com.fr.workspace.WorkContext; |
||||
import com.fr.workspace.base.WorkspaceAPI; |
||||
import com.fr.workspace.connect.WorkspaceConnectionInfo; |
||||
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 java.lang.reflect.Method; |
||||
import java.text.ParsePosition; |
||||
import java.text.SimpleDateFormat; |
||||
import java.util.ArrayList; |
||||
import java.util.Date; |
||||
import java.util.HashMap; |
||||
import java.util.HashSet; |
||||
import java.util.List; |
||||
import java.util.Map; |
||||
import java.util.Set; |
||||
import java.util.concurrent.CountDownLatch; |
||||
import java.util.concurrent.TimeUnit; |
||||
|
||||
/** |
||||
* @author pengda |
||||
* @version 10.0 |
||||
* Created on 2021-06-02 |
||||
*/ |
||||
public class VersionCheckUtils { |
||||
public static final String INCONSISTENCY = "inconsistency"; |
||||
public static final String MISSING = "missing"; |
||||
private static final String ID = "id"; |
||||
private static final String VERSION = "version"; |
||||
private static final String NAME = "name"; |
||||
|
||||
|
||||
public static boolean versionCheck(String envName) { |
||||
return checkLocalAndRemoteJartime(envName) && checkLocalAndRemotePlugin().size() == 0; |
||||
} |
||||
|
||||
public static boolean versionCheck(DesignerWorkspaceInfo selectedEnv) { |
||||
return checkLocalAndRemoteJartime(selectedEnv) && checkLocalAndRemotePlugin().size() == 0; |
||||
} |
||||
|
||||
public static void showVersionCheckDialog(String envName) { |
||||
if (!VersionCheckUtils.versionCheck(envName)) { |
||||
VersionCheckMessageDialog versionCheckMessageDialog = new VersionCheckMessageDialog(DesignerContext.getDesignerFrame(), Toolkit.i18nText("Fine-Design_Basic_Sync_Check_Brief_Info"), envName); |
||||
versionCheckMessageDialog.setVisible(true); |
||||
} |
||||
} |
||||
|
||||
public static boolean checkLocalAndRemoteJartime(String envName) { |
||||
DesignerEnvManager envManager = DesignerEnvManager.getEnvManager(); |
||||
DesignerWorkspaceInfo selectedEnv = envManager.getWorkspaceInfo(envName); |
||||
return checkLocalAndRemoteJartime(selectedEnv); |
||||
} |
||||
|
||||
public static boolean checkLocalAndRemoteJartime(DesignerWorkspaceInfo selectedEnv) { |
||||
//是否需要做服务校验
|
||||
if (needCheckBranch(selectedEnv)) { |
||||
String localBranch; |
||||
String remoteBranch = getRemoteBranch(selectedEnv); |
||||
localBranch = GeneralUtils.readFullBuildNO(); |
||||
//通过是否包含#来避免当前版本为非安装版本(主要是内部开发版本)
|
||||
if (localBranch.contains("#") && ComparatorUtils.equals(localBranch, remoteBranch)) { |
||||
//说明版本一致,仅做日志记录
|
||||
FineLoggerFactory.getLogger().info("Remote Designer version consistency"); |
||||
return true; |
||||
} else { |
||||
return false; |
||||
} |
||||
} |
||||
return true; |
||||
} |
||||
|
||||
public static List<String> getNoExistServiceDescription(String envName) { |
||||
DesignerEnvManager envManager = DesignerEnvManager.getEnvManager(); |
||||
DesignerWorkspaceInfo selectedEnv = envManager.getWorkspaceInfo(envName); |
||||
WorkspaceConnectionInfo connectionInfo = selectedEnv.getConnection(); |
||||
List<String> noExistServiceDescription = new ArrayList<>(); |
||||
Set<Class> noExistServiceSet = getNoExistServiceSet(connectionInfo); |
||||
for (Class clazz : noExistServiceSet) { |
||||
WorkspaceAPI workspaceAPI = (WorkspaceAPI) clazz.getAnnotation(WorkspaceAPI.class); |
||||
if (workspaceAPI == null) { |
||||
FineLoggerFactory.getLogger().info("workspace service {} get annotation failed", clazz); |
||||
continue; |
||||
} |
||||
if (workspaceAPI.ignore()) { |
||||
continue; |
||||
} |
||||
String descriptionOfCN = InterProviderFactory.getProvider().getLocText(workspaceAPI.description()); |
||||
noExistServiceDescription.add(descriptionOfCN); |
||||
} |
||||
return noExistServiceDescription; |
||||
} |
||||
|
||||
public static String getRemoteBranch(String envName) { |
||||
DesignerEnvManager envManager = DesignerEnvManager.getEnvManager(); |
||||
DesignerWorkspaceInfo selectedEnv = envManager.getWorkspaceInfo(envName); |
||||
return getRemoteBranch(selectedEnv); |
||||
} |
||||
|
||||
public static String getRemoteBranch(DesignerWorkspaceInfo selectedEnv) { |
||||
String remoteBranch = StringUtils.EMPTY; |
||||
WorkspaceConnectionInfo connectionInfo = selectedEnv.getConnection(); |
||||
try { |
||||
remoteBranch = new FunctionalHttpRequest(connectionInfo).getServerBranch(); |
||||
} catch (WorkspaceConnectionException e) { |
||||
remoteBranch = Toolkit.i18nText("Fine-Design_Basic_Remote_Design_Branch_Is_Old") + formatBranch(GeneralUtils.readFullBuildNO()); |
||||
} catch (Exception e) { |
||||
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
||||
} |
||||
return remoteBranch; |
||||
} |
||||
|
||||
/** |
||||
* 获取不存在的服务列表 |
||||
* |
||||
* @param info 环境连接信息 |
||||
* @return 以Set形式返回不存在的服务 |
||||
*/ |
||||
public static Set<Class> getNoExistServiceSet(WorkspaceConnectionInfo info) { |
||||
Set<Class> noExistServiceSet = new HashSet<Class>(); |
||||
Set<Class> remoteServiceSet = new HashSet<Class>(); |
||||
Set<Class> localServiceSet = FineObjectPool.getInstance().getServerPool().keySet(); |
||||
|
||||
try { |
||||
JSONArray serviceArray = new FunctionalHttpRequest(info).getServiceList(); |
||||
for (int i = 0; i < serviceArray.size(); i++) { |
||||
try { |
||||
Class clazz = Class.forName((String) serviceArray.get(i)); |
||||
remoteServiceSet.add(clazz); |
||||
} catch (Exception e) { |
||||
continue; |
||||
} |
||||
} |
||||
noExistServiceSet.addAll(localServiceSet); |
||||
noExistServiceSet.removeAll(remoteServiceSet); |
||||
return noExistServiceSet; |
||||
} catch (WorkspaceConnectionException e) { |
||||
FineLoggerFactory.getLogger().info(e.getMessage()); |
||||
//根据本地的服务列表做逐一检测
|
||||
for (Class clazz : localServiceSet) { |
||||
Method testMethod = Reflect.on(Method.class).create(clazz, "connectTest", new Class[0], String.class, new Class[0], 1025, 8, null, null, null, null).get(); |
||||
WorkspaceProxyPool proxyPool = (WorkspaceProxyPool) (((RemoteWorkspace) WorkContext.getCurrent()).getClient()).getPool(); |
||||
Result result = proxyPool.testInvoker(testMethod); |
||||
Exception invokeException = (Exception) result.getException(); |
||||
if (invokeException != null) { |
||||
Exception cause = (Exception) invokeException.getCause(); |
||||
//获取被包装最底层的异常
|
||||
while (cause != null) { |
||||
invokeException = cause; |
||||
cause = (Exception) invokeException.getCause(); |
||||
} |
||||
//该异常表示服务不存在
|
||||
if (invokeException instanceof ClassNotFoundException) { |
||||
noExistServiceSet.add(clazz); |
||||
} |
||||
} |
||||
} |
||||
return noExistServiceSet; |
||||
} catch (Exception e) { |
||||
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
||||
return noExistServiceSet; |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 格式化分支版本号 |
||||
* |
||||
* @param buildNO 初始的分支版本号 |
||||
* @return 格式化后的版本号 |
||||
*/ |
||||
private static String formatBranch(String buildNO) { |
||||
Date jarDate = (new SimpleDateFormat("yyyy.MM.dd")).parse(buildNO, new ParsePosition(buildNO.indexOf("-") + 1)); |
||||
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); |
||||
return df.format(jarDate); |
||||
} |
||||
|
||||
private static boolean needCheckBranch(DesignerWorkspaceInfo selectedEnv) { |
||||
if (selectedEnv.getType() == DesignerWorkspaceType.Remote) { |
||||
return true; |
||||
} |
||||
return false; |
||||
} |
||||
|
||||
public static JSONArray checkLocalAndRemotePlugin() { |
||||
JSONArray differentPlugins = new JSONArray(); |
||||
JSONArray remotePlugins = FRContext.getCommonOperator().getPluginStatus(); |
||||
Map<String, PluginContext> localPluginsMap = new HashMap<>(); |
||||
List<PluginContext> localPlugins = PluginManager.getContexts(); |
||||
for (PluginContext pluginContext : localPlugins) { |
||||
localPluginsMap.put(pluginContext.getID(), pluginContext); |
||||
} |
||||
JSONObject remotePlugin; |
||||
for (int i = 0; i < remotePlugins.size(); i++) { |
||||
remotePlugin = remotePlugins.getJSONObject(i); |
||||
if (localPluginsMap.containsKey(remotePlugin.getString(ID))) { |
||||
if (ComparatorUtils.equals(localPluginsMap.get(remotePlugin.getString(ID)).getVersion(), remotePlugin.getString(VERSION))) { |
||||
continue; |
||||
} else { |
||||
if (remotePlugin.getString(NAME) == null) { |
||||
remotePlugin.put(NAME, localPluginsMap.get(remotePlugin.getString(ID)).getName()); |
||||
} |
||||
remotePlugin.put("type", INCONSISTENCY); |
||||
} |
||||
} |
||||
remotePlugin.put("type", MISSING); |
||||
if (remotePlugin.getString(NAME) == null) { |
||||
remotePlugin.put(NAME, remotePlugin.getString("id")); |
||||
} |
||||
differentPlugins.put(remotePlugin); |
||||
} |
||||
return differentPlugins; |
||||
} |
||||
|
||||
public static JSONArray syncPlugins(JSONArray differentPlugins) { |
||||
Set<String> uninstallFailed = uninstallPlugins(differentPlugins); |
||||
List<PluginMarker> plugins = getSyncPlugins(differentPlugins, uninstallFailed); |
||||
installPlugins(plugins); |
||||
return getPluginsSyncFailed(differentPlugins); |
||||
} |
||||
|
||||
private static List<PluginMarker> getSyncPlugins(JSONArray differentPlugins, Set<String> uninstallFailed) { |
||||
JSONObject differentPlugin; |
||||
String id; |
||||
String version; |
||||
List<PluginMarker> plugins = new ArrayList<>(); |
||||
if (differentPlugins != null) { |
||||
for (int i = 0; i < differentPlugins.size(); i++) { |
||||
differentPlugin = differentPlugins.getJSONObject(i); |
||||
id = differentPlugin.getString(ID); |
||||
if (uninstallFailed.contains(id)) { |
||||
continue; |
||||
} |
||||
version = differentPlugin.getString(VERSION); |
||||
plugins.add(PluginMarker.create(id, version)); |
||||
} |
||||
} |
||||
return plugins; |
||||
} |
||||
|
||||
private static Set<String> uninstallPlugins(JSONArray differentPlugins) { |
||||
Set<PluginMarker> pluginsNeedUninstall = new HashSet<>(); |
||||
Map<String, PluginContext> localPluginsMap = new HashMap<>(); |
||||
List<PluginContext> localPlugins = PluginManager.getContexts(); |
||||
for (PluginContext pluginContext : localPlugins) { |
||||
localPluginsMap.put(pluginContext.getID(), pluginContext); |
||||
} |
||||
for (int i = 0; i < differentPlugins.size(); i++) { |
||||
String id = differentPlugins.getJSONObject(i).getString(ID); |
||||
if (localPluginsMap.containsKey(id)) { |
||||
pluginsNeedUninstall.add(localPluginsMap.get(id).getMarker()); |
||||
} |
||||
} |
||||
Set<String> uninstallFailedID = new HashSet<>(); |
||||
CountDownLatch latch = new CountDownLatch(pluginsNeedUninstall.size()); |
||||
for (PluginMarker pluginMarker : pluginsNeedUninstall) { |
||||
PluginManager.getController().uninstall(pluginMarker, true, new PluginTaskCallback() { |
||||
@Override |
||||
public void done(PluginTaskResult result) { |
||||
latch.countDown(); |
||||
if (!result.isSuccess()) { |
||||
uninstallFailedID.add(pluginMarker.getPluginID()); |
||||
} |
||||
} |
||||
}); |
||||
} |
||||
try { |
||||
latch.await(5000, TimeUnit.MILLISECONDS); |
||||
} catch (Exception e) { |
||||
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
||||
} |
||||
return uninstallFailedID; |
||||
} |
||||
|
||||
private static JSONArray getPluginsSyncFailed(JSONArray differentPlugins){ |
||||
JSONArray pluginsNeedSync = JSONArray.create(); |
||||
List<PluginContext> localPlugins = PluginManager.getContexts(); |
||||
Map<String, String> localPluginsInfo = new HashMap<>(); |
||||
for (int i = 0; i < localPlugins.size(); i++) { |
||||
localPluginsInfo.put(localPlugins.get(i).getID(), localPlugins.get(i).getVersion()); |
||||
} |
||||
for (int i = 0; i < differentPlugins.size(); i++) { |
||||
JSONObject plugin = differentPlugins.getJSONObject(i); |
||||
String id = plugin.getString(ID); |
||||
if (localPluginsInfo.containsKey(id) && ComparatorUtils.equals(plugin.getString(VERSION), localPluginsInfo.get(id))) { |
||||
continue; |
||||
} |
||||
pluginsNeedSync.add(plugin); |
||||
} |
||||
return pluginsNeedSync; |
||||
} |
||||
|
||||
private static void installPlugins(List<PluginMarker> plugins) { |
||||
CountDownLatch latch = new CountDownLatch(plugins.size()); |
||||
for (int i = 0; i < plugins.size(); i++) { |
||||
PluginControllerHelper.installOnline(plugins.get(i), new ProgressCallback() { |
||||
@Override |
||||
public void updateProgress(String description, double progress) { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void done(PluginTaskResult result) { |
||||
latch.countDown(); |
||||
} |
||||
}); |
||||
} |
||||
try { |
||||
latch.await(); |
||||
} catch (InterruptedException e) { |
||||
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
||||
} |
||||
|
||||
} |
||||
} |
@ -0,0 +1,277 @@
|
||||
package com.fr.design.data.datapane.preview.sql; |
||||
|
||||
import com.fr.base.Parameter; |
||||
import com.fr.base.ParameterHelper; |
||||
import com.fr.base.ParameterMapNameSpace; |
||||
import com.fr.data.impl.DBTableData; |
||||
import com.fr.data.impl.EscapeSqlHelper; |
||||
import com.fr.data.operator.DataOperator; |
||||
import com.fr.decision.webservice.v10.config.ConfigService; |
||||
import com.fr.design.dialog.DialogActionAdapter; |
||||
import com.fr.design.dialog.link.MessageWithLink; |
||||
import com.fr.design.gui.ibutton.UIButton; |
||||
import com.fr.design.gui.ilable.UILabel; |
||||
import com.fr.design.i18n.Toolkit; |
||||
import com.fr.design.layout.FRGUIPaneFactory; |
||||
import com.fr.design.mainframe.DesignerContext; |
||||
import com.fr.design.parameter.ParameterInputPane; |
||||
import com.fr.design.utils.gui.GUICoreUtils; |
||||
import com.fr.general.CloudCenter; |
||||
import com.fr.general.GeneralContext; |
||||
import com.fr.log.FineLoggerFactory; |
||||
import com.fr.plugin.injectable.PluginModule; |
||||
import com.fr.script.Calculator; |
||||
import com.fr.stable.ArrayUtils; |
||||
import com.fr.stable.ParameterProvider; |
||||
import com.fr.stable.StringUtils; |
||||
import com.fr.stable.fun.TableDataProvider; |
||||
import com.fr.stable.plugin.ExtraClassManagerProvider; |
||||
import com.fr.stable.script.NameSpace; |
||||
|
||||
import javax.swing.BorderFactory; |
||||
import javax.swing.JDialog; |
||||
import javax.swing.JFrame; |
||||
import javax.swing.JLabel; |
||||
import javax.swing.JPanel; |
||||
import javax.swing.JScrollPane; |
||||
import javax.swing.JTextArea; |
||||
import javax.swing.UIManager; |
||||
import javax.swing.text.BadLocationException; |
||||
import javax.swing.text.DefaultHighlighter; |
||||
import javax.swing.text.Highlighter; |
||||
import java.awt.BorderLayout; |
||||
import java.awt.Color; |
||||
import java.awt.Cursor; |
||||
import java.awt.Frame; |
||||
import java.awt.datatransfer.StringSelection; |
||||
import java.awt.event.ActionEvent; |
||||
import java.awt.event.ActionListener; |
||||
import java.util.HashMap; |
||||
import java.util.HashSet; |
||||
import java.util.List; |
||||
import java.util.Locale; |
||||
import java.util.Map; |
||||
import java.util.Set; |
||||
|
||||
public class PreviewPerformedSqlPane extends JDialog implements ActionListener { |
||||
|
||||
private JPanel topPanel; |
||||
private JPanel centerPanel; |
||||
private JPanel bottomPanel; |
||||
|
||||
private UILabel imageLabel; |
||||
|
||||
public PreviewPerformedSqlPane(Frame frame, String sql) { |
||||
this(frame, sql, null, null, false); |
||||
} |
||||
|
||||
public PreviewPerformedSqlPane(Frame frame, String sql, List<int[]> selectedSpecialCharIndex, String[] selectedSpecialChar, boolean highlight) { |
||||
super(frame, true); |
||||
// 提示信息
|
||||
topPanel = FRGUIPaneFactory.createBorderLayout_L_Pane(); |
||||
JPanel imagePanel = new JPanel(); |
||||
JPanel messagePanel; |
||||
|
||||
if (isShowSpecialCharSqlPane(selectedSpecialCharIndex)) { |
||||
imageLabel = new UILabel(UIManager.getIcon("OptionPane.warningIcon")); |
||||
messagePanel = new JPanel(); |
||||
messagePanel.setLayout(FRGUIPaneFactory.createBorderLayout()); |
||||
messagePanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 0, 0)); |
||||
// 日韩取消超链,直接显示文字
|
||||
if (isNotShowLink()) { |
||||
JLabel label = new JLabel(Toolkit.i18nText("Fine-Design_Basic_Preview_Performed_Sql_Message") + Toolkit.i18nText("Fine-Design_Basic_Sql_Injection_Prevention") + Toolkit.i18nText("Fine-Design_Basic_Preview_Special_Char_Sql_Back_Message")); |
||||
messagePanel.add(label); |
||||
} else { |
||||
MessageWithLink message = new MessageWithLink(Toolkit.i18nText("Fine-Design_Basic_Preview_Special_Char_Sql_Front_Message"), Toolkit.i18nText("Fine-Design_Basic_Sql_Injection_Prevention"), CloudCenter.getInstance().acquireConf(Toolkit.i18nText("Fine-Design_Basic_Sql_Injection_Prevention_Help"), "https://help.fanruan.com/finereport/doc-view-2219.html"), Toolkit.i18nText("Fine-Design_Basic_Preview_Special_Char_Sql_Back_Message")); |
||||
messagePanel.add(message); |
||||
} |
||||
// 提示图标
|
||||
JPanel tipPanel = FRGUIPaneFactory.createBorderLayout_L_Pane(); |
||||
UILabel tipLabel = new UILabel(UIManager.getIcon("OptionPane.tipIcon")); |
||||
StringBuilder textBuilder = new StringBuilder(); |
||||
textBuilder.append("<html>").append(Toolkit.i18nText("Fine-Design_Basic_Processed_Special_Char")).append("<br/>"); |
||||
for (String sChar : selectedSpecialChar) { |
||||
textBuilder.append(sChar).append("<br/>"); |
||||
} |
||||
textBuilder.append("</html>"); |
||||
tipLabel.setToolTipText(textBuilder.toString()); |
||||
tipPanel.add(tipLabel, BorderLayout.SOUTH); |
||||
topPanel.add(tipPanel, BorderLayout.EAST); |
||||
} else { |
||||
imageLabel = new UILabel(UIManager.getIcon("OptionPane.informationIcon")); |
||||
messagePanel = FRGUIPaneFactory.createVerticalFlowLayout_S_Pane(true); |
||||
JLabel label = new JLabel(Toolkit.i18nText("Fine-Design_Basic_Preview_Performed_Sql_Message")); |
||||
messagePanel.add(label); |
||||
} |
||||
imagePanel.add(imageLabel); |
||||
|
||||
topPanel.add(imagePanel, BorderLayout.WEST); |
||||
topPanel.add(messagePanel, BorderLayout.CENTER); |
||||
topPanel.setBorder(BorderFactory.createEmptyBorder(10,10,0,10)); |
||||
|
||||
//中间的SQL面板
|
||||
centerPanel = FRGUIPaneFactory.createBorderLayout_L_Pane(); |
||||
centerPanel.setBorder(BorderFactory.createEmptyBorder(0,10,10,10)); |
||||
JScrollPane scrollPane = new JScrollPane(); |
||||
JTextArea checkArea = new JTextArea(sql); |
||||
checkArea.setEditable(false); |
||||
checkArea.setCursor(new Cursor(Cursor.TEXT_CURSOR)); |
||||
if (highlight) { |
||||
Highlighter highLighter = checkArea.getHighlighter(); |
||||
DefaultHighlighter.DefaultHighlightPainter p = new DefaultHighlighter.DefaultHighlightPainter(Color.ORANGE); |
||||
for (int[] specialCharIndex : selectedSpecialCharIndex) { |
||||
try { |
||||
highLighter.addHighlight(specialCharIndex[0], specialCharIndex[1], p); |
||||
} catch (BadLocationException e) { |
||||
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
||||
} |
||||
} |
||||
} |
||||
scrollPane.setViewportView(checkArea); |
||||
scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); |
||||
centerPanel.add(scrollPane); |
||||
|
||||
//底部的按钮面板
|
||||
UIButton okButton = new UIButton(Toolkit.i18nText("Fine-Design_Report_OK")); |
||||
okButton.addActionListener(this); |
||||
bottomPanel = FRGUIPaneFactory.createBorderLayout_L_Pane(); |
||||
bottomPanel.setBorder(BorderFactory.createEmptyBorder(10,10,10,10)); |
||||
bottomPanel.add(okButton, BorderLayout.EAST); |
||||
|
||||
this.setTitle(Toolkit.i18nText("Fine-Design_Basic_Preview_Performed_Sql")); |
||||
this.setResizable(false); |
||||
this.add(topPanel, BorderLayout.NORTH); |
||||
this.add(centerPanel, BorderLayout.CENTER); |
||||
this.add(bottomPanel, BorderLayout.SOUTH); |
||||
this.setSize(600, 400); |
||||
|
||||
GUICoreUtils.centerWindow(this); |
||||
} |
||||
|
||||
private boolean isNotShowLink() { |
||||
return GeneralContext.getLocale().equals(Locale.JAPAN) || GeneralContext.getLocale().equals(Locale.KOREA); |
||||
} |
||||
|
||||
public static void previewPerformedSql(DBTableData tableData) { |
||||
Calculator calculator = Calculator.createCalculator(); |
||||
//参数
|
||||
ParameterProvider[] parameters = DataOperator.getInstance().getTableDataParameters(tableData); |
||||
if (ArrayUtils.isEmpty(parameters)) { |
||||
parameters = tableData.getParameters(calculator); |
||||
} |
||||
Map<String, Object> parameterMap = new HashMap<>(); |
||||
if (needInputParams(parameters)) { |
||||
showParaWindow(parameterMap, parameters); |
||||
} else { |
||||
for (ParameterProvider parameter : parameters) { |
||||
parameterMap.put(parameter.getName(), parameter.getValue()); |
||||
} |
||||
} |
||||
boolean showOriginSql = true; |
||||
for (ParameterProvider parameter : DataOperator.getInstance().getTableDataParameters(tableData)) { |
||||
if (parameterMap.containsKey(parameter.getName())) { |
||||
Object value = parameterMap.get(parameter.getName()); |
||||
if (value != null && !StringUtils.EMPTY.equals(value)) { |
||||
showOriginSql = false; |
||||
} |
||||
parameter.setValue(value); |
||||
} |
||||
} |
||||
String sql; |
||||
// 计算高亮文本位置
|
||||
List<int[]> specialCharParamIndex = null; |
||||
boolean highlight = true; |
||||
if (showOriginSql) { |
||||
sql = tableData.getQuery(); |
||||
} else { |
||||
NameSpace ns = ParameterMapNameSpace.create(parameterMap); |
||||
calculator.pushNameSpace(ns); |
||||
Parameter[] paras = processParameters(tableData, calculator); |
||||
// 所有被转义参数的集合
|
||||
Set<String> specialCharParam = EscapeSqlHelper.getInstance().getSpecialCharParam(paras); |
||||
// 将参数转义等
|
||||
Set<TableDataProvider> tableDataProviders = getTableDataProviders(); |
||||
for (TableDataProvider provider : tableDataProviders) { |
||||
provider.processParametersBeforeAnalyzeSQL(paras, calculator); |
||||
} |
||||
|
||||
if (!specialCharParam.isEmpty()) { |
||||
specialCharParamIndex = ParameterHelper.analyzeCurrentContextTableData4Template(tableData.getQuery(), paras, specialCharParam); |
||||
} |
||||
String oldSql = ParameterHelper.analyzeCurrentContextTableData4Templatee(tableData.getQuery(), paras); |
||||
sql = processExtraSQL(paras, oldSql, calculator, tableDataProviders); |
||||
if (!StringUtils.equals(oldSql, sql)) { |
||||
highlight = false; |
||||
} |
||||
} |
||||
// sql内容复制到剪切板
|
||||
StringSelection selection = new StringSelection(sql); |
||||
java.awt.Toolkit.getDefaultToolkit().getSystemClipboard().setContents(selection, selection); |
||||
// 弹窗
|
||||
PreviewPerformedSqlPane pane; |
||||
if (isShowSpecialCharSqlPane(specialCharParamIndex)) { |
||||
pane = new PreviewPerformedSqlPane(DesignerContext.getDesignerFrame(), sql, specialCharParamIndex, ConfigService.getInstance().getPSIConfig().getSelectedSpecialChar(), highlight); |
||||
} else { |
||||
pane = new PreviewPerformedSqlPane(DesignerContext.getDesignerFrame(), sql); |
||||
} |
||||
pane.setVisible(true); |
||||
} |
||||
|
||||
private static boolean isShowSpecialCharSqlPane(List<int[]> specialCharParamIndex) { |
||||
return specialCharParamIndex != null && !specialCharParamIndex.isEmpty(); |
||||
} |
||||
|
||||
private static Parameter[] processParameters(DBTableData tableData, Calculator calculator) { |
||||
ParameterProvider[] parameters = tableData.getParameters(); |
||||
if (parameters == null || parameters.length == 0) { |
||||
tableData.setParameters(ParameterHelper.analyze4Parameters(tableData.getQuery(), false)); |
||||
return new Parameter[0]; |
||||
} |
||||
return Parameter.providers2Parameter(Calculator.processParameters(calculator, parameters)); |
||||
} |
||||
|
||||
private static String processExtraSQL(Parameter[] ps, String sql, Calculator ca, Set<TableDataProvider> tableDataProviders) { |
||||
for (TableDataProvider provider : tableDataProviders) { |
||||
String newSql = provider.processTableDataSQL(ps, sql, ca); |
||||
if (StringUtils.isNotEmpty(newSql)) { |
||||
sql = newSql; |
||||
} |
||||
} |
||||
return sql; |
||||
} |
||||
|
||||
private static boolean needInputParams(ParameterProvider[] parameters) { |
||||
if (ArrayUtils.isNotEmpty(parameters)) { |
||||
return true; |
||||
} |
||||
for (ParameterProvider parameter : parameters) { |
||||
if (parameter.getValue() == null || StringUtils.EMPTY.equals(parameter.getValue())) { |
||||
return true; |
||||
} |
||||
} |
||||
return false; |
||||
} |
||||
|
||||
private static void showParaWindow(final Map<String, Object> parameterMap, ParameterProvider[] inParameters) { |
||||
final ParameterInputPane pPane = new ParameterInputPane(inParameters); |
||||
pPane.showSmallWindow(new JFrame(), new DialogActionAdapter() { |
||||
@Override |
||||
public void doOk() { |
||||
parameterMap.putAll(pPane.update()); |
||||
} |
||||
}).setVisible(true); |
||||
} |
||||
|
||||
private static Set<TableDataProvider> getTableDataProviders() { |
||||
ExtraClassManagerProvider classManagerProvider = PluginModule.getAgent(PluginModule.ExtraCore); |
||||
if (classManagerProvider == null) { |
||||
return new HashSet<>(); |
||||
} |
||||
return classManagerProvider.getArray(TableDataProvider.XML_TAG, EscapeSqlHelper.getInstance()); |
||||
} |
||||
|
||||
@Override |
||||
public void actionPerformed(ActionEvent e) { |
||||
this.dispose(); |
||||
} |
||||
} |
@ -0,0 +1,50 @@
|
||||
package com.fr.design.update.actions; |
||||
|
||||
import com.fr.decision.update.SyncExecutor; |
||||
import com.fr.decision.update.info.UpdateCallBack; |
||||
import com.fr.log.FineLoggerFactory; |
||||
import java.util.concurrent.ExecutionException; |
||||
import javax.swing.SwingWorker; |
||||
|
||||
public abstract class SyncFileProcess extends SwingWorker<Boolean, Void> { |
||||
private UpdateCallBack callBack; |
||||
private String buildNo; |
||||
|
||||
public SyncFileProcess(UpdateCallBack callBack,String buildNo) { |
||||
this.callBack = callBack; |
||||
this.buildNo = buildNo; |
||||
} |
||||
|
||||
@Override |
||||
protected Boolean doInBackground() throws Exception { |
||||
return SyncExecutor.getInstance().execute(callBack,buildNo); |
||||
} |
||||
|
||||
@Override |
||||
protected void done() { |
||||
boolean success = false; |
||||
try { |
||||
success = get(); |
||||
} catch (InterruptedException e) { |
||||
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
||||
Thread.currentThread().interrupt(); |
||||
} catch (ExecutionException e) { |
||||
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
||||
} |
||||
if (success) { |
||||
onDownloadSuccess(); |
||||
} else { |
||||
onDownloadFailed(); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 下载成功 |
||||
*/ |
||||
public abstract void onDownloadSuccess(); |
||||
|
||||
/** |
||||
* 下载失败 |
||||
*/ |
||||
public abstract void onDownloadFailed(); |
||||
} |
@ -0,0 +1,73 @@
|
||||
package com.fr.env; |
||||
|
||||
import com.fr.design.dialog.link.MessageWithLink; |
||||
import com.fr.design.gui.ibutton.UIButton; |
||||
import com.fr.design.gui.ilable.UILabel; |
||||
import com.fr.design.i18n.Toolkit; |
||||
import com.fr.design.layout.FRGUIPaneFactory; |
||||
import com.fr.design.utils.gui.GUICoreUtils; |
||||
import com.fr.general.CloudCenter; |
||||
import com.fr.general.GeneralContext; |
||||
import com.fr.general.IOUtils; |
||||
import java.awt.BorderLayout; |
||||
import java.awt.Dimension; |
||||
import java.awt.Frame; |
||||
import java.awt.event.ActionEvent; |
||||
import java.awt.event.ActionListener; |
||||
import java.util.Locale; |
||||
import javax.swing.BorderFactory; |
||||
import javax.swing.JDialog; |
||||
import javax.swing.JPanel; |
||||
|
||||
/** |
||||
* 主jar下载失败的弹出框 |
||||
* |
||||
* */ |
||||
|
||||
public class ErrorDialog extends JDialog implements ActionListener { |
||||
public ErrorDialog(Frame parent, String message) { |
||||
super(parent, true); |
||||
init(message); |
||||
} |
||||
|
||||
private void init(String message){ |
||||
//主体内容
|
||||
JPanel centerPanel = FRGUIPaneFactory.createBorderLayout_L_Pane(); |
||||
|
||||
//带超链的提示信息
|
||||
JPanel messagePanel = FRGUIPaneFactory.createLeftFlowZeroGapBorderPane(); |
||||
messagePanel.setBorder(BorderFactory.createEmptyBorder(5,0,0,0)); |
||||
|
||||
MessageWithLink messageWithLink = new MessageWithLink(message + ",", Toolkit.i18nText("Fine-Design_Basic_Sync_Help"), CloudCenter.getInstance().acquireUrlByKind("help.replacejars", "https://help.fanruan.com/finereport/doc-view-3268.html")); |
||||
messageWithLink.setPreferredSize(new Dimension(108, 20)); |
||||
JPanel messageLinkPane = FRGUIPaneFactory.createBorderLayout_L_Pane(); |
||||
messageLinkPane.setBorder(BorderFactory.createEmptyBorder(5, 8, 5, 0)); |
||||
messageLinkPane.add(messageWithLink); |
||||
|
||||
//错误提示图标
|
||||
UILabel imageLabel = new UILabel(IOUtils.readIcon("com/fr/design/icon/versioncheck/bigfail.png")); |
||||
messagePanel.add(imageLabel); |
||||
messagePanel.add(messageLinkPane); |
||||
|
||||
//确定按钮
|
||||
UIButton ok = new UIButton(Toolkit.i18nText("Fine-Design_Basic_Button_OK")); |
||||
ok.addActionListener(this); |
||||
ok.setSize(new Dimension(44, 20)); |
||||
JPanel okPanel = FRGUIPaneFactory.createRightFlowInnerContainer_S_Pane(); |
||||
okPanel.add(ok); |
||||
|
||||
centerPanel.add(messagePanel, BorderLayout.CENTER); |
||||
centerPanel.add(okPanel, BorderLayout.SOUTH); |
||||
|
||||
this.setTitle(Toolkit.i18nText("Fine-Design_Basic_Tool_Tips")); |
||||
this.setResizable(false); |
||||
this.add(centerPanel, BorderLayout.CENTER); |
||||
this.setSize(new Dimension(GeneralContext.getLocale().equals(Locale.US) ? 282 : 262, 118)); |
||||
GUICoreUtils.centerWindow(this); |
||||
} |
||||
|
||||
@Override |
||||
public void actionPerformed(ActionEvent e) { |
||||
this.dispose(); |
||||
} |
||||
} |
@ -0,0 +1,119 @@
|
||||
package com.fr.env; |
||||
|
||||
import com.fr.design.RestartHelper; |
||||
import com.fr.design.dialog.link.MessageWithLink; |
||||
import com.fr.design.gui.ibutton.UIButton; |
||||
import com.fr.design.gui.ilable.UILabel; |
||||
import com.fr.design.gui.itextarea.UITextArea; |
||||
import com.fr.design.i18n.Toolkit; |
||||
import com.fr.design.layout.FRGUIPaneFactory; |
||||
import com.fr.design.mainframe.DesignerContext; |
||||
import com.fr.design.utils.gui.GUICoreUtils; |
||||
import com.fr.general.CloudCenter; |
||||
import com.fr.general.GeneralContext; |
||||
import com.fr.general.IOUtils; |
||||
import com.fr.json.JSONArray; |
||||
import com.fr.json.JSONObject; |
||||
import com.fr.stable.StringUtils; |
||||
import java.awt.BorderLayout; |
||||
import java.awt.Dimension; |
||||
import java.awt.Frame; |
||||
import java.awt.event.MouseAdapter; |
||||
import java.awt.event.MouseEvent; |
||||
import java.awt.event.MouseListener; |
||||
import java.util.Locale; |
||||
import javax.swing.BorderFactory; |
||||
import javax.swing.Icon; |
||||
import javax.swing.JDialog; |
||||
import javax.swing.JLabel; |
||||
import javax.swing.JPanel; |
||||
import javax.swing.JScrollPane; |
||||
import javax.swing.UIManager; |
||||
|
||||
/** |
||||
* @author pengda |
||||
* @version 10.0 |
||||
* Created on 2021-06-02 |
||||
*/ |
||||
public class SyncFailedPluginsDialog extends JDialog { |
||||
private UILabel detailsLabel; |
||||
private JScrollPane scrollPane; |
||||
public SyncFailedPluginsDialog(Frame parent, JSONArray syncFailedPlugins) { |
||||
super(parent, true); |
||||
JPanel body = FRGUIPaneFactory.createBorderLayout_L_Pane(); |
||||
|
||||
JPanel northPane = FRGUIPaneFactory.createBorderLayout_L_Pane(); |
||||
northPane.setBorder(BorderFactory.createEmptyBorder(0,0,5,0)); |
||||
JPanel imagePanel = new JPanel(); |
||||
Icon icon = IOUtils.readIcon("com/fr/design/icon/versioncheck/warning.png"); |
||||
JLabel imageLabel = new JLabel(); |
||||
imageLabel.setIcon(icon); |
||||
imagePanel.add(imageLabel); |
||||
imagePanel.setPreferredSize(new Dimension(20, 20)); |
||||
|
||||
JPanel messagePane = FRGUIPaneFactory.createBorderLayout_S_Pane(); |
||||
MessageWithLink messageWithLink = new MessageWithLink(Toolkit.i18nText("Fine-Design_Basic_Sync_Plugin_Fail_Suggestion"),Toolkit.i18nText("Fine-Design_Basic_Sync_Deal_Immediately"), |
||||
CloudCenter.getInstance().acquireUrlByKind("help.installplugins", "https://help.fanruan.com/finereport/doc-view-2198.html")); |
||||
messageWithLink.setPreferredSize(new Dimension(316, 20)); |
||||
|
||||
messagePane.add(messageWithLink); |
||||
messagePane.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 0)); |
||||
|
||||
northPane.add(imageLabel, BorderLayout.WEST); |
||||
northPane.add(messagePane, BorderLayout.CENTER); |
||||
|
||||
JPanel centerPanel = FRGUIPaneFactory.createBorderLayout_S_Pane(); |
||||
detailsLabel = new UILabel(Toolkit.i18nText("Fine_Designer_Look_Detail")); |
||||
detailsLabel.setIcon(UIManager.getIcon("OptionPane.narrow.down")); |
||||
detailsLabel.addMouseListener(detailsLabelClickListener); |
||||
JPanel detailsTitlePanel = FRGUIPaneFactory.createLeftFlowZeroGapBorderPane(); |
||||
detailsTitlePanel.add(detailsLabel); |
||||
detailsTitlePanel.setBorder(BorderFactory.createEmptyBorder(0,0,5,0)); |
||||
|
||||
UITextArea detailsTextArea = new UITextArea(); |
||||
StringBuilder detailsText = new StringBuilder(StringUtils.EMPTY); |
||||
for (int i = 0; i < syncFailedPlugins.size(); i++) { |
||||
JSONObject plugin = syncFailedPlugins.getJSONObject(i); |
||||
detailsText.append(plugin.getString("name")).append(",").append(Toolkit.i18nText("Fine-Design_Basic_Sync_Server_Version")).append(plugin.getString("version")).append("\n"); |
||||
} |
||||
detailsTextArea.setText(detailsText.toString()); |
||||
scrollPane = new JScrollPane(detailsTextArea); |
||||
centerPanel.add(detailsTitlePanel,BorderLayout.NORTH); |
||||
centerPanel.add(scrollPane,BorderLayout.CENTER); |
||||
|
||||
JPanel southPane = FRGUIPaneFactory.createRightFlowInnerContainer_S_Pane(); |
||||
UIButton restartButton = new UIButton(Toolkit.i18nText("Fine-Design_Updater_Restart_Designer")); |
||||
restartButton.addMouseListener(restartButtonClickListener); |
||||
southPane.add(restartButton); |
||||
|
||||
body.add(northPane,BorderLayout.NORTH); |
||||
body.add(centerPanel,BorderLayout.CENTER); |
||||
body.add(southPane,BorderLayout.SOUTH); |
||||
|
||||
this.setTitle(Toolkit.i18nText("Fine-Design_Basic_Tool_Tips")); |
||||
this.setResizable(false); |
||||
this.add(body, BorderLayout.CENTER); |
||||
this.setSize(new Dimension(GeneralContext.getLocale().equals(Locale.US) ? 400 : 380, 225)); |
||||
GUICoreUtils.centerWindow(this); |
||||
} |
||||
|
||||
private MouseListener detailsLabelClickListener = new MouseAdapter() { |
||||
@Override |
||||
public void mouseClicked(MouseEvent e) { |
||||
if(scrollPane.isVisible()){ |
||||
scrollPane.setVisible(false); |
||||
detailsLabel.setIcon(UIManager.getIcon("OptionPane.narrow.right")); |
||||
}else{ |
||||
scrollPane.setVisible(true); |
||||
detailsLabel.setIcon(UIManager.getIcon("OptionPane.narrow.down")); |
||||
} |
||||
} |
||||
}; |
||||
|
||||
private MouseListener restartButtonClickListener = new MouseAdapter() { |
||||
@Override |
||||
public void mouseClicked(MouseEvent e) { |
||||
RestartHelper.restartForUpdate(DesignerContext.getDesignerFrame()); |
||||
} |
||||
}; |
||||
} |
@ -0,0 +1,105 @@
|
||||
package com.fr.env; |
||||
|
||||
import com.fr.design.VersionCheckUtils; |
||||
import com.fr.design.gui.ilable.UILabel; |
||||
import com.fr.design.i18n.Toolkit; |
||||
import com.fr.design.layout.FRGUIPaneFactory; |
||||
import com.fr.design.mainframe.DesignerContext; |
||||
import com.fr.design.utils.gui.GUICoreUtils; |
||||
import com.fr.general.ComparatorUtils; |
||||
import com.fr.general.GeneralContext; |
||||
import com.fr.general.GeneralUtils; |
||||
import com.fr.general.IOUtils; |
||||
import java.awt.BorderLayout; |
||||
import java.awt.Color; |
||||
import java.awt.Dimension; |
||||
import java.awt.Frame; |
||||
import java.awt.event.ActionEvent; |
||||
import java.awt.event.ActionListener; |
||||
import java.awt.event.MouseAdapter; |
||||
import java.awt.event.MouseEvent; |
||||
import java.util.ArrayList; |
||||
import java.util.List; |
||||
import java.util.Locale; |
||||
import javax.swing.BorderFactory; |
||||
import javax.swing.JDialog; |
||||
import javax.swing.JPanel; |
||||
|
||||
/** |
||||
* @author pengda |
||||
* @version 10.0 |
||||
* Created on 2021-06-02 |
||||
*/ |
||||
public class VersionCheckMessageDialog extends JDialog implements ActionListener { |
||||
private UILabel imageLabel; |
||||
private UILabel detailLabel; |
||||
private JPanel centerPanel; |
||||
private JPanel detailPanel; |
||||
private JPanel body; |
||||
private String envName; |
||||
|
||||
public VersionCheckMessageDialog(Frame parent, String message, String envName) { |
||||
super(parent, true); |
||||
this.envName = envName; |
||||
init(message); |
||||
} |
||||
|
||||
private void init(String message) { |
||||
JPanel imagePanel = new JPanel(); |
||||
imageLabel = new UILabel(IOUtils.readIcon("com/fr/design/images/warnings/warning32.png")); |
||||
imagePanel.add(imageLabel); |
||||
JPanel messagePanel = FRGUIPaneFactory.createVerticalFlowLayout_S_Pane(true); |
||||
UILabel messageText = new UILabel(); |
||||
messageText.setText("<html>" + message + "</html>"); |
||||
messagePanel.add(messageText); |
||||
|
||||
centerPanel = FRGUIPaneFactory.createBorderLayout_L_Pane(); |
||||
centerPanel.setBorder(BorderFactory.createEmptyBorder(15, 10, 10, 10)); |
||||
centerPanel.add(imagePanel, BorderLayout.WEST); |
||||
centerPanel.add(messagePanel, BorderLayout.CENTER); |
||||
|
||||
detailLabel = new UILabel(); |
||||
detailLabel.setText(Toolkit.i18nText("Fine_Designer_Look_Detail")); |
||||
detailLabel.setForeground(Color.BLUE); |
||||
|
||||
detailPanel = FRGUIPaneFactory.createBorderLayout_L_Pane(); |
||||
detailPanel.add(detailLabel, BorderLayout.EAST); |
||||
|
||||
String localBranch = GeneralUtils.readFullBuildNO(); |
||||
String remoteBranch = VersionCheckUtils.getRemoteBranch(envName); |
||||
List<String> noExistServiceDescription; |
||||
if(ComparatorUtils.equals(localBranch,remoteBranch)) { |
||||
noExistServiceDescription = new ArrayList<>(); |
||||
}else{ |
||||
noExistServiceDescription = VersionCheckUtils.getNoExistServiceDescription(this.envName); |
||||
} |
||||
|
||||
detailPanel.addMouseListener(new MouseAdapter() { |
||||
@Override |
||||
public void mouseClicked(MouseEvent e) { |
||||
hideDialog(); |
||||
CheckServiceDialog checkServiceDialog = new CheckServiceDialog(DesignerContext.getDesignerFrame(), localBranch, remoteBranch, noExistServiceDescription); |
||||
checkServiceDialog.setVisible(true); |
||||
} |
||||
}); |
||||
|
||||
body = FRGUIPaneFactory.createBorderLayout_S_Pane(); |
||||
body.add(centerPanel, BorderLayout.CENTER); |
||||
body.add(detailPanel, BorderLayout.SOUTH); |
||||
|
||||
this.setTitle(Toolkit.i18nText("Fine-Design_Basic_Sync_Prompt")); |
||||
this.setResizable(false); |
||||
this.add(body, BorderLayout.NORTH); |
||||
this.setSize(new Dimension(GeneralContext.getLocale().equals(Locale.US) ? 300 : 280, 135)); |
||||
GUICoreUtils.centerWindow(this); |
||||
} |
||||
|
||||
private void hideDialog(){ |
||||
this.dispose(); |
||||
} |
||||
|
||||
@Override |
||||
public void actionPerformed(ActionEvent e) { |
||||
hideDialog(); |
||||
} |
||||
} |
@ -1 +1,5 @@
|
||||
com.fr.design.mainframe.check.CheckButton=305*118 |
||||
com.fr.design.mainframe.check.CheckFontInfoDialog.collapse=630*185 |
||||
com.fr.design.mainframe.check.CheckFontInfoDialog.messageWithLink=630*31 |
||||
com.fr.design.mainframe.check.CheckFontInfoDialog.unfold=630*280 |
||||
com.fr.design.report.ReportColumnsPane=800*600 |
||||
|
@ -0,0 +1,4 @@
|
||||
com.fr.design.mainframe.check.CheckButton=280*118 |
||||
com.fr.design.mainframe.check.CheckFontInfoDialog.collapse=610*185 |
||||
com.fr.design.mainframe.check.CheckFontInfoDialog.messageWithLink=610*31 |
||||
com.fr.design.mainframe.check.CheckFontInfoDialog.unfold=610*280 |
@ -0,0 +1,4 @@
|
||||
com.fr.design.mainframe.check.CheckButton=230*118 |
||||
com.fr.design.mainframe.check.CheckFontInfoDialog.collapse=490*185 |
||||
com.fr.design.mainframe.check.CheckFontInfoDialog.messageWithLink=490*31 |
||||
com.fr.design.mainframe.check.CheckFontInfoDialog.unfold=490*280 |
@ -1 +1,5 @@
|
||||
# \u9ED8\u8BA4\u4E3A\u7C7B\u7684\u5168\u9650\u5B9A\u540D\uFF08\u53EF\u81EA\u5B9A\u4E49key\uFF09= width * height |
||||
com.fr.design.mainframe.check.CheckButton=250*118 |
||||
com.fr.design.mainframe.check.CheckFontInfoDialog.collapse=385*185 |
||||
com.fr.design.mainframe.check.CheckFontInfoDialog.messageWithLink=385*31 |
||||
com.fr.design.mainframe.check.CheckFontInfoDialog.unfold=385*280 |
@ -0,0 +1,4 @@
|
||||
com.fr.design.mainframe.check.CheckButton=250*118 |
||||
com.fr.design.mainframe.check.CheckFontInfoDialog.collapse=385*185 |
||||
com.fr.design.mainframe.check.CheckFontInfoDialog.messageWithLink=385*31 |
||||
com.fr.design.mainframe.check.CheckFontInfoDialog.unfold=385*280 |
After Width: | Height: | Size: 179 B |
After Width: | Height: | Size: 722 B |
After Width: | Height: | Size: 377 B |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 410 B |
After Width: | Height: | Size: 942 B |
After Width: | Height: | Size: 402 B |
After Width: | Height: | Size: 366 B |
@ -0,0 +1,29 @@
|
||||
package com.fr.design.fun; |
||||
|
||||
import com.fr.design.designer.creator.XCreator; |
||||
import com.fr.design.mainframe.BaseJForm; |
||||
import com.fr.design.mainframe.FormDesigner; |
||||
import com.fr.stable.fun.mark.Immutable; |
||||
|
||||
import javax.swing.JComponent; |
||||
|
||||
|
||||
/** |
||||
* Created by kerry on 5/28/21 |
||||
*/ |
||||
public interface ShareWidgetUIProcessor extends Immutable { |
||||
|
||||
String MARK_STRING = "ShareWidgetUIProcessor"; |
||||
|
||||
int CURRENT_LEVEL = 1; |
||||
|
||||
/** |
||||
* 生成属性配置界面 |
||||
* |
||||
* @param xCreator 选中的Xcreator |
||||
* @param formDesigner 表单设计器 |
||||
* @return 属性配置界面 |
||||
*/ |
||||
JComponent createToolPane(XCreator xCreator, BaseJForm jform, FormDesigner formDesigner); |
||||
|
||||
} |
@ -0,0 +1,19 @@
|
||||
package com.fr.design.fun.impl; |
||||
|
||||
import com.fr.design.fun.ShareWidgetUIProcessor; |
||||
import com.fr.stable.fun.mark.API; |
||||
|
||||
/** |
||||
* Created by kerry on 5/28/21 |
||||
*/ |
||||
@API(level = ShareWidgetUIProcessor.CURRENT_LEVEL) |
||||
public abstract class AbstractShareWidgetUIProcessor implements ShareWidgetUIProcessor { |
||||
|
||||
public int currentAPILevel() { |
||||
return CURRENT_LEVEL; |
||||
} |
||||
|
||||
public int layerIndex() { |
||||
return DEFAULT_LAYER_INDEX; |
||||
} |
||||
} |