forked from fanruan/design
svnadmin
9 years ago
2198 changed files with 295464 additions and 0 deletions
@ -1,3 +1,4 @@
|
||||
designer/bin |
||||
designer_base/bin |
||||
designer_chart/bin |
||||
designer_form/bin |
||||
|
@ -0,0 +1,33 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<classpath> |
||||
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/jdk1.6u35"/> |
||||
<classpathentry kind="src" path="src"/> |
||||
<classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/lib"/> |
||||
<classpathentry combineaccessrules="false" exported="true" kind="src" path="/base"/> |
||||
<classpathentry combineaccessrules="false" kind="src" path="/base-stable"/> |
||||
<classpathentry combineaccessrules="false" kind="src" path="/base-basic"/> |
||||
<classpathentry kind="lib" path="/lib/jetty/activation.jar"/> |
||||
<classpathentry kind="lib" path="/lib/jetty/commons-el.jar"/> |
||||
<classpathentry kind="lib" path="/lib/jetty/commons-logging.jar"/> |
||||
<classpathentry kind="lib" path="/lib/jetty/jasper-compiler.jar"/> |
||||
<classpathentry kind="lib" path="/lib/jetty/jasper-runtime.jar"/> |
||||
<classpathentry kind="lib" path="/lib/jetty/javax.servlet.jar"/> |
||||
<classpathentry kind="lib" path="/lib/jetty/jaxrpc.jar"/> |
||||
<classpathentry kind="lib" path="/lib/jetty/mail.jar"/> |
||||
<classpathentry kind="lib" path="/lib/jetty/mx4j-remote.jar"/> |
||||
<classpathentry kind="lib" path="/lib/jetty/mx4j-tools.jar"/> |
||||
<classpathentry kind="lib" path="/lib/jetty/mx4j.jar"/> |
||||
<classpathentry kind="lib" path="/lib/jetty/org.mortbay.jetty.jar"/> |
||||
<classpathentry kind="lib" path="/lib/jetty/org.mortbay.jmx.jar"/> |
||||
<classpathentry kind="lib" path="/lib/jetty/saaj.jar"/> |
||||
<classpathentry kind="lib" path="/lib/jetty/xercesImpl.jar"/> |
||||
<classpathentry kind="lib" path="/lib/jetty/xml-apis.jar"/> |
||||
<classpathentry kind="lib" path="/lib/jetty/xmlParserAPIs.jar"/> |
||||
<classpathentry kind="lib" path="/lib/3rd.jar"/> |
||||
<classpathentry combineaccessrules="false" kind="src" path="/base-calculate"/> |
||||
<classpathentry kind="lib" path="/lib/junit.jar"/> |
||||
<classpathentry combineaccessrules="false" kind="src" path="/base-data"/> |
||||
<classpathentry kind="lib" path="/lib/olap4j-1.1.0.jar"/> |
||||
<classpathentry combineaccessrules="false" kind="src" path="/base-file"/> |
||||
<classpathentry kind="output" path="bin"/> |
||||
</classpath> |
@ -0,0 +1 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>designer_base</name>
<comment/>
<projects/>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments/>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
</natures>
</projectDescription> |
@ -0,0 +1,19 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<module type="JAVA_MODULE" version="4"> |
||||
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_7" inherit-compiler-output="false"> |
||||
<output url="file://$MODULE_DIR$/../../../env/8.0/WebReport/WEB-INF/classes" /> |
||||
<content url="file://$MODULE_DIR$"> |
||||
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" /> |
||||
</content> |
||||
<orderEntry type="jdk" jdkName="jdk1.8" jdkType="JavaSDK" /> |
||||
<orderEntry type="sourceFolder" forTests="false" /> |
||||
<orderEntry type="module" module-name="base" /> |
||||
<orderEntry type="module" module-name="base-basic" /> |
||||
<orderEntry type="module" module-name="base-calculate" /> |
||||
<orderEntry type="module" module-name="base-data" /> |
||||
<orderEntry type="module" module-name="base-file" /> |
||||
<orderEntry type="module" module-name="base-performance" /> |
||||
<orderEntry type="module" module-name="base-stable" /> |
||||
<orderEntry type="library" name="lib" level="project" /> |
||||
</component> |
||||
</module> |
@ -0,0 +1,141 @@
|
||||
package com.fr.design; |
||||
|
||||
import java.util.Iterator; |
||||
import java.util.List; |
||||
import java.util.Map; |
||||
|
||||
import com.fr.base.Parameter; |
||||
import com.fr.base.io.IOFile; |
||||
import com.fr.data.TableDataSource; |
||||
import com.fr.design.mainframe.JTemplate; |
||||
import com.fr.design.mainframe.JTemplateProvider; |
||||
import com.fr.form.ui.Widget; |
||||
import com.fr.general.ComparatorUtils; |
||||
import com.fr.stable.js.WidgetName; |
||||
|
||||
/** |
||||
* 当前的设计器模式 |
||||
* |
||||
* @author zhou |
||||
* @since 2012-7-26上午11:24:54 |
||||
*/ |
||||
public abstract class DesignModelAdapter<T extends IOFile, S extends JTemplateProvider> { |
||||
|
||||
private static DesignModelAdapter<?, ?> currentModelAdapter; |
||||
protected S jTemplate; |
||||
|
||||
public DesignModelAdapter(S jTemplate) { |
||||
this.jTemplate = jTemplate; |
||||
setCurrentModelAdapter(this); |
||||
} |
||||
|
||||
public T getBook() { |
||||
return (T) ((JTemplate) jTemplate).getTarget(); |
||||
} |
||||
|
||||
public static void setCurrentModelAdapter(DesignModelAdapter<?, ?> model) { |
||||
currentModelAdapter = model; |
||||
} |
||||
|
||||
public static DesignModelAdapter<?, ?> getCurrentModelAdapter() { |
||||
return currentModelAdapter; |
||||
} |
||||
|
||||
/** |
||||
* 响应目标改变事件. |
||||
*/ |
||||
public void fireTargetModified() { |
||||
((JTemplate) this.jTemplate).fireTargetModified(); |
||||
} |
||||
|
||||
public String[] getFloatNames() { |
||||
return new String[0]; |
||||
} |
||||
|
||||
public Parameter[] getParameters() { |
||||
return new Parameter[0]; |
||||
} |
||||
|
||||
// 报表参数
|
||||
public Parameter[] getReportParameters() { |
||||
return new Parameter[0]; |
||||
} |
||||
|
||||
/** |
||||
* 数据源参数 |
||||
* |
||||
* @return |
||||
*/ |
||||
public Parameter[] getTableDataParameters() { |
||||
return new Parameter[0]; |
||||
} |
||||
|
||||
/** |
||||
* 重命名数据集 |
||||
* |
||||
* @param oldName 旧名字 |
||||
* @param newName 新名字 |
||||
* @param isNeedFireModified 是否需要触发保存 |
||||
* @return 重命名成功返回True |
||||
*/ |
||||
public boolean renameTableData(String oldName, String newName, boolean isNeedFireModified) { |
||||
if (!ComparatorUtils.equals(oldName, newName)) { |
||||
TableDataSource tds = getBook(); |
||||
boolean b; |
||||
b = tds.renameTableData(oldName, newName); |
||||
if (!b) { |
||||
return b; |
||||
} |
||||
if (isNeedFireModified) { |
||||
fireTargetModified(); |
||||
} |
||||
} |
||||
return true; |
||||
} |
||||
|
||||
/** |
||||
* 重命名TableData后的一些操作 |
||||
* |
||||
* @param oldName 旧名字 |
||||
* @param newName 新名字. |
||||
* @return 返回是否名字一样. |
||||
*/ |
||||
public boolean renameTableData(String oldName, String newName) { |
||||
return renameTableData(oldName, newName, true); |
||||
} |
||||
|
||||
/** |
||||
* 重命名tabledata |
||||
* |
||||
* @param map 新名字 |
||||
*/ |
||||
public void renameTableData(Map<String, String> map) { |
||||
if (map.isEmpty()) { |
||||
return; |
||||
} |
||||
Iterator<String> iterator = map.keySet().iterator(); |
||||
while (iterator.hasNext()) { |
||||
String key = iterator.next(); |
||||
renameTableData(key, map.get(key)); |
||||
} |
||||
} |
||||
|
||||
public abstract Widget[] getLinkableWidgets() ; |
||||
|
||||
public abstract List<WidgetName> getWidgetsName(); |
||||
|
||||
/** |
||||
* 环境改变. |
||||
*/ |
||||
public abstract void envChanged(); |
||||
|
||||
/** |
||||
* 参数改变. |
||||
*/ |
||||
public abstract void parameterChanged(); |
||||
|
||||
/** |
||||
* 控件配置改变. |
||||
*/ |
||||
public abstract void widgetConfigChanged(); |
||||
} |
@ -0,0 +1,73 @@
|
||||
package com.fr.design; |
||||
|
||||
import com.fr.base.BaseUtils; |
||||
import com.fr.base.Env; |
||||
import com.fr.base.FRContext; |
||||
import com.fr.design.mainframe.toolbar.ToolBarMenuDockPlus; |
||||
import com.fr.env.RemoteEnv; |
||||
|
||||
/** |
||||
* Created by IntelliJ IDEA. |
||||
* Author : daisy |
||||
* Version: 6.5.6 |
||||
* Date: 13-12-24 |
||||
* Time: 上午9:36 |
||||
* 记录现在设计器的设计状态 |
||||
*/ |
||||
public class DesignState { |
||||
|
||||
//菜单的几种情况
|
||||
//Jwrok
|
||||
|
||||
//worksheet
|
||||
public static final int WORK_SHEET = 0; |
||||
//polyDesogner
|
||||
public static final int POLY_SHEET = 1; |
||||
//参数面板
|
||||
public static final int PARAMETER_PANE = 2; |
||||
|
||||
|
||||
//From
|
||||
public static final int JFORM = 4; |
||||
|
||||
|
||||
//是不是在远程
|
||||
public static final int REMOTE = 8; |
||||
|
||||
//设计状态
|
||||
private int designState = -1; |
||||
private boolean isRoot = true;//默认是管理员登陆
|
||||
private boolean isAuthority = false; |
||||
|
||||
public DesignState(ToolBarMenuDockPlus plus) { |
||||
designState = plus.getMenuState(); |
||||
Env env = FRContext.getCurrentEnv(); |
||||
if (env != null && env instanceof RemoteEnv) { |
||||
designState += REMOTE; |
||||
} |
||||
isRoot = env != null && env.isRoot(); |
||||
isAuthority = BaseUtils.isAuthorityEditing(); |
||||
} |
||||
|
||||
public int getDesignState() { |
||||
return designState; |
||||
} |
||||
|
||||
/** |
||||
* 是否是管理员 |
||||
* @return 是管理员返回true |
||||
*/ |
||||
public boolean isRoot() { |
||||
return this.isRoot; |
||||
} |
||||
|
||||
/** |
||||
* 是否处于权限编辑状态 |
||||
* @return 是则返回true |
||||
*/ |
||||
public boolean isAuthority() { |
||||
return isAuthority; |
||||
} |
||||
|
||||
|
||||
} |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,11 @@
|
||||
package com.fr.design.Exception; |
||||
|
||||
public class ValidationException extends Exception { |
||||
|
||||
public ValidationException() { |
||||
} |
||||
|
||||
public ValidationException(String msg) { |
||||
super(msg); |
||||
} |
||||
} |
@ -0,0 +1,827 @@
|
||||
/* |
||||
* Copyright (c) 2001-2014,FineReport Inc, All Rights Reserved. |
||||
*/ |
||||
|
||||
package com.fr.design; |
||||
|
||||
import com.fr.base.BaseUtils; |
||||
import com.fr.base.FRContext; |
||||
import com.fr.design.data.datapane.TableDataNameObjectCreator; |
||||
import com.fr.design.data.tabledata.wrapper.TableDataFactory; |
||||
import com.fr.design.fun.*; |
||||
import com.fr.design.gui.controlpane.NameObjectCreator; |
||||
import com.fr.design.gui.core.WidgetOption; |
||||
import com.fr.design.gui.core.WidgetOptionFactory; |
||||
import com.fr.design.mainframe.App; |
||||
import com.fr.design.mainframe.DesignerFrame; |
||||
import com.fr.design.menu.ShortCut; |
||||
import com.fr.design.widget.Appearance; |
||||
import com.fr.file.XMLFileManager; |
||||
import com.fr.form.ui.Widget; |
||||
import com.fr.general.ComparatorUtils; |
||||
import com.fr.general.FRLogger; |
||||
import com.fr.general.GeneralContext; |
||||
import com.fr.general.GeneralUtils; |
||||
import com.fr.plugin.PluginCollector; |
||||
import com.fr.plugin.PluginInvalidLevelException; |
||||
import com.fr.plugin.PluginLicenseManager; |
||||
import com.fr.plugin.PluginMessage; |
||||
import com.fr.stable.EnvChangedListener; |
||||
import com.fr.stable.StringUtils; |
||||
import com.fr.stable.fun.Authorize; |
||||
import com.fr.stable.fun.Level; |
||||
import com.fr.stable.plugin.ExtraDesignClassManagerProvider; |
||||
import com.fr.stable.plugin.PluginSimplify; |
||||
import com.fr.stable.xml.XMLPrintWriter; |
||||
import com.fr.stable.xml.XMLableReader; |
||||
|
||||
import java.util.ArrayList; |
||||
import java.util.HashMap; |
||||
import java.util.HashSet; |
||||
import java.util.List; |
||||
import java.util.Map; |
||||
import java.util.Set; |
||||
|
||||
/** |
||||
* @author : richie |
||||
* @since : 8.0 |
||||
* 用于设计器扩展的管理类 |
||||
*/ |
||||
public class ExtraDesignClassManager extends XMLFileManager implements ExtraDesignClassManagerProvider { |
||||
|
||||
private static final String XML_TAG = "ExtraDesignClassManager"; |
||||
private static final String TEMPLATE_TREE_TAG = "TemplateTreeShortCut"; |
||||
|
||||
private static ClassLoader loader = Thread.currentThread().getContextClassLoader(); |
||||
|
||||
private static ExtraDesignClassManager classManager; |
||||
|
||||
public synchronized static ExtraDesignClassManager getInstance() { |
||||
if (classManager == null) { |
||||
classManager = new ExtraDesignClassManager(); |
||||
classManager.readXMLFile(); |
||||
} |
||||
|
||||
return classManager; |
||||
} |
||||
|
||||
static { |
||||
GeneralContext.addEnvChangedListener(new EnvChangedListener() { |
||||
public void envChanged() { |
||||
ExtraDesignClassManager.envChanged(); |
||||
} |
||||
}); |
||||
} |
||||
|
||||
|
||||
private synchronized static void envChanged() { |
||||
classManager = null; |
||||
} |
||||
|
||||
private List<TableDataNameObjectCreator> reportTDCreators; |
||||
private List<TableDataNameObjectCreator> serverTDCreators; |
||||
|
||||
private List<WidgetOption> parameterWidgetOptions; |
||||
private Map<Class<? extends Widget>, Class<?>> parameterWidgetOptionsMap; |
||||
private List<WidgetOption> webWidgetOptions; |
||||
|
||||
private List<WidgetOption> formWidgetOptions; |
||||
private List<WidgetOption> formWidgetContainerOptions; |
||||
private Map<Class<? extends Widget>, Class<?>> formWidgetOptionsMap; |
||||
|
||||
private List<WidgetOption> cellWidgetOptions; |
||||
private Map<Class<? extends Widget>, Appearance> cellWidgetOptionMap; |
||||
private List<NameObjectCreator> connectionCreators; |
||||
private Set<PreviewProvider> previewProviders; |
||||
|
||||
private Set<HighlightProvider> highlightProviders; |
||||
|
||||
private TableDataCreatorProvider tableDataCreatorProvider; |
||||
|
||||
private List<MenuHandler> menuHandlers; |
||||
|
||||
private UIFormulaProcessor uiFormulaProcessor; |
||||
|
||||
private List<PresentKindProvider> presentKindProviders; |
||||
|
||||
private List<ExportToolBarProvider> exportToolBarProviders; |
||||
|
||||
private Set<ShortCut> templateTreeShortCutProviders; |
||||
|
||||
private List<SubmitProvider> submitProviders; |
||||
|
||||
private List<GlobalListenerProvider> globalListenerProviders; |
||||
|
||||
private List<JavaScriptActionProvider> javaScriptActionProviders; |
||||
|
||||
private TitlePlaceProcessor titlePlaceProcessor; |
||||
|
||||
private FormElementCaseEditorProcessor formElementCaseEditorProcessor; |
||||
|
||||
private IndentationUnitProcessor indentationUnitProcessor; |
||||
|
||||
private CellAttributeProvider cellAttributeProvider; |
||||
|
||||
private Set<HyperlinkProvider> hyperlinkGroupProviders; |
||||
|
||||
public void addSupportDesignApps(Level level, PluginSimplify simplify) throws Exception { |
||||
validAPILevel(level, App.CURRENT_LEVEL, simplify.getPluginName()); |
||||
App provider = (App) level; |
||||
DesignerFrame.registApp(provider); |
||||
} |
||||
|
||||
private void validAPILevel(Level level, int targetLevel, String pluginName) { |
||||
if (PluginCollector.getCollector().isError(level, targetLevel, pluginName)) { |
||||
throw new PluginInvalidLevelException(pluginName, level.currentAPILevel()); |
||||
} |
||||
} |
||||
|
||||
public HyperlinkProvider[] getHyperlinkProvider() { |
||||
if (hyperlinkGroupProviders == null) { |
||||
return new HyperlinkProvider[0]; |
||||
} |
||||
return hyperlinkGroupProviders.toArray(new HyperlinkProvider[hyperlinkGroupProviders.size()]); |
||||
} |
||||
|
||||
public void addHyperlinkProvider(Level level, PluginSimplify simplify) throws Exception { |
||||
if (hyperlinkGroupProviders == null) { |
||||
hyperlinkGroupProviders = new HashSet<HyperlinkProvider>(); |
||||
} |
||||
validAPILevel(level, HyperlinkProvider.CURRENT_LEVEL, simplify.getPluginName()); |
||||
HyperlinkProvider provider = (HyperlinkProvider) level; |
||||
hyperlinkGroupProviders.add(provider); |
||||
} |
||||
|
||||
public GlobalListenerProvider[] getGlobalListenerProvider() { |
||||
if (globalListenerProviders == null) { |
||||
return new GlobalListenerProvider[0]; |
||||
} |
||||
return globalListenerProviders.toArray(new GlobalListenerProvider[globalListenerProviders.size()]); |
||||
} |
||||
|
||||
/** |
||||
* 获取javaScriptPane |
||||
* |
||||
* @return javaScriptPane集合 |
||||
*/ |
||||
public List<JavaScriptActionProvider> getJavaScriptActionProvider() { |
||||
return javaScriptActionProviders; |
||||
} |
||||
|
||||
/** |
||||
* 添加一个javaScriptPane |
||||
*/ |
||||
public void addJavaScriptActionProvider(Level level, PluginSimplify simplify) throws Exception { |
||||
if (javaScriptActionProviders == null) { |
||||
javaScriptActionProviders = new ArrayList<JavaScriptActionProvider>(); |
||||
} |
||||
validAPILevel(level, JavaScriptActionProvider.CURRENT_LEVEL, simplify.getPluginName()); |
||||
JavaScriptActionProvider provider = (JavaScriptActionProvider) level; |
||||
if (!javaScriptActionProviders.contains(provider)) { |
||||
javaScriptActionProviders.add(provider); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 添加全局监听 |
||||
*/ |
||||
public void addGlobalListenerProvider(Level level, PluginSimplify simplify) throws Exception { |
||||
if (globalListenerProviders == null) { |
||||
globalListenerProviders = new ArrayList<GlobalListenerProvider>(); |
||||
} |
||||
validAPILevel(level, GlobalListenerProvider.CURRENT_LEVEL, simplify.getPluginName()); |
||||
GlobalListenerProvider provider = (GlobalListenerProvider) level; |
||||
if (!globalListenerProviders.contains(provider)) { |
||||
globalListenerProviders.add(provider); |
||||
} |
||||
} |
||||
|
||||
public TableDataCreatorProvider getTableDataCreatorProvider() { |
||||
return tableDataCreatorProvider; |
||||
} |
||||
|
||||
public void setTableDataCreatorProvider(String className) { |
||||
if (StringUtils.isNotBlank(className)) { |
||||
try { |
||||
Class clazz = Class.forName(className); |
||||
tableDataCreatorProvider = (TableDataCreatorProvider) clazz.newInstance(); |
||||
} catch (Exception e) { |
||||
FRLogger.getLogger().error(e.getMessage(), e); |
||||
} |
||||
} |
||||
} |
||||
|
||||
public SubmitProvider[] getSubmitProviders() { |
||||
if (submitProviders == null) { |
||||
return new SubmitProvider[0]; |
||||
} |
||||
return submitProviders.toArray(new SubmitProvider[submitProviders.size()]); |
||||
} |
||||
|
||||
/** |
||||
* 添加提交接口 |
||||
*/ |
||||
public void addSubmitProvider(Level level, PluginSimplify simplify) throws Exception { |
||||
if (submitProviders == null) { |
||||
submitProviders = new ArrayList<SubmitProvider>(); |
||||
} |
||||
validAPILevel(level, SubmitProvider.CURRENT_LEVEL, simplify.getPluginName()); |
||||
SubmitProvider provider = (SubmitProvider) level; |
||||
if (!submitProviders.contains(provider)) { |
||||
submitProviders.add(provider); |
||||
} |
||||
} |
||||
|
||||
public TableDataNameObjectCreator[] getReportTableDataCreators() { |
||||
if (reportTDCreators == null) { |
||||
return new TableDataNameObjectCreator[0]; |
||||
} else { |
||||
return reportTDCreators.toArray(new TableDataNameObjectCreator[reportTDCreators.size()]); |
||||
} |
||||
} |
||||
|
||||
|
||||
/** |
||||
* 添加reportTDCreators |
||||
* |
||||
* @param className 类名 |
||||
*/ |
||||
public void addTableDataNameObjectCreator(String className, PluginSimplify simplify) { |
||||
if (StringUtils.isNotBlank(className)) { |
||||
try { |
||||
if (reportTDCreators == null) { |
||||
reportTDCreators = new ArrayList<TableDataNameObjectCreator>(); |
||||
} |
||||
TableDataNameObjectCreator creator = createTableDataNameObjectCreator(className, simplify); |
||||
if (!reportTDCreators.contains(creator)) { |
||||
reportTDCreators.add(creator); |
||||
} |
||||
} catch (Exception e) { |
||||
PluginMessage.remindUpdate(className + e.getMessage()); |
||||
} |
||||
} |
||||
} |
||||
|
||||
|
||||
/** |
||||
* 添加serverTDCreators |
||||
* |
||||
* @return 类名 |
||||
*/ |
||||
public TableDataNameObjectCreator[] getServerTableDataCreators() { |
||||
if (serverTDCreators == null) { |
||||
return new TableDataNameObjectCreator[0]; |
||||
} else { |
||||
return serverTDCreators.toArray(new TableDataNameObjectCreator[serverTDCreators.size()]); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 添加serverTDCreators |
||||
* |
||||
* @param className 类名 |
||||
*/ |
||||
public void addServerTableDataNameObjectCreator(String className, PluginSimplify simplify) { |
||||
if (StringUtils.isNotBlank(className)) { |
||||
try { |
||||
if (serverTDCreators == null) { |
||||
serverTDCreators = new ArrayList<TableDataNameObjectCreator>(); |
||||
} |
||||
TableDataNameObjectCreator creator = createTableDataNameObjectCreator(className, simplify); |
||||
if (!serverTDCreators.contains(creator)) { |
||||
serverTDCreators.add(creator); |
||||
} |
||||
} catch (Exception e) { |
||||
PluginMessage.remindUpdate(className + e.getMessage()); |
||||
} |
||||
} |
||||
} |
||||
|
||||
private TableDataNameObjectCreator createTableDataNameObjectCreator(String className, PluginSimplify simplify) throws Exception { |
||||
Class clazz = loader.loadClass(className); |
||||
TableDataDefineProvider provider = (TableDataDefineProvider) clazz.newInstance(); |
||||
validAPILevel(provider, TableDataDefineProvider.CURRENT_LEVEL, simplify.getPluginName()); |
||||
TableDataNameObjectCreator creator = new TableDataNameObjectCreator( |
||||
provider.nameForTableData(), |
||||
provider.prefixForTableData(), |
||||
provider.iconPathForTableData(), |
||||
provider.classForTableData(), |
||||
provider.classForInitTableData(), |
||||
provider.appearanceForTableData() |
||||
); |
||||
TableDataFactory.register(provider.classForTableData(), creator); |
||||
return creator; |
||||
} |
||||
|
||||
public Map<Class<? extends Widget>, Class<?>> getParameterWidgetOptionsMap() { |
||||
if (parameterWidgetOptionsMap == null) { |
||||
return new HashMap<Class<? extends Widget>, Class<?>>(); |
||||
} else { |
||||
return parameterWidgetOptionsMap; |
||||
} |
||||
} |
||||
|
||||
public WidgetOption[] getParameterWidgetOptions() { |
||||
if (parameterWidgetOptions == null) { |
||||
return new WidgetOption[0]; |
||||
} else { |
||||
return parameterWidgetOptions.toArray(new WidgetOption[parameterWidgetOptions.size()]); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 添加parameterWidgetOptionsMap |
||||
*/ |
||||
public void addParameterWidgetOption(Level level, PluginSimplify simplify) throws Exception { |
||||
if (parameterWidgetOptions == null) { |
||||
parameterWidgetOptions = new ArrayList<WidgetOption>(); |
||||
} |
||||
if (parameterWidgetOptionsMap == null) { |
||||
parameterWidgetOptionsMap = new HashMap<Class<? extends Widget>, Class<?>>(); |
||||
} |
||||
validAPILevel(level, ParameterWidgetOptionProvider.CURRENT_LEVEL, simplify.getPluginName()); |
||||
|
||||
ParameterWidgetOptionProvider provider = (ParameterWidgetOptionProvider) level; |
||||
WidgetOption option = WidgetOptionFactory.createByWidgetClass( |
||||
provider.nameForWidget(), |
||||
BaseUtils.readIcon(provider.iconPathForWidget()), |
||||
provider.classForWidget() |
||||
); |
||||
parameterWidgetOptionsMap.put(provider.classForWidget(), provider.appearanceForWidget()); |
||||
parameterWidgetOptions.add(option); |
||||
} |
||||
|
||||
/** |
||||
* 添加 webWidgetOptions |
||||
* |
||||
* @return 返回 webWidgetOptions |
||||
*/ |
||||
public void addWebWidgetOption(Level level, PluginSimplify simplify) throws Exception { |
||||
if (webWidgetOptions == null) { |
||||
webWidgetOptions = new ArrayList<WidgetOption>(); |
||||
} |
||||
validAPILevel(level, ToolbarItemProvider.CURRENT_LEVEL, simplify.getPluginName()); |
||||
|
||||
ToolbarItemProvider provider = (ToolbarItemProvider) level; |
||||
WidgetOption option = WidgetOptionFactory.createByWidgetClass( |
||||
provider.nameForWidget(), |
||||
BaseUtils.readIcon(provider.iconPathForWidget()), |
||||
provider.classForWidget() |
||||
); |
||||
if (!webWidgetOptions.contains(option)) { |
||||
webWidgetOptions.add(option); |
||||
} |
||||
} |
||||
|
||||
public Map<Class<? extends Widget>, Class<?>> getFormWidgetOptionsMap() { |
||||
if (formWidgetOptionsMap == null) { |
||||
return new HashMap<Class<? extends Widget>, Class<?>>(); |
||||
} else { |
||||
return formWidgetOptionsMap; |
||||
} |
||||
} |
||||
|
||||
public WidgetOption[] getFormWidgetOptions() { |
||||
if (formWidgetOptions == null) { |
||||
return new WidgetOption[0]; |
||||
} else { |
||||
return formWidgetOptions.toArray(new WidgetOption[formWidgetOptions.size()]); |
||||
} |
||||
} |
||||
|
||||
public WidgetOption[] getWebWidgetOptions() { |
||||
if (webWidgetOptions == null) { |
||||
return new WidgetOption[0]; |
||||
} else { |
||||
return webWidgetOptions.toArray(new WidgetOption[webWidgetOptions.size()]); |
||||
} |
||||
} |
||||
|
||||
public WidgetOption[] getFormWidgetContainerOptions() { |
||||
if (formWidgetContainerOptions == null) { |
||||
return new WidgetOption[0]; |
||||
} else { |
||||
return formWidgetContainerOptions.toArray(new WidgetOption[formWidgetContainerOptions.size()]); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 添加 formWidgetContainerOptions |
||||
*/ |
||||
public void addFormWidgetOption(Level level, PluginSimplify simplify) throws Exception { |
||||
if (formWidgetOptions == null) { |
||||
formWidgetOptions = new ArrayList<WidgetOption>(); |
||||
} |
||||
if (formWidgetContainerOptions == null) { |
||||
formWidgetContainerOptions = new ArrayList<WidgetOption>(); |
||||
} |
||||
if (formWidgetOptionsMap == null) { |
||||
formWidgetOptionsMap = new HashMap<Class<? extends Widget>, Class<?>>(); |
||||
} |
||||
validAPILevel(level, FormWidgetOptionProvider.CURRENT_LEVEL, simplify.getPluginName()); |
||||
|
||||
FormWidgetOptionProvider provider = (FormWidgetOptionProvider) level; |
||||
WidgetOption option = WidgetOptionFactory.createByWidgetClass( |
||||
provider.nameForWidget(), |
||||
BaseUtils.readIcon(provider.iconPathForWidget()), |
||||
provider.classForWidget() |
||||
); |
||||
formWidgetOptionsMap.put(provider.classForWidget(), provider.appearanceForWidget()); |
||||
if (provider.isContainer()) { |
||||
formWidgetContainerOptions.add(option); |
||||
} else { |
||||
formWidgetOptions.add(option); |
||||
} |
||||
} |
||||
|
||||
public Map<Class<? extends Widget>, Appearance> getCellWidgetOptionsMap() { |
||||
if (cellWidgetOptionMap == null) { |
||||
return new HashMap<Class<? extends Widget>, Appearance>(); |
||||
} else { |
||||
return cellWidgetOptionMap; |
||||
} |
||||
} |
||||
|
||||
public WidgetOption[] getCellWidgetOptions() { |
||||
if (cellWidgetOptions == null) { |
||||
return new WidgetOption[0]; |
||||
} else { |
||||
return cellWidgetOptions.toArray(new WidgetOption[cellWidgetOptions.size()]); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 添加cellWidgetOptionMap |
||||
*/ |
||||
public void addCellWidgetOption(Level level, PluginSimplify simplify) throws Exception { |
||||
if (cellWidgetOptions == null) { |
||||
cellWidgetOptions = new ArrayList<WidgetOption>(); |
||||
} |
||||
if (cellWidgetOptionMap == null) { |
||||
cellWidgetOptionMap = new HashMap<Class<? extends Widget>, Appearance>(); |
||||
} |
||||
validAPILevel(level, CellWidgetOptionProvider.CURRENT_LEVEL, simplify.getPluginName()); |
||||
|
||||
CellWidgetOptionProvider provider = (CellWidgetOptionProvider) level; |
||||
WidgetOption option = WidgetOptionFactory.createByWidgetClass( |
||||
provider.nameForWidget(), |
||||
BaseUtils.readIcon(provider.iconPathForWidget()), |
||||
provider.classForWidget() |
||||
); |
||||
if (cellWidgetOptions.contains(option)) { |
||||
return; |
||||
} |
||||
cellWidgetOptionMap.put(provider.classForWidget(), new Appearance(provider.appearanceForWidget(), Appearance.P_MARK + cellWidgetOptionMap.size())); |
||||
cellWidgetOptions.add(option); |
||||
} |
||||
|
||||
|
||||
/** |
||||
* 添加 connectionCreators |
||||
* |
||||
* @param className 类名 |
||||
*/ |
||||
public void addConnection(String className, PluginSimplify simplify) { |
||||
if (StringUtils.isNotBlank(className)) { |
||||
try { |
||||
Class clazz = Class.forName(className); |
||||
if (connectionCreators == null) { |
||||
connectionCreators = new ArrayList<NameObjectCreator>(); |
||||
} |
||||
ConnectionProvider provider = (ConnectionProvider) clazz.newInstance(); |
||||
validAPILevel(provider, ConnectionProvider.CURRENT_LEVEL, simplify.getPluginName()); |
||||
NameObjectCreator creator = new NameObjectCreator( |
||||
provider.nameForConnection(), |
||||
provider.iconPathForConnection(), |
||||
provider.classForConnection(), |
||||
provider.appearanceForConnection() |
||||
); |
||||
if (!connectionCreators.contains(creator)) { |
||||
connectionCreators.add(creator); |
||||
} |
||||
} catch (Exception e) { |
||||
PluginMessage.remindUpdate(className + e.getMessage()); |
||||
} |
||||
} |
||||
} |
||||
|
||||
public NameObjectCreator[] getConnections() { |
||||
if (connectionCreators == null) { |
||||
return new NameObjectCreator[0]; |
||||
} else { |
||||
return connectionCreators.toArray(new NameObjectCreator[connectionCreators.size()]); |
||||
} |
||||
} |
||||
|
||||
public PreviewProvider[] getPreviewProviders() { |
||||
if (previewProviders == null) { |
||||
return new PreviewProvider[0]; |
||||
} |
||||
return previewProviders.toArray(new PreviewProvider[previewProviders.size()]); |
||||
} |
||||
|
||||
/** |
||||
* 添加previewProviders |
||||
*/ |
||||
public void addPreviewProvider(Level level, PluginSimplify simplify) throws Exception { |
||||
if (previewProviders == null) { |
||||
previewProviders = new HashSet<PreviewProvider>(); |
||||
} |
||||
validAPILevel(level, PreviewProvider.CURRENT_LEVEL, simplify.getPluginName()); |
||||
|
||||
PreviewProvider provider = (PreviewProvider) level; |
||||
if (!previewProviders.contains(provider)) { |
||||
previewProviders.add(provider); |
||||
} |
||||
} |
||||
|
||||
public HighlightProvider[] getHighlightProviders() { |
||||
if (highlightProviders == null) { |
||||
return new HighlightProvider[0]; |
||||
} |
||||
return highlightProviders.toArray(new HighlightProvider[highlightProviders.size()]); |
||||
} |
||||
|
||||
/** |
||||
* 添加 highlightProviders |
||||
*/ |
||||
public void addTemplateTreeShortCutProvider(Level level, PluginSimplify simplify) throws Exception { |
||||
if (templateTreeShortCutProviders == null) { |
||||
templateTreeShortCutProviders = new HashSet<ShortCut>(); |
||||
} |
||||
validAPILevel(level, ShortCut.CURRENT_LEVEL, simplify.getPluginName()); |
||||
ShortCut provider = (ShortCut) level; |
||||
templateTreeShortCutProviders.add(provider); |
||||
} |
||||
|
||||
public ShortCut[] getTemplateTreeShortCutProviders() { |
||||
if (templateTreeShortCutProviders == null) { |
||||
return new ShortCut[0]; |
||||
} |
||||
return templateTreeShortCutProviders.toArray(new ShortCut[templateTreeShortCutProviders.size()]); |
||||
} |
||||
|
||||
/** |
||||
* 添加 highlightProviders |
||||
*/ |
||||
public void addConditionProvider(Level level, PluginSimplify simplify) throws Exception { |
||||
if (highlightProviders == null) { |
||||
highlightProviders = new HashSet<HighlightProvider>(); |
||||
} |
||||
validAPILevel(level, HighlightProvider.CURRENT_LEVEL, simplify.getPluginName()); |
||||
HighlightProvider provider = (HighlightProvider) level; |
||||
highlightProviders.add(provider); |
||||
} |
||||
|
||||
public Feedback getFeedback() { |
||||
try { |
||||
Class clazz = GeneralUtils.classForName("com.fr.design.feedback.CurrentFeedback"); |
||||
if (clazz != null) { |
||||
return (Feedback) clazz.newInstance(); |
||||
} |
||||
} catch (Exception e) { |
||||
FRLogger.getLogger().info("no feed back support"); |
||||
} |
||||
return Feedback.EMPTY; |
||||
} |
||||
|
||||
public MenuHandler[] getMenuHandlers(String category) { |
||||
if (menuHandlers == null) { |
||||
return new MenuHandler[0]; |
||||
} |
||||
List<MenuHandler> handlers = new ArrayList<MenuHandler>(); |
||||
for (MenuHandler handler : menuHandlers) { |
||||
if (ComparatorUtils.equals(category, handler.category())) { |
||||
handlers.add(handler); |
||||
} |
||||
} |
||||
return handlers.toArray(new MenuHandler[handlers.size()]); |
||||
} |
||||
|
||||
/** |
||||
* 添加menuHandlers |
||||
*/ |
||||
public void addMenuHandler(Level level, PluginSimplify simplify) throws Exception { |
||||
if (menuHandlers == null) { |
||||
menuHandlers = new ArrayList<MenuHandler>(); |
||||
} |
||||
validAPILevel(level, MenuHandler.CURRENT_LEVEL, simplify.getPluginName()); |
||||
MenuHandler handler = (MenuHandler) level; |
||||
if (!menuHandlers.contains(handler)) { |
||||
menuHandlers.add(handler); |
||||
} |
||||
} |
||||
|
||||
public UIFormulaProcessor getUIFormulaProcessor() { |
||||
return uiFormulaProcessor; |
||||
} |
||||
|
||||
public void setUIFormulaProcessor(Level level, PluginSimplify simplify) throws Exception { |
||||
validAPILevel(level, UIFormulaProcessor.CURRENT_LEVEL, simplify.getPluginName()); |
||||
uiFormulaProcessor = (UIFormulaProcessor) level; |
||||
} |
||||
|
||||
public PresentKindProvider[] getPresentKindProviders() { |
||||
if (presentKindProviders == null) { |
||||
return new PresentKindProvider[0]; |
||||
} |
||||
return presentKindProviders.toArray(new PresentKindProvider[presentKindProviders.size()]); |
||||
} |
||||
|
||||
/** |
||||
* 添加presentKindProviders |
||||
*/ |
||||
public void addPresentKindProvider(Level level, PluginSimplify simplify) throws Exception { |
||||
if (presentKindProviders == null) { |
||||
presentKindProviders = new ArrayList<PresentKindProvider>(); |
||||
} |
||||
validAPILevel(level, PresentKindProvider.CURRENT_LEVEL, simplify.getPluginName()); |
||||
PresentKindProvider provider = (PresentKindProvider) level; |
||||
presentKindProviders.add(provider); |
||||
} |
||||
|
||||
public ExportToolBarProvider[] getExportToolBarProviders() { |
||||
if (exportToolBarProviders == null) { |
||||
return new ExportToolBarProvider[0]; |
||||
} |
||||
return exportToolBarProviders.toArray(new ExportToolBarProvider[exportToolBarProviders.size()]); |
||||
} |
||||
|
||||
/** |
||||
* 添加exportToolBarProviders |
||||
*/ |
||||
public void addExportToolBarProvider(Level level, PluginSimplify simplify) throws Exception { |
||||
if (exportToolBarProviders == null) { |
||||
exportToolBarProviders = new ArrayList<ExportToolBarProvider>(); |
||||
} |
||||
validAPILevel(level, ExportToolBarProvider.CURRENT_LEVEL, simplify.getPluginName()); |
||||
ExportToolBarProvider provider = (ExportToolBarProvider) level; |
||||
if (!exportToolBarProviders.contains(provider)) { |
||||
exportToolBarProviders.add(provider); |
||||
} |
||||
} |
||||
|
||||
public TitlePlaceProcessor getTitlePlaceProcessor() { |
||||
return titlePlaceProcessor; |
||||
} |
||||
|
||||
public void setTitlePlaceProcessor(Level level, PluginSimplify simplify) throws Exception { |
||||
validAPILevel(level, TitlePlaceProcessor.CURRENT_LEVEL, simplify.getPluginName()); |
||||
titlePlaceProcessor = (TitlePlaceProcessor) level; |
||||
} |
||||
|
||||
public FormElementCaseEditorProcessor getPropertyTableEditor() { |
||||
return formElementCaseEditorProcessor; |
||||
} |
||||
|
||||
public void setPropertyTableEditor(Level level, PluginSimplify simplify) throws Exception { |
||||
validAPILevel(level, FormElementCaseEditorProcessor.CURRENT_LEVEL, simplify.getPluginName()); |
||||
formElementCaseEditorProcessor = (FormElementCaseEditorProcessor) level; |
||||
} |
||||
|
||||
public IndentationUnitProcessor getIndentationUnitEditor() { |
||||
return indentationUnitProcessor; |
||||
} |
||||
|
||||
public void setIndentationUnitEditor(Level level, PluginSimplify simplify) throws Exception { |
||||
validAPILevel(level, IndentationUnitProcessor.CURRENT_LEVEL, simplify.getPluginName()); |
||||
indentationUnitProcessor = (IndentationUnitProcessor) level; |
||||
} |
||||
|
||||
public CellAttributeProvider getCelllAttributeProvider() { |
||||
return cellAttributeProvider; |
||||
} |
||||
|
||||
public void setCellAttributeProvider(Level level, PluginSimplify simplify) throws Exception { |
||||
validAPILevel(level, CellAttributeProvider.CURRENT_LEVEL, simplify.getPluginName()); |
||||
cellAttributeProvider = (CellAttributeProvider) level; |
||||
} |
||||
|
||||
/** |
||||
* 文件名 |
||||
* |
||||
* @return 文件名 |
||||
*/ |
||||
@Override |
||||
public String fileName() { |
||||
return "designer.xml"; |
||||
} |
||||
|
||||
/** |
||||
* 读xml |
||||
* |
||||
* @param reader xml对象 |
||||
*/ |
||||
public void readXML(XMLableReader reader) { |
||||
readXML(reader, null, PluginSimplify.NULL); |
||||
} |
||||
|
||||
/** |
||||
* 读xml |
||||
* |
||||
* @param reader xml对象 |
||||
* @param extraDesignInterfaceList 接口列表 |
||||
*/ |
||||
@Override |
||||
public void readXML(XMLableReader reader, List<String> extraDesignInterfaceList, PluginSimplify simplify) { |
||||
if (reader.isChildNode()) { |
||||
String tagName = reader.getTagName(); |
||||
if (extraDesignInterfaceList != null) { |
||||
extraDesignInterfaceList.add(tagName); |
||||
} |
||||
String className = reader.getAttrAsString("class", ""); |
||||
if (StringUtils.isEmpty(className)) { |
||||
return; |
||||
} |
||||
readLevelTag(tagName, className, simplify); |
||||
} |
||||
} |
||||
|
||||
private void readLevelTag(String tagName, String className, PluginSimplify simplify) { |
||||
try { |
||||
//实现了Level接口的, 可以直接newInstance子类的
|
||||
Class<?> clazz = loader.loadClass(className); |
||||
Authorize authorize = clazz.getAnnotation(Authorize.class); |
||||
if (authorize != null) { |
||||
PluginLicenseManager.getInstance().registerPaid(authorize, simplify); |
||||
} |
||||
|
||||
Level impl = (Level) clazz.newInstance(); |
||||
//控件
|
||||
readWidgetRelated(tagName, impl, simplify); |
||||
//数据集, 数据连接
|
||||
readTableDataRelated(tagName, className, simplify); |
||||
if (tagName.equals(ParameterWidgetOptionProvider.XML_TAG)) { |
||||
addParameterWidgetOption(impl, simplify); |
||||
} else if (tagName.equals(PreviewProvider.MARK_STRING)) { |
||||
addPreviewProvider(impl, simplify); |
||||
} else if (tagName.equals(HighlightProvider.MARK_STRING)) { |
||||
addConditionProvider(impl, simplify); |
||||
} else if (tagName.equals(MenuHandler.MARK_STRING)) { |
||||
addMenuHandler(impl, simplify); |
||||
} else if (tagName.equals(UIFormulaProcessor.MARK_STRING)) { |
||||
setUIFormulaProcessor(impl, simplify); |
||||
} else if (tagName.equals(PresentKindProvider.MARK_STRING)) { |
||||
addPresentKindProvider(impl, simplify); |
||||
} else if (tagName.equals(TEMPLATE_TREE_TAG)) { |
||||
addTemplateTreeShortCutProvider(impl, simplify); |
||||
} else if (tagName.equals(SubmitProvider.MARK_STRING)) { |
||||
addSubmitProvider(impl, simplify); |
||||
} else if (tagName.equals(GlobalListenerProvider.XML_TAG)) { |
||||
addGlobalListenerProvider(impl, simplify); |
||||
} else if (tagName.equals(JavaScriptActionProvider.XML_TAG)) { |
||||
addJavaScriptActionProvider(impl, simplify); |
||||
} else if (tagName.equals(TitlePlaceProcessor.MARK_STRING)) { |
||||
setTitlePlaceProcessor(impl, simplify); |
||||
} else if (tagName.equals(FormElementCaseEditorProcessor.MARK_STRING)) { |
||||
setPropertyTableEditor(impl, simplify); |
||||
} else if (tagName.equals(IndentationUnitProcessor.MARK_STRING)) { |
||||
setIndentationUnitEditor(impl, simplify); |
||||
} else if (tagName.equals(CellAttributeProvider.MARK_STRING)) { |
||||
setCellAttributeProvider(impl, simplify); |
||||
} else if (tagName.equals(HyperlinkProvider.XML_TAG)) { |
||||
addHyperlinkProvider(impl, simplify); |
||||
} else if (tagName.equals(App.MARK_STRING)) { |
||||
addSupportDesignApps(impl, simplify); |
||||
} |
||||
} catch (PluginInvalidLevelException e) { |
||||
PluginMessage.remindUpdate(e.getMessage()); |
||||
} catch (Exception e) { |
||||
FRContext.getLogger().error(e.getMessage()); |
||||
} |
||||
} |
||||
|
||||
private void readTableDataRelated(String tagName, String className, PluginSimplify simplify) { |
||||
if (tagName.equals(TableDataCreatorProvider.XML_TAG)) { |
||||
setTableDataCreatorProvider(className); |
||||
} else if (tagName.equals(TableDataDefineProvider.XML_TAG)) { |
||||
addTableDataNameObjectCreator(className, simplify); |
||||
} else if (tagName.equals(ServerTableDataDefineProvider.XML_TAG)) { |
||||
addServerTableDataNameObjectCreator(className, simplify); |
||||
} else if (tagName.equals(ConnectionProvider.XML_TAG)) { |
||||
addConnection(className, simplify); |
||||
} |
||||
} |
||||
|
||||
private void readWidgetRelated(String tagName, Level impl, PluginSimplify simplify) throws Exception { |
||||
if (tagName.equals(FormWidgetOptionProvider.XML_TAG)) { |
||||
addFormWidgetOption(impl, simplify); |
||||
} else if (tagName.equals(ToolbarItemProvider.XML_TAG)) { |
||||
addWebWidgetOption(impl, simplify); |
||||
} else if (tagName.equals(ExportToolBarProvider.XML_TAG)) { |
||||
addExportToolBarProvider(impl, simplify); |
||||
} else if (tagName.equals(CellWidgetOptionProvider.XML_TAG)) { |
||||
addCellWidgetOption(impl, simplify); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 写xml |
||||
* |
||||
* @param writer xml对象 |
||||
*/ |
||||
public void writeXML(XMLPrintWriter writer) { |
||||
writer.startTAG(XML_TAG); |
||||
writer.end(); |
||||
} |
||||
} |
@ -0,0 +1,191 @@
|
||||
package com.fr.design; |
||||
|
||||
import com.fr.design.mainframe.DesignerContext; |
||||
import com.fr.general.ComparatorUtils; |
||||
import com.fr.general.FRLogger; |
||||
import com.fr.general.GeneralUtils; |
||||
import com.fr.stable.ArrayUtils; |
||||
import com.fr.stable.OperatingSystem; |
||||
import com.fr.stable.StableUtils; |
||||
import com.fr.stable.StringUtils; |
||||
|
||||
import java.io.File; |
||||
import java.io.FileInputStream; |
||||
import java.io.FileOutputStream; |
||||
import java.io.IOException; |
||||
import java.util.ArrayList; |
||||
import java.util.List; |
||||
import java.util.Map; |
||||
import java.util.Properties; |
||||
|
||||
/** |
||||
* @author richie |
||||
* @date 2015-03-26 |
||||
* @since 8.0 |
||||
*/ |
||||
public class RestartHelper { |
||||
|
||||
public static final String RECORD_FILE = StableUtils.pathJoin(StableUtils.getInstallHome(), "delete.properties"); |
||||
public static final String MOVE_FILE = StableUtils.pathJoin(StableUtils.getInstallHome(), "move.properties"); |
||||
|
||||
|
||||
/** |
||||
* 把要删除的文件都记录到delete.properties中 |
||||
* |
||||
* @param files 要删除的文件 |
||||
*/ |
||||
public static void saveFilesWhichToDelete(String[] files) { |
||||
Properties properties = new Properties(); |
||||
File file = new File(RECORD_FILE); |
||||
if (file.exists()) { |
||||
try { |
||||
FileInputStream file2DeleteInputStream = new FileInputStream(file); |
||||
properties.load(file2DeleteInputStream); |
||||
file2DeleteInputStream.close(); |
||||
} catch (IOException e) { |
||||
FRLogger.getLogger().error(e.getMessage(), e); |
||||
} |
||||
} |
||||
if (ArrayUtils.getLength(files) != 0) { |
||||
int size = properties.values().size(); |
||||
for (int i = 0, len = files.length; i < len; i++) { |
||||
properties.setProperty((i + size) + "", files[i]); |
||||
} |
||||
} |
||||
try { |
||||
FileOutputStream file2DeleteOutputStream = new FileOutputStream(file); |
||||
properties.store(file2DeleteOutputStream, "save"); |
||||
file2DeleteOutputStream.close(); |
||||
} catch (IOException e) { |
||||
FRLogger.getLogger().error(e.getMessage(), e); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 把要移动的文件都记录到move.properties中 |
||||
* |
||||
* @param map 移动的文件 |
||||
*/ |
||||
public static void saveFilesWhichToMove(Map<String, String> map) { |
||||
Properties properties = new Properties(); |
||||
File file = new File(MOVE_FILE); |
||||
if (file.exists()) { |
||||
try { |
||||
FileInputStream file2MoveInputStream = new FileInputStream(file); |
||||
properties.load(file2MoveInputStream); |
||||
file2MoveInputStream.close(); |
||||
} catch (IOException e) { |
||||
FRLogger.getLogger().error(e.getMessage(), e); |
||||
} |
||||
} |
||||
if (!map.isEmpty()) { |
||||
for (String key : map.keySet()) { |
||||
properties.setProperty(key, map.get(key)); |
||||
} |
||||
} |
||||
try { |
||||
FileOutputStream file2MoveOutputStream = new FileOutputStream(file); |
||||
properties.store(file2MoveOutputStream, "save"); |
||||
file2MoveOutputStream.close(); |
||||
} catch (IOException e) { |
||||
FRLogger.getLogger().error(e.getMessage(), e); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 需要重启启动器用于删除文件 |
||||
*/ |
||||
public static void deleteRecordFilesWhenStart() { |
||||
File ff = new File(RECORD_FILE); |
||||
// 如果文件不存在就直接返回了
|
||||
if (!ff.exists()) { |
||||
return; |
||||
} |
||||
restart(); |
||||
} |
||||
|
||||
private static boolean deleteWhenDebug() { |
||||
File ff = new File(RECORD_FILE); |
||||
Properties properties = new Properties(); |
||||
try { |
||||
properties.load(new FileInputStream(ff)); |
||||
} catch (IOException ignore) { |
||||
return true; |
||||
} |
||||
|
||||
for (Map.Entry<Object, Object> entry : properties.entrySet()) { |
||||
String filePath = GeneralUtils.objectToString(entry.getValue()); |
||||
File file = new File(filePath); |
||||
if (file.isDirectory()) { |
||||
File[] files = file.listFiles(); |
||||
if (files != null) { |
||||
for (File f : files) { |
||||
deleteFile(f); |
||||
} |
||||
} |
||||
} |
||||
deleteFile(file); |
||||
} |
||||
return ff.delete(); |
||||
} |
||||
|
||||
private static boolean deleteFile(File f) { |
||||
return StableUtils.deleteFile(f); |
||||
} |
||||
|
||||
/** |
||||
* 重启设计器 |
||||
*/ |
||||
public static void restart() { |
||||
restart(ArrayUtils.EMPTY_STRING_ARRAY); |
||||
} |
||||
|
||||
/** |
||||
* 重启设计器并删除某些特定的文件 |
||||
* |
||||
* @param filesToBeDelete 要删除的文件集合 |
||||
*/ |
||||
public static void restart(String[] filesToBeDelete) { |
||||
String installHome = StableUtils.getInstallHome(); |
||||
if (StringUtils.isEmpty(installHome) || ComparatorUtils.equals(".", installHome)) { |
||||
deleteWhenDebug(); |
||||
return; |
||||
} |
||||
|
||||
try { |
||||
if (OperatingSystem.isMacOS()) { |
||||
restartInMacOS(installHome, filesToBeDelete); |
||||
} else { |
||||
restartInWindows(installHome, filesToBeDelete); |
||||
} |
||||
} catch (Exception e) { |
||||
FRLogger.getLogger().error(e.getMessage()); |
||||
} finally { |
||||
DesignerContext.getDesignerFrame().exit(); |
||||
} |
||||
} |
||||
|
||||
private static void restartInMacOS(String installHome, String[] filesToBeDelete) throws Exception { |
||||
ProcessBuilder builder = new ProcessBuilder(); |
||||
List<String> commands = new ArrayList<String>(); |
||||
commands.add("open"); |
||||
commands.add(installHome + File.separator + "bin" + File.separator + "restart.app"); |
||||
if (ArrayUtils.isNotEmpty(filesToBeDelete)) { |
||||
commands.add("--args"); |
||||
commands.add(StableUtils.join(filesToBeDelete, "+")); |
||||
} |
||||
builder.command(commands); |
||||
builder.start(); |
||||
} |
||||
|
||||
private static void restartInWindows(String installHome, String[] filesToBeDelete) throws Exception { |
||||
ProcessBuilder builder = new ProcessBuilder(); |
||||
List<String> commands = new ArrayList<String>(); |
||||
commands.add(installHome + File.separator + "bin" + File.separator + "restart.exe"); |
||||
if (ArrayUtils.isNotEmpty(filesToBeDelete)) { |
||||
commands.add(StableUtils.join(filesToBeDelete, "+")); |
||||
} |
||||
builder.command(commands); |
||||
builder.start(); |
||||
} |
||||
} |
@ -0,0 +1 @@
|
||||
package com.fr.design.actions;
import com.fr.base.BaseUtils;
import com.fr.design.constants.UIConstants;
import com.fr.design.menu.KeySetUtils;
import com.fr.design.roleAuthority.ReportAndFSManagePane;
import com.fr.design.roleAuthority.RolesAlreadyEditedPane;
import com.fr.design.designer.TargetComponent;
import com.fr.design.file.HistoryTemplateListPane;
import com.fr.design.mainframe.*;
/**
* Author : daisy
* Date: 13-8-30
* Time: 上午10:12
*/
public class AllowAuthorityEditAction extends TemplateComponentAction {
public AllowAuthorityEditAction(TargetComponent t) {
super(t);
this.setMenuKeySet(KeySetUtils.ALLOW_AUTHORITY_EDIT);
this.setName(getMenuKeySet().getMenuName());
this.setMnemonic(getMenuKeySet().getMnemonic());
this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_report/allow_authority_edit.png"));
}
/**
* 撤销
*/
public void prepare4Undo() {
HistoryTemplateListPane.getInstance().getCurrentEditingTemplate().iniAuthorityUndoState();
}
/**
* 执行动作
*
* @return 是否执行成功
*/
public boolean executeActionReturnUndoRecordNeeded() {
TargetComponent tc = getEditingComponent();
if (tc == null) {
return false;
}
cleanAuthorityCondition();
//进入时是格式刷则取消格式刷
if (DesignerContext.getFormatState() != DesignerContext.FORMAT_STATE_NULL) {
tc.cancelFormat();
}
BaseUtils.setAuthorityEditing(true);
ReportAndFSManagePane.getInstance().refreshDockingView();
RolesAlreadyEditedPane.getInstance().refreshDockingView();
WestRegionContainerPane.getInstance().replaceDownPane(ReportAndFSManagePane.getInstance());
DesignerContext.getDesignerFrame().setCloseMode(UIConstants.CLOSE_OF_AUTHORITY);
DesignerContext.getDesignerFrame().resetToolkitByPlus(tc.getToolBarMenuDockPlus());
DesignerContext.getDesignerFrame().needToAddAuhtorityPaint();
EastRegionContainerPane.getInstance().replaceUpPane(tc.getEastUpPane());
DesignerContext.getDesignerFrame().refreshDottedLine();
EastRegionContainerPane.getInstance().replaceDownPane(RolesAlreadyEditedPane.getInstance());
//画虚线
return true;
}
/**
* 进入权限编辑之前将权限编辑界面重置一下工具栏
*/
private void cleanAuthorityCondition() {
java.util.List<JTemplate<?, ?>> opendedTemplate = HistoryTemplateListPane.getInstance().getHistoryList();
for (int i = 0; i < opendedTemplate.size(); i++) {
opendedTemplate.get(i).cleanAuthorityUndo();
}
}
} |
@ -0,0 +1,41 @@
|
||||
/* |
||||
* Copyright(c) 2001-2010, FineReport Inc, All Rights Reserved. |
||||
*/ |
||||
package com.fr.design.actions; |
||||
|
||||
import javax.swing.JCheckBoxMenuItem; |
||||
|
||||
import com.fr.design.gui.ibutton.UIButton; |
||||
import com.fr.design.gui.imenu.UICheckBoxMenuItem; |
||||
|
||||
/** |
||||
* check box |
||||
*/ |
||||
public abstract class CheckBoxAction extends UpdateAction { |
||||
public UICheckBoxMenuItem createMenuItem() { |
||||
Object object = this.getValue(UICheckBoxMenuItem.class.getName()); |
||||
if (object == null) { |
||||
object = createCheckBoxMenuItem(this); |
||||
this.putValue(UICheckBoxMenuItem.class.getName(), object); |
||||
} |
||||
|
||||
// isSelected.
|
||||
((JCheckBoxMenuItem) object).setSelected(this.isSelected()); |
||||
|
||||
return (UICheckBoxMenuItem) object; |
||||
} |
||||
|
||||
|
||||
|
||||
public abstract boolean isSelected(); |
||||
|
||||
|
||||
public boolean isRadioSelect() { |
||||
return false; |
||||
} |
||||
|
||||
public void setSelected(boolean isSelected) { |
||||
UIButton button = (UIButton) this.createToolBarComponent(); |
||||
button.setSelected(isSelected); |
||||
} |
||||
} |
@ -0,0 +1 @@
|
||||
package com.fr.design.actions;
import com.fr.base.BaseUtils;
import com.fr.design.data.datapane.TableDataTreePane;
import com.fr.design.DesignModelAdapter;
import com.fr.design.designer.TargetComponent;
import com.fr.design.file.HistoryTemplateListPane;
import com.fr.design.mainframe.*;
import com.fr.general.Inter;
/**
* Author : daisy
* Date: 13-9-2
* Time: 下午3:36
*/
public class ExitAuthorityEditAction extends TemplateComponentAction {
public ExitAuthorityEditAction(TargetComponent t) {
super(t);
this.setName(Inter.getLocText(new String[]{"Exit", "DashBoard-Potence", "Edit"}));
this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_report/exit_authority_edit.png"));
}
public void prepare4Undo() {
}
public boolean executeActionReturnUndoRecordNeeded() {
TargetComponent tc = getEditingComponent();
if (tc == null) {
return false;
}
if (BaseUtils.isAuthorityEditing()) {
BaseUtils.setAuthorityEditing(false);
WestRegionContainerPane.getInstance().replaceDownPane(TableDataTreePane.getInstance(DesignModelAdapter.getCurrentModelAdapter()));
EastRegionContainerPane.getInstance().replaceDownPane(tc.getEastDownPane());
EastRegionContainerPane.getInstance().replaceUpPane(tc.getEastUpPane());
DesignerContext.getDesignerFrame().resetToolkitByPlus(tc.getToolBarMenuDockPlus());
DesignerContext.getDesignerFrame().needToAddAuhtorityPaint();
DesignerContext.getDesignerFrame().refreshDottedLine();
fireAuthorityStateToNomal();
}
return true;
}
/**
* 退出权限编辑时,将所有的做过权限编辑的状态,作为一个状态赋给报、报表主体
*/
private void fireAuthorityStateToNomal() {
java.util.List<JTemplate<?, ?>> opendedTemplate = HistoryTemplateListPane.getInstance().getHistoryList();
for (int i = 0; i < opendedTemplate.size(); i++) {
//如果在权限编辑时做过操作,则将做过的操作作为一个整体状态赋给正在报表
if (opendedTemplate.get(i).isDoSomethingInAuthority()) {
opendedTemplate.get(i).fireAuthorityStateToNomal();
}
}
}
} |
@ -0,0 +1,57 @@
|
||||
/* |
||||
* Copyright (c) 2001-2014,FineReport Inc, All Rights Reserved. |
||||
*/ |
||||
|
||||
package com.fr.design.actions; |
||||
|
||||
import com.fr.design.gui.controlpane.NameObjectCreator; |
||||
|
||||
import java.awt.event.ActionEvent; |
||||
|
||||
/** |
||||
* Created by IntelliJ IDEA. |
||||
* Author : daisy |
||||
* Version: 6.5.6 |
||||
* Date: 14-2-26 |
||||
* Time: 上午10:47 |
||||
*/ |
||||
public abstract class HyperlinkPluginAction extends UpdateAction { |
||||
public static final String XML_TAG = "hyperlinkType"; |
||||
|
||||
public HyperlinkPluginAction() { |
||||
this.setName(this.getDisplayName()); |
||||
} |
||||
|
||||
|
||||
/** |
||||
* 名字 |
||||
* |
||||
* @return |
||||
*/ |
||||
public abstract String getDisplayName(); |
||||
|
||||
/** |
||||
* 得到超级链接的声明类 |
||||
* |
||||
* @return |
||||
*/ |
||||
public abstract Class getHyperlinkClass(); |
||||
|
||||
/** |
||||
* 得到相应面板的类 |
||||
* |
||||
* @return |
||||
*/ |
||||
public abstract Class getUpdateHyperlinkPaneClass(); |
||||
|
||||
public NameObjectCreator getHyperlinkCreator() { |
||||
return new NameObjectCreator(getDisplayName(), getHyperlinkClass(), getUpdateHyperlinkPaneClass()); |
||||
} |
||||
|
||||
/** |
||||
* 动作 |
||||
* @param e 动作 |
||||
*/ |
||||
public void actionPerformed(ActionEvent e) { |
||||
} |
||||
} |
@ -0,0 +1,16 @@
|
||||
package com.fr.design.actions; |
||||
|
||||
import com.fr.design.mainframe.JTemplate; |
||||
|
||||
public abstract class JTemplateAction<T extends JTemplate<?, ?>> extends UpdateAction implements TemplateComponentActionInterface<T> { |
||||
private T t; |
||||
public JTemplateAction(T t) { |
||||
this.t = t; |
||||
} |
||||
|
||||
@Override |
||||
public T getEditingComponent() { |
||||
return t; |
||||
} |
||||
|
||||
} |
@ -0,0 +1,46 @@
|
||||
/* |
||||
* Copyright (c) 2001-2014,FineReport Inc, All Rights Reserved. |
||||
*/ |
||||
|
||||
package com.fr.design.actions; |
||||
|
||||
import com.fr.base.BaseUtils; |
||||
import com.fr.stable.StringUtils; |
||||
|
||||
|
||||
/** |
||||
* Created by IntelliJ IDEA. |
||||
* Author : daisy |
||||
* Version: 6.5.6 |
||||
* Date: 14-2-28 |
||||
* Time: 上午9:44 |
||||
*/ |
||||
public abstract class MenuAction extends UpdateAction { |
||||
|
||||
public MenuAction() { |
||||
this.setName(getDisplayName()); |
||||
this.setMnemonic(getMnemonic()); |
||||
this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_insert/bindColumn.png")); |
||||
} |
||||
|
||||
/** |
||||
* 名字 |
||||
* |
||||
* @return |
||||
*/ |
||||
public abstract String getDisplayName(); |
||||
|
||||
public char getMnemonic() { |
||||
return '\0'; |
||||
} |
||||
|
||||
/** |
||||
* 图标 |
||||
* |
||||
* @return |
||||
*/ |
||||
public String getIconPath() { |
||||
return StringUtils.EMPTY; |
||||
} |
||||
|
||||
} |
@ -0,0 +1,84 @@
|
||||
package com.fr.design.actions; |
||||
|
||||
import javax.swing.SwingUtilities; |
||||
|
||||
import com.fr.base.BaseUtils; |
||||
import com.fr.design.data.DesignTableDataManager; |
||||
import com.fr.data.TableDataSource; |
||||
import com.fr.design.data.datapane.ReportTableDataPane; |
||||
import com.fr.design.data.datapane.TableDataTreePane; |
||||
import com.fr.design.data.tabledata.ResponseDataSourceChange; |
||||
import com.fr.design.DesignModelAdapter; |
||||
import com.fr.design.mainframe.JTemplate; |
||||
import com.fr.design.menu.KeySetUtils; |
||||
import com.fr.design.dialog.BasicDialog; |
||||
import com.fr.design.dialog.DialogActionAdapter; |
||||
|
||||
import java.util.HashMap; |
||||
import java.util.Map; |
||||
|
||||
/* |
||||
* richer:包括报表和表单的数据集 && 图表的数据集 |
||||
*/ |
||||
public class TableDataSourceAction extends TemplateComponentAction<JTemplate<?, ?>> implements ResponseDataSourceChange { |
||||
public TableDataSourceAction(JTemplate<?, ?> t) { |
||||
super(t); |
||||
this.setMenuKeySet(KeySetUtils.TEMPLATE_TABLE_DATA_SOURCE); |
||||
this.setName(getMenuKeySet().getMenuKeySetName() + "..."); |
||||
this.setMnemonic(getMenuKeySet().getMnemonic()); |
||||
this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_web/datasource.png")); |
||||
} |
||||
|
||||
/** |
||||
* 执行动作 |
||||
* |
||||
* @return 是否执行成功 |
||||
*/ |
||||
public boolean executeActionReturnUndoRecordNeeded() { |
||||
final TableDataSource tds = this.getEditingComponent().getTarget(); |
||||
|
||||
final ReportTableDataPane tableDataPane = new ReportTableDataPane() { |
||||
public void complete() { |
||||
populate(tds); |
||||
} |
||||
}; |
||||
BasicDialog reportTableDataDialog = tableDataPane.showLargeWindow(SwingUtilities.getWindowAncestor(this.getEditingComponent()), null); |
||||
reportTableDataDialog.addDialogActionListener(new DialogActionAdapter() { |
||||
|
||||
@Override |
||||
public void doOk() { |
||||
DesignModelAdapter.getCurrentModelAdapter().renameTableData(tableDataPane.getDsNameChangedMap()); |
||||
tableDataPane.update(tds); |
||||
TableDataTreePane.getInstance(DesignModelAdapter.getCurrentModelAdapter()); |
||||
TableDataSourceAction.this.getEditingComponent().fireTargetModified(); |
||||
fireDSChanged(tableDataPane.getDsNameChangedMap()); |
||||
} |
||||
}); |
||||
reportTableDataDialog.setVisible(true); |
||||
return false; |
||||
} |
||||
|
||||
// TODO ALEX_SEP 同JWorkBookAction,也不知道这个undo该如何处理
|
||||
|
||||
/** |
||||
* 撤销 |
||||
*/ |
||||
public void prepare4Undo() { |
||||
} |
||||
|
||||
/** |
||||
* 响应数据集改变 |
||||
*/ |
||||
public void fireDSChanged() { |
||||
fireDSChanged(new HashMap<String, String>()); |
||||
} |
||||
|
||||
/** |
||||
* 响应数据集改变 |
||||
* |
||||
* @param map 地图 |
||||
*/ |
||||
public void fireDSChanged(Map<String, String> map) { |
||||
DesignTableDataManager.fireDSChanged(map); |
||||
} |
||||
} |
@ -0,0 +1,40 @@
|
||||
package com.fr.design.actions; |
||||
|
||||
|
||||
import com.fr.design.designer.TargetComponent; |
||||
|
||||
public abstract class TemplateComponentAction<T extends TargetComponent> extends UndoableAction implements TemplateComponentActionInterface<T> { |
||||
private T t; |
||||
protected TemplateComponentAction(T t) { |
||||
this.t = t; |
||||
} |
||||
|
||||
protected void setEditingComponent(T t) { |
||||
this.t = t; |
||||
} |
||||
|
||||
@Override |
||||
public T getEditingComponent() { |
||||
return t; |
||||
} |
||||
|
||||
@Override |
||||
public void prepare4Undo() { |
||||
this.getEditingComponent().fireTargetModified(); |
||||
T component = getEditingComponent(); |
||||
if (component == null) { |
||||
return; |
||||
} |
||||
|
||||
component.requestFocus(); |
||||
} |
||||
|
||||
/** |
||||
* update enable |
||||
* TODO ALEX_SEP 这个方法的名字只是简单的叫update,太不明了了 |
||||
*/ |
||||
@Override |
||||
public void update() { |
||||
this.setEnabled(this.getEditingComponent() != null); |
||||
} |
||||
} |
@ -0,0 +1,7 @@
|
||||
package com.fr.design.actions; |
||||
|
||||
import com.fr.design.designer.TargetComponent; |
||||
|
||||
public interface TemplateComponentActionInterface<T extends TargetComponent> { |
||||
public T getEditingComponent(); |
||||
} |
@ -0,0 +1,15 @@
|
||||
package com.fr.design.actions; |
||||
|
||||
import com.fr.design.gui.ibutton.UIToggleButton; |
||||
|
||||
/** |
||||
* 具有ToggleButton属性的action,继承这个类的action就会有 |
||||
* |
||||
* @author zhou |
||||
* |
||||
*/ |
||||
|
||||
public interface ToggleButtonUpdateAction { |
||||
|
||||
public abstract UIToggleButton createToolBarComponent(); |
||||
} |
@ -0,0 +1,52 @@
|
||||
/* |
||||
* Copyright(c) 2001-2010, FineReport Inc, All Rights Reserved. |
||||
*/ |
||||
package com.fr.design.actions; |
||||
|
||||
import java.util.ArrayList; |
||||
import java.util.List; |
||||
|
||||
import com.fr.design.menu.MenuDef; |
||||
|
||||
public class ToolbarActionManager { |
||||
|
||||
private static ToolbarActionManager toolbarActionManager = null; //key map
|
||||
//所有的Action Map.
|
||||
private List<UpdateAction> actionList = new ArrayList<UpdateAction>(); |
||||
private List<MenuDef> menuList=new ArrayList<MenuDef>(); |
||||
|
||||
private ToolbarActionManager() { |
||||
} |
||||
|
||||
public static ToolbarActionManager createToolbarActionManager() { |
||||
if (toolbarActionManager == null) { |
||||
toolbarActionManager = new ToolbarActionManager(); |
||||
} |
||||
return toolbarActionManager; |
||||
} |
||||
|
||||
public void registerAction(UpdateAction updateAction) { |
||||
actionList.add(updateAction); |
||||
} |
||||
|
||||
public void registerAction(MenuDef menuDef) { |
||||
menuList.add(menuDef); |
||||
} |
||||
|
||||
public void update() { |
||||
int actionCount = actionList.size(); |
||||
for (int i = 0; i < actionCount; i++) { |
||||
UpdateAction action = actionList.get(i); |
||||
if (action != null) { |
||||
action.update(); |
||||
} |
||||
} |
||||
actionCount=menuList.size(); |
||||
for(int i=0;i<actionCount;i++){ |
||||
MenuDef menuDef=menuList.get(i); |
||||
if(menuDef!=null){ |
||||
menuDef.updateMenu(); |
||||
} |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,21 @@
|
||||
package com.fr.design.actions; |
||||
|
||||
import java.awt.event.ActionEvent; |
||||
|
||||
public abstract class UndoableAction extends UpdateAction { |
||||
@Override |
||||
public void actionPerformed(ActionEvent evt) { |
||||
actionPerformedUndoable(); |
||||
} |
||||
|
||||
protected void actionPerformedUndoable() { |
||||
boolean executeValue = this.executeActionReturnUndoRecordNeeded(); |
||||
if (executeValue) { |
||||
prepare4Undo(); |
||||
} |
||||
} |
||||
|
||||
public abstract boolean executeActionReturnUndoRecordNeeded(); |
||||
|
||||
public abstract void prepare4Undo(); |
||||
} |
@ -0,0 +1,402 @@
|
||||
/* |
||||
* Copyright(c) 2001-2010, FineReport Inc, All Rights Reserved. |
||||
*/ |
||||
package com.fr.design.actions; |
||||
|
||||
import com.fr.base.NameStyle; |
||||
import com.fr.base.ScreenResolution; |
||||
import com.fr.base.Style; |
||||
import com.fr.design.constants.UIConstants; |
||||
import com.fr.design.actions.core.ActionUtils; |
||||
import com.fr.design.gui.ibutton.UIButton; |
||||
import com.fr.design.gui.imenu.UICheckBoxMenuItem; |
||||
import com.fr.design.gui.imenu.UIMenuItem; |
||||
import com.fr.design.menu.ShortCut; |
||||
import com.fr.stable.StringUtils; |
||||
|
||||
import javax.swing.*; |
||||
import java.awt.*; |
||||
import java.beans.PropertyChangeListener; |
||||
import java.util.HashMap; |
||||
import java.util.Iterator; |
||||
import java.util.Map; |
||||
|
||||
/** |
||||
* An UpdateAction functions allows actions to have an efficient transient state, |
||||
* it's update method is called every time the action is about to be displayed |
||||
* in UI - allowing the action to poll whatever information it wishes to update its state |
||||
* before being displayed |
||||
* As a regular Swing Action object - it stores the name, icon, and enabled state for a single action. |
||||
* <p/> |
||||
* For example, a 'cut' action my be enabled or disabled based on the state of the selection |
||||
* in a text component. Just before the edit menu is displayed, the cut action is given the |
||||
* opportunity to update itself, and will appear in the menu with the correct state. |
||||
* august:不需要考虑UpdateAction的持久化,难道需要持久化吗? 又不像以前那样保存docking的大小布局 |
||||
* 如果是ToggleButton,就额外继承ToggleButtonUpdateAction接口 |
||||
*/ |
||||
public abstract class UpdateAction extends ShortCut implements Action { |
||||
|
||||
/** |
||||
* Specifies whether action is enabled; the default is true. |
||||
*/ |
||||
private boolean enabled = true; |
||||
|
||||
/** |
||||
* Contains the array of key bindings. |
||||
* august:关键词key,是Action里面的final常量,如:Action.NAME、Action.SMALL_ICON等等 |
||||
*/ |
||||
private Map<String, Object> componentMap; |
||||
|
||||
/** |
||||
* Constructor |
||||
*/ |
||||
public UpdateAction() { |
||||
//设置默认的small icon,必须有一个默认的图片,这样菜单整体美观.
|
||||
this.putValue(Action.SMALL_ICON, UIConstants.BLACK_ICON); |
||||
} |
||||
|
||||
/** |
||||
* Returns true if the action is enabled. |
||||
* |
||||
* @return true if the action is enabled, false otherwise |
||||
* @see Action#isEnabled |
||||
*/ |
||||
@Override |
||||
public boolean isEnabled() { |
||||
return enabled; |
||||
} |
||||
|
||||
/** |
||||
* Enables or disables the action. |
||||
* |
||||
* @param newValue true to enable the action, false to |
||||
* disable it |
||||
* @see Action#setEnabled |
||||
*/ |
||||
@Override |
||||
public void setEnabled(boolean newValue) { |
||||
boolean oldValue = this.enabled; |
||||
|
||||
if (oldValue != newValue) { |
||||
this.enabled = newValue; |
||||
|
||||
//循环遍历所有的Enable属性.
|
||||
Iterator<Object> valueIt = this.componentMap.values().iterator(); |
||||
while (valueIt.hasNext()) { |
||||
Object valueObject = valueIt.next(); |
||||
if (valueObject instanceof JComponent) { |
||||
((JComponent) valueObject).setEnabled(this.enabled); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
|
||||
/** |
||||
* Returns the name for the action, used for a menu or button. |
||||
* |
||||
* @return the name for the action. |
||||
*/ |
||||
public String getName() { |
||||
return (String) this.getValue(Action.NAME); |
||||
} |
||||
|
||||
/** |
||||
* Sets the name for the action, used for a menu or button. |
||||
* |
||||
* @param name the name for the action. |
||||
*/ |
||||
public void setName(String name) { |
||||
this.putValue(Action.NAME, name); |
||||
} |
||||
|
||||
/** |
||||
* Returns the smallIcon property setting. |
||||
* |
||||
* @return The small icon for the action. |
||||
*/ |
||||
public Icon getSmallIcon() { |
||||
return (Icon) this.getValue(Action.SMALL_ICON); |
||||
} |
||||
|
||||
/** |
||||
* Sets the smallIcon property. The smallIcon may be displayed as a menu item's icon or |
||||
* possibly as the icon for a button. This icon should be 16x16 pixels in size. |
||||
* |
||||
* @param smallIcon The small icon for the action. |
||||
*/ |
||||
public void setSmallIcon(Icon smallIcon) { |
||||
this.putValue(Action.SMALL_ICON, smallIcon); |
||||
} |
||||
|
||||
/** |
||||
* Returns the mnemonic property setting. |
||||
* |
||||
* @return The mnemonic character for the action. |
||||
*/ |
||||
public char getMnemonic() { |
||||
Integer n = (Integer) this.getValue(Action.MNEMONIC_KEY); |
||||
return n == null ? '\0' : (char) n.intValue(); |
||||
} |
||||
|
||||
/** |
||||
* Sets the mnemonic property. The mnemonic character is the 'hotkey' for the menu item |
||||
* or button displaying the action. This *must* be a character in the 'name' property, |
||||
* or it will have no effect. |
||||
* |
||||
* @param mnemonic The mnemonic character for the action |
||||
*/ |
||||
public void setMnemonic(char mnemonic) { |
||||
this.putValue(Action.MNEMONIC_KEY, new Integer(mnemonic)); |
||||
} |
||||
|
||||
/** |
||||
* Returns the key used for storing a <code>KeyStroke</code> to be used as the |
||||
* accelerator for the action. |
||||
* |
||||
* @return the key as the accelerator for the action. |
||||
*/ |
||||
public KeyStroke getAccelerator() { |
||||
return (KeyStroke) this.getValue(Action.ACCELERATOR_KEY); |
||||
} |
||||
|
||||
/** |
||||
* Sets the key used for storing a <code>KeyStroke</code> to be used as the |
||||
* accelerator for the action. |
||||
* |
||||
* @param accelerator the key as the accelerator for the action. |
||||
*/ |
||||
public void setAccelerator(KeyStroke accelerator) { |
||||
this.putValue(Action.ACCELERATOR_KEY, accelerator); |
||||
} |
||||
|
||||
/** |
||||
* update enable |
||||
*/ |
||||
public void update() { |
||||
} |
||||
|
||||
/** |
||||
* Gets the <code>Object</code> associated with the specified key. |
||||
* |
||||
* @param key a string containing the specified <code>key</code> |
||||
* @return the binding <code>Object</code> stored with this key; if there |
||||
* are no keys, it will return <code>null</code> |
||||
* @see Action#getValue |
||||
*/ |
||||
@Override |
||||
public Object getValue(String key) { |
||||
if (componentMap == null) { |
||||
return null; |
||||
} |
||||
return componentMap.get(key); |
||||
} |
||||
|
||||
/** |
||||
* Sets the <code>Value</code> associated with the specified key. |
||||
* |
||||
* @param key the <code>String</code> that identifies the stored object |
||||
* @param newValue the <code>Object</code> to store using this key |
||||
* @see Action#putValue |
||||
*/ |
||||
@Override |
||||
public void putValue(String key, Object newValue) { |
||||
if (componentMap == null) { |
||||
componentMap = new HashMap<String, Object>(); |
||||
} |
||||
|
||||
|
||||
if (newValue == null) { |
||||
componentMap.remove(key); |
||||
} else { |
||||
componentMap.put(key, newValue); |
||||
} |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public synchronized void addPropertyChangeListener(PropertyChangeListener listener) { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public synchronized void removePropertyChangeListener(PropertyChangeListener listener) { |
||||
} |
||||
|
||||
/** |
||||
* Gets menu item. |
||||
* |
||||
* @return the created menu item. |
||||
*/ |
||||
public UIMenuItem createMenuItem() { |
||||
Object object = this.getValue(UIMenuItem.class.getName()); |
||||
if (object == null && !(object instanceof UIMenuItem)) { |
||||
UIMenuItem menuItem = new UIMenuItem(this); |
||||
// 设置名字用作单元测
|
||||
menuItem.setName(getName()); |
||||
object = menuItem; |
||||
|
||||
this.putValue(UIMenuItem.class.getName(), object); |
||||
} |
||||
|
||||
return (UIMenuItem) object; |
||||
} |
||||
|
||||
/** |
||||
* Gets component on toolbar. |
||||
* |
||||
* @return the created components on toolbar. |
||||
*/ |
||||
public JComponent createToolBarComponent() { |
||||
Object object = this.getValue(UIButton.class.getName()); |
||||
if (!(object instanceof AbstractButton)) { |
||||
UIButton button = null; |
||||
button = new UIButton(); |
||||
// 添加一个名字作为自动化测试用
|
||||
button.setName(getName()); |
||||
button.set4ToolbarButton(); |
||||
|
||||
//设置属性.
|
||||
Integer mnemonicInteger = (Integer) this.getValue(Action.MNEMONIC_KEY); |
||||
if (mnemonicInteger != null) { |
||||
button.setMnemonic((char) mnemonicInteger.intValue()); |
||||
} |
||||
|
||||
button.setIcon((Icon) this.getValue(Action.SMALL_ICON)); |
||||
button.addActionListener(this); |
||||
|
||||
button.registerKeyboardAction(this, this.getAccelerator(), JComponent.WHEN_IN_FOCUSED_WINDOW); |
||||
|
||||
this.putValue(UIButton.class.getName(), button); |
||||
button.setText(StringUtils.EMPTY); |
||||
button.setEnabled(this.isEnabled()); |
||||
|
||||
//peter:产生tooltip
|
||||
button.setToolTipText(ActionUtils.createButtonToolTipText(this)); |
||||
object = button; |
||||
} |
||||
|
||||
return (JComponent) object; |
||||
} |
||||
|
||||
/** |
||||
* Equals |
||||
*/ |
||||
@Override |
||||
public boolean equals(Object object) { |
||||
if (object == this) { |
||||
return true; |
||||
} |
||||
if (!(object instanceof UpdateAction)) { |
||||
return false; |
||||
} |
||||
|
||||
return ((UpdateAction) object).getName().equals(this.getName()); |
||||
} |
||||
|
||||
@Override |
||||
public int hashCode() { |
||||
int hash = 5; |
||||
hash = 59 * hash + (this.enabled ? 1 : 0); |
||||
return hash; |
||||
} |
||||
|
||||
/* |
||||
* Add this ShortCut into JPopupMenu |
||||
*/ |
||||
@Override |
||||
public void intoJPopupMenu(JPopupMenu menu) { |
||||
update(); |
||||
|
||||
menu.add(this.createMenuItem()); |
||||
} |
||||
|
||||
/* |
||||
* Add this ShortCut into JToolBar |
||||
*/ |
||||
@Override |
||||
public void intoJToolBar(JToolBar toolBar) { |
||||
update(); |
||||
|
||||
toolBar.add(this.createToolBarComponent()); |
||||
} |
||||
|
||||
/** |
||||
* 全局style的菜单 |
||||
*/ |
||||
public static class UseMenuItem extends UIMenuItem { |
||||
|
||||
private NameStyle nameStyle; |
||||
|
||||
public UseMenuItem(Action action) { |
||||
super(action); |
||||
setPreferredSize(new Dimension(80, 20)); |
||||
} |
||||
|
||||
public UseMenuItem(String text, Icon icon) { |
||||
super(text, icon); |
||||
} |
||||
|
||||
@Override |
||||
public void paintComponent(Graphics g) { |
||||
super.paintComponent(g); |
||||
|
||||
if (nameStyle == null) { |
||||
return; |
||||
} |
||||
|
||||
Style.paintBackground((Graphics2D) g, nameStyle, getWidth() - 1, getHeight() - 1); |
||||
|
||||
Style.paintContent((Graphics2D) g, nameStyle.getName(), nameStyle, getWidth() - 1, getHeight() - 1, ScreenResolution.getScreenResolution()); |
||||
|
||||
Style.paintBorder((Graphics2D) g, nameStyle, getWidth() - 1, getHeight() - 1); |
||||
} |
||||
|
||||
public NameStyle getNameStyle() { |
||||
return this.nameStyle; |
||||
} |
||||
|
||||
public void setNameStyle(NameStyle nameStyle) { |
||||
this.nameStyle = nameStyle; |
||||
} |
||||
|
||||
@Override |
||||
public Dimension getMinimumSize() { |
||||
return getPreferredSize(); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* Gets menu item. |
||||
* |
||||
* @return the created menu item. |
||||
*/ |
||||
public UseMenuItem createUseMenuItem() { |
||||
Object object = this.getValue(UseMenuItem.class.getName()); |
||||
if (object == null && !(object instanceof UseMenuItem)) { |
||||
object = new UseMenuItem(this); |
||||
this.putValue(UseMenuItem.class.getName(), object); |
||||
} |
||||
return (UseMenuItem) object; |
||||
} |
||||
|
||||
public static UICheckBoxMenuItem createCheckBoxMenuItem(UpdateAction action) { |
||||
UICheckBoxMenuItem menuItem = new UICheckBoxMenuItem(action.getName()); |
||||
|
||||
// 设置属性.
|
||||
Integer mnemonicInteger = (Integer) action |
||||
.getValue(Action.MNEMONIC_KEY); |
||||
if (mnemonicInteger != null) { |
||||
menuItem.setMnemonic((char) mnemonicInteger.intValue()); |
||||
} |
||||
menuItem.setIcon((Icon) action.getValue(Action.SMALL_ICON)); |
||||
// if(menuItem.isSelected()){
|
||||
// menuItem.setIcon(FRSwingConstants.YES_ICON);
|
||||
// }
|
||||
menuItem.addActionListener(action); |
||||
menuItem.setToolTipText((String) action.getValue(Action.LONG_DESCRIPTION)); |
||||
menuItem.setAccelerator((KeyStroke) action.getValue(Action.ACCELERATOR_KEY)); |
||||
|
||||
return menuItem; |
||||
} |
||||
} |
@ -0,0 +1,202 @@
|
||||
package com.fr.design.actions.core; |
||||
|
||||
import java.awt.event.KeyEvent; |
||||
import java.lang.reflect.Constructor; |
||||
import java.util.HashMap; |
||||
import java.util.Map; |
||||
|
||||
import javax.swing.Action; |
||||
import javax.swing.KeyStroke; |
||||
|
||||
import com.fr.base.FRContext; |
||||
import com.fr.base.Utils; |
||||
import com.fr.design.actions.UpdateAction; |
||||
import com.fr.design.file.HistoryTemplateListPane; |
||||
import com.fr.design.mainframe.JTemplate; |
||||
import com.fr.design.selection.QuickEditor; |
||||
|
||||
/** |
||||
* 一些ActionUtils |
||||
*/ |
||||
public class ActionUtils { |
||||
private static Class<UpdateAction>[] actionClasses; |
||||
private static Class<UpdateAction>[] floatActionClasses; |
||||
|
||||
private ActionUtils() { |
||||
} |
||||
|
||||
private static Map<Class, QuickEditor> floatEditor = new HashMap<Class, QuickEditor>(); |
||||
|
||||
private static Class chartCollectionClass = null; |
||||
|
||||
private static Map<Class, QuickEditor> cellEditor = new HashMap<Class, QuickEditor>(); |
||||
|
||||
private static UpdateAction chartPreStyleAction = null; |
||||
|
||||
/** |
||||
* 待说明 |
||||
* @param clzz 待说明 |
||||
* @param editor 待说明 |
||||
*/ |
||||
public static void registerCellEditor(Class clzz, QuickEditor editor) { |
||||
cellEditor.put(clzz, editor); |
||||
} |
||||
|
||||
/** |
||||
* 待说明 |
||||
* @param clzz 待说明 |
||||
* @param editor 待说明 |
||||
*/ |
||||
public static void registerFloatEditor(Class clzz, QuickEditor editor) { |
||||
floatEditor.put(clzz, editor); |
||||
} |
||||
|
||||
/** |
||||
* 注册图表的 预定义样式. |
||||
* @param action 注册的图表预定义样式action |
||||
*/ |
||||
public static void registerChartPreStyleAction(UpdateAction action) { |
||||
chartPreStyleAction = action; |
||||
} |
||||
|
||||
/** |
||||
* 返回 图表预定义样式Action |
||||
*/ |
||||
public static UpdateAction getChartPreStyleAction() { |
||||
return chartPreStyleAction; |
||||
} |
||||
|
||||
/** |
||||
* kunsnat: 图表注册 悬浮元素编辑器 , 因为ChartCollecion和ChartQuickEditor一个在Chart,一个在Designer, 所以分开注册. |
||||
* @param clzz 待说明 |
||||
*/ |
||||
public static void registerChartCollection(Class clzz) { |
||||
chartCollectionClass = clzz; |
||||
} |
||||
|
||||
public static Class getChartCollectionClass() { |
||||
return chartCollectionClass; |
||||
} |
||||
|
||||
/** |
||||
* kunsnat: 图表注册 悬浮元素编辑器 , 因为ChartCollecion和ChartQuickEditor一个在Chart,一个在Designer, 所以分开注册. |
||||
* @param editor 待说明 |
||||
*/ |
||||
public static void registerChartFloatEditorInEditor(QuickEditor editor) { |
||||
if(chartCollectionClass != null) { |
||||
floatEditor.put(chartCollectionClass, editor); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* kunsnat: 图表注册 悬浮元素编辑器 , 因为ChartCollecion和ChartQuickEditor一个在Chart,一个在Designer, 所以分开注册. |
||||
* @param editor 待说明 |
||||
*/ |
||||
public static void registerChartCellEditorInEditor(QuickEditor editor) { |
||||
if(chartCollectionClass != null) { |
||||
cellEditor.put(chartCollectionClass, editor); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 返回 悬浮元素选中的Editor |
||||
*/ |
||||
public static QuickEditor getFloatEditor(Class clazz) { |
||||
return floatEditor.get(clazz); |
||||
} |
||||
|
||||
public static QuickEditor getCellEditor(Class clazz) { |
||||
return cellEditor.get(clazz); |
||||
} |
||||
|
||||
/** |
||||
* peter:从Action来产生ToolTipText. |
||||
* @param action 动作 |
||||
* @return 字符 |
||||
*/ |
||||
public static String createButtonToolTipText(Action action) { |
||||
StringBuffer buttonToolTipTextBuf = new StringBuffer(); |
||||
|
||||
//peter:把中文后面的(U),alt 快捷键的括号去掉,这个方法是临时的做法.
|
||||
String actionName = (String) action.getValue(Action.NAME); |
||||
if (actionName.lastIndexOf("(") != -1) { |
||||
buttonToolTipTextBuf.append(actionName.substring(0, actionName.lastIndexOf("("))); |
||||
} else { |
||||
buttonToolTipTextBuf.append(actionName); |
||||
} |
||||
|
||||
//peter:产生快捷键的ToolTip.
|
||||
KeyStroke keyStroke = (KeyStroke) action.getValue(Action.ACCELERATOR_KEY); |
||||
if (keyStroke != null) { |
||||
buttonToolTipTextBuf.append(" ("); |
||||
buttonToolTipTextBuf.append(KeyEvent.getKeyModifiersText(keyStroke.getModifiers())); |
||||
buttonToolTipTextBuf.append('+'); |
||||
buttonToolTipTextBuf.append(KeyEvent.getKeyText(keyStroke.getKeyCode())); |
||||
buttonToolTipTextBuf.append(')'); |
||||
} |
||||
|
||||
return Utils.objectToString(buttonToolTipTextBuf); |
||||
} |
||||
|
||||
/** |
||||
* 纪录插入元素的种类 |
||||
* |
||||
* @param cls 类型数组 |
||||
*/ |
||||
public static void registerCellInsertActionClass(Class<UpdateAction>[] cls) { |
||||
actionClasses = cls; |
||||
} |
||||
|
||||
/** |
||||
* 生成单元格插入相关的Action |
||||
* |
||||
* @param cls 构造函数参数类型 |
||||
* @param obj 构造函数参数值 |
||||
* @return 相关Action组成的一个数组 |
||||
*/ |
||||
public static UpdateAction[] createCellInsertAction(Class cls, Object obj) { |
||||
int length = 0; |
||||
JTemplate jTemplate = HistoryTemplateListPane.getInstance().getCurrentEditingTemplate(); |
||||
//表单中报表块编辑屏蔽掉 插入子报表
|
||||
length = jTemplate.isJWorkBook()? actionClasses.length : actionClasses.length - 1; |
||||
UpdateAction[] actions = new UpdateAction[length]; |
||||
for (int i = 0; i < length; i++) { |
||||
try { |
||||
Constructor<UpdateAction> c = actionClasses[i].getConstructor(cls); |
||||
actions[i] = c.newInstance(obj); |
||||
} catch (Exception e) { |
||||
FRContext.getLogger().error(e.getMessage(), e); |
||||
} |
||||
} |
||||
return actions; |
||||
} |
||||
|
||||
/** |
||||
* 登记悬浮元素插入类型 |
||||
* |
||||
* @param cls 插入类型数组 |
||||
*/ |
||||
public static void registerFloatInsertActionClass(Class<UpdateAction>[] cls) { |
||||
floatActionClasses = cls; |
||||
} |
||||
|
||||
/** |
||||
* 生成悬浮元素插入相关的Action |
||||
* |
||||
* @param cls 构造函数参数类型 |
||||
* @param obj 构造函数参数值 |
||||
* @return 相关Action组成的一个数组 |
||||
*/ |
||||
public static UpdateAction[] createFloatInsertAction(Class cls, Object obj) { |
||||
UpdateAction[] actions = new UpdateAction[floatActionClasses.length]; |
||||
for (int i = 0; i < floatActionClasses.length; i++) { |
||||
try { |
||||
Constructor<UpdateAction> c = floatActionClasses[i].getConstructor(cls); |
||||
actions[i] = c.newInstance(obj); |
||||
} catch (Exception e) { |
||||
FRContext.getLogger().error(e.getMessage(), e); |
||||
} |
||||
} |
||||
return actions; |
||||
} |
||||
} |
@ -0,0 +1,37 @@
|
||||
/* |
||||
* Copyright(c) 2001-2010, FineReport Inc, All Rights Reserved. |
||||
*/ |
||||
package com.fr.design.actions.edit; |
||||
|
||||
import java.awt.event.KeyEvent; |
||||
|
||||
import javax.swing.KeyStroke; |
||||
|
||||
import com.fr.base.BaseUtils; |
||||
import com.fr.design.actions.TemplateComponentAction; |
||||
import com.fr.design.designer.TargetComponent; |
||||
import com.fr.general.Inter; |
||||
|
||||
/** |
||||
* Copy. |
||||
*/ |
||||
public class CopyAction extends TemplateComponentAction { |
||||
public CopyAction(TargetComponent t) { |
||||
super(t); |
||||
|
||||
this.setName(Inter.getLocText("M_Edit-Copy")); |
||||
this.setMnemonic('C'); |
||||
this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_edit/copy.png")); |
||||
this.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, KeyEvent.CTRL_MASK)); |
||||
} |
||||
|
||||
@Override |
||||
public boolean executeActionReturnUndoRecordNeeded() { |
||||
TargetComponent tc = getEditingComponent(); |
||||
if (tc != null) { |
||||
tc.copy(); |
||||
} |
||||
|
||||
return false; |
||||
} |
||||
} |
@ -0,0 +1,39 @@
|
||||
/* |
||||
* Copyright(c) 2001-2010, FineReport Inc, All Rights Reserved. |
||||
*/ |
||||
package com.fr.design.actions.edit; |
||||
|
||||
import java.awt.event.KeyEvent; |
||||
|
||||
import javax.swing.KeyStroke; |
||||
|
||||
import com.fr.base.BaseUtils; |
||||
import com.fr.design.actions.TemplateComponentAction; |
||||
import com.fr.design.designer.TargetComponent; |
||||
import com.fr.general.Inter; |
||||
|
||||
/** |
||||
* Cut. |
||||
*/ |
||||
public class CutAction extends TemplateComponentAction { |
||||
/** |
||||
* Constructor |
||||
*/ |
||||
public CutAction(TargetComponent t) { |
||||
super(t); |
||||
|
||||
this.setName(Inter.getLocText("M_Edit-Cut")); |
||||
this.setMnemonic('T'); |
||||
this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_edit/cut.png")); |
||||
this.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, KeyEvent.CTRL_MASK)); |
||||
} |
||||
|
||||
@Override |
||||
public boolean executeActionReturnUndoRecordNeeded() { |
||||
TargetComponent editPane = getEditingComponent(); |
||||
if (editPane == null) { |
||||
return false; |
||||
} |
||||
return editPane.cut(); |
||||
} |
||||
} |
@ -0,0 +1,39 @@
|
||||
/* |
||||
* Copyright(c) 2001-2010, FineReport Inc, All Rights Reserved. |
||||
*/ |
||||
package com.fr.design.actions.edit; |
||||
|
||||
import java.awt.event.KeyEvent; |
||||
|
||||
import javax.swing.KeyStroke; |
||||
|
||||
import com.fr.base.BaseUtils; |
||||
import com.fr.design.actions.TemplateComponentAction; |
||||
import com.fr.design.designer.TargetComponent; |
||||
import com.fr.general.Inter; |
||||
|
||||
/** |
||||
* Paste. |
||||
*/ |
||||
public class PasteAction extends TemplateComponentAction { |
||||
/** |
||||
* Constructor |
||||
*/ |
||||
public PasteAction(TargetComponent t) { |
||||
super(t); |
||||
|
||||
this.setName(Inter.getLocText("M_Edit-Paste")); |
||||
this.setMnemonic('P'); |
||||
this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_edit/paste.png")); |
||||
this.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V, KeyEvent.CTRL_MASK)); |
||||
} |
||||
|
||||
@Override |
||||
public boolean executeActionReturnUndoRecordNeeded() { |
||||
TargetComponent tc = getEditingComponent(); |
||||
if (tc == null) { |
||||
return false; |
||||
} |
||||
return tc.paste(); |
||||
} |
||||
} |
@ -0,0 +1,59 @@
|
||||
/* |
||||
* Copyright(c) 2001-2010, FineReport Inc, All Rights Reserved. |
||||
*/ |
||||
package com.fr.design.actions.edit; |
||||
|
||||
import java.awt.event.ActionEvent; |
||||
|
||||
import com.fr.base.BaseUtils; |
||||
import com.fr.design.DesignerEnvManager; |
||||
import com.fr.design.actions.TemplateComponentActionInterface; |
||||
import com.fr.design.actions.UpdateAction; |
||||
import com.fr.design.mainframe.JTemplate; |
||||
import com.fr.design.menu.KeySetUtils; |
||||
|
||||
/** |
||||
* Redo. |
||||
*/ |
||||
public class RedoAction extends UpdateAction implements TemplateComponentActionInterface<JTemplate<?, ?>> { |
||||
private JTemplate<?, ?> t; |
||||
|
||||
public RedoAction(JTemplate<?, ?> t) { |
||||
this.t = t; |
||||
this.setMenuKeySet(KeySetUtils.REDO); |
||||
this.setName(getMenuKeySet().getMenuKeySetName()); |
||||
this.setMnemonic(getMenuKeySet().getMnemonic()); |
||||
this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_edit/redo.png")); |
||||
this.setAccelerator(getMenuKeySet().getKeyStroke()); |
||||
} |
||||
|
||||
@Override |
||||
public JTemplate<?, ?> getEditingComponent() { |
||||
return t; |
||||
} |
||||
|
||||
/** |
||||
* 动作 |
||||
* @param e 事件 |
||||
*/ |
||||
public void actionPerformed(ActionEvent e) { |
||||
JTemplate<?, ?> uncComponent = getEditingComponent(); |
||||
if (uncComponent != null) { |
||||
uncComponent.redo(); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* update enable |
||||
*/ |
||||
@Override |
||||
public void update() { |
||||
JTemplate<?, ?> undoComponent = getEditingComponent(); |
||||
if (DesignerEnvManager.getEnvManager().isSupportUndo()) { |
||||
this.setEnabled(undoComponent != null && undoComponent.canRedo()); |
||||
} else { |
||||
this.setEnabled(false); |
||||
} |
||||
|
||||
} |
||||
} |
@ -0,0 +1,60 @@
|
||||
/* |
||||
* Copyright(c) 2001-2010, FineReport Inc, All Rights Reserved. |
||||
*/ |
||||
package com.fr.design.actions.edit; |
||||
|
||||
import java.awt.event.ActionEvent; |
||||
|
||||
import com.fr.base.BaseUtils; |
||||
import com.fr.design.DesignerEnvManager; |
||||
import com.fr.design.actions.TemplateComponentActionInterface; |
||||
import com.fr.design.actions.UpdateAction; |
||||
import com.fr.design.mainframe.JTemplate; |
||||
import com.fr.design.menu.KeySetUtils; |
||||
|
||||
/** |
||||
* Undo. |
||||
*/ |
||||
public class UndoAction extends UpdateAction implements TemplateComponentActionInterface<JTemplate<?,?>> { |
||||
private JTemplate<?, ?> t; |
||||
|
||||
public UndoAction(JTemplate<?, ?> t) { |
||||
this.t = t; |
||||
this.setMenuKeySet(KeySetUtils.UNDO); |
||||
this.setName(getMenuKeySet().getMenuKeySetName()); |
||||
this.setMnemonic(getMenuKeySet().getMnemonic()); |
||||
this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_edit/undo.png")); |
||||
this.setAccelerator(getMenuKeySet().getKeyStroke()); |
||||
} |
||||
|
||||
@Override |
||||
public JTemplate<?, ?> getEditingComponent() { |
||||
return t; |
||||
} |
||||
|
||||
/** |
||||
* 动作 |
||||
* @param e 事件 |
||||
*/ |
||||
public void actionPerformed(ActionEvent e) { |
||||
JTemplate<?, ?> undoComponent = getEditingComponent(); |
||||
if (undoComponent != null) { |
||||
undoComponent.undo(); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* update enable |
||||
*/ |
||||
@Override |
||||
public void update() { |
||||
JTemplate<?, ?> undoComponent = getEditingComponent(); |
||||
if (DesignerEnvManager.getEnvManager().isSupportUndo()) { |
||||
this.setEnabled(undoComponent != null && undoComponent.canUndo()); |
||||
} else { |
||||
this.setEnabled(false); |
||||
} |
||||
|
||||
|
||||
} |
||||
} |
@ -0,0 +1 @@
|
||||
package com.fr.design.actions.file;
import com.fr.design.actions.UpdateAction;
import com.fr.design.file.HistoryTemplateListPane;
import com.fr.design.file.MutilTempalteTabPane;
import com.fr.design.menu.KeySetUtils;
import java.awt.event.ActionEvent;
/**
* Author : daisy
* Date: 13-8-16
* Time: 下午3:23
*/
public class CloseCurrentTemplateAction extends UpdateAction {
public CloseCurrentTemplateAction() {
this.setMenuKeySet(KeySetUtils.CLOSE_CURRENT_TEMPLATE);
this.setName(getMenuKeySet().getMenuKeySetName());
this.setMnemonic(getMenuKeySet().getMnemonic());
this.setAccelerator(getMenuKeySet().getKeyStroke());
}
/**
* 动作
* @param e 事件
*/
public void actionPerformed(ActionEvent e) {
MutilTempalteTabPane.getInstance().setIsCloseCurrent(true);
MutilTempalteTabPane.getInstance().closeFormat(HistoryTemplateListPane.getInstance().getCurrentEditingTemplate());
MutilTempalteTabPane.getInstance().closeSpecifiedTemplate(HistoryTemplateListPane.getInstance().getCurrentEditingTemplate());
}
} |
@ -0,0 +1,29 @@
|
||||
/* |
||||
* Copyright(c) 2001-2010, FineReport Inc, All Rights Reserved. |
||||
*/ |
||||
package com.fr.design.actions.file; |
||||
|
||||
import java.awt.event.ActionEvent; |
||||
|
||||
import com.fr.design.actions.JTemplateAction; |
||||
import com.fr.design.mainframe.JTemplate; |
||||
import com.fr.general.Inter; |
||||
|
||||
/** |
||||
* Close Report. |
||||
*/ |
||||
public class CloseTemplateAction extends JTemplateAction<JTemplate<?, ?>> { |
||||
/** |
||||
* Constructor |
||||
*/ |
||||
public CloseTemplateAction(JTemplate<?, ?> jt) { |
||||
super(jt); |
||||
|
||||
this.setName(Inter.getLocText("M-Close_Template")); |
||||
this.setMnemonic('C'); |
||||
} |
||||
|
||||
public void actionPerformed(ActionEvent evt) { |
||||
// this.getEditingComponent().unlockTemplate();
|
||||
} |
||||
} |
@ -0,0 +1,22 @@
|
||||
package com.fr.design.actions.file; |
||||
|
||||
import java.awt.event.ActionEvent; |
||||
|
||||
import com.fr.design.actions.UpdateAction; |
||||
import com.fr.design.mainframe.TemplatePane; |
||||
import com.fr.general.Inter; |
||||
|
||||
|
||||
public class EditEnvAction extends UpdateAction { |
||||
|
||||
|
||||
public EditEnvAction() { |
||||
this.setName(Inter.getLocText("M-Others") + "..."); |
||||
} |
||||
|
||||
@Override |
||||
public void actionPerformed(ActionEvent e) { |
||||
TemplatePane.getInstance().editItems(); |
||||
|
||||
} |
||||
} |
@ -0,0 +1,32 @@
|
||||
/* |
||||
* Copyright(c) 2001-2010, FineReport Inc, All Rights Reserved. |
||||
*/ |
||||
package com.fr.design.actions.file; |
||||
|
||||
import java.awt.event.ActionEvent; |
||||
|
||||
import com.fr.design.actions.UpdateAction; |
||||
import com.fr.design.mainframe.DesignerContext; |
||||
import com.fr.design.menu.KeySetUtils; |
||||
|
||||
/** |
||||
* Exit. |
||||
*/ |
||||
public class ExitDesignerAction extends UpdateAction { |
||||
/** |
||||
* Constructor |
||||
*/ |
||||
public ExitDesignerAction() { |
||||
this.setMenuKeySet(KeySetUtils.EXIT_DESIGNER); |
||||
this.setName(getMenuKeySet().getMenuKeySetName()); |
||||
this.setMnemonic(getMenuKeySet().getMnemonic()); |
||||
} |
||||
|
||||
/** |
||||
* 动作 |
||||
* @param e 事件 |
||||
*/ |
||||
public void actionPerformed(ActionEvent e) { |
||||
DesignerContext.getDesignerFrame().exit(); |
||||
} |
||||
} |
@ -0,0 +1,243 @@
|
||||
/* |
||||
* Copyright (c) 2001-2014,FineReport Inc, All Rights Reserved. |
||||
*/ |
||||
|
||||
package com.fr.design.actions.file; |
||||
|
||||
import java.awt.BorderLayout; |
||||
import java.io.IOException; |
||||
import java.io.InputStream; |
||||
import java.io.OutputStream; |
||||
import java.util.ArrayList; |
||||
import java.util.Collections; |
||||
import java.util.HashSet; |
||||
import java.util.List; |
||||
import java.util.Properties; |
||||
import java.util.Set; |
||||
import java.util.Vector; |
||||
|
||||
import javax.swing.JTable; |
||||
import javax.swing.RowFilter; |
||||
import javax.swing.SwingWorker; |
||||
import javax.swing.event.DocumentEvent; |
||||
import javax.swing.event.DocumentListener; |
||||
import javax.swing.table.DefaultTableModel; |
||||
import javax.swing.table.TableRowSorter; |
||||
|
||||
import com.fr.base.Env; |
||||
import com.fr.base.FRContext; |
||||
import com.fr.design.gui.frpane.UITabbedPane; |
||||
import com.fr.design.gui.icontainer.UIScrollPane; |
||||
import com.fr.design.gui.itextfield.UITextField; |
||||
import com.fr.design.dialog.BasicPane; |
||||
import com.fr.file.filetree.FileNode; |
||||
import com.fr.general.FRLogger; |
||||
import com.fr.general.GeneralUtils; |
||||
import com.fr.general.IOUtils; |
||||
import com.fr.general.Inter; |
||||
import com.fr.stable.ArrayUtils; |
||||
import com.fr.stable.project.ProjectConstants; |
||||
|
||||
/** |
||||
* @author : richie |
||||
* @since : 8.0 |
||||
*/ |
||||
public class LocalePane extends BasicPane { |
||||
private static final String FR = "fr.properties"; |
||||
private static final String US = "fr_en_US.properties"; |
||||
private static final String CN = "fr_zh_CN.properties"; |
||||
private static final String JP = "fr_ja_JP.properties"; |
||||
private static final String TW = "fr_zh_TW.properties"; |
||||
private static final String PREFIX = "fr_"; |
||||
private static final int LOCALE_NAME_LEN = 5; |
||||
|
||||
private UITabbedPane tabbedPane; |
||||
private JTable predefinedTable; |
||||
private JTable customTable; |
||||
private DefaultTableModel predefineTableModel; |
||||
private DefaultTableModel customTableModel; |
||||
|
||||
public LocalePane() { |
||||
tabbedPane = new UITabbedPane(); |
||||
setLayout(new BorderLayout()); |
||||
final UITextField searchTextField = new UITextField(); |
||||
add(searchTextField, BorderLayout.NORTH); |
||||
add(tabbedPane, BorderLayout.CENTER); |
||||
|
||||
predefineTableModel = new DefaultTableModel() { |
||||
public boolean isCellEditable(int col, int row) { |
||||
return false; |
||||
} |
||||
}; |
||||
|
||||
predefinedTable = new JTable(predefineTableModel); |
||||
final TableRowSorter sorter = new TableRowSorter(predefineTableModel); |
||||
predefinedTable.setRowSorter(sorter); |
||||
|
||||
customTableModel = new DefaultTableModel(); |
||||
customTable = new JTable(customTableModel); |
||||
final TableRowSorter customSorter = new TableRowSorter(customTableModel); |
||||
customTable.setRowSorter(customSorter); |
||||
|
||||
|
||||
searchTextField.getDocument().addDocumentListener(new DocumentListener() { |
||||
public void insertUpdate(DocumentEvent e) { |
||||
customSorter.setRowFilter(RowFilter.regexFilter(searchTextField.getText())); |
||||
sorter.setRowFilter(RowFilter.regexFilter(searchTextField.getText())); |
||||
} |
||||
|
||||
public void removeUpdate(DocumentEvent e) { |
||||
customSorter.setRowFilter(RowFilter.regexFilter(searchTextField.getText())); |
||||
sorter.setRowFilter(RowFilter.regexFilter(searchTextField.getText())); |
||||
} |
||||
|
||||
public void changedUpdate(DocumentEvent e) { |
||||
customSorter.setRowFilter(RowFilter.regexFilter(searchTextField.getText())); |
||||
sorter.setRowFilter(RowFilter.regexFilter(searchTextField.getText())); |
||||
} |
||||
}); |
||||
|
||||
|
||||
tabbedPane.addTab(Inter.getLocText("Preference-Predefined"), new UIScrollPane(predefinedTable)); |
||||
tabbedPane.addTab(Inter.getLocText("Preference-Custom"), new UIScrollPane(customTable)); |
||||
|
||||
loadData(); |
||||
} |
||||
|
||||
private void loadData() { |
||||
new SwingWorker<Void, Void>() { |
||||
|
||||
@Override |
||||
protected Void doInBackground() throws Exception { |
||||
initPredefinedProperties(); |
||||
initCustomProperties(); |
||||
|
||||
return null; |
||||
} |
||||
|
||||
public void done() { |
||||
predefineTableModel.fireTableDataChanged(); |
||||
customTableModel.fireTableDataChanged(); |
||||
} |
||||
}.execute(); |
||||
} |
||||
|
||||
private void initPredefinedProperties() { |
||||
Properties fr = loadLocaleProperties(FR); |
||||
Properties us = loadLocaleProperties(US); |
||||
Properties cn = loadLocaleProperties(CN); |
||||
Properties jp = loadLocaleProperties(JP); |
||||
Properties tw = loadLocaleProperties(TW); |
||||
|
||||
Set<String> keys = fr.stringPropertyNames(); |
||||
List<String> sortKeys = new ArrayList<String>(keys); |
||||
Collections.sort(sortKeys); |
||||
Vector<String> keyVector = new Vector<String>(); |
||||
Vector<String> valueVector = new Vector<String>(); |
||||
Vector<String> usVector = new Vector<String>(); |
||||
Vector<String> cnVector = new Vector<String>(); |
||||
Vector<String> jpVector = new Vector<String>(); |
||||
Vector<String> twVector = new Vector<String>(); |
||||
for (String key : sortKeys) { |
||||
keyVector.add(key); |
||||
valueVector.add(fr.getProperty(key)); |
||||
usVector.add(us.getProperty(key)); |
||||
cnVector.add(cn.getProperty(key)); |
||||
jpVector.add(jp.getProperty(key)); |
||||
twVector.add(tw.getProperty(key)); |
||||
} |
||||
predefineTableModel.addColumn(Inter.getLocText("Key"), keyVector); |
||||
predefineTableModel.addColumn(Inter.getLocText("Value"), valueVector); |
||||
predefineTableModel.addColumn("en_US", usVector); |
||||
predefineTableModel.addColumn("zh_CN", cnVector); |
||||
predefineTableModel.addColumn("ja_JP", jpVector); |
||||
predefineTableModel.addColumn("zh_TW", twVector); |
||||
} |
||||
|
||||
private void initCustomProperties() throws Exception { |
||||
Env env = FRContext.getCurrentEnv(); |
||||
if (env == null) { |
||||
return; |
||||
} |
||||
FileNode[] fileNodes = env.listFile(ProjectConstants.LOCALE_NAME); |
||||
if (ArrayUtils.getLength(fileNodes) == 0) { |
||||
return; |
||||
} |
||||
|
||||
List<Properties> list = new ArrayList<Properties>(); |
||||
Set<String> keys = new HashSet<String>(); |
||||
customTableModel.addColumn(Inter.getLocText("Key")); |
||||
for (FileNode fileNode : fileNodes) { |
||||
String fileName = fileNode.getName(); |
||||
if (fileName.endsWith(".properties")) { |
||||
InputStream in = env.readBean(fileName, ProjectConstants.LOCALE_NAME); |
||||
Properties properties = new Properties(); |
||||
properties.load(in); |
||||
keys.addAll(properties.stringPropertyNames()); |
||||
list.add(properties); |
||||
customTableModel.addColumn(fileName.substring(PREFIX.length(), LOCALE_NAME_LEN + PREFIX.length())); |
||||
} |
||||
} |
||||
List<String> sortKeys = new ArrayList<String>(keys); |
||||
Collections.sort(sortKeys); |
||||
for (String key : sortKeys) { |
||||
Vector<String> vector = new Vector<String>(); |
||||
vector.add(key); |
||||
for (int i = 0; i < list.size(); i ++) { |
||||
vector.add(list.get(i).getProperty(key)); |
||||
} |
||||
customTableModel.addRow(vector); |
||||
} |
||||
} |
||||
|
||||
private Properties loadLocaleProperties(String name) { |
||||
Properties properties = new Properties(); |
||||
InputStream inputStream = IOUtils.readResource("/com/fr/general/locale/" + name); |
||||
try { |
||||
properties.load(inputStream); |
||||
} catch (IOException e) { |
||||
FRLogger.getLogger().error(e.getMessage()); |
||||
} |
||||
return properties; |
||||
} |
||||
|
||||
/** |
||||
* 保存当前编辑的国际化 |
||||
* |
||||
* |
||||
* @date 2014-9-30-下午3:10:30 |
||||
*/ |
||||
public void save() { |
||||
Env env = FRContext.getCurrentEnv(); |
||||
if (env == null) { |
||||
return; |
||||
} |
||||
if (customTable.getCellEditor() == null) { |
||||
return; |
||||
} |
||||
customTable.getCellEditor().stopCellEditing(); |
||||
for (int i = 1, columnCount = customTableModel.getColumnCount(); i < columnCount; i ++) { |
||||
String fileName = customTableModel.getColumnName(i); |
||||
Properties properties = new Properties(); |
||||
for (int j = 0, rowCount = customTableModel.getRowCount(); j < rowCount; j ++) { |
||||
properties.setProperty(GeneralUtils.objectToString(customTableModel.getValueAt(j, 0)), GeneralUtils.objectToString(customTableModel.getValueAt(j, i))); |
||||
} |
||||
|
||||
OutputStream out = null; |
||||
try { |
||||
out = env.writeBean(PREFIX + fileName + ".properties", ProjectConstants.LOCALE_NAME); |
||||
properties.store(out, null); |
||||
|
||||
out.flush(); |
||||
out.close(); |
||||
} catch (Exception e) { |
||||
FRLogger.getLogger().info(e.getMessage()); |
||||
} |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
protected String title4PopupWindow() { |
||||
return Inter.getLocText("Preference-Locale"); |
||||
} |
||||
} |
@ -0,0 +1,78 @@
|
||||
package com.fr.design.actions.file; |
||||
|
||||
import java.awt.event.ActionEvent; |
||||
import java.util.List; |
||||
|
||||
import com.fr.base.BaseUtils; |
||||
import com.fr.design.DesignerEnvManager; |
||||
import com.fr.design.actions.UpdateAction; |
||||
import com.fr.design.gui.imenu.UIMenu; |
||||
import com.fr.design.mainframe.DesignerContext; |
||||
import com.fr.design.menu.KeySetUtils; |
||||
import com.fr.design.menu.MenuDef; |
||||
import com.fr.file.FILEFactory; |
||||
|
||||
/** |
||||
* Open Resent MenuDef. |
||||
*/ |
||||
public class OpenRecentReportMenuDef extends MenuDef { |
||||
public OpenRecentReportMenuDef() { |
||||
this.setMenuKeySet(KeySetUtils.RECENT_OPEN); |
||||
this.setName(getMenuKeySet().getMenuKeySetName()); |
||||
this.setMnemonic(getMenuKeySet().getMnemonic()); |
||||
this.setIconPath("/com/fr/base/images/cell/blank.gif"); |
||||
initMenuDef(); |
||||
} |
||||
|
||||
private void initMenuDef() { |
||||
DesignerEnvManager designerEnvManager = DesignerEnvManager.getEnvManager(); |
||||
List<String> list = designerEnvManager.getRecentOpenedFilePathList(); |
||||
for (int i = 0; i < list.size(); i++) { |
||||
this.addShortCut(new OpenRecentReportAction(list.get(i))); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 更新菜单 |
||||
*/ |
||||
public void updateMenu() { |
||||
UIMenu createdMenu = this.createJMenu(); |
||||
createdMenu.removeAll(); |
||||
this.clearShortCuts(); |
||||
initMenuDef(); |
||||
int menuCount = this.getShortCutCount(); |
||||
for (int i = 0; i < menuCount; i++) { |
||||
Object object = this.getShortCut(i); |
||||
if (!(object instanceof OpenRecentReportAction)) { |
||||
return; |
||||
} |
||||
OpenRecentReportAction openResentReportAction = (OpenRecentReportAction) object; |
||||
openResentReportAction.update(); |
||||
if (openResentReportAction.isEnabled()) { |
||||
createdMenu.add(openResentReportAction.createMenuItem()); |
||||
} |
||||
} |
||||
} |
||||
|
||||
public static class OpenRecentReportAction extends UpdateAction { |
||||
public OpenRecentReportAction() { |
||||
} |
||||
|
||||
public OpenRecentReportAction(String cptName) { |
||||
this.setName(cptName); |
||||
this.setSmallIcon(BaseUtils.readIcon("/com/fr/base/images/oem/logo.png")); |
||||
} |
||||
|
||||
/** |
||||
* 动作 |
||||
* @param e 事件 |
||||
*/ |
||||
public void actionPerformed(ActionEvent e) { |
||||
DesignerContext.getDesignerFrame().openTemplate(FILEFactory.createFILE(this.getPath())); |
||||
} |
||||
|
||||
public String getPath() { |
||||
return this.getName(); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,45 @@
|
||||
/* |
||||
* Copyright(c) 2001-2010, FineReport Inc, All Rights Reserved. |
||||
*/ |
||||
package com.fr.design.actions.file; |
||||
|
||||
import java.awt.event.ActionEvent; |
||||
|
||||
import com.fr.base.BaseUtils; |
||||
import com.fr.design.actions.UpdateAction; |
||||
import com.fr.design.mainframe.DesignerContext; |
||||
import com.fr.design.menu.KeySetUtils; |
||||
import com.fr.file.FILE; |
||||
import com.fr.file.FILEChooserPane; |
||||
|
||||
|
||||
/** |
||||
* Open Template. |
||||
*/ |
||||
public class OpenTemplateAction extends UpdateAction { |
||||
|
||||
public OpenTemplateAction() { |
||||
this.setMenuKeySet(KeySetUtils.OPEN_TEMPLATE); |
||||
this.setName(getMenuKeySet().getMenuKeySetName()); |
||||
this.setMnemonic(getMenuKeySet().getMnemonic()); |
||||
this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_file/open.png")); |
||||
this.setAccelerator(getMenuKeySet().getKeyStroke()); |
||||
} |
||||
|
||||
/** |
||||
* 动作 |
||||
* @param evt 事件 |
||||
*/ |
||||
public void actionPerformed(ActionEvent evt) { |
||||
FILEChooserPane fileChooser = FILEChooserPane.getInstance(true, true); |
||||
|
||||
if (fileChooser.showOpenDialog(DesignerContext.getDesignerFrame()) |
||||
== FILEChooserPane.OK_OPTION) { |
||||
final FILE file = fileChooser.getSelectedFILE(); |
||||
if (file == null) {//选择的文件不能是 null
|
||||
return; |
||||
} |
||||
DesignerContext.getDesignerFrame().openTemplate(file); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,46 @@
|
||||
package com.fr.design.actions.file; |
||||
|
||||
import java.awt.event.ActionEvent; |
||||
|
||||
import com.fr.design.DesignerEnvManager; |
||||
import com.fr.design.actions.UpdateAction; |
||||
import com.fr.design.file.HistoryTemplateListPane; |
||||
import com.fr.design.mainframe.DesignerContext; |
||||
import com.fr.design.mainframe.DesignerFrame; |
||||
import com.fr.design.mainframe.JTemplate; |
||||
import com.fr.design.menu.KeySetUtils; |
||||
import com.fr.design.dialog.BasicDialog; |
||||
import com.fr.design.dialog.DialogActionAdapter; |
||||
|
||||
|
||||
public class PreferenceAction extends UpdateAction { |
||||
public PreferenceAction() { |
||||
this.setMenuKeySet(KeySetUtils.PREFERENCE); |
||||
this.setName(getMenuKeySet().getMenuKeySetName()+"..."); |
||||
this.setMnemonic(getMenuKeySet().getMnemonic()); |
||||
} |
||||
|
||||
/** |
||||
* 动作 |
||||
* @param e 事件 |
||||
*/ |
||||
public void actionPerformed(ActionEvent e) { |
||||
final DesignerFrame designerFrame = DesignerContext.getDesignerFrame(); |
||||
|
||||
final PreferencePane preferencePane = new PreferencePane(); |
||||
preferencePane.populate(DesignerEnvManager.getEnvManager()); |
||||
|
||||
BasicDialog basicDialog = preferencePane.showWindow(designerFrame); |
||||
basicDialog.addDialogActionListener(new DialogActionAdapter() { |
||||
public void doOk() { |
||||
preferencePane.update(DesignerEnvManager.getEnvManager()); |
||||
DesignerEnvManager.loadLogSetting(); |
||||
DesignerEnvManager.getEnvManager().saveXMLFile(); |
||||
JTemplate jt = HistoryTemplateListPane.getInstance().getCurrentEditingTemplate(); |
||||
jt.refreshToolArea(); |
||||
} |
||||
}); |
||||
|
||||
basicDialog.setVisible(true); |
||||
} |
||||
} |
@ -0,0 +1,633 @@
|
||||
package com.fr.design.actions.file; |
||||
|
||||
import java.awt.BorderLayout; |
||||
import java.awt.Component; |
||||
import java.awt.Dimension; |
||||
import java.awt.event.ActionEvent; |
||||
import java.awt.event.ActionListener; |
||||
import java.awt.event.ItemEvent; |
||||
import java.awt.event.ItemListener; |
||||
import java.awt.event.KeyAdapter; |
||||
import java.awt.event.KeyEvent; |
||||
import java.awt.event.MouseAdapter; |
||||
import java.awt.event.MouseEvent; |
||||
import java.io.File; |
||||
import java.util.Locale; |
||||
|
||||
import javax.swing.JFileChooser; |
||||
import javax.swing.JPanel; |
||||
import javax.swing.KeyStroke; |
||||
import javax.swing.SwingUtilities; |
||||
|
||||
import com.fr.base.BaseUtils; |
||||
import com.fr.design.DesignerEnvManager; |
||||
import com.fr.design.dialog.BasicDialog; |
||||
import com.fr.design.dialog.BasicPane; |
||||
import com.fr.design.dialog.DialogActionAdapter; |
||||
import com.fr.design.editor.editor.IntegerEditor; |
||||
import com.fr.design.gui.frpane.UITabbedPane; |
||||
import com.fr.design.gui.ibutton.UIButton; |
||||
import com.fr.design.gui.ibutton.UIColorButton; |
||||
import com.fr.design.gui.icheckbox.UICheckBox; |
||||
import com.fr.design.gui.icombobox.UIComboBox; |
||||
import com.fr.design.gui.ilable.ActionLabel; |
||||
import com.fr.design.gui.ilable.UILabel; |
||||
import com.fr.design.gui.itextfield.UITextField; |
||||
import com.fr.design.layout.FRGUIPaneFactory; |
||||
import com.fr.design.layout.TableLayout; |
||||
import com.fr.design.layout.TableLayoutHelper; |
||||
import com.fr.design.mainframe.DesignerContext; |
||||
import com.fr.design.utils.gui.GUICoreUtils; |
||||
import com.fr.general.ComparatorUtils; |
||||
import com.fr.general.FRLevel; |
||||
import com.fr.general.Inter; |
||||
|
||||
/** |
||||
* 选项对话框 |
||||
* |
||||
* @editor zhou |
||||
* @since 2012-3-28下午3:39:48 |
||||
*/ |
||||
public class PreferencePane extends BasicPane { |
||||
private static final int MAX_UNDO_LIMIT_5 = 5; |
||||
private static final int MAX_UNDO_LIMIT_10 = 10; |
||||
private static final int MAX_UNDO_LIMIT_15 = 15; |
||||
private static final int MAX_UNDO_LIMIT_20 = 20; |
||||
private static final int MAX_UNDO_LIMIT_50 = 50; |
||||
private static final int SELECTED_INDEX_4 = 4; |
||||
private static final int SELECTED_INDEX_5 = 5; |
||||
|
||||
private static final String TYPE = "pressed"; |
||||
private static final String DISPLAY_TYPE = "+"; |
||||
private static final String BACK_SLASH = "BACK_SLASH"; |
||||
private static final String DISPLAY_BACK_SLASH = "\\"; |
||||
private static final String SLASH = "SLASH"; |
||||
private static final String DISPLAY_SLASH = "/"; |
||||
private static final String CONTROL = "CONTROL"; |
||||
private static final String DISPLAY_CONTROL = "ctrl"; |
||||
private static final String OPEN_BRACKET = "OPEN_BRACKET"; |
||||
private static final String DISPLAY_OPEN_BRACKET = "{"; |
||||
private static final String CLOSE_BRACKET = "CLOSE_BRACKET"; |
||||
private static final String DISPLAY_CLOSE_BRACKET = "}"; |
||||
private static final String COMMA = "COMMA"; |
||||
private static final String DISPLAY_COMMA = ","; |
||||
private static final String PERIOD = "PERIOD"; |
||||
private static final String DISPLAY_PERIOD = "."; |
||||
private static final String SEMICOLON = "SEMICOLON"; |
||||
private static final String DISPLAY_SEMICOLON = ";"; |
||||
private static final String QUOTE = "QUOTE"; |
||||
private static final String DISPLAY_QUOTE = "'"; |
||||
private static final String EQUALS = "EQUALS"; |
||||
private static final String DISPLAY_EQUALS = "+"; |
||||
private static final String MINUS = "MINUS"; |
||||
private static final String DISPLAY_MINUS = "-"; |
||||
|
||||
private static final FRLevel[] LOG = {FRLevel.SEVERE, FRLevel.WARNING, FRLevel.INFO, FRLevel.DEBUG}; |
||||
private static final String[] LANGUAGE = {Inter.getLocText("FR-Designer_Language_Default"), |
||||
getLocaledLanguage("Simplified_Chinese_Language", Locale.SIMPLIFIED_CHINESE), |
||||
getLocaledLanguage("English_Language", Locale.ENGLISH), |
||||
getLocaledLanguage("Japanese_Language", Locale.JAPAN), |
||||
getLocaledLanguage("Traditional_Chinese_Language", Locale.TRADITIONAL_CHINESE)}; |
||||
|
||||
//设置是否支持undo
|
||||
private UICheckBox supportUndoCheckBox; |
||||
//设置最大撤销次数
|
||||
private UIComboBox maxUndoLimit; |
||||
//是非支持自动计算父格
|
||||
private UICheckBox supportDefaultParentCalculateCheckBox; |
||||
|
||||
//是否自动转化为公式
|
||||
private UICheckBox supportStringToFormulaBox; |
||||
private UICheckBox defaultStringToFormulaBox; |
||||
|
||||
private UILabel shortCutLabel; |
||||
private KeyStroke shortCutKeyStore = null; |
||||
private UIColorButton gridLineColorTBButton; |
||||
|
||||
|
||||
private UIColorButton paginationLineColorTBButton; |
||||
|
||||
private UICheckBox supportCellEditorDefCheckBox; |
||||
private UICheckBox isDragPermitedCheckBox; |
||||
|
||||
private UITextField logExportDirectoryField; |
||||
|
||||
private UIComboBox logLevelComboBox, languageComboBox, pageLengthComboBox, reportLengthComboBox; |
||||
private IntegerEditor portEditor; |
||||
private UITextField jdkHomeTextField; |
||||
private UICheckBox oracleSpace; |
||||
private UICheckBox joinProductImprove; |
||||
|
||||
public PreferencePane() { |
||||
this.initComponents(); |
||||
} |
||||
|
||||
protected void initComponents() { |
||||
JPanel contentPane = this; |
||||
contentPane.setLayout(FRGUIPaneFactory.createBorderLayout()); |
||||
|
||||
UITabbedPane jtabPane = new UITabbedPane(); |
||||
JPanel generalPane = FRGUIPaneFactory.createY_AXISBoxInnerContainer_L_Pane(); |
||||
jtabPane.addTab(Inter.getLocText("FR-Designer_General"), generalPane); |
||||
JPanel advancePane = FRGUIPaneFactory.createY_AXISBoxInnerContainer_L_Pane(); |
||||
jtabPane.addTab(Inter.getLocText("FR-Designer_Advanced"), advancePane); |
||||
contentPane.add(jtabPane, BorderLayout.NORTH); |
||||
|
||||
|
||||
createFunctionPane(generalPane); |
||||
createEditPane(generalPane); |
||||
createGuiOfGridPane(generalPane); |
||||
createColorSettingPane(generalPane); |
||||
|
||||
// ConfPane
|
||||
JPanel confLocationPane = FRGUIPaneFactory.createX_AXISBoxInnerContainer_S_Pane(); |
||||
advancePane.add(confLocationPane); |
||||
|
||||
createLogPane(advancePane); |
||||
|
||||
createLanPane(generalPane); |
||||
|
||||
createLengthPane(advancePane); |
||||
|
||||
createServerPane(advancePane); |
||||
|
||||
createJdkHomePane(advancePane); |
||||
|
||||
String[] message = new String[]{"Display", "Oracle_All_Tables"}; |
||||
String[] sign = new String[]{"Oracle"}; |
||||
JPanel oraclePane = FRGUIPaneFactory.createTitledBorderPane("Oracle" + Inter.getLocText("FR-Designer_Oracle_All_Tables")); |
||||
oracleSpace = new UICheckBox(Inter.getLocText(message, sign)); |
||||
oraclePane.add(oracleSpace); |
||||
|
||||
JPanel improvePane = FRGUIPaneFactory.createTitledBorderPane(Inter.getLocText("FR-Designer_Product_improve")); |
||||
joinProductImprove = new UICheckBox(Inter.getLocText("FR-Designer_Join_Product_improve")); |
||||
improvePane.add(joinProductImprove); |
||||
|
||||
JPanel spaceUpPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); |
||||
spaceUpPane.add(oraclePane, BorderLayout.NORTH); |
||||
spaceUpPane.add(improvePane, BorderLayout.SOUTH); |
||||
advancePane.add(spaceUpPane); |
||||
} |
||||
|
||||
private static String getLocaledLanguage(String key, Locale locale){ |
||||
StringBuilder sb = new StringBuilder(); |
||||
sb.append(Inter.getLocText(key)).append("("); |
||||
sb.append(Inter.getLocText(key, locale)).append(")"); |
||||
return sb.toString(); |
||||
} |
||||
|
||||
private void createFunctionPane(JPanel generalPane) { |
||||
JPanel functionPane = FRGUIPaneFactory.createTitledBorderPane(Inter.getLocText("FR-Designer_Preference-Function")); |
||||
generalPane.add(functionPane); |
||||
|
||||
//添加supportUndo选择项
|
||||
supportUndoCheckBox = new UICheckBox(Inter.getLocText("Preference-Support_Undo")); |
||||
functionPane.add(supportUndoCheckBox); |
||||
//添加maxUndoLimit
|
||||
//String[] undoTimes = {"最大撤销次数","5次","10次","15次","20次","50次"};
|
||||
String[] undoTimes = {Inter.getLocText("FR-Designer_max_undo_limit"), MAX_UNDO_LIMIT_5 + Inter.getLocText("FR-Designer_time(s)"), MAX_UNDO_LIMIT_10 + Inter.getLocText("FR-Designer_time(s)") |
||||
, MAX_UNDO_LIMIT_15 + Inter.getLocText("FR-Designer_time(s)"), MAX_UNDO_LIMIT_20 + Inter.getLocText("FR-Designer_time(s)"), MAX_UNDO_LIMIT_50 + Inter.getLocText("FR-Designer_time(s)")}; |
||||
maxUndoLimit = new UIComboBox(undoTimes); |
||||
functionPane.add(maxUndoLimit); |
||||
|
||||
//不支持撤销则不能选择撤销可缓存,也不能设置最大撤销次数
|
||||
supportUndoCheckBox.addActionListener(new ActionListener() { |
||||
public void actionPerformed(ActionEvent e) { |
||||
maxUndoLimit.setEnabled(supportUndoCheckBox.isSelected()); |
||||
} |
||||
}); |
||||
|
||||
|
||||
//添加supportDefaultParentCalculate选择项
|
||||
supportDefaultParentCalculateCheckBox = new UICheckBox( |
||||
Inter.getLocText("Preference-Support_Default_Parent_Calculate")); |
||||
functionPane.add(supportDefaultParentCalculateCheckBox); |
||||
} |
||||
|
||||
private void createEditPane(JPanel generalPane) { |
||||
//samuel:编辑器设置
|
||||
JPanel editPane = FRGUIPaneFactory.createTitledBorderPane(Inter.getLocText(new String[]{"Editor", "Set"})); |
||||
generalPane.add(editPane); |
||||
|
||||
//设置是否支持将字符串编辑为公式
|
||||
supportStringToFormulaBox = new UICheckBox(Inter.getLocText("FR-Designer_Surport_String_To_Formula")); |
||||
editPane.add(supportStringToFormulaBox); |
||||
|
||||
//是否默认转化
|
||||
defaultStringToFormulaBox = new UICheckBox(Inter.getLocText("FR-Designer_Always")); |
||||
|
||||
editPane.add(defaultStringToFormulaBox); |
||||
//不支持转化则不能默认执行
|
||||
supportStringToFormulaBox.addActionListener(new ActionListener() { |
||||
public void actionPerformed(ActionEvent e) { |
||||
defaultStringToFormulaBox.setEnabled(supportStringToFormulaBox.isSelected()); |
||||
} |
||||
}); |
||||
JPanel keyStrokePane = new JPanel(new BorderLayout()); |
||||
keyStrokePane.add(new UILabel(Inter.getLocText("Support-Auto_Complete_Shortcut") + ":"), BorderLayout.WEST); |
||||
shortCutLabel = new UILabel(); |
||||
keyStrokePane.add(shortCutLabel, BorderLayout.CENTER); |
||||
editPane.add(keyStrokePane); |
||||
shortCutLabel.addMouseListener(new MouseAdapter() { |
||||
@Override |
||||
public void mouseClicked(MouseEvent e) { |
||||
if (e.getClickCount() > 1) { |
||||
final KeyStrokePane basicPane = new KeyStrokePane(shortCutLabel.getText()); |
||||
BasicDialog dlg = basicPane.showSmallWindow(SwingUtilities.getWindowAncestor(PreferencePane.this), new DialogActionAdapter() { |
||||
@Override |
||||
public void doOk() { |
||||
shortCutLabel.setText(basicPane.getText()); |
||||
} |
||||
}); |
||||
dlg.setVisible(true); |
||||
} |
||||
} |
||||
}); |
||||
} |
||||
|
||||
private class KeyStrokePane extends BasicPane { |
||||
private UILabel label; |
||||
|
||||
public KeyStrokePane(String text) { |
||||
setLayout(new BorderLayout()); |
||||
setFocusable(true); |
||||
requestFocusInWindow(); |
||||
label = new UILabel(text); |
||||
add(GUICoreUtils.createBorderLayoutPane( |
||||
new UILabel(Inter.getLocText("Support-Current_Auto_Complete_Shortcut") + ":"), |
||||
BorderLayout.WEST, |
||||
label, |
||||
BorderLayout.CENTER), |
||||
BorderLayout.NORTH); |
||||
addKeyListener(new KeyAdapter() { |
||||
@Override |
||||
public void keyReleased(KeyEvent e) { |
||||
int modifier = e.getModifiers(); |
||||
if (modifier == 0) { |
||||
return; |
||||
} |
||||
int keyCode = e.getKeyCode(); |
||||
shortCutKeyStore = KeyStroke.getKeyStroke(keyCode, modifier); |
||||
String str = shortCutKeyStore.toString(); |
||||
label.setText(getDisplayShortCut(str)); |
||||
} |
||||
}); |
||||
} |
||||
|
||||
public String getText() { |
||||
return label.getText(); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
protected String title4PopupWindow() { |
||||
return "KeyStroke"; |
||||
} |
||||
|
||||
} |
||||
|
||||
private void createGuiOfGridPane(JPanel generalPane) { |
||||
// GridPane
|
||||
JPanel guiOfGridPane = FRGUIPaneFactory.createTitledBorderPane(Inter.getLocText("Preference-Setting_Grid")); |
||||
generalPane.add(guiOfGridPane); |
||||
|
||||
supportCellEditorDefCheckBox = new UICheckBox(Inter.getLocText("Preference-Support_Cell_Editor_Definition")); |
||||
guiOfGridPane.add(supportCellEditorDefCheckBox); |
||||
|
||||
isDragPermitedCheckBox = new UICheckBox(Inter.getLocText("Preference-Is_Drag_Permited")); |
||||
guiOfGridPane.add(isDragPermitedCheckBox); |
||||
} |
||||
|
||||
private void createColorSettingPane(JPanel generalPane) { |
||||
// Color Setting Pane
|
||||
JPanel colorSettingPane = FRGUIPaneFactory.createTitledBorderPane(Inter.getLocText("Preference-Setting_Colors")); |
||||
generalPane.add(colorSettingPane); |
||||
|
||||
new UILabel(Inter.getLocText("Preference-Grid_Line_Color")); |
||||
|
||||
new UILabel(Inter.getLocText("Preference-Pagination_Line_Color")); |
||||
|
||||
gridLineColorTBButton = new UIColorButton(BaseUtils.readIcon("/com/fr/design/images/gui/color/foreground.png")); |
||||
gridLineColorTBButton.setEnabled(this.isEnabled()); |
||||
|
||||
paginationLineColorTBButton = new UIColorButton(BaseUtils.readIcon("/com/fr/design/images/gui/color/foreground.png")); |
||||
paginationLineColorTBButton.setEnabled(this.isEnabled()); |
||||
|
||||
JPanel leftPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); |
||||
leftPane.add(new UILabel(Inter.getLocText("Preference-Grid_Line_Color") + ":")); |
||||
leftPane.add(gridLineColorTBButton); |
||||
JPanel rightPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); |
||||
rightPane.add(new UILabel(Inter.getLocText("Preference-Pagination_Line_Color") + ":")); |
||||
rightPane.add(paginationLineColorTBButton); |
||||
colorSettingPane.add(leftPane); |
||||
colorSettingPane.add(rightPane); |
||||
} |
||||
|
||||
private void createLogPane(JPanel advancePane) { |
||||
//richer:选择导出log文件的目录.
|
||||
JPanel logPane = FRGUIPaneFactory.createX_AXISBoxInnerContainer_S_Pane(); |
||||
advancePane.add(logPane); |
||||
JPanel logExportPane = FRGUIPaneFactory.createTitledBorderPane("log" + Inter.getLocText("FR-Designer_Export_Setting")); |
||||
logPane.add(logExportPane); |
||||
UILabel logLabel = new UILabel(Inter.getLocText("FR-Designer_Select_Export_Log_Directory") + ":"); |
||||
logExportPane.add(logLabel, BorderLayout.WEST); |
||||
logExportDirectoryField = new UITextField(24); |
||||
logExportPane.add(logExportDirectoryField, BorderLayout.CENTER); |
||||
UIButton chooseDirBtn = new UIButton("..."); |
||||
logExportPane.add(chooseDirBtn, BorderLayout.EAST); |
||||
chooseDirBtn.setPreferredSize(new Dimension(25, 25)); |
||||
chooseDirBtn.addActionListener(new ActionListener() { |
||||
public void actionPerformed(ActionEvent evt) { |
||||
JFileChooser fileChooser = new JFileChooser(); |
||||
fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); |
||||
int saveValue = fileChooser.showOpenDialog(DesignerContext.getDesignerFrame()); |
||||
if (saveValue == JFileChooser.APPROVE_OPTION) { |
||||
File selectedFile = fileChooser.getSelectedFile(); |
||||
logExportDirectoryField.setText(selectedFile.getAbsolutePath()); |
||||
} |
||||
} |
||||
}); |
||||
|
||||
JPanel logLevelPane = FRGUIPaneFactory.createTitledBorderPane("log" + Inter.getLocText("FR-Designer_Level_Setting")); |
||||
logPane.add(logLevelPane); |
||||
logLevelComboBox = new UIComboBox(LOG); |
||||
logLevelPane.add(logLevelComboBox); |
||||
logLevelComboBox.addActionListener(new ActionListener() { |
||||
public void actionPerformed(ActionEvent e) { |
||||
DesignerEnvManager.getEnvManager().setLogLevel(((FRLevel) logLevelComboBox.getSelectedItem()).getLevel()); |
||||
} |
||||
}); |
||||
} |
||||
|
||||
private void createLanPane(JPanel generalPane) { |
||||
// ben:选择版本语言;
|
||||
JPanel languageAndDashBoard_pane = FRGUIPaneFactory.createX_AXISBoxInnerContainer_S_Pane(); |
||||
JPanel LanguagePane = FRGUIPaneFactory.createTitledBorderPane(Inter.getLocText("FR-Designer_Choose_Language")); |
||||
generalPane.add(languageAndDashBoard_pane); |
||||
languageAndDashBoard_pane.add(LanguagePane); |
||||
languageComboBox = new UIComboBox(LANGUAGE); |
||||
ActionLabel languageLabel = new ActionLabel(Inter.getLocText("FR-Designer_Designer_Language")); |
||||
languageLabel.addActionListener(new ActionListener() { |
||||
@Override |
||||
public void actionPerformed(ActionEvent e) { |
||||
final LocalePane localePane = new LocalePane(); |
||||
BasicDialog dlg = localePane.showLargeWindow(SwingUtilities.getWindowAncestor(PreferencePane.this), new DialogActionAdapter() { |
||||
@Override |
||||
public void doOk() { |
||||
localePane.save(); |
||||
} |
||||
}); |
||||
dlg.setVisible(true); |
||||
} |
||||
}); |
||||
UILabel noticeLabel = new UILabel(Inter.getLocText("FR-Designer_Work_After_Restart_Designer"));//sail:提示重启后生效
|
||||
double p = TableLayout.PREFERRED; |
||||
double rowSize[] = {p}; |
||||
double columnSize[] = {p, p, p}; |
||||
Component[][] components = { |
||||
{languageLabel, languageComboBox, noticeLabel}, |
||||
}; |
||||
languageComboBox.addItemListener(new ItemListener() { |
||||
@Override |
||||
public void itemStateChanged(ItemEvent e) { |
||||
//Inter.fr = ResourceBundle.getBundle("com/fr/general/locale/fr", Locale.US);
|
||||
} |
||||
}); |
||||
JPanel choosePane = TableLayoutHelper.createTableLayoutPane(components, rowSize, columnSize); |
||||
LanguagePane.add(choosePane); |
||||
} |
||||
|
||||
private String getDisplayShortCut(String shotrCut) { |
||||
return shotrCut.replace(TYPE, DISPLAY_TYPE).replace(BACK_SLASH, DISPLAY_BACK_SLASH).replace(SLASH, DISPLAY_SLASH) |
||||
.replace(CONTROL, DISPLAY_CONTROL).replace(OPEN_BRACKET, DISPLAY_OPEN_BRACKET).replace(CLOSE_BRACKET, DISPLAY_CLOSE_BRACKET) |
||||
.replace(COMMA, DISPLAY_COMMA).replace(PERIOD, DISPLAY_PERIOD).replace(SEMICOLON, DISPLAY_SEMICOLON).replace(QUOTE, DISPLAY_QUOTE) |
||||
.replace(EQUALS, DISPLAY_EQUALS).replace(MINUS, DISPLAY_MINUS); |
||||
} |
||||
|
||||
|
||||
private KeyStroke convert2KeyStroke(String ks) { |
||||
return KeyStroke.getKeyStroke(ks.replace(DISPLAY_TYPE, TYPE)); |
||||
} |
||||
|
||||
|
||||
private void createLengthPane(JPanel advancePane) { |
||||
double p = TableLayout.PREFERRED; |
||||
double rowSize[] = {p}; |
||||
|
||||
// 长度单位选择
|
||||
JPanel lengthPane = FRGUIPaneFactory.createTitledBorderPane(Inter.getLocText("FR-Designer_Setting-Ruler-Units")); |
||||
advancePane.add(lengthPane); |
||||
pageLengthComboBox = new UIComboBox(new String[]{Inter.getLocText("FR-Designer_PageSetup-mm"), Inter.getLocText("FR-Designer_Unit_CM"), Inter.getLocText("FR-Designer_Unit_INCH")}); |
||||
pageLengthComboBox.setPreferredSize(new Dimension(80, 20)); |
||||
pageLengthComboBox.setMinimumSize(new Dimension(80, 20)); |
||||
reportLengthComboBox = new UIComboBox(new String[]{Inter.getLocText("FR-Designer_PageSetup-mm"), Inter.getLocText("FR-Designer_Unit_CM"), Inter.getLocText("FR-Designer_Unit_INCH"), Inter.getLocText("FR-Designer_Unit_PT")}); |
||||
reportLengthComboBox.setPreferredSize(new Dimension(80, 20)); |
||||
reportLengthComboBox.setMinimumSize(new Dimension(80, 20)); |
||||
UILabel pagelengthLabel = new UILabel(Inter.getLocText("FR-Designer_Page-Setup-Scale-Units") + ":"); |
||||
UILabel reportLengthLabel = new UILabel(Inter.getLocText("FR-Designer_Report-Design-Ruler-Units") + ":"); |
||||
Component[][] lengthComponents = { |
||||
{pagelengthLabel, pageLengthComboBox, reportLengthLabel, reportLengthComboBox}, |
||||
}; |
||||
JPanel chooseLengthPane = TableLayoutHelper.createTableLayoutPane(lengthComponents, rowSize, new double[]{p, p, p, p}); |
||||
lengthPane.add(chooseLengthPane); |
||||
} |
||||
|
||||
private void createServerPane(JPanel advancePane) { |
||||
double p = TableLayout.PREFERRED; |
||||
double rowSize[] = {p}; |
||||
double columnSize[] = {p, p, p}; |
||||
|
||||
JPanel serverPortPane = FRGUIPaneFactory.createTitledBorderPane(Inter.getLocText("FR-Designer_Web_Preview_Port_Setting")); |
||||
advancePane.add(serverPortPane); |
||||
portEditor = new IntegerEditor(); |
||||
portEditor.setPreferredSize(new Dimension(80, 20)); |
||||
portEditor.setMinimumSize(new Dimension(80, 20)); |
||||
UILabel notiJlabel = new UILabel(Inter.getLocText("FR-Designer_Work_After_Restart_Designer")); |
||||
UILabel serverPortLabel = new UILabel(Inter.getLocText("FR-Designer_Web_Preview_Port") + ":"); |
||||
Component[][] portComponents = { |
||||
{serverPortLabel, portEditor, notiJlabel}, |
||||
}; |
||||
JPanel choosePortPane = TableLayoutHelper.createTableLayoutPane(portComponents, rowSize, columnSize); |
||||
serverPortPane.add(choosePortPane, BorderLayout.CENTER); |
||||
} |
||||
|
||||
private void createJdkHomePane(JPanel advancePane) { |
||||
double p = TableLayout.PREFERRED; |
||||
double rowSize[] = {p}; |
||||
double columnSize[] = {p, p, p}; |
||||
|
||||
JPanel serverPortPane = FRGUIPaneFactory.createTitledBorderPane(Inter.getLocText("Preference-JDK_Home")); |
||||
advancePane.add(serverPortPane); |
||||
jdkHomeTextField = new UITextField(); |
||||
UIButton chooseBtn = new UIButton("..."); |
||||
chooseBtn.setPreferredSize(new Dimension(20, 20)); |
||||
JPanel panel = GUICoreUtils.createBorderLayoutPane( |
||||
jdkHomeTextField, BorderLayout.CENTER, |
||||
chooseBtn, BorderLayout.EAST |
||||
); |
||||
chooseBtn.addActionListener(new ActionListener() { |
||||
@Override |
||||
public void actionPerformed(ActionEvent e) { |
||||
JFileChooser fileChooser = new JFileChooser(); |
||||
fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); |
||||
int returnValue = fileChooser.showOpenDialog(PreferencePane.this); |
||||
if (returnValue == JFileChooser.APPROVE_OPTION) { |
||||
File file = fileChooser.getSelectedFile(); |
||||
jdkHomeTextField.setText(file.getAbsolutePath()); |
||||
} |
||||
} |
||||
}); |
||||
panel.setPreferredSize(new Dimension(300, 20)); |
||||
UILabel notiJlabel = new UILabel(Inter.getLocText("FR-Designer_Work_After_Restart_Designer")); |
||||
UILabel serverPortLabel = new UILabel(Inter.getLocText("Preference-JDK_Home") + ":"); |
||||
Component[][] portComponents = { |
||||
{serverPortLabel, panel, notiJlabel}, |
||||
}; |
||||
JPanel choosePortPane = TableLayoutHelper.createTableLayoutPane(portComponents, rowSize, columnSize); |
||||
serverPortPane.add(choosePortPane, BorderLayout.CENTER); |
||||
} |
||||
|
||||
@Override |
||||
protected String title4PopupWindow() { |
||||
return Inter.getLocText("M_Window-Preference"); |
||||
} |
||||
|
||||
/** |
||||
* The method of populate. |
||||
* |
||||
* @param designerEnvManager |
||||
*/ |
||||
public void populate(DesignerEnvManager designerEnvManager) { |
||||
if (designerEnvManager == null) { |
||||
return; |
||||
} |
||||
|
||||
supportUndoCheckBox.setSelected(designerEnvManager.isSupportUndo()); |
||||
if (designerEnvManager.isSupportUndo()) { |
||||
maxUndoLimit.setSelectedIndex(chooseCase(designerEnvManager.getUndoLimit())); |
||||
} else { |
||||
maxUndoLimit.setEnabled(false); |
||||
} |
||||
|
||||
supportDefaultParentCalculateCheckBox.setSelected(designerEnvManager.isSupportDefaultParentCalculate()); |
||||
|
||||
supportStringToFormulaBox.setSelected(designerEnvManager.isSupportStringToFormula()); |
||||
|
||||
shortCutLabel.setText(getDisplayShortCut(designerEnvManager.getAutoCompleteShortcuts())); |
||||
shortCutKeyStore = convert2KeyStroke(designerEnvManager.getAutoCompleteShortcuts()); |
||||
|
||||
if (supportStringToFormulaBox.isSelected()) { |
||||
defaultStringToFormulaBox.setEnabled(true); |
||||
defaultStringToFormulaBox.setSelected(designerEnvManager.isDefaultStringToFormula()); |
||||
} else { |
||||
defaultStringToFormulaBox.setEnabled(false); |
||||
defaultStringToFormulaBox.setSelected(false); |
||||
} |
||||
|
||||
supportCellEditorDefCheckBox.setSelected(designerEnvManager.isSupportCellEditorDef()); |
||||
|
||||
isDragPermitedCheckBox.setSelected(designerEnvManager.isDragPermited()); |
||||
|
||||
gridLineColorTBButton.setColor(designerEnvManager.getGridLineColor()); |
||||
paginationLineColorTBButton.setColor(designerEnvManager.getPaginationLineColor()); |
||||
|
||||
this.logExportDirectoryField.setText(designerEnvManager.getLogLocation()); |
||||
|
||||
this.logLevelComboBox.setSelectedItem(FRLevel.getByLevel(designerEnvManager.getLogLevel())); |
||||
|
||||
this.languageComboBox.setSelectedItem(LANGUAGE[designerEnvManager.getLanguage()]); |
||||
|
||||
this.pageLengthComboBox.setSelectedIndex(designerEnvManager.getPageLengthUnit()); |
||||
this.reportLengthComboBox.setSelectedIndex(designerEnvManager.getReportLengthUnit()); |
||||
|
||||
this.portEditor.setValue(new Integer(designerEnvManager.getJettyServerPort())); |
||||
|
||||
this.jdkHomeTextField.setText(designerEnvManager.getJdkHome()); |
||||
|
||||
this.oracleSpace.setSelected(designerEnvManager.isOracleSystemSpace()); |
||||
this.joinProductImprove.setSelected(designerEnvManager.isJoinProductImprove()); |
||||
} |
||||
|
||||
private int chooseCase(int sign) { |
||||
switch (sign) { |
||||
case 0: |
||||
return 0; |
||||
case MAX_UNDO_LIMIT_5: |
||||
return 1; |
||||
case MAX_UNDO_LIMIT_10: |
||||
return 2; |
||||
case MAX_UNDO_LIMIT_15: |
||||
return 3; |
||||
case MAX_UNDO_LIMIT_20: |
||||
return SELECTED_INDEX_4; |
||||
case MAX_UNDO_LIMIT_50: |
||||
return SELECTED_INDEX_5; |
||||
default: |
||||
return 1; |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* The method of update. |
||||
*/ |
||||
public void update(DesignerEnvManager designerEnvManager) { |
||||
if (designerEnvManager == null) { |
||||
return; |
||||
} |
||||
|
||||
designerEnvManager.setLogLocation(this.logExportDirectoryField.getText()); |
||||
|
||||
designerEnvManager.setLogLevel(((FRLevel) logLevelComboBox.getSelectedItem()).getLevel()); |
||||
|
||||
designerEnvManager.setSupportUndo(supportUndoCheckBox.isSelected()); |
||||
|
||||
designerEnvManager.setSupportDefaultParentCalculate(supportDefaultParentCalculateCheckBox.isSelected()); |
||||
|
||||
designerEnvManager.setSupportStringToFormula(supportStringToFormulaBox.isSelected()); |
||||
|
||||
designerEnvManager.setDefaultStringToFormula(defaultStringToFormulaBox.isSelected()); |
||||
|
||||
designerEnvManager.setSupportCellEditorDef(supportCellEditorDefCheckBox.isSelected()); |
||||
|
||||
designerEnvManager.setAutoCompleteShortcuts(shortCutKeyStore != null ? shortCutKeyStore.toString().replace(TYPE, DISPLAY_TYPE) : shortCutLabel.getText()); |
||||
|
||||
designerEnvManager.setDragPermited(isDragPermitedCheckBox.isSelected()); |
||||
|
||||
designerEnvManager.setGridLineColor(gridLineColorTBButton.getColor()); |
||||
|
||||
designerEnvManager.setPaginationLineColor(paginationLineColorTBButton.getColor()); |
||||
|
||||
designerEnvManager.setLanguage(getLanguageInt()); |
||||
|
||||
designerEnvManager.setPageLengthUnit((short) pageLengthComboBox.getSelectedIndex()); |
||||
designerEnvManager.setReportLengthUnit((short) reportLengthComboBox.getSelectedIndex()); |
||||
|
||||
designerEnvManager.setJettyServerPort(portEditor.getValue().intValue()); |
||||
|
||||
designerEnvManager.setJdkHome(jdkHomeTextField.getText()); |
||||
|
||||
designerEnvManager.setOracleSystemSpace(this.oracleSpace.isSelected()); |
||||
designerEnvManager.setJoinProductImprove(this.joinProductImprove.isSelected()); |
||||
// designerEnvManager.setAutoBackUp(this.autoBackUp.isSelected());
|
||||
|
||||
designerEnvManager.setUndoLimit(maxUndoLimit.getSelectedIndex() * SELECTED_INDEX_5); |
||||
if (maxUndoLimit.getSelectedIndex() == SELECTED_INDEX_5) { |
||||
designerEnvManager.setUndoLimit(MAX_UNDO_LIMIT_50); |
||||
} |
||||
} |
||||
|
||||
/* |
||||
* 得到所选语言的int值 |
||||
*/ |
||||
private int getLanguageInt() { |
||||
int l = 0; |
||||
String lang = (String) this.languageComboBox.getSelectedItem(); |
||||
for (int i = 0; i < LANGUAGE.length; i++) { |
||||
if (ComparatorUtils.equals(lang, LANGUAGE[i])) { |
||||
l = i; |
||||
break; |
||||
} |
||||
} |
||||
return l; |
||||
} |
||||
} |
@ -0,0 +1,48 @@
|
||||
/* |
||||
* Copyright(c) 2001-2010, FineReport Inc, All Rights Reserved. |
||||
*/ |
||||
package com.fr.design.actions.file; |
||||
|
||||
import java.awt.event.ActionEvent; |
||||
|
||||
import com.fr.base.BaseUtils; |
||||
import com.fr.design.actions.JTemplateAction; |
||||
import com.fr.design.mainframe.JTemplate; |
||||
import com.fr.design.menu.KeySetUtils; |
||||
|
||||
/** |
||||
* Save as file |
||||
*/ |
||||
public class SaveAsTemplateAction extends JTemplateAction<JTemplate<?, ?>> { |
||||
|
||||
public SaveAsTemplateAction(JTemplate<?, ?> dPane) { |
||||
super(dPane); |
||||
this.setMenuKeySet(KeySetUtils.SAVE_AS_TEMPLATE); |
||||
this.setName(getMenuKeySet().getMenuKeySetName() + "..."); |
||||
this.setMnemonic(getMenuKeySet().getMnemonic()); |
||||
this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_file/saveAs.png")); |
||||
} |
||||
|
||||
/** |
||||
* 动作 |
||||
* @param e 事件 |
||||
*/ |
||||
public void actionPerformed(ActionEvent e) { |
||||
JTemplate<?, ?> jt = this.getEditingComponent(); |
||||
// kunsnat: 保存前停止编辑状态,保存属性.
|
||||
jt.stopEditing(); |
||||
jt.saveAsTemplate(); |
||||
this.setEnabled(true); |
||||
|
||||
jt.requestFocus(); |
||||
} |
||||
|
||||
@Override |
||||
public void update() { |
||||
super.update(); |
||||
|
||||
// this.setEnabled(!this.getEditingComponent().isSaved());
|
||||
// 另存为按钮应该一直可用使用
|
||||
this.setEnabled(true); |
||||
} |
||||
} |
@ -0,0 +1,45 @@
|
||||
/* |
||||
* Copyright(c) 2001-2010, FineReport Inc, All Rights Reserved. |
||||
*/ |
||||
package com.fr.design.actions.file; |
||||
|
||||
import java.awt.event.ActionEvent; |
||||
|
||||
import com.fr.base.BaseUtils; |
||||
import com.fr.design.actions.JTemplateAction; |
||||
import com.fr.design.mainframe.JTemplate; |
||||
import com.fr.design.menu.KeySetUtils; |
||||
|
||||
/** |
||||
* @author richer |
||||
* @since 6.5.3 |
||||
*/ |
||||
public class SaveTemplateAction extends JTemplateAction<JTemplate<?, ?>> { |
||||
|
||||
public SaveTemplateAction(JTemplate<?, ?> jt) { |
||||
super(jt); |
||||
this.setMenuKeySet(KeySetUtils.SAVE_TEMPLATE); |
||||
this.setName(getMenuKeySet().getMenuKeySetName()); |
||||
this.setMnemonic(getMenuKeySet().getMnemonic()); |
||||
this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_file/save.png")); |
||||
this.setAccelerator(getMenuKeySet().getKeyStroke()); |
||||
} |
||||
|
||||
/** |
||||
* 动作 |
||||
* @param e 事件 |
||||
*/ |
||||
public void actionPerformed(ActionEvent e) { |
||||
JTemplate<?, ?> jt = this.getEditingComponent(); |
||||
jt.stopEditing(); |
||||
jt.saveTemplate(); |
||||
jt.requestFocus(); |
||||
} |
||||
|
||||
@Override |
||||
public void update() { |
||||
super.update(); |
||||
this.setEnabled(!this.getEditingComponent().isSaved()); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,127 @@
|
||||
package com.fr.design.actions.file; |
||||
|
||||
import com.fr.base.BaseUtils; |
||||
import com.fr.base.Env; |
||||
import com.fr.base.FRContext; |
||||
import com.fr.design.data.DesignTableDataManager; |
||||
import com.fr.design.data.tabledata.ResponseDataSourceChange; |
||||
import com.fr.dav.LocalEnv; |
||||
import com.fr.design.DesignerEnvManager; |
||||
import com.fr.design.actions.UpdateAction; |
||||
import com.fr.design.file.HistoryTemplateListPane; |
||||
import com.fr.design.mainframe.DesignerContext; |
||||
import com.fr.design.mainframe.TemplatePane; |
||||
import com.fr.design.menu.KeySetUtils; |
||||
import com.fr.design.menu.MenuDef; |
||||
import com.fr.design.menu.SeparatorDef; |
||||
import com.fr.design.dialog.InformationWarnPane; |
||||
import com.fr.env.RemoteEnv; |
||||
import com.fr.env.SignIn; |
||||
import com.fr.general.ComparatorUtils; |
||||
import com.fr.general.FRLogger; |
||||
import com.fr.general.GeneralContext; |
||||
import com.fr.general.Inter; |
||||
import com.fr.stable.LicUtils; |
||||
import com.fr.stable.ProductConstants; |
||||
import com.fr.stable.EnvChangedListener; |
||||
import com.fr.stable.StringUtils; |
||||
|
||||
import javax.swing.*; |
||||
import java.awt.event.ActionEvent; |
||||
import java.util.HashMap; |
||||
import java.util.Iterator; |
||||
import java.util.Map; |
||||
import java.util.logging.Level; |
||||
|
||||
|
||||
public class SwitchExistEnv extends MenuDef { |
||||
|
||||
public SwitchExistEnv() { |
||||
this.setMenuKeySet(KeySetUtils.SWITCH_ENV); |
||||
this.setName(getMenuKeySet().getMenuName()); |
||||
this.setHasScrollSubMenu(true); |
||||
initMenuDef(); |
||||
GeneralContext.addEnvWillChangedListener(new EnvChangedListener() { |
||||
public void envChanged() { |
||||
SwitchExistEnv.this.clearShortCuts(); |
||||
initMenuDef(); |
||||
} |
||||
}); |
||||
} |
||||
|
||||
private void initMenuDef() { |
||||
//ButtonGroup group = new ButtonGroup();
|
||||
Iterator<String> nameIt = DesignerEnvManager.getEnvManager().getEnvNameIterator(); |
||||
while (nameIt.hasNext()) { |
||||
String name = nameIt.next(); |
||||
this.setIconPath("com/fr/design/images/m_file/switch.png"); |
||||
this.addShortCut(new GetExistEnvAction(name)); |
||||
} |
||||
this.addShortCut(SeparatorDef.DEFAULT); |
||||
this.addShortCut(new EditEnvAction()); |
||||
} |
||||
|
||||
public static class GetExistEnvAction extends UpdateAction implements ResponseDataSourceChange { |
||||
public GetExistEnvAction() { |
||||
|
||||
} |
||||
|
||||
public GetExistEnvAction(String envName) { |
||||
this.setName(envName); |
||||
Env env = DesignerEnvManager.getEnvManager().getEnv(envName); |
||||
if (env instanceof LocalEnv) { |
||||
this.setSmallIcon(BaseUtils.readIcon("com/fr/design/images/data/bind/localconnect.png")); |
||||
} else if (env instanceof RemoteEnv) { |
||||
this.setSmallIcon(BaseUtils.readIcon("com/fr/design/images/data/bind/distanceconnect.png")); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 响应数据集改变 |
||||
*/ |
||||
public void fireDSChanged() { |
||||
fireDSChanged(new HashMap<String, String>()); |
||||
} |
||||
|
||||
/** |
||||
* 响应数据集改变 |
||||
* |
||||
* @param map 数据集 |
||||
*/ |
||||
public void fireDSChanged(Map<String, String> map) { |
||||
DesignTableDataManager.fireDSChanged(map); |
||||
} |
||||
|
||||
/** |
||||
* 动作 |
||||
* |
||||
* @param e 事件 |
||||
*/ |
||||
public void actionPerformed(ActionEvent e) { |
||||
DesignerEnvManager envManager = DesignerEnvManager.getEnvManager(); |
||||
Env selectedEnv = envManager.getEnv(this.getName()); |
||||
try { |
||||
if (selectedEnv instanceof RemoteEnv && !((RemoteEnv) selectedEnv).testServerConnection()) { |
||||
JOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), Inter.getLocText(new String[]{"M-SwitchWorkspace", "Failed"})); |
||||
return; |
||||
} |
||||
String remoteVersion = selectedEnv.getDesignerVersion(); |
||||
if (StringUtils.isBlank(remoteVersion) || ComparatorUtils.compare(remoteVersion, ProductConstants.DESIGNER_VERSION) < 0) { |
||||
String infor = Inter.getLocText("Server-version-tip"); |
||||
String moreInfo = Inter.getLocText("Server-version-tip-moreInfo"); |
||||
FRLogger.getLogger().log(Level.WARNING, infor); |
||||
new InformationWarnPane(infor, moreInfo, Inter.getLocText("Tooltips")).show(); |
||||
return; |
||||
} |
||||
SignIn.signIn(selectedEnv); |
||||
LicUtils.resetBytes(); |
||||
HistoryTemplateListPane.getInstance().getCurrentEditingTemplate().refreshToolArea(); |
||||
fireDSChanged(); |
||||
} catch (Exception em) { |
||||
FRContext.getLogger().error(em.getMessage(), em); |
||||
JOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), Inter.getLocText(new String[]{"M-SwitchWorkspace", "Failed"})); |
||||
TemplatePane.getInstance().editItems(); |
||||
} |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,95 @@
|
||||
package com.fr.design.actions.file; |
||||
|
||||
import com.fr.design.mainframe.DesignerContext; |
||||
import com.fr.design.mainframe.JTemplate; |
||||
import com.fr.design.utils.DesignUtils; |
||||
import com.fr.file.FILE; |
||||
import com.fr.file.FileNodeFILE; |
||||
import com.fr.general.GeneralUtils; |
||||
import com.fr.general.Inter; |
||||
import com.fr.general.web.ParameterConsts; |
||||
import com.fr.stable.project.ProjectConstants; |
||||
|
||||
import javax.swing.*; |
||||
import java.util.Map; |
||||
|
||||
public final class WebPreviewUtils { |
||||
|
||||
public static void onWorkbookPreview(JTemplate<?, ?> jt) { |
||||
actionPerformed(jt, jt.getPreviewType().parametersForPreview(), ParameterConsts.REPORTLET); |
||||
} |
||||
|
||||
public static void onFormPreview(JTemplate<?, ?> jt) { |
||||
actionPerformed(jt, null, ParameterConsts.FORMLET); |
||||
} |
||||
|
||||
public static void actionPerformed(JTemplate<?, ?> jt, Map<String, Object> map, String actionType) { |
||||
if (jt == null) { |
||||
return; |
||||
} |
||||
|
||||
DesignerContext.getDesignerFrame().refreshToolbar(); |
||||
|
||||
jt.stopEditing(); |
||||
/* |
||||
* alex:如果没有保存,先保存到Env |
||||
* |
||||
* 如果保存失败,不执行下面的WebPreview |
||||
*/ |
||||
if (!jt.isSaved() && !jt.saveTemplate2Env()) { |
||||
return; |
||||
} |
||||
|
||||
FILE currentTemplate = jt.getEditingFILE(); |
||||
// carl:是否是保存在运行环境下的模板,不是就不能被预览
|
||||
if (currentTemplate instanceof FileNodeFILE) { |
||||
browseUrl(currentTemplate, map, actionType, jt); |
||||
} else { |
||||
// 说明模板没有保存在报表运行环境下面,提示用户
|
||||
int selVal = JOptionPane.showConfirmDialog(DesignerContext.getDesignerFrame(), Inter.getLocText("Web_Preview_Message"), |
||||
Inter.getLocText("Preview_ToolTips"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE); |
||||
|
||||
if (JOptionPane.OK_OPTION == selVal) { |
||||
if (!jt.saveAsTemplate2Env()) { |
||||
return; |
||||
} |
||||
currentTemplate = jt.getEditingFILE(); |
||||
browseUrl(currentTemplate, map, actionType, jt); |
||||
} |
||||
} |
||||
} |
||||
|
||||
private static void browseUrl(FILE currentTemplate, Map<String, Object> map, String actionType, JTemplate<?, ?> jt) { |
||||
if (!(currentTemplate instanceof FileNodeFILE)) { |
||||
return; |
||||
} |
||||
|
||||
if (currentTemplate.exists()) { |
||||
String path = currentTemplate.getPath(); |
||||
if (path.startsWith(ProjectConstants.REPORTLETS_NAME)) { |
||||
path = path.substring(ProjectConstants.REPORTLETS_NAME.length() + 1); |
||||
|
||||
java.util.List<String> parameterNameList = new java.util.ArrayList<String>(); |
||||
java.util.List<String> parameterValueList = new java.util.ArrayList<String>(); |
||||
|
||||
parameterNameList.add(actionType); |
||||
parameterValueList.add(path); |
||||
if (map != null) { |
||||
for (String key : map.keySet()) { |
||||
parameterNameList.add(key); |
||||
parameterValueList.add(GeneralUtils.objectToString(map.get(key))); |
||||
} |
||||
} |
||||
DesignUtils.visitEnvServerByParameters(parameterNameList.toArray(new String[parameterNameList.size()]), parameterValueList.toArray(new String[parameterValueList.size()])); |
||||
} |
||||
} else { |
||||
int selVal = JOptionPane.showConfirmDialog(DesignerContext.getDesignerFrame(), Inter.getLocText("Web_Preview_Message"), |
||||
Inter.getLocText("Preview_ToolTips"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE); |
||||
if (JOptionPane.OK_OPTION == selVal) { |
||||
if (!jt.saveAsTemplate()) { |
||||
return; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,50 @@
|
||||
/* |
||||
* Copyright(c) 2001-2010, FineReport Inc, All Rights Reserved. |
||||
*/ |
||||
package com.fr.design.actions.help; |
||||
|
||||
import com.fr.design.actions.UpdateAction; |
||||
import com.fr.design.mainframe.DesignerContext; |
||||
import com.fr.design.menu.MenuKeySet; |
||||
import com.fr.general.Inter; |
||||
|
||||
import javax.swing.*; |
||||
import java.awt.event.ActionEvent; |
||||
|
||||
/** |
||||
* help about. |
||||
*/ |
||||
public class AboutAction extends UpdateAction { |
||||
public AboutAction() { |
||||
this.setMenuKeySet(ABOUT); |
||||
this.setName(getMenuKeySet().getMenuKeySetName()+"..."); |
||||
this.setMnemonic(getMenuKeySet().getMnemonic()); |
||||
} |
||||
|
||||
/** |
||||
* 动作 |
||||
* @param evt 事件 |
||||
*/ |
||||
public void actionPerformed(ActionEvent evt) { |
||||
AboutPane aboutPane = new AboutPane(); |
||||
AboutDialog aboutDailog = new AboutDialog(DesignerContext.getDesignerFrame(), aboutPane); |
||||
aboutDailog.setVisible(true); |
||||
} |
||||
|
||||
public static final MenuKeySet ABOUT = new MenuKeySet() { |
||||
@Override |
||||
public char getMnemonic() { |
||||
return 'S'; |
||||
} |
||||
|
||||
@Override |
||||
public String getMenuName() { |
||||
return Inter.getLocText("M_Help-About_Software"); |
||||
} |
||||
|
||||
@Override |
||||
public KeyStroke getKeyStroke() { |
||||
return null; |
||||
} |
||||
}; |
||||
} |
@ -0,0 +1,100 @@
|
||||
package com.fr.design.actions.help; |
||||
|
||||
import java.awt.BorderLayout; |
||||
import java.awt.Dimension; |
||||
import java.awt.Frame; |
||||
import java.awt.event.ActionEvent; |
||||
import java.awt.event.ActionListener; |
||||
import java.awt.event.KeyEvent; |
||||
import java.awt.event.WindowAdapter; |
||||
import java.awt.event.WindowEvent; |
||||
|
||||
import javax.swing.AbstractAction; |
||||
import javax.swing.ActionMap; |
||||
import javax.swing.InputMap; |
||||
import javax.swing.JComponent; |
||||
import javax.swing.JDialog; |
||||
import javax.swing.JPanel; |
||||
import javax.swing.KeyStroke; |
||||
|
||||
import com.fr.design.gui.frpane.UITabbedPane; |
||||
import com.fr.design.gui.ibutton.UIButton; |
||||
import com.fr.design.layout.FRGUIPaneFactory; |
||||
import com.fr.general.Inter; |
||||
import com.fr.stable.ProductConstants; |
||||
import com.fr.design.utils.gui.GUICoreUtils; |
||||
|
||||
/** |
||||
* Dialog displaying information about the application. |
||||
*/ |
||||
public class AboutDialog extends JDialog implements ActionListener { |
||||
/** |
||||
* Construct a new AboutDialog. |
||||
*/ |
||||
public AboutDialog() { |
||||
} |
||||
|
||||
public AboutDialog(Frame parent, JPanel aboutPanel) { |
||||
super(parent, true); |
||||
|
||||
this.setTitle(ProductConstants.PRODUCT_NAME); |
||||
this.setResizable(false); |
||||
JPanel defaultPane=FRGUIPaneFactory.createBorderLayout_L_Pane(); |
||||
this.setContentPane(defaultPane); |
||||
|
||||
okButton = new UIButton(Inter.getLocText("OK")); |
||||
okButton.addActionListener(this); |
||||
|
||||
tabbedPane = new UITabbedPane(); |
||||
sysPane = new SystemInfoPane(); |
||||
|
||||
tabbedPane.addTab(Inter.getLocText("About"), aboutPanel); |
||||
tabbedPane.addTab(Inter.getLocText("System"), sysPane); |
||||
|
||||
buttonPanel = FRGUIPaneFactory.createRightFlowInnerContainer_S_Pane(); |
||||
buttonPanel.add(okButton); |
||||
|
||||
defaultPane.add(tabbedPane, BorderLayout.CENTER); |
||||
defaultPane.add(buttonPanel, BorderLayout.SOUTH); |
||||
|
||||
addWindowListener(new WindowAdapter() { |
||||
public void windowClosing(WindowEvent e) { |
||||
dialogExit(); |
||||
} |
||||
}); |
||||
|
||||
//esp.
|
||||
InputMap inputMapAncestor = defaultPane.getInputMap( |
||||
JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); |
||||
ActionMap actionMap = defaultPane.getActionMap(); |
||||
|
||||
//transfer focus to CurrentEditor
|
||||
inputMapAncestor.put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "dialogExit"); |
||||
actionMap.put("dialogExit", new AbstractAction() { |
||||
public void actionPerformed(ActionEvent evt) { |
||||
dialogExit(); |
||||
} |
||||
}); |
||||
|
||||
this.getRootPane().setDefaultButton(okButton); |
||||
|
||||
this.setSize(new Dimension(660, 600)); |
||||
GUICoreUtils.centerWindow(this); |
||||
} |
||||
|
||||
public void dialogExit() { |
||||
this.dispose(); |
||||
} |
||||
|
||||
/** |
||||
* Called when the ok button is clicked. |
||||
*/ |
||||
public void actionPerformed(ActionEvent e) { |
||||
this.dialogExit(); |
||||
} |
||||
|
||||
private SystemInfoPane sysPane; |
||||
private JPanel buttonPanel; |
||||
private UITabbedPane tabbedPane; |
||||
private UIButton okButton; |
||||
} |
@ -0,0 +1,238 @@
|
||||
/* |
||||
* Copyright(c) 2001-2010, FineReport Inc, All Rights Reserved. |
||||
*/ |
||||
package com.fr.design.actions.help; |
||||
|
||||
import com.fr.design.DesignerEnvManager; |
||||
import com.fr.design.gui.ilable.ActionLabel; |
||||
import com.fr.design.gui.ilable.BoldFontTextLabel; |
||||
import com.fr.design.gui.ilable.UILabel; |
||||
import com.fr.design.layout.FRGUIPaneFactory; |
||||
import com.fr.general.ComparatorUtils; |
||||
import com.fr.general.GeneralUtils; |
||||
import com.fr.general.Inter; |
||||
import com.fr.stable.ProductConstants; |
||||
import com.fr.stable.StringUtils; |
||||
import com.fr.stable.bridge.StableFactory; |
||||
import com.fr.start.BBSGuestPaneProvider; |
||||
|
||||
import javax.swing.*; |
||||
import java.awt.*; |
||||
import java.awt.datatransfer.Clipboard; |
||||
import java.awt.datatransfer.StringSelection; |
||||
import java.awt.event.ActionEvent; |
||||
import java.awt.event.ActionListener; |
||||
import java.awt.event.MouseAdapter; |
||||
import java.awt.event.MouseEvent; |
||||
import java.net.URI; |
||||
|
||||
public class AboutPane extends JPanel { |
||||
private static final String FINEREPORT = "FineReport"; |
||||
private static final int DEFAULT_GAP = 12; |
||||
private static final String COPYRIGHT_LABEL = "\u00A9 "; |
||||
private static final String BUILD_PREFIX = " Build #"; |
||||
|
||||
public AboutPane() { |
||||
this.setLayout(FRGUIPaneFactory.createBorderLayout()); |
||||
|
||||
//center panel
|
||||
JPanel centerPane=FRGUIPaneFactory.createBorderLayout_L_Pane(); |
||||
this.add(centerPane, BorderLayout.CENTER); |
||||
|
||||
JPanel contentPane=FRGUIPaneFactory.createY_AXISBoxInnerContainer_L_Pane(); |
||||
centerPane.add(contentPane, BorderLayout.NORTH); |
||||
|
||||
BoxCenterAlignmentCopyablePane buildCopyPane = new BoxCenterAlignmentCopyablePane( |
||||
getBuildTitle(), |
||||
GeneralUtils.readBuildNO(), |
||||
new String[]{ |
||||
Inter.getLocText("FR-Designer-Basic_Copy_Build_NO"), |
||||
Inter.getLocText("FR-Designer-Basic_Copy_Build_NO_OK") |
||||
}); |
||||
contentPane.add(buildCopyPane); |
||||
|
||||
BoxCenterAligmentPane boxCenterAlignmentPane = new BoxCenterAligmentPane(getCopyRight()); |
||||
contentPane.add(boxCenterAlignmentPane); |
||||
|
||||
boxCenterAlignmentPane = new BoxCenterAligmentPane(Inter.getLocText("About-All_Rights_Reserved")); |
||||
contentPane.add(boxCenterAlignmentPane); |
||||
|
||||
contentPane.add(new BoxCenterAlignmentCopyablePane( |
||||
Inter.getLocText("FR-Designer-Basic_Activation_Key"), |
||||
DesignerEnvManager.getEnvManager().getActivationKey(), |
||||
new String[]{ |
||||
Inter.getLocText("FR-Designer-Basic_Copy_Activation_Key"), |
||||
Inter.getLocText("FR-Designer-Basic_Activation_Key_Copy_OK") |
||||
})); |
||||
|
||||
if(ComparatorUtils.equals(ProductConstants.APP_NAME,FINEREPORT)){ |
||||
boxCenterAlignmentPane = new BoxCenterAligmentPane(Inter.getLocText("Service_Phone") + ProductConstants.COMPARE_TELEPHONE); |
||||
contentPane.add(boxCenterAlignmentPane); |
||||
} |
||||
|
||||
BoxCenterAligmentPane actionLabel = getURLActionLabel(ProductConstants.WEBSITE_URL); |
||||
BoxCenterAligmentPane emailLabel = getEmailActionLabel(ProductConstants.SUPPORT_EMAIL); |
||||
|
||||
contentPane.add(actionLabel); |
||||
contentPane.add(emailLabel); |
||||
|
||||
addThankPane(contentPane); |
||||
} |
||||
|
||||
//添加鸣谢面板
|
||||
private void addThankPane(JPanel contentPane){ |
||||
BBSGuestPaneProvider pane = StableFactory.getMarkedInstanceObjectFromClass(BBSGuestPaneProvider.XML_TAG, BBSGuestPaneProvider.class); |
||||
if(pane == null){ |
||||
return; |
||||
} |
||||
|
||||
contentPane.add(Box.createVerticalStrut(DEFAULT_GAP)); |
||||
contentPane.add((Component) pane); |
||||
} |
||||
|
||||
private String append(String...strs){ |
||||
StringBuilder sb = new StringBuilder(); |
||||
for(String str : strs){ |
||||
sb.append(str); |
||||
} |
||||
|
||||
return sb.toString(); |
||||
} |
||||
|
||||
private String getCopyRight(){ |
||||
return append(Inter.getLocText("About-CopyRight"), COPYRIGHT_LABEL, |
||||
ProductConstants.HISTORY, StringUtils.BLANK, ProductConstants.COMPANY_NAME); |
||||
} |
||||
|
||||
private String getBuildTitle() { |
||||
return append(ProductConstants.APP_NAME, Inter.getLocText("About-Version"), |
||||
StringUtils.BLANK, ProductConstants.RELEASE_VERSION, BUILD_PREFIX); |
||||
} |
||||
|
||||
private BoxCenterAligmentPane getEmailActionLabel(final String mailTo){ |
||||
ActionLabel emailLabel = new ActionLabel(mailTo); |
||||
|
||||
emailLabel.addActionListener(new ActionListener() { |
||||
@Override |
||||
public void actionPerformed(ActionEvent e) { |
||||
try { |
||||
Desktop.getDesktop().mail(new URI(mailTo)); |
||||
} catch (Exception ignore) { |
||||
|
||||
} |
||||
} |
||||
}); |
||||
|
||||
return new BoxCenterAligmentPane(emailLabel); |
||||
} |
||||
|
||||
private BoxCenterAligmentPane getURLActionLabel(final String url){ |
||||
ActionLabel actionLabel = new ActionLabel(url); |
||||
actionLabel.addActionListener(new ActionListener() { |
||||
@Override |
||||
public void actionPerformed(ActionEvent e) { |
||||
try { |
||||
Desktop.getDesktop().browse(new URI(url)); |
||||
} catch (Exception exp) { |
||||
|
||||
} |
||||
} |
||||
}); |
||||
|
||||
return new BoxCenterAligmentPane(actionLabel); |
||||
} |
||||
|
||||
class UserLabel extends BoldFontTextLabel { |
||||
public UserLabel(String text) { |
||||
super(text); |
||||
|
||||
if (text != null && text.length() > 30) { |
||||
ToolTipManager manager = ToolTipManager.sharedInstance(); |
||||
manager.registerComponent(this); |
||||
} |
||||
} |
||||
|
||||
public String getToolTipText(MouseEvent e) { |
||||
return this.getText(); |
||||
} |
||||
|
||||
public Point getToolTipLocation(MouseEvent e) { |
||||
return new Point(0, 0); |
||||
} |
||||
} |
||||
|
||||
class BoxCenterAligmentPane extends JPanel { |
||||
|
||||
private UILabel textLabel; |
||||
|
||||
public BoxCenterAligmentPane(String text) { |
||||
this(new UILabel(text)); |
||||
} |
||||
|
||||
public BoxCenterAligmentPane(UILabel label) { |
||||
this.setLayout(FRGUIPaneFactory.createBorderLayout()); |
||||
|
||||
JPanel centerPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); |
||||
this.add(centerPane, BorderLayout.CENTER); |
||||
|
||||
this.textLabel = label; |
||||
centerPane.add(textLabel); |
||||
} |
||||
|
||||
public void setFont(Font font) { |
||||
super.setFont(font); |
||||
|
||||
if (textLabel != null) { |
||||
textLabel.setFont(font); |
||||
} |
||||
} |
||||
} |
||||
|
||||
class BoxCenterAlignmentCopyablePane extends JPanel { |
||||
|
||||
private UILabel label; |
||||
private UILabel textField; |
||||
private UILabel lastLabel; |
||||
|
||||
public BoxCenterAlignmentCopyablePane(String title, String copyText, final String[] descriptions) { |
||||
setLayout(FRGUIPaneFactory.createBorderLayout()); |
||||
JPanel centerPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); |
||||
this.label = new UILabel(title); |
||||
this.textField = new UILabel(copyText); |
||||
textField.setBackground(null); |
||||
textField.setBorder(null); |
||||
|
||||
centerPane.add(label); |
||||
centerPane.add(textField); |
||||
textField.addMouseListener(new MouseAdapter() { |
||||
@Override |
||||
public void mouseClicked(MouseEvent e) { |
||||
if (e.getClickCount() == 2) { |
||||
StringSelection selection = new StringSelection(textField.getText()); |
||||
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); |
||||
clipboard.setContents(selection, selection); |
||||
lastLabel.setText(descriptions[1]); |
||||
lastLabel.setForeground(Color.RED); |
||||
} |
||||
} |
||||
}); |
||||
|
||||
this.lastLabel = new UILabel(descriptions[0]); |
||||
lastLabel.setForeground(Color.lightGray); |
||||
centerPane.add(lastLabel); |
||||
|
||||
add(centerPane, BorderLayout.CENTER); |
||||
} |
||||
|
||||
public void setFont(Font font) { |
||||
super.setFont(font); |
||||
|
||||
if (textField != null) { |
||||
textField.setFont(font); |
||||
} |
||||
if (label != null) { |
||||
label.setFont(font); |
||||
} |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,57 @@
|
||||
package com.fr.design.actions.help; |
||||
|
||||
import com.fr.base.BaseUtils; |
||||
import com.fr.design.actions.UpdateAction; |
||||
import com.fr.design.dialog.BasicDialog; |
||||
import com.fr.design.mainframe.DesignerContext; |
||||
import com.fr.design.mainframe.DesignerFrame; |
||||
import com.fr.design.menu.MenuKeySet; |
||||
import com.fr.general.Inter; |
||||
|
||||
import javax.swing.*; |
||||
import java.awt.event.ActionEvent; |
||||
|
||||
/** |
||||
* Created by IntelliJ IDEA. |
||||
* Author : daisy |
||||
* Version: 6.5.6 |
||||
* Date: 14-3-18 |
||||
* Time: 上午9:09 |
||||
*/ |
||||
public class FeedBackAction extends UpdateAction { |
||||
|
||||
public FeedBackAction() { |
||||
this.setMenuKeySet(FEED_BACK); |
||||
this.setName(getMenuKeySet().getMenuName()); |
||||
this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_help/feedback.png")); |
||||
} |
||||
|
||||
/** |
||||
* 动作 |
||||
* @param e 事件 |
||||
*/ |
||||
public void actionPerformed(ActionEvent e) { |
||||
final DesignerFrame designerFrame = DesignerContext.getDesignerFrame(); |
||||
FeedBackPane feedBackPane = new FeedBackPane(); |
||||
BasicDialog basicDialog =feedBackPane.showWindow(designerFrame,false); |
||||
feedBackPane.setFeedbackDialog(basicDialog); |
||||
basicDialog.setVisible(true); |
||||
} |
||||
|
||||
public static final MenuKeySet FEED_BACK = new MenuKeySet() { |
||||
@Override |
||||
public char getMnemonic() { |
||||
return 0; |
||||
} |
||||
|
||||
@Override |
||||
public String getMenuName() { |
||||
return Inter.getLocText("product_feedback"); |
||||
} |
||||
|
||||
@Override |
||||
public KeyStroke getKeyStroke() { |
||||
return null; |
||||
} |
||||
}; |
||||
} |
@ -0,0 +1,350 @@
|
||||
/* |
||||
* Copyright (c) 2001-2014,FineReport Inc, All Rights Reserved. |
||||
*/ |
||||
|
||||
package com.fr.design.actions.help; |
||||
|
||||
import com.fr.base.FRContext; |
||||
import com.fr.base.FeedBackInfo; |
||||
import com.fr.design.constants.LayoutConstants; |
||||
import com.fr.design.gui.ibutton.UIButton; |
||||
import com.fr.design.gui.icontainer.UIScrollPane; |
||||
import com.fr.design.gui.ilable.UILabel; |
||||
import com.fr.design.gui.itextarea.UITextArea; |
||||
import com.fr.design.gui.itextfield.UITextField; |
||||
import com.fr.design.layout.FRGUIPaneFactory; |
||||
import com.fr.design.layout.TableLayout; |
||||
import com.fr.design.layout.TableLayoutHelper; |
||||
import com.fr.design.mainframe.DesignerContext; |
||||
import com.fr.design.dialog.BasicDialog; |
||||
import com.fr.design.dialog.BasicPane; |
||||
import com.fr.general.ComparatorUtils; |
||||
import com.fr.general.FRLogger; |
||||
import com.fr.general.Inter; |
||||
import com.fr.stable.StringUtils; |
||||
import com.fr.design.utils.DesignUtils; |
||||
|
||||
import javax.swing.*; |
||||
import javax.swing.border.Border; |
||||
import javax.swing.border.EmptyBorder; |
||||
import javax.swing.border.MatteBorder; |
||||
import javax.swing.plaf.ColorUIResource; |
||||
import javax.swing.text.AttributeSet; |
||||
import javax.swing.text.BadLocationException; |
||||
import javax.swing.text.PlainDocument; |
||||
import java.awt.*; |
||||
import java.awt.event.*; |
||||
import java.util.Date; |
||||
import java.util.concurrent.CancellationException; |
||||
|
||||
/** |
||||
* Created by IntelliJ IDEA. |
||||
* Author : daisy |
||||
* Version: 6.5.6 |
||||
* Date: 14-3-18 |
||||
* Time: 上午9:50 |
||||
*/ |
||||
public class FeedBackPane extends BasicPane { |
||||
|
||||
private static final Dimension DIALOG_SIZE = new Dimension(660, 600); |
||||
private static final Dimension TEXT_AREA_SIZE = new Dimension(585, 180); |
||||
private static final int TEXT_FIELD_WIDTH = 160; |
||||
private static final int TEXT_FIELD_HEIGHT = 21; |
||||
private static final int GAP = 5; |
||||
private static final ColorUIResource BORDER_COLOR = new ColorUIResource(168, 172, 180); |
||||
private static final Border TIP_BORDER = BorderFactory.createEmptyBorder(10, 4, 4, 4); |
||||
private static final Border DIALOG_BORDER = BorderFactory.createEmptyBorder(0, 6, 4, 6); |
||||
private static final Border INNER_LEFT_BORDER = BorderFactory.createEmptyBorder(15, 18, 0, 0); |
||||
private static final Border TEXT_AREA_BORDER = BorderFactory.createEmptyBorder(0, 13, 0, 15); |
||||
private static final Border SEND_BORDER = BorderFactory.createEmptyBorder(10, 0, 10, 0); |
||||
private static final int DETAIL_TEXT_MAX_LENGTH = 400; |
||||
private static final int QQ_MAX_LENGTH = 15; |
||||
private static final int EMAIL_MAX_LENGTH = 40; |
||||
private static final int TEL_MAX_LENGTH = 11; |
||||
private static final String ALLOWED_INTEGER_TYPE = "0123456789"; |
||||
private SwingWorker worker; |
||||
private JDialog dlg = new JDialog(DesignerContext.getDesignerFrame(), Inter.getLocText("Send"), true); |
||||
private UIButton ok = new UIButton(Inter.getLocText("OK")); |
||||
private UIButton cancle = new UIButton(Inter.getLocText("Cancel")); |
||||
private int ifHasBeenWriten = 0; |
||||
private UITextArea detailField; |
||||
private boolean isSendSuccessful = false; |
||||
private UITextField qq = new UITextField() { |
||||
public Dimension getPreferredSize() { |
||||
return new Dimension(TEXT_FIELD_WIDTH, TEXT_FIELD_HEIGHT); |
||||
} |
||||
}; |
||||
protected UITextField email = new UITextField() { |
||||
public Dimension getPreferredSize() { |
||||
return new Dimension(TEXT_FIELD_WIDTH, TEXT_FIELD_HEIGHT); |
||||
} |
||||
}; |
||||
protected UITextField phone = new UITextField() { |
||||
public Dimension getPreferredSize() { |
||||
return new Dimension(TEXT_FIELD_WIDTH, TEXT_FIELD_HEIGHT); |
||||
} |
||||
}; |
||||
private UIButton sendButton = null; |
||||
|
||||
private BasicDialog feedbackDialog = null; |
||||
private JOptionPane send = null; |
||||
|
||||
public FeedBackPane() { |
||||
this.setLayout(FRGUIPaneFactory.createBorderLayout()); |
||||
initDetailArea(); |
||||
UILabel tip = new UILabel(Inter.getLocText("feedback_info")); |
||||
tip.setBorder(TIP_BORDER); |
||||
this.add(tip, BorderLayout.NORTH); |
||||
UIScrollPane scrollPane = new UIScrollPane(initDetailPane()); |
||||
scrollPane.setBorder(new MatteBorder(1, 1, 1, 1, BORDER_COLOR)); |
||||
this.add(scrollPane, BorderLayout.CENTER); |
||||
this.add(getSendButton(), BorderLayout.SOUTH); |
||||
sendButton.setEnabled(false); |
||||
this.setBorder(DIALOG_BORDER); |
||||
initDocument(); |
||||
} |
||||
|
||||
public void setFeedbackDialog(BasicDialog dialog) { |
||||
feedbackDialog = dialog; |
||||
} |
||||
|
||||
public Dimension getPreferredSize() { |
||||
return DIALOG_SIZE; |
||||
} |
||||
|
||||
|
||||
private void initDocument() { |
||||
LimitedDocument qqLimited = new LimitedDocument(QQ_MAX_LENGTH); |
||||
qqLimited.setAllowChar(ALLOWED_INTEGER_TYPE); |
||||
qq.setDocument(qqLimited); |
||||
email.setDocument(new LimitedDocument(EMAIL_MAX_LENGTH)); |
||||
LimitedDocument phoneLimited = new LimitedDocument(TEL_MAX_LENGTH); |
||||
phoneLimited.setAllowChar(ALLOWED_INTEGER_TYPE); |
||||
phone.setDocument(phoneLimited); |
||||
} |
||||
|
||||
|
||||
private void initDetailArea() { |
||||
detailField = new UITextArea() { |
||||
public Dimension getPreferredSize() { |
||||
return TEXT_AREA_SIZE; |
||||
} |
||||
}; |
||||
this.detailField.setForeground(Color.gray); |
||||
this.detailField.setText(Inter.getLocText("feedback_tip")); |
||||
detailField.addKeyListener(new KeyAdapter() { |
||||
|
||||
@Override |
||||
public void keyPressed(KeyEvent e) { |
||||
if (ifHasBeenWriten == 0) { |
||||
detailField.setText(StringUtils.EMPTY); |
||||
detailField.setDocument(new LimitedDocument(DETAIL_TEXT_MAX_LENGTH)); |
||||
ifHasBeenWriten = 1; |
||||
} |
||||
} |
||||
|
||||
public void keyReleased(KeyEvent e) { |
||||
if (ifHasBeenWriten == 0) { |
||||
detailField.setText(StringUtils.EMPTY); |
||||
detailField.setDocument(new LimitedDocument(DETAIL_TEXT_MAX_LENGTH)); |
||||
ifHasBeenWriten = 1; |
||||
} |
||||
detailField.setForeground(Color.black); |
||||
String text = detailField.getText(); |
||||
// 判断在中文输入状态是否还包含提示符 要删掉
|
||||
String tip = Inter.getLocText("feedback_tip"); |
||||
if (text.contains(tip)) { |
||||
text = text.substring(0, text.indexOf(tip)); |
||||
detailField.setText(text); |
||||
} |
||||
sendButton.setEnabled(!(ifHasBeenWriten == 0 || ComparatorUtils.equals(detailField.getText().trim(), StringUtils.EMPTY))); |
||||
} |
||||
}); |
||||
|
||||
detailField.addMouseListener(new MouseAdapter() { |
||||
@Override |
||||
public void mousePressed(MouseEvent e) { |
||||
if (ifHasBeenWriten == 0) { |
||||
detailField.setText(StringUtils.EMPTY); |
||||
detailField.setDocument(new LimitedDocument(DETAIL_TEXT_MAX_LENGTH)); |
||||
ifHasBeenWriten = 1; |
||||
} |
||||
} |
||||
}); |
||||
} |
||||
|
||||
private JPanel initDetailPane() { |
||||
double p = TableLayout.PREFERRED; |
||||
UILabel info = new UILabel(Inter.getLocText("detail_description") + ":"); |
||||
info.setBorder(INNER_LEFT_BORDER); |
||||
JPanel contactPane = getContactPane(); |
||||
contactPane.setBorder(INNER_LEFT_BORDER); |
||||
UILabel contact = new UILabel(Inter.getLocText("contact_info") + ":"); |
||||
contact.setBorder(INNER_LEFT_BORDER); |
||||
JPanel jPanel = new JPanel(); |
||||
jPanel.add(detailField); |
||||
jPanel.setBorder(TEXT_AREA_BORDER); |
||||
Component[][] components = new Component[][]{ |
||||
new Component[]{info}, |
||||
new Component[]{jPanel}, |
||||
new Component[]{contact}, |
||||
new Component[]{contactPane}, |
||||
}; |
||||
double[] rowSize = {p, p, p, p}; |
||||
double[] columnSize = {p}; |
||||
int[][] rowCount = {{1}, {1}, {1}, {1}}; |
||||
return TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, rowCount, LayoutConstants.VGAP_MEDIUM, LayoutConstants.VGAP_MEDIUM); |
||||
} |
||||
|
||||
|
||||
protected JPanel getContactPane() { |
||||
double f = TableLayout.FILL; |
||||
double p = TableLayout.PREFERRED; |
||||
Component[][] components = new Component[][]{ |
||||
new Component[]{new UILabel("QQ:", SwingConstants.RIGHT), qq}, |
||||
new Component[]{new UILabel(Inter.getLocText("email") + ":", SwingConstants.RIGHT), email}, |
||||
new Component[]{new UILabel(Inter.getLocText("mobile_number") + ":", SwingConstants.RIGHT), phone} |
||||
}; |
||||
double[] rowSize = {p, p, p}; |
||||
double[] columnSize = {p, p}; |
||||
int[][] rowCount = {{1, 1}, {1, 1}, {1, 1}}; |
||||
return TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, rowCount, LayoutConstants.VGAP_MEDIUM, LayoutConstants.VGAP_MEDIUM); |
||||
} |
||||
|
||||
private JPanel getSendButton() { |
||||
JPanel controlPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); |
||||
JPanel buttonsPane = new JPanel(new FlowLayout(FlowLayout.LEFT, GAP, 0)); |
||||
controlPane.add(buttonsPane, BorderLayout.EAST); |
||||
sendButton = new UIButton(Inter.getLocText("Send")); |
||||
buttonsPane.add(sendButton); |
||||
buttonsPane.setBorder(SEND_BORDER); |
||||
sendButton.addActionListener(new ActionListener() { |
||||
|
||||
public void actionPerformed(ActionEvent evt) { |
||||
doWithSendPane(); |
||||
} |
||||
}); |
||||
controlPane.setBorder(new EmptyBorder(0, 0, GAP, 0)); |
||||
return controlPane; |
||||
} |
||||
|
||||
|
||||
private void doWithSendPane() { |
||||
Object[] options = new Object[]{ok, cancle}; |
||||
send = new JOptionPane(Inter.getLocText("sending"), |
||||
JOptionPane.INFORMATION_MESSAGE, JOptionPane.OK_CANCEL_OPTION, null, options, options[0]); |
||||
ok.setEnabled(false); |
||||
ok.addActionListener(new ActionListener() { |
||||
@Override |
||||
public void actionPerformed(ActionEvent e) { |
||||
if (isSendSuccessful) { |
||||
dlg.dispose(); |
||||
feedbackDialog.dispose(); |
||||
} else { |
||||
ok.setEnabled(false); |
||||
send.setMessage(Inter.getLocText("sending")); |
||||
setWorker(send); |
||||
worker.execute(); |
||||
} |
||||
} |
||||
}); |
||||
cancle.addActionListener(new ActionListener() { |
||||
@Override |
||||
public void actionPerformed(ActionEvent e) { |
||||
worker.cancel(true); |
||||
dlg.dispose(); |
||||
} |
||||
}); |
||||
|
||||
dlg.setContentPane(send); |
||||
dlg.pack(); |
||||
dlg.setLocationRelativeTo(DesignerContext.getDesignerFrame()); |
||||
setWorker(send); |
||||
worker.execute(); |
||||
dlg.setVisible(true); |
||||
|
||||
|
||||
} |
||||
|
||||
|
||||
private void setWorker(final JOptionPane send) { |
||||
worker = new SwingWorker<Boolean, Void>() { |
||||
@Override |
||||
protected Boolean doInBackground() throws Exception { |
||||
FeedBackInfo feedBackInfo = new FeedBackInfo(new Date(), qq.getText(), email.getText(), phone.getText(), detailField.getText()); |
||||
try { |
||||
return DesignUtils.sendFeedBack(feedBackInfo); |
||||
} catch (Exception e) { |
||||
FRLogger.getLogger().error(e.getMessage()); |
||||
return false; |
||||
} |
||||
} |
||||
|
||||
public void done() { |
||||
try { |
||||
boolean model = get(); |
||||
ok.setEnabled(true); |
||||
cancle.setEnabled(!model); |
||||
if (model) { |
||||
//发送成功
|
||||
isSendSuccessful = true; |
||||
send.setMessage(Inter.getLocText("HJS-Send_Successfully") + "!"); |
||||
} else { |
||||
isSendSuccessful = false; |
||||
String[] message = new String[]{"HJS-Send_Failed", "try_resending"}; |
||||
String[] operator = new String[]{",", ""}; |
||||
send.setMessage(Inter.getLocText(message, operator)); |
||||
} |
||||
} catch (Exception e) { |
||||
isSendSuccessful = false; |
||||
if (!(e instanceof CancellationException)) { |
||||
FRContext.getLogger().error(e.getMessage(), e); |
||||
} |
||||
} |
||||
} |
||||
}; |
||||
} |
||||
|
||||
|
||||
@Override |
||||
protected String title4PopupWindow() { |
||||
return Inter.getLocText("product_feedback"); |
||||
} |
||||
|
||||
|
||||
private class LimitedDocument extends PlainDocument { |
||||
private static final long serialVersionUID = 1L; |
||||
private int maxLength = -1;// 允许的最大长度
|
||||
private String allowCharAsString = null;// 允许的字符串格式(0123456789)
|
||||
|
||||
public LimitedDocument(int maxLength) { |
||||
super(); |
||||
this.maxLength = maxLength; |
||||
} |
||||
|
||||
public void insertString(int offset, String str, AttributeSet attrSet) throws BadLocationException { |
||||
if (str == null) { |
||||
return; |
||||
} |
||||
if (allowCharAsString != null && str.length() == 1) { |
||||
if (allowCharAsString.indexOf(str) == -1) { |
||||
Toolkit.getDefaultToolkit().beep();// 发出一个警告声
|
||||
return;// 不是所要求的字符格式,就直接返回,不进行下面的添加
|
||||
} |
||||
} |
||||
char[] charVal = str.toCharArray(); |
||||
String strOldValue = getText(0, getLength()); |
||||
char[] tmp = strOldValue.toCharArray(); |
||||
if (maxLength != -1 && (tmp.length + charVal.length > maxLength)) { |
||||
Toolkit.getDefaultToolkit().beep();// 发出一个警告声
|
||||
return;// 长度大于指定的长度maxLength,也直接返回,不进行下面的添加
|
||||
} |
||||
super.insertString(offset, str, attrSet); |
||||
} |
||||
|
||||
public void setAllowChar(String str) { |
||||
allowCharAsString = str; |
||||
} |
||||
} |
||||
|
||||
} |
@ -0,0 +1,75 @@
|
||||
/* |
||||
* Copyright (c) 2001-2014,FineReport Inc, All Rights Reserved. |
||||
*/ |
||||
|
||||
package com.fr.design.actions.help; |
||||
|
||||
import com.fr.base.BaseUtils; |
||||
import com.fr.base.FRContext; |
||||
import com.fr.design.actions.UpdateAction; |
||||
import com.fr.design.menu.MenuKeySet; |
||||
import com.fr.general.Inter; |
||||
import com.fr.stable.StringUtils; |
||||
|
||||
import javax.swing.*; |
||||
import java.awt.*; |
||||
import java.awt.event.ActionEvent; |
||||
import java.io.IOException; |
||||
import java.net.URI; |
||||
import java.net.URISyntaxException; |
||||
|
||||
/** |
||||
* Created by IntelliJ IDEA. |
||||
* Author : daisy |
||||
* Version: 6.5.6 |
||||
* Date: 14-3-18 |
||||
* Time: 上午9:21 |
||||
*/ |
||||
public class ForumAction extends UpdateAction { |
||||
public ForumAction() { |
||||
this.setMenuKeySet(FORUM); |
||||
this.setName(getMenuKeySet().getMenuName()); |
||||
this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_help/product_forum.png")); |
||||
} |
||||
|
||||
|
||||
/** |
||||
* 动作 |
||||
* @param e 事件 |
||||
*/ |
||||
public void actionPerformed(ActionEvent e) { |
||||
String url = "http://bbs.finereport.com/"; |
||||
if (StringUtils.isEmpty(url)) { |
||||
FRContext.getLogger().info("The URL is empty!"); |
||||
return; |
||||
} |
||||
try { |
||||
Desktop.getDesktop().browse(new URI(url)); |
||||
} catch (IOException exp) { |
||||
JOptionPane.showMessageDialog(null, Inter.getLocText("Set_default_browser")); |
||||
FRContext.getLogger().errorWithServerLevel(exp.getMessage(), exp); |
||||
} catch (URISyntaxException exp) { |
||||
FRContext.getLogger().errorWithServerLevel(exp.getMessage(), exp); |
||||
} catch (Exception exp) { |
||||
FRContext.getLogger().errorWithServerLevel(exp.getMessage(), exp); |
||||
FRContext.getLogger().error("Can not open the browser for URL: " + url); |
||||
} |
||||
} |
||||
|
||||
public static final MenuKeySet FORUM = new MenuKeySet() { |
||||
@Override |
||||
public char getMnemonic() { |
||||
return 0; |
||||
} |
||||
|
||||
@Override |
||||
public String getMenuName() { |
||||
return Inter.getLocText("Forum"); |
||||
} |
||||
|
||||
@Override |
||||
public KeyStroke getKeyStroke() { |
||||
return null; |
||||
} |
||||
}; |
||||
} |
@ -0,0 +1,63 @@
|
||||
/* |
||||
* Copyright (c) 2001-2014,FineReport Inc, All Rights Reserved. |
||||
*/ |
||||
|
||||
package com.fr.design.actions.help; |
||||
|
||||
import com.fr.base.BaseUtils; |
||||
import com.fr.base.FRContext; |
||||
import com.fr.design.actions.UpdateAction; |
||||
import com.fr.design.menu.MenuKeySet; |
||||
import com.fr.general.Inter; |
||||
import com.fr.stable.ProductConstants; |
||||
|
||||
import javax.swing.*; |
||||
import java.awt.*; |
||||
import java.awt.event.ActionEvent; |
||||
import java.io.IOException; |
||||
import java.net.URI; |
||||
import java.net.URISyntaxException; |
||||
|
||||
/** |
||||
* Created with IntelliJ IDEA. |
||||
* User: wikky |
||||
* Date: 14-6-20 |
||||
* Time: 上午10:01 |
||||
* To change this template use File | Settings | File Templates. |
||||
*/ |
||||
public class SupportQQAction extends UpdateAction { |
||||
|
||||
public SupportQQAction(){ |
||||
this.setMenuKeySet(SUPPORT_QQ); |
||||
this.setName(getMenuKeySet().getMenuName()); |
||||
this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_help/support_qq.png")); |
||||
} |
||||
@Override |
||||
public void actionPerformed(ActionEvent e) { |
||||
try { |
||||
Desktop.getDesktop().browse(new URI(ProductConstants.SUPPORT_QQ)); |
||||
} catch (IOException exp) { |
||||
JOptionPane.showMessageDialog(null, Inter.getLocText("Set_default_browser")); |
||||
FRContext.getLogger().errorWithServerLevel(exp.getMessage(), exp); |
||||
} catch (URISyntaxException exp) { |
||||
FRContext.getLogger().errorWithServerLevel(exp.getMessage(), exp); |
||||
} |
||||
} |
||||
|
||||
public static final MenuKeySet SUPPORT_QQ = new MenuKeySet() { |
||||
@Override |
||||
public char getMnemonic() { |
||||
return 0; |
||||
} |
||||
|
||||
@Override |
||||
public String getMenuName() { |
||||
return Inter.getLocText("Support_QQ"); |
||||
} |
||||
|
||||
@Override |
||||
public KeyStroke getKeyStroke() { |
||||
return null; |
||||
} |
||||
}; |
||||
} |
@ -0,0 +1,69 @@
|
||||
package com.fr.design.actions.help; |
||||
|
||||
import java.awt.BorderLayout; |
||||
import java.util.Arrays; |
||||
import java.util.Enumeration; |
||||
import java.util.Properties; |
||||
|
||||
import javax.swing.JPanel; |
||||
import javax.swing.JScrollPane; |
||||
import javax.swing.JTable; |
||||
import javax.swing.table.DefaultTableModel; |
||||
import javax.swing.table.TableColumnModel; |
||||
|
||||
import com.fr.design.layout.FRGUIPaneFactory; |
||||
import com.fr.general.Inter; |
||||
import com.fr.stable.ProductConstants; |
||||
|
||||
public class SystemInfoPane extends JPanel { |
||||
public SystemInfoPane() { |
||||
super(FRGUIPaneFactory.createBorderLayout()); |
||||
|
||||
DefaultTableModel tableModel = new DefaultTableModel(); |
||||
JTable table = new JTable(tableModel) { |
||||
public boolean isCellEditable(int row, int column) { |
||||
return false; |
||||
} |
||||
}; |
||||
tableModel.addColumn(Inter.getLocText("Property")); |
||||
tableModel.addColumn(Inter.getLocText("Value")); |
||||
|
||||
Properties properties = System.getProperties(); |
||||
Object[] keys = new Object[properties.size()]; |
||||
|
||||
int index = 0; |
||||
Enumeration enumeration = properties.propertyNames(); |
||||
while (enumeration.hasMoreElements()) { |
||||
keys[index++] = enumeration.nextElement(); |
||||
} |
||||
Arrays.sort(keys); |
||||
|
||||
for (int i = 0; i < keys.length; i++) { |
||||
Object[] tableRowData = new Object[2]; |
||||
String keyValue = keys[i].toString(); |
||||
// james:屏蔽掉exe4j的内容
|
||||
if (keyValue.indexOf("exe4j") != -1) { |
||||
continue; |
||||
} |
||||
// james:这个也是exe4j的东东
|
||||
if ("install4j.exeDir".equals(keyValue)) { |
||||
continue; |
||||
} |
||||
|
||||
if(keyValue.indexOf("FineReport") != -1){ |
||||
keys[i] = keyValue.replaceAll("FineReport", ProductConstants.APP_NAME); |
||||
} |
||||
|
||||
tableRowData[0] = keys[i]; |
||||
tableRowData[1] = properties.getProperty((String) keys[i]); |
||||
tableModel.addRow(tableRowData); |
||||
} |
||||
|
||||
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); |
||||
TableColumnModel columnModel = table.getColumnModel(); |
||||
columnModel.getColumn(0).setPreferredWidth(160); |
||||
columnModel.getColumn(1).setPreferredWidth(240); |
||||
|
||||
add(new JScrollPane(table), BorderLayout.CENTER); |
||||
} |
||||
} |
@ -0,0 +1,98 @@
|
||||
package com.fr.design.actions.help; |
||||
|
||||
import java.awt.Desktop; |
||||
import java.awt.event.ActionEvent; |
||||
import java.awt.event.KeyEvent; |
||||
import java.io.File; |
||||
import java.io.IOException; |
||||
import java.net.URI; |
||||
import java.util.Locale; |
||||
|
||||
import javax.swing.KeyStroke; |
||||
|
||||
import com.fr.base.BaseUtils; |
||||
import com.fr.base.FRContext; |
||||
import com.fr.base.Utils; |
||||
import com.fr.design.actions.UpdateAction; |
||||
import com.fr.design.menu.MenuKeySet; |
||||
import com.fr.general.ComparatorUtils; |
||||
import com.fr.general.Inter; |
||||
import com.fr.general.http.HttpClient; |
||||
import com.fr.stable.OperatingSystem; |
||||
import com.fr.stable.ProductConstants; |
||||
import com.fr.stable.StableUtils; |
||||
|
||||
public class TutorialAction extends UpdateAction { |
||||
|
||||
public TutorialAction() { |
||||
this.setMenuKeySet(HELP_TUTORIAL); |
||||
this.setName(getMenuKeySet().getMenuName()); |
||||
this.setMnemonic(getMenuKeySet().getMnemonic()); |
||||
this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_help/help.png")); |
||||
this.setAccelerator(getMenuKeySet().getKeyStroke()); |
||||
} |
||||
|
||||
private void nativeExcuteMacInstallHomePrograms(String appName) { |
||||
String installHome = StableUtils.getInstallHome(); |
||||
if(installHome == null) { |
||||
FRContext.getLogger().error("Can not find the install home, please check it."); |
||||
} else { |
||||
String appPath = StableUtils.pathJoin(new String[]{installHome, "bin", appName}); |
||||
if(!(new File(appPath)).exists()) { |
||||
FRContext.getLogger().error(appPath + " can not be found."); |
||||
} |
||||
|
||||
String cmd = "open " + appPath; |
||||
Runtime runtime = Runtime.getRuntime(); |
||||
|
||||
try { |
||||
runtime.exec(cmd); |
||||
} catch (IOException e) { |
||||
FRContext.getLogger().error(e.getMessage(), e); |
||||
} |
||||
|
||||
} |
||||
} |
||||
/** |
||||
* 动作 |
||||
* @param evt 事件 |
||||
*/ |
||||
public void actionPerformed(ActionEvent evt) { |
||||
Locale locale = FRContext.getLocale(); |
||||
if (ComparatorUtils.equals(locale, Locale.CHINA) || ComparatorUtils.equals(locale, Locale.TAIWAN)){ |
||||
HttpClient client = new HttpClient(ProductConstants.HELP_URL); |
||||
if(client.getResponseCode() != -1) { |
||||
try { |
||||
Desktop.getDesktop().browse(new URI(ProductConstants.HELP_URL)); |
||||
return; |
||||
} catch (Exception e) { |
||||
//出了异常的话, 依然打开本地教程
|
||||
} |
||||
} |
||||
} |
||||
if (OperatingSystem.isMacOS()) { |
||||
nativeExcuteMacInstallHomePrograms("helptutorial.app"); |
||||
} |
||||
else { |
||||
Utils.nativeExcuteInstallHomePrograms("helptutorial.exe"); |
||||
} |
||||
} |
||||
|
||||
public static final MenuKeySet HELP_TUTORIAL = new MenuKeySet() { |
||||
@Override |
||||
public char getMnemonic() { |
||||
return 'T'; |
||||
} |
||||
|
||||
@Override |
||||
public String getMenuName() { |
||||
return Inter.getLocText("M_Help-Tutorial"); |
||||
} |
||||
|
||||
@Override |
||||
public KeyStroke getKeyStroke() { |
||||
return KeyStroke.getKeyStroke(KeyEvent.VK_F1, 0); |
||||
} |
||||
}; |
||||
|
||||
} |
@ -0,0 +1,46 @@
|
||||
package com.fr.design.actions.help; |
||||
|
||||
import com.fr.base.BaseUtils; |
||||
import com.fr.design.actions.UpdateAction; |
||||
import com.fr.design.menu.MenuKeySet; |
||||
import com.fr.general.Inter; |
||||
import com.fr.start.StartServer; |
||||
|
||||
import javax.swing.*; |
||||
import java.awt.event.ActionEvent; |
||||
|
||||
|
||||
public class WebDemoAction extends UpdateAction { |
||||
public WebDemoAction() { |
||||
this.setMenuKeySet(PRODUCT_DEMO); |
||||
this.setName(getMenuKeySet().getMenuName()); |
||||
this.setMnemonic(getMenuKeySet().getMnemonic()); |
||||
this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_help/demo.png")); |
||||
} |
||||
|
||||
/** |
||||
* 动作 |
||||
* @param evt 事件 |
||||
*/ |
||||
public void actionPerformed(ActionEvent evt) { |
||||
StartServer.browerDemoURL(); |
||||
} |
||||
|
||||
public static final MenuKeySet PRODUCT_DEMO = new MenuKeySet() { |
||||
@Override |
||||
public char getMnemonic() { |
||||
return 'D'; |
||||
} |
||||
|
||||
@Override |
||||
public String getMenuName() { |
||||
return Inter.getLocText("Product_Demo"); |
||||
} |
||||
|
||||
@Override |
||||
public KeyStroke getKeyStroke() { |
||||
return null; |
||||
} |
||||
}; |
||||
|
||||
} |
@ -0,0 +1,171 @@
|
||||
package com.fr.design.actions.server; |
||||
|
||||
import com.fr.base.BaseUtils; |
||||
import com.fr.base.Env; |
||||
import com.fr.base.FRContext; |
||||
import com.fr.base.ModifiedTable; |
||||
import com.fr.data.impl.Connection; |
||||
import com.fr.dav.LocalEnv; |
||||
import com.fr.design.actions.UpdateAction; |
||||
import com.fr.design.data.datapane.connect.ConnectionManagerPane; |
||||
import com.fr.design.dialog.BasicDialog; |
||||
import com.fr.design.dialog.DialogActionAdapter; |
||||
import com.fr.design.mainframe.DesignerContext; |
||||
import com.fr.design.mainframe.DesignerFrame; |
||||
import com.fr.design.menu.MenuKeySet; |
||||
import com.fr.file.DatasourceManager; |
||||
import com.fr.file.DatasourceManagerProvider; |
||||
import com.fr.general.Inter; |
||||
|
||||
import javax.swing.*; |
||||
import java.awt.event.ActionEvent; |
||||
import java.util.HashMap; |
||||
|
||||
/** |
||||
* DatasourceList Action |
||||
*/ |
||||
public class ConnectionListAction extends UpdateAction { |
||||
private static final int BYTENUM = 1444; |
||||
|
||||
public ConnectionListAction() { |
||||
this.setMenuKeySet(DEFINE_DATA_CONNECTION); |
||||
this.setName(getMenuKeySet().getMenuKeySetName()); |
||||
this.setMnemonic(getMenuKeySet().getMnemonic()); |
||||
this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_web/connection.png")); |
||||
} |
||||
|
||||
public static final MenuKeySet DEFINE_DATA_CONNECTION = new MenuKeySet() { |
||||
@Override |
||||
public char getMnemonic() { |
||||
return 'D'; |
||||
} |
||||
|
||||
@Override |
||||
public String getMenuName() { |
||||
return Inter.getLocText("Server-Define_Data_Connection"); |
||||
} |
||||
|
||||
@Override |
||||
public KeyStroke getKeyStroke() { |
||||
return null; |
||||
} |
||||
}; |
||||
|
||||
/** |
||||
* 执行动作 |
||||
* |
||||
* @param evt 事件 |
||||
*/ |
||||
public void actionPerformed(ActionEvent evt) { |
||||
DesignerFrame designerFrame = DesignerContext.getDesignerFrame(); |
||||
final DatasourceManagerProvider datasourceManager = DatasourceManager.getProviderInstance(); |
||||
final DatasourceManager backupManager = datasourceManager.getBackUpManager(); |
||||
final ConnectionManagerPane databaseManagerPane = new ConnectionManagerPane() { |
||||
public void complete() { |
||||
populate(datasourceManager); |
||||
} |
||||
|
||||
protected void renameConnection(String oldName, String newName) { |
||||
datasourceManager.getConnectionLocalModifyTable().rename(oldName, newName); |
||||
} |
||||
}; |
||||
final BasicDialog databaseListDialog = databaseManagerPane.showLargeWindow(designerFrame, null); |
||||
databaseListDialog.addDialogActionListener(new DialogActionAdapter() { |
||||
public void doOk() { |
||||
if (!databaseManagerPane.isNamePermitted()) { |
||||
databaseListDialog.setDoOKSucceed(false); |
||||
return; |
||||
} |
||||
if (!doWithDatasourceManager(datasourceManager, backupManager, databaseManagerPane, databaseListDialog)) { |
||||
//如果更新失败,则不关闭对话框,也不写xml文件,并且将对话框定位在请重命名的那个对象页面
|
||||
return; |
||||
} |
||||
// marks:保存数据
|
||||
writeFile(datasourceManager); |
||||
} |
||||
|
||||
public void doCancel() { |
||||
datasourceManager.synchronizedWithServer(); |
||||
} |
||||
}); |
||||
databaseListDialog.setVisible(true); |
||||
} |
||||
|
||||
|
||||
private void writeFile(DatasourceManagerProvider datasourceManager) { |
||||
Env currentEnv = FRContext.getCurrentEnv(); |
||||
try { |
||||
boolean isSuccess = currentEnv.writeResource(datasourceManager); |
||||
if (!isSuccess) { |
||||
throw new RuntimeException(Inter.getLocText("FR-Designer_Already_exist")); |
||||
} |
||||
} catch (Exception e) { |
||||
throw new RuntimeException(Inter.getLocText("FR-Designer_Already_exist")); |
||||
} |
||||
DesignerContext.getDesignerBean("databasename").refreshBeanElement(); |
||||
} |
||||
|
||||
/** |
||||
* 是否正常更新完datasourceManager |
||||
* |
||||
* @param datasourceManager |
||||
* @param databaseManagerPane |
||||
* @return |
||||
*/ |
||||
private boolean doWithDatasourceManager(DatasourceManagerProvider datasourceManager, DatasourceManager backupManager, |
||||
ConnectionManagerPane databaseManagerPane, BasicDialog databaseListDialog) { |
||||
databaseManagerPane.update(datasourceManager); |
||||
HashMap<String, Connection> modifyDetails = datasourceManager.getConnectionModifyDetails(); |
||||
modifyDetails.clear(); |
||||
Env currentEnv = FRContext.getCurrentEnv(); |
||||
ModifiedTable localModifiedTable = datasourceManager.checkConnectionModifyTable(backupManager, currentEnv.getUserID()); |
||||
boolean isFailed = false; |
||||
if (currentEnv.isSupportLocalFileOperate() && !((LocalEnv) currentEnv).isNoRemoteUser()) { |
||||
//如果是本地,并且有远程用户时则更新自己的修改表
|
||||
datasourceManager.updateSelfConnectionTotalModifiedTable(localModifiedTable, ModifiedTable.LOCAL_MODIFIER); |
||||
} else { |
||||
if (!currentEnv.isSupportLocalFileOperate()) { |
||||
//如果是远程,则去取服务器的最新的修改表,检查有没有冲突
|
||||
ModifiedTable currentServerModifyTable = currentEnv.getDataSourceModifiedTables(DatasourceManager.CONNECTION); |
||||
if (localModifiedTable.checkModifiedTableConflictWithServer(currentServerModifyTable, currentEnv.getUserID())) { |
||||
//有冲突,进行提示
|
||||
String title = Inter.getLocText(new String[]{"Select", "Single", "Setting"}); |
||||
int returnVal = JOptionPane.showConfirmDialog(DesignerContext.getDesignerFrame(), localModifiedTable.getWaringMessage(), title, JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); |
||||
if (returnVal == JOptionPane.YES_OPTION) { |
||||
//点击是,进行相应刷新去冲突
|
||||
datasourceManager.synchronizedWithServer(backupManager, DatasourceManager.CONNECTION); |
||||
//要是有重命名冲突的,则对详细的修改表先进行修改
|
||||
datasourceManager.doWithConnectionConflict(localModifiedTable); |
||||
localModifiedTable.removeConfilct(); |
||||
modifyDetails.clear(); |
||||
//更新面板
|
||||
databaseManagerPane.populate(datasourceManager); |
||||
} else { |
||||
//更新失败,继续停留页面
|
||||
isFailed = true; |
||||
} |
||||
|
||||
} |
||||
} |
||||
} |
||||
//存在请重命名则不能更新
|
||||
int index = datasourceManager.isConnectionMapContainsRename(); |
||||
if (index != -1) { |
||||
isFailed = true; |
||||
databaseManagerPane.setSelectedIndex(index); |
||||
} |
||||
databaseListDialog.setDoOKSucceed(!isFailed); |
||||
//如果修改成功,则去远程端增量修改修改表
|
||||
if (!isFailed && !currentEnv.isSupportLocalFileOperate()) { |
||||
currentEnv.writeDataSourceModifiedTables(localModifiedTable, DatasourceManager.CONNECTION); |
||||
localModifiedTable.clear(); |
||||
modifyDetails.clear(); |
||||
} |
||||
return !isFailed; |
||||
} |
||||
|
||||
|
||||
public void update() { |
||||
this.setEnabled(true); |
||||
} |
||||
} |
@ -0,0 +1,79 @@
|
||||
/* |
||||
* Copyright(c) 2001-2010, FineReport Inc, All Rights Reserved. |
||||
*/ |
||||
package com.fr.design.actions.server; |
||||
|
||||
import com.fr.base.BaseUtils; |
||||
import com.fr.base.Env; |
||||
import com.fr.base.FRContext; |
||||
import com.fr.design.actions.UpdateAction; |
||||
import com.fr.design.dialog.BasicDialog; |
||||
import com.fr.design.dialog.DialogActionAdapter; |
||||
import com.fr.design.formula.FunctionManagerPane; |
||||
import com.fr.design.mainframe.DesignerContext; |
||||
import com.fr.design.menu.MenuKeySet; |
||||
import com.fr.file.FunctionManager; |
||||
import com.fr.file.FunctionManagerProvider; |
||||
import com.fr.general.Inter; |
||||
|
||||
import javax.swing.*; |
||||
import java.awt.event.ActionEvent; |
||||
|
||||
|
||||
/** |
||||
* FunctionManager. |
||||
*/ |
||||
public class FunctionManagerAction extends UpdateAction { |
||||
public FunctionManagerAction() { |
||||
this.setMenuKeySet(FUNCTION_MANAGER); |
||||
this.setName(getMenuKeySet().getMenuKeySetName()+"..."); |
||||
this.setMnemonic(getMenuKeySet().getMnemonic()); |
||||
this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_web/function.png")); |
||||
} |
||||
|
||||
/** |
||||
* 动作 |
||||
* @param evt 事件 |
||||
*/ |
||||
public void actionPerformed(ActionEvent evt) { |
||||
final FunctionManagerPane functionManagerPane = new FunctionManagerPane(); |
||||
BasicDialog functionManagerDialog = |
||||
functionManagerPane.showWindow( |
||||
DesignerContext.getDesignerFrame(),null); |
||||
final FunctionManagerProvider functionManager = FunctionManager.getProviderInstance(); |
||||
functionManagerDialog.addDialogActionListener(new DialogActionAdapter() { |
||||
public void doOk() { |
||||
functionManagerPane.update(functionManager); |
||||
Env currentEnv = FRContext.getCurrentEnv(); |
||||
try { |
||||
currentEnv.writeResource(functionManager); |
||||
} catch (Exception e) { |
||||
FRContext.getLogger().error(e.getMessage(), e); |
||||
} |
||||
} |
||||
}); |
||||
functionManagerPane.populate(functionManager); |
||||
functionManagerDialog.setVisible(true); |
||||
} |
||||
|
||||
public void update() { |
||||
this.setEnabled(true); |
||||
} |
||||
|
||||
public static final MenuKeySet FUNCTION_MANAGER = new MenuKeySet() { |
||||
@Override |
||||
public char getMnemonic() { |
||||
return 'F'; |
||||
} |
||||
|
||||
@Override |
||||
public String getMenuName() { |
||||
return Inter.getLocText("M_Server-Function_Manager"); |
||||
} |
||||
|
||||
@Override |
||||
public KeyStroke getKeyStroke() { |
||||
return null; |
||||
} |
||||
}; |
||||
} |
@ -0,0 +1,93 @@
|
||||
/* |
||||
* Copyright(c) 2001-2010, FineReport Inc, All Rights Reserved. |
||||
*/ |
||||
package com.fr.design.actions.server; |
||||
|
||||
import com.fr.base.BaseUtils; |
||||
import com.fr.base.ConfigManager; |
||||
import com.fr.base.Env; |
||||
import com.fr.base.FRContext; |
||||
import com.fr.design.DesignModelAdapter; |
||||
import com.fr.design.actions.UpdateAction; |
||||
import com.fr.design.dialog.BasicDialog; |
||||
import com.fr.design.dialog.DialogActionAdapter; |
||||
import com.fr.design.mainframe.DesignerContext; |
||||
import com.fr.design.mainframe.DesignerFrame; |
||||
import com.fr.design.menu.MenuKeySet; |
||||
import com.fr.design.parameter.ParameterManagerPane; |
||||
import com.fr.general.Inter; |
||||
import com.fr.base.ConfigManagerProvider; |
||||
|
||||
import javax.swing.*; |
||||
import java.awt.event.ActionEvent; |
||||
|
||||
|
||||
/** |
||||
* Parameter dialog |
||||
*/ |
||||
public class GlobalParameterAction extends UpdateAction { |
||||
public GlobalParameterAction() { |
||||
this.setMenuKeySet(GLOBAL_PARAMETER); |
||||
this.setName(getMenuKeySet().getMenuKeySetName() + "..."); |
||||
this.setMnemonic(getMenuKeySet().getMnemonic()); |
||||
this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_report/p.png")); |
||||
} |
||||
|
||||
/** |
||||
* 动作 |
||||
* |
||||
* @param e 事件 |
||||
*/ |
||||
public void actionPerformed(ActionEvent e) { |
||||
final DesignerFrame designerFrame = DesignerContext.getDesignerFrame(); |
||||
final ParameterManagerPane parameterManagerPane = new ParameterManagerPane(); |
||||
|
||||
final BasicDialog parameterManagerDialog = parameterManagerPane.showWindow(designerFrame); |
||||
|
||||
//marks:读取服务器配置信息
|
||||
final ConfigManagerProvider configManager = ConfigManager.getProviderInstance(); |
||||
|
||||
parameterManagerPane.populate(configManager); |
||||
parameterManagerDialog.addDialogActionListener(new DialogActionAdapter() { |
||||
public void doOk() { |
||||
//apply new parameter list.
|
||||
parameterManagerPane.update(configManager); |
||||
//marks:保存数据
|
||||
Env currentEnv = FRContext.getCurrentEnv(); |
||||
try { |
||||
currentEnv.writeResource(configManager); |
||||
} catch (Exception ex) { |
||||
FRContext.getLogger().error(ex.getMessage(), ex); |
||||
} |
||||
DesignModelAdapter<?, ?> model = DesignModelAdapter.getCurrentModelAdapter(); |
||||
if (model != null) { |
||||
model.parameterChanged(); |
||||
} |
||||
parameterManagerDialog.setDoOKSucceed(!parameterManagerPane.isContainsRename()); |
||||
} |
||||
}); |
||||
parameterManagerDialog.setModal(true); |
||||
parameterManagerDialog.setVisible(true); |
||||
} |
||||
|
||||
public void update() { |
||||
this.setEnabled(true); |
||||
} |
||||
|
||||
public static final MenuKeySet GLOBAL_PARAMETER = new MenuKeySet() { |
||||
@Override |
||||
public char getMnemonic() { |
||||
return 'G'; |
||||
} |
||||
|
||||
@Override |
||||
public String getMenuName() { |
||||
return Inter.getLocText("M_Server-Global_Parameters"); |
||||
} |
||||
|
||||
@Override |
||||
public KeyStroke getKeyStroke() { |
||||
return null; |
||||
} |
||||
}; |
||||
} |
@ -0,0 +1,197 @@
|
||||
/* |
||||
* Copyright(c) 2001-2010, FineReport Inc, All Rights Reserved. |
||||
*/ |
||||
package com.fr.design.actions.server; |
||||
|
||||
import com.fr.base.*; |
||||
import com.fr.dav.LocalEnv; |
||||
import com.fr.design.DesignModelAdapter; |
||||
import com.fr.design.actions.UpdateAction; |
||||
import com.fr.design.data.DesignTableDataManager; |
||||
import com.fr.design.data.datapane.TableDataTreePane; |
||||
import com.fr.design.data.tabledata.ResponseDataSourceChange; |
||||
import com.fr.design.data.tabledata.tabledatapane.TableDataManagerPane; |
||||
import com.fr.design.dialog.BasicDialog; |
||||
import com.fr.design.dialog.DialogActionAdapter; |
||||
import com.fr.design.mainframe.DesignerContext; |
||||
import com.fr.design.mainframe.DesignerFrame; |
||||
import com.fr.design.menu.MenuKeySet; |
||||
import com.fr.file.DatasourceManager; |
||||
import com.fr.file.DatasourceManagerProvider; |
||||
import com.fr.general.Inter; |
||||
|
||||
import javax.swing.*; |
||||
import java.awt.event.ActionEvent; |
||||
import java.util.HashMap; |
||||
import java.util.Map; |
||||
|
||||
/** |
||||
* Global TableData. |
||||
*/ |
||||
public class GlobalTableDataAction extends UpdateAction implements ResponseDataSourceChange { |
||||
//private static TableDataManagerPane globalTableDataPane = new TableDataManagerPane();
|
||||
|
||||
public GlobalTableDataAction() { |
||||
this.setMenuKeySet(SERVER_TABLEDATA); |
||||
this.setName(getMenuKeySet().getMenuKeySetName()); |
||||
this.setMnemonic(getMenuKeySet().getMnemonic()); |
||||
this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/data/dock/serverdatabase.png")); |
||||
} |
||||
|
||||
public static final MenuKeySet SERVER_TABLEDATA = new MenuKeySet() { |
||||
@Override |
||||
public char getMnemonic() { |
||||
return 'S'; |
||||
} |
||||
|
||||
@Override |
||||
public String getMenuName() { |
||||
return Inter.getLocText("DS-Server_TableData"); |
||||
} |
||||
|
||||
@Override |
||||
public KeyStroke getKeyStroke() { |
||||
return null; |
||||
} |
||||
}; |
||||
|
||||
/** |
||||
* 动作 |
||||
* @param evt 事件 |
||||
*/ |
||||
public void actionPerformed(ActionEvent evt) { |
||||
final DesignerFrame designerFrame = DesignerContext.getDesignerFrame(); |
||||
final DatasourceManagerProvider datasourceManager = DatasourceManager.getProviderInstance(); |
||||
final DatasourceManager backupManager = datasourceManager.getBackUpManager(); |
||||
final TableDataManagerPane globalTableDataPane = new TableDataManagerPane() { |
||||
public void complete() { |
||||
populate(datasourceManager); |
||||
} |
||||
|
||||
protected void renameConnection(String oldName, String newName) { |
||||
datasourceManager.getConnectionLocalModifyTable().rename(oldName, newName); |
||||
} |
||||
}; |
||||
final BasicDialog globalTableDataDialog = globalTableDataPane.showLargeWindow(designerFrame, null); |
||||
|
||||
globalTableDataDialog.addDialogActionListener(new DialogActionAdapter() { |
||||
|
||||
@Override |
||||
public void doOk() { |
||||
if (!globalTableDataPane.isNamePermitted()) { |
||||
globalTableDataDialog.setDoOKSucceed(false); |
||||
return; |
||||
} |
||||
|
||||
DesignTableDataManager.clearGlobalDs(); |
||||
globalTableDataPane.update(datasourceManager); |
||||
if (!doWithDatasourceManager(datasourceManager, backupManager, globalTableDataPane, globalTableDataDialog)) { |
||||
//如果更新失败,则不关闭对话框,也不写xml文件,并且将对话框定位在请重命名的那个对象页面
|
||||
return; |
||||
} |
||||
|
||||
writeFile(datasourceManager); |
||||
// 刷新共有数据集
|
||||
TableDataTreePane.getInstance(DesignModelAdapter.getCurrentModelAdapter()); |
||||
fireDSChanged(globalTableDataPane.getDsChangedNameMap()); |
||||
} |
||||
|
||||
public void doCancel() { |
||||
datasourceManager.synchronizedWithServer(); |
||||
} |
||||
}); |
||||
globalTableDataDialog.setVisible(true); |
||||
} |
||||
|
||||
private void writeFile(DatasourceManagerProvider datasourceManager) { |
||||
|
||||
Env currentEnv = FRContext.getCurrentEnv(); |
||||
try { |
||||
boolean isSuccess = currentEnv.writeResource(datasourceManager); |
||||
if (!isSuccess) { |
||||
throw new RuntimeException(Inter.getLocText("FR-Designer_Already_exist")); |
||||
} |
||||
} catch (Exception e) { |
||||
throw new RuntimeException(Inter.getLocText("FR-Designer_Already_exist")); |
||||
} |
||||
} |
||||
|
||||
|
||||
/** |
||||
* 是否正常更新完datasourceManager |
||||
* |
||||
* @param datasourceManager |
||||
* @param databaseManagerPane |
||||
* @return |
||||
*/ |
||||
private boolean doWithDatasourceManager(DatasourceManagerProvider datasourceManager, DatasourceManager backupManager, |
||||
TableDataManagerPane tableDataManagerPane, BasicDialog databaseListDialog) { |
||||
HashMap<String, TableData> modifyDetails = datasourceManager.getTableDataModifyDetails(); |
||||
modifyDetails.clear(); |
||||
Env currentEnv = FRContext.getCurrentEnv(); |
||||
ModifiedTable localModifiedTable = datasourceManager.checkTableDataModifyTable(backupManager, currentEnv.getUserID()); |
||||
boolean isFailed = false; |
||||
if (currentEnv.isSupportLocalFileOperate() && !((LocalEnv) currentEnv).isNoRemoteUser()) { |
||||
//如果是本地,并且有远程用户时则更新自己的修改表
|
||||
datasourceManager.updateSelfTableDataTotalModifiedTable(localModifiedTable, ModifiedTable.LOCAL_MODIFIER); |
||||
} else { |
||||
if (!currentEnv.isSupportLocalFileOperate()) { |
||||
//如果是远程,则去取服务器的最新的修改表,检查有没有冲突
|
||||
ModifiedTable currentServerModifyTable = currentEnv.getDataSourceModifiedTables(DatasourceManager.TABLEDATA); |
||||
if (localModifiedTable.checkModifiedTableConflictWithServer(currentServerModifyTable, currentEnv.getUserID())) { |
||||
//有冲突,进行提示
|
||||
String title = Inter.getLocText(new String[]{"Select", "Single", "Setting"}); |
||||
int returnVal = JOptionPane.showConfirmDialog(DesignerContext.getDesignerFrame(), localModifiedTable.getWaringMessage(), title, JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); |
||||
if (returnVal == JOptionPane.YES_OPTION) { |
||||
//点击是,进行相应刷新去冲突
|
||||
datasourceManager.synchronizedWithServer(backupManager, DatasourceManager.TABLEDATA); |
||||
//要是有重命名冲突的,则对详细的修改表先进行修改
|
||||
datasourceManager.doWithTableDataConfilct(localModifiedTable); |
||||
localModifiedTable.removeConfilct(); |
||||
modifyDetails.clear(); |
||||
//更新面板
|
||||
tableDataManagerPane.populate(datasourceManager); |
||||
} else { |
||||
//更新失败,继续停留页面
|
||||
isFailed = true; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
//存在请重命名则不能更新
|
||||
int index = datasourceManager.isTableDataMapContainsRename(); |
||||
if (index != -1) { |
||||
isFailed = true; |
||||
tableDataManagerPane.setSelectedIndex(index); |
||||
} |
||||
databaseListDialog.setDoOKSucceed(!isFailed); |
||||
//如果修改成功,则去远程端增量修改修改表
|
||||
if (!isFailed && !currentEnv.isSupportLocalFileOperate()) { |
||||
currentEnv.writeDataSourceModifiedTables(localModifiedTable, DatasourceManager.TABLEDATA); |
||||
localModifiedTable.clear(); |
||||
modifyDetails.clear(); |
||||
} |
||||
return !isFailed; |
||||
} |
||||
|
||||
|
||||
public void update() { |
||||
this.setEnabled(true); |
||||
} |
||||
|
||||
/** |
||||
* 响应数据集改变 |
||||
*/ |
||||
public void fireDSChanged() { |
||||
fireDSChanged(new HashMap<String, String>()); |
||||
} |
||||
|
||||
/** |
||||
* 响应数据集改变 |
||||
* |
||||
* @param map 对应集 |
||||
*/ |
||||
public void fireDSChanged(Map<String, String> map) { |
||||
DesignTableDataManager.fireDSChanged(map); |
||||
} |
||||
} |
@ -0,0 +1,48 @@
|
||||
package com.fr.design.actions.server; |
||||
|
||||
import com.fr.base.BaseUtils; |
||||
import com.fr.design.actions.UpdateAction; |
||||
import com.fr.design.menu.MenuKeySet; |
||||
import com.fr.design.utils.DesignUtils; |
||||
import com.fr.general.Inter; |
||||
import com.fr.general.web.ParameterConsts; |
||||
|
||||
import javax.swing.*; |
||||
import java.awt.event.ActionEvent; |
||||
|
||||
public class PlatformManagerAction extends UpdateAction { |
||||
public PlatformManagerAction() { |
||||
this.setMenuKeySet(PLATEFORM_MANAGER); |
||||
this.setName(getMenuKeySet().getMenuKeySetName()); |
||||
this.setMnemonic(getMenuKeySet().getMnemonic()); |
||||
this.setSmallIcon(BaseUtils.readIcon("/com/fr/web/images/platform/platform_16_16.png")); |
||||
} |
||||
|
||||
/** |
||||
* 动作 |
||||
* @param evt 事件 |
||||
*/ |
||||
public void actionPerformed(ActionEvent evt) { |
||||
DesignUtils.visitEnvServerByParameters( |
||||
new String[] {ParameterConsts.OP}, |
||||
new String[] {"fr_platform"} |
||||
); |
||||
} |
||||
|
||||
public static final MenuKeySet PLATEFORM_MANAGER = new MenuKeySet() { |
||||
@Override |
||||
public char getMnemonic() { |
||||
return 'P'; |
||||
} |
||||
|
||||
@Override |
||||
public String getMenuName() { |
||||
return Inter.getLocText("M_Server-Platform_Manager"); |
||||
} |
||||
|
||||
@Override |
||||
public KeyStroke getKeyStroke() { |
||||
return null; |
||||
} |
||||
}; |
||||
} |
@ -0,0 +1,52 @@
|
||||
package com.fr.design.actions.server; |
||||
|
||||
import com.fr.base.BaseUtils; |
||||
import com.fr.design.actions.UpdateAction; |
||||
import com.fr.design.dialog.BasicDialog; |
||||
import com.fr.design.extra.PluginManagerPane; |
||||
import com.fr.design.mainframe.DesignerContext; |
||||
import com.fr.design.menu.MenuKeySet; |
||||
import com.fr.general.Inter; |
||||
|
||||
import javax.swing.*; |
||||
import java.awt.event.ActionEvent; |
||||
|
||||
/** |
||||
* @author richie |
||||
* @date 2015-03-09 |
||||
* @since 8.0 |
||||
*/ |
||||
public class PluginManagerAction extends UpdateAction { |
||||
|
||||
public PluginManagerAction() { |
||||
this.setMenuKeySet(PLUGIN_MANAGER); |
||||
this.setName(getMenuKeySet().getMenuKeySetName()); |
||||
this.setMnemonic(getMenuKeySet().getMnemonic()); |
||||
this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/server/plugin.png")); |
||||
} |
||||
|
||||
@Override |
||||
public void actionPerformed(ActionEvent e) { |
||||
final PluginManagerPane managerPane = new PluginManagerPane(); |
||||
BasicDialog dlg = managerPane.showLargeWindow(DesignerContext.getDesignerFrame(),null); |
||||
|
||||
dlg.setVisible(true); |
||||
} |
||||
|
||||
public static final MenuKeySet PLUGIN_MANAGER = new MenuKeySet() { |
||||
@Override |
||||
public char getMnemonic() { |
||||
return 'I'; |
||||
} |
||||
|
||||
@Override |
||||
public String getMenuName() { |
||||
return Inter.getLocText("FR-Designer-Plugin_Manager"); |
||||
} |
||||
|
||||
@Override |
||||
public KeyStroke getKeyStroke() { |
||||
return null; |
||||
} |
||||
}; |
||||
} |
@ -0,0 +1,63 @@
|
||||
package com.fr.design.actions.server; |
||||
|
||||
import com.fr.base.BaseUtils; |
||||
import com.fr.base.FRContext; |
||||
import com.fr.design.DesignModelAdapter; |
||||
import com.fr.design.actions.UpdateAction; |
||||
import com.fr.design.data.DesignTableDataManager; |
||||
import com.fr.design.data.datapane.TableDataTreePane; |
||||
import com.fr.design.data.tabledata.tabledatapane.ProcedureManagerPane; |
||||
import com.fr.design.dialog.BasicDialog; |
||||
import com.fr.design.dialog.DialogActionAdapter; |
||||
import com.fr.design.mainframe.DesignerContext; |
||||
import com.fr.design.mainframe.DesignerFrame; |
||||
import com.fr.file.DatasourceManager; |
||||
import com.fr.file.DatasourceManagerProvider; |
||||
import com.fr.general.Inter; |
||||
|
||||
import java.awt.event.ActionEvent; |
||||
|
||||
public class ProcedureListAction extends UpdateAction { |
||||
public ProcedureListAction() { |
||||
this.setName(Inter.getLocText("Datasource-Stored_Procedure") + "(P)" + "..."); |
||||
this.setMnemonic('P'); |
||||
this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/data/store_procedure.png")); |
||||
} |
||||
|
||||
/** |
||||
* 事件触发操作 |
||||
* |
||||
* @param evt 事件 |
||||
* |
||||
*/ |
||||
public void actionPerformed(ActionEvent evt) { |
||||
DesignerFrame designerFrame = DesignerContext.getDesignerFrame(); |
||||
|
||||
final DatasourceManagerProvider datasourceManager = DatasourceManager.getProviderInstance(); |
||||
final ProcedureManagerPane databaseManagerPane = new ProcedureManagerPane() { |
||||
public void complete() { |
||||
populate(datasourceManager); |
||||
} |
||||
}; |
||||
BasicDialog databaseListDialog = databaseManagerPane.showLargeWindow(designerFrame,null); |
||||
databaseListDialog.addDialogActionListener(new DialogActionAdapter() { |
||||
public void doOk() { |
||||
DesignTableDataManager.clearGlobalDs(); |
||||
databaseManagerPane.update(datasourceManager); |
||||
|
||||
// marks:保存数据
|
||||
try { |
||||
FRContext.getCurrentEnv().writeResource(datasourceManager); |
||||
} catch (Exception e) { |
||||
FRContext.getLogger().error(e.getMessage()); |
||||
} |
||||
TableDataTreePane.getInstance(DesignModelAdapter.getCurrentModelAdapter()); |
||||
} |
||||
}); |
||||
databaseListDialog.setVisible(true); |
||||
} |
||||
|
||||
public void update() { |
||||
this.setEnabled(true); |
||||
} |
||||
} |
@ -0,0 +1,97 @@
|
||||
package com.fr.design.actions.tabledata; |
||||
|
||||
import com.fr.base.BaseUtils; |
||||
import com.fr.design.data.datapane.TableDataNameObjectCreator; |
||||
import com.fr.design.actions.UpdateAction; |
||||
|
||||
import java.awt.event.ActionEvent; |
||||
|
||||
/** |
||||
* Created by IntelliJ IDEA. |
||||
* Author : daisy |
||||
* Version: 6.5.6 |
||||
* Date: 13-12-19 |
||||
* Time: 下午5:21 |
||||
*/ |
||||
public abstract class TableDataAction extends UpdateAction { |
||||
public static final String XML_TAG_TEMPLATE = "template_tabledata_Type"; |
||||
public static final String XML_TAG_SERVER = "server_tabledata_Type"; |
||||
|
||||
public TableDataAction() { |
||||
this.setName(this.getDisplayName()); |
||||
this.setSmallIcon(BaseUtils.readIcon(this.getIconPath())); |
||||
} |
||||
|
||||
|
||||
/** |
||||
* 名字 |
||||
* |
||||
* @return |
||||
*/ |
||||
public abstract String getDisplayName(); |
||||
|
||||
/** |
||||
* 图标 |
||||
* |
||||
* @return |
||||
*/ |
||||
public abstract String getIconPath(); |
||||
|
||||
/** |
||||
* 后缀 |
||||
* |
||||
* @return |
||||
*/ |
||||
public abstract String getPrefix(); |
||||
|
||||
|
||||
/** |
||||
* 得到TableData的声明类 |
||||
* |
||||
* @return |
||||
*/ |
||||
public abstract Class getTableDataClass(); |
||||
|
||||
/** |
||||
* 得到相应面板的类 |
||||
* |
||||
* @return |
||||
*/ |
||||
public abstract Class getUpdateTableDataPaneClass(); |
||||
|
||||
/** |
||||
* 用于初始化的类。诺是不需要初始化,则不需要实现 |
||||
* |
||||
* @return |
||||
*/ |
||||
public Class getClass4Init() { |
||||
return null; |
||||
} |
||||
|
||||
/** |
||||
* 该菜单后面是否需要插入分割符 |
||||
* |
||||
* @return 是则返回true |
||||
*/ |
||||
public boolean isNeedInsertSeparator() { |
||||
return false; |
||||
} |
||||
|
||||
public TableDataNameObjectCreator getTableDataCreator() { |
||||
if (this.getClass4Init() == null) { |
||||
return new TableDataNameObjectCreator(this); |
||||
} else { |
||||
return new TableDataNameObjectCreator(this, getClass4Init()); |
||||
} |
||||
} |
||||
|
||||
|
||||
/** |
||||
* 动作 |
||||
* @param e 动作 |
||||
*/ |
||||
public void actionPerformed(ActionEvent e) { |
||||
} |
||||
|
||||
|
||||
} |
@ -0,0 +1,39 @@
|
||||
package com.fr.design.beans; |
||||
|
||||
import com.fr.design.dialog.BasicPane; |
||||
|
||||
/** |
||||
* Update Pane |
||||
*/ |
||||
public abstract class BasicBeanPane<T> extends BasicPane { |
||||
|
||||
/** |
||||
* Populate. |
||||
*/ |
||||
public abstract void populateBean(T ob); |
||||
|
||||
/** |
||||
* Update. |
||||
*/ |
||||
public abstract T updateBean(); |
||||
|
||||
public void updateBean(T ob) { |
||||
|
||||
} |
||||
|
||||
/** |
||||
* 更新权限工具栏面板 |
||||
*/ |
||||
public void populateAuthority() { |
||||
|
||||
} |
||||
|
||||
/** |
||||
* 仅用来处理图表设计器的地图面板 |
||||
* @param mapType 地图类型 |
||||
*/ |
||||
public void dealWidthMap(String mapType){ |
||||
|
||||
} |
||||
|
||||
} |
@ -0,0 +1,28 @@
|
||||
package com.fr.design.beans; |
||||
|
||||
/** |
||||
* |
||||
* @author zhou |
||||
* @since 2012-5-30下午12:12:42 |
||||
*/ |
||||
public abstract class FurtherBasicBeanPane<T> extends BasicBeanPane<T> { |
||||
/** |
||||
* 是否是指定类型 |
||||
* @param ob 对象 |
||||
* @return 是否是指定类型 |
||||
*/ |
||||
public abstract boolean accept(Object ob); |
||||
|
||||
/** |
||||
* title应该是一个属性,不只是对话框的标题时用到,与其他组件结合时,也会用得到 |
||||
* @return 绥化狂标题 |
||||
*/ |
||||
@Override |
||||
public abstract String title4PopupWindow(); |
||||
|
||||
/** |
||||
* 重置 |
||||
*/ |
||||
public abstract void reset(); |
||||
|
||||
} |
@ -0,0 +1,56 @@
|
||||
package com.fr.design.beans; |
||||
|
||||
import javax.swing.table.TableCellEditor; |
||||
import javax.swing.table.TableCellRenderer; |
||||
|
||||
/** |
||||
* richer:属性和事件分组 |
||||
* @since 6.5.3 |
||||
*/ |
||||
public interface GroupModel { |
||||
/** |
||||
* 该属性所属的分类,普通属性分为基本属性和其它,事件属性根据事件名称不同进行分类 |
||||
*/ |
||||
String getGroupName(); |
||||
|
||||
/** |
||||
* 总共的属性行数 |
||||
*/ |
||||
int getRowCount(); |
||||
|
||||
/** |
||||
* 获取属性表中第row行的渲染器 |
||||
* @param row |
||||
*/ |
||||
TableCellRenderer getRenderer(int row); |
||||
|
||||
/** |
||||
* 获取属性表中第row行的编辑器 |
||||
* @param row |
||||
*/ |
||||
TableCellEditor getEditor(int row); |
||||
|
||||
/** |
||||
* 获取属性表中第row行第column列的值 |
||||
* @param row |
||||
* @param column |
||||
* @return 表格中的值 |
||||
*/ |
||||
Object getValue(int row, int column); |
||||
|
||||
/** |
||||
* 设置属性表中第row行第column列的值为value |
||||
* @param value |
||||
* @param row |
||||
* @param column |
||||
* @return 设置成功则返回true,否则返回false |
||||
*/ |
||||
boolean setValue(Object value, int row, int column); |
||||
|
||||
/** |
||||
* 改行是否可编辑 |
||||
* @param row |
||||
* @return 第row行可编辑返回true,否则返回false |
||||
*/ |
||||
boolean isEditable(int row); |
||||
} |
@ -0,0 +1,190 @@
|
||||
package com.fr.design.beans.location; |
||||
|
||||
import java.awt.Color; |
||||
import java.awt.Graphics; |
||||
|
||||
import com.fr.base.GraphHelper; |
||||
import com.fr.design.scrollruler.ScrollRulerComponent; |
||||
import com.fr.stable.ArrayUtils; |
||||
|
||||
public class Absorptionline { |
||||
private static Absorptionline lineInX = new Absorptionline(null, null, null, true); |
||||
private static Absorptionline lineInY = new Absorptionline(null, null, null, false); |
||||
|
||||
private Color lineColor = new Color(228, 225, 199); |
||||
private Color midLineColor = new Color(196, 227, 237); |
||||
private Integer x1; |
||||
private Integer x2; |
||||
private Integer middle; |
||||
private int[] verticalLines; |
||||
private int[] horizontalLines; |
||||
|
||||
private boolean trans; |
||||
|
||||
/** |
||||
* 创建X轴连接线 |
||||
* |
||||
* @param x x坐标 |
||||
* |
||||
* @return X轴的连接线 |
||||
* |
||||
* @date 2015-2-12-下午2:45:49 |
||||
* |
||||
*/ |
||||
public static Absorptionline createXAbsorptionline(int x) { |
||||
lineInX.x1 = x; |
||||
lineInX.x2 = lineInX.middle = null; |
||||
lineInX.horizontalLines = lineInX.verticalLines = null; |
||||
return lineInX; |
||||
} |
||||
|
||||
/** |
||||
* 创建X中轴连接线 |
||||
* |
||||
* @param x x坐标 |
||||
* |
||||
* @return X中轴的连接线 |
||||
* |
||||
* @date 2015-2-12-下午2:45:49 |
||||
* |
||||
*/ |
||||
public static Absorptionline createXMidAbsorptionline(int x) { |
||||
lineInX.middle = x; |
||||
lineInX.x1 = lineInX.x2 = null; |
||||
lineInX.horizontalLines = lineInX.verticalLines = null; |
||||
return lineInX; |
||||
} |
||||
|
||||
/** |
||||
* 创建Y轴连接线 |
||||
* |
||||
* @param y y坐标 |
||||
* |
||||
* @return Y轴的连接线 |
||||
* |
||||
* @date 2015-2-12-下午2:45:49 |
||||
* |
||||
*/ |
||||
public static Absorptionline createYAbsorptionline(int y) { |
||||
lineInY.x1 = y; |
||||
lineInY.x2 = lineInY.middle = null; |
||||
lineInY.horizontalLines = lineInY.verticalLines = null; |
||||
return lineInY; |
||||
} |
||||
|
||||
/** |
||||
* 创建Y中轴连接线 |
||||
* |
||||
* @param y y坐标 |
||||
* |
||||
* @return Y中轴的连接线 |
||||
* |
||||
* @date 2015-2-12-下午2:45:49 |
||||
* |
||||
*/ |
||||
public static Absorptionline createYMidAbsorptionline(int y) { |
||||
lineInY.middle = y; |
||||
lineInY.x1 = lineInY.x2 = null; |
||||
lineInY.horizontalLines = lineInY.verticalLines = null; |
||||
return lineInY; |
||||
} |
||||
|
||||
private Absorptionline(Integer x1, Integer x2, Integer middleInX, boolean trans) { |
||||
this.x1 = x1; |
||||
this.x2 = x2; |
||||
this.middle = middleInX; |
||||
this.trans = trans; |
||||
} |
||||
|
||||
public void setFirstLine(Integer x) { |
||||
this.x1 = x; |
||||
} |
||||
|
||||
public void setMidLine(Integer x) { |
||||
this.middle = x; |
||||
} |
||||
|
||||
public void setSecondLine(Integer x) { |
||||
this.x2 = x; |
||||
} |
||||
|
||||
/** |
||||
* 是否相关参数都已设置完毕 |
||||
* |
||||
* @return 相关参数都已设置完毕 |
||||
* |
||||
* @date 2015-2-12-下午2:44:46 |
||||
* |
||||
*/ |
||||
public boolean isFull() { |
||||
return x1 != null && x2 != null && middle != null; |
||||
} |
||||
|
||||
public int[] getVerticalLines() { |
||||
return verticalLines; |
||||
} |
||||
|
||||
public void setVerticalLines(int[] verticalLines) { |
||||
this.verticalLines = verticalLines; |
||||
} |
||||
|
||||
public int[] getHorizontalLines() { |
||||
return horizontalLines; |
||||
} |
||||
|
||||
public void setHorizontalLines(int[] horizontalLines) { |
||||
this.horizontalLines = horizontalLines; |
||||
} |
||||
|
||||
public void paint(Graphics g, ScrollRulerComponent designer) { |
||||
g = g.create(); |
||||
if (trans) { |
||||
|
||||
for (int i = 0; i < ArrayUtils.getLength(verticalLines); i++) { |
||||
g.setColor(lineColor); |
||||
GraphHelper.drawLine(g, verticalLines[i] - designer.getHorizontalValue(), 0, verticalLines[i] - designer.getHorizontalValue(), |
||||
designer.getDesignerHeight()); |
||||
} |
||||
|
||||
if (x1 != null) { |
||||
g.setColor(lineColor); |
||||
GraphHelper.drawLine(g, x1 - designer.getHorizontalValue(), 0, x1 - designer.getHorizontalValue(), |
||||
designer.getDesignerHeight()); |
||||
} |
||||
if (x2 != null) { |
||||
g.setColor(lineColor); |
||||
GraphHelper.drawLine(g, x2 - designer.getHorizontalValue(), 0, x2 - designer.getHorizontalValue(), |
||||
designer.getDesignerWidth()); |
||||
} |
||||
if (middle != null) { |
||||
g.setColor(midLineColor); |
||||
GraphHelper.drawLine(g, middle - designer.getHorizontalValue(), 0, middle |
||||
- designer.getHorizontalValue(), designer.getDesignerHeight()); |
||||
} |
||||
} else { |
||||
for (int i = 0; i < ArrayUtils.getLength(horizontalLines); i++) { |
||||
g.setColor(lineColor); |
||||
GraphHelper.drawLine(g, 0, horizontalLines[i] - designer.getVerticalValue(), |
||||
designer.getDesignerWidth(), horizontalLines[i] - designer.getVerticalValue()); |
||||
} |
||||
|
||||
if (x1 != null) { |
||||
|
||||
g.setColor(lineColor); |
||||
GraphHelper.drawLine(g, 0, x1 - designer.getVerticalValue(), designer.getDesignerWidth(), x1 |
||||
- designer.getVerticalValue()); |
||||
} |
||||
if (x2 != null) { |
||||
g.setColor(lineColor); |
||||
GraphHelper.drawLine(g, 0, x2 - designer.getVerticalValue(), designer.getDesignerWidth(), x2 |
||||
- designer.getVerticalValue()); |
||||
} |
||||
if (middle != null) { |
||||
g.setColor(midLineColor); |
||||
GraphHelper.drawLine(g, 0, middle - designer.getVerticalValue(), designer.getDesignerWidth(), middle |
||||
- designer.getVerticalValue()); |
||||
} |
||||
|
||||
} |
||||
} |
||||
} |
@ -0,0 +1,332 @@
|
||||
/* |
||||
* Copyright(c) 2001-2011, FineReport Inc, All Rights Reserved. |
||||
*/ |
||||
package com.fr.design.beans.location; |
||||
|
||||
import javax.swing.*; |
||||
import java.awt.*; |
||||
import java.util.ArrayList; |
||||
|
||||
/** |
||||
* Created by IntelliJ IDEA. |
||||
* |
||||
* @author: Richer |
||||
* @since : 6.5.5 Date: 11-7-1 Time: 下午2:22 |
||||
*/ |
||||
public class MoveUtils { |
||||
|
||||
public static final int SORPTION_UNIT = 5; |
||||
|
||||
private MoveUtils() { |
||||
|
||||
} |
||||
|
||||
public interface RectangleDesigner { |
||||
|
||||
/** |
||||
* 获取块边界的迭代器 |
||||
* |
||||
* @return 块边界的迭代器 |
||||
* |
||||
* @date 2015-2-12-下午2:43:47 |
||||
* |
||||
*/ |
||||
RectangleIterator createRectangleIterator(); |
||||
|
||||
/** |
||||
* 设置X轴的线 |
||||
* |
||||
* @param line 连接线 |
||||
* |
||||
* @date 2015-2-12-下午2:44:04 |
||||
* |
||||
*/ |
||||
void setXAbsorptionline(Absorptionline line); |
||||
|
||||
/** |
||||
* 设置Y轴的线 |
||||
* |
||||
* @param line 连接线 |
||||
* |
||||
* @date 2015-2-12-下午2:44:04 |
||||
* |
||||
*/ |
||||
void setYAbsorptionline(Absorptionline line); |
||||
|
||||
/** |
||||
* 获取当前选中块的垂直线数组 |
||||
* |
||||
* @return 块的垂直线数组 |
||||
* |
||||
*/ |
||||
int[] getVerticalLine(); |
||||
|
||||
/** |
||||
* 获取当前选中块的水平线数组 |
||||
* |
||||
* @return 块的水平线数组 |
||||
* |
||||
*/ |
||||
int[] getHorizontalLine(); |
||||
} |
||||
|
||||
public interface RectangleIterator { |
||||
|
||||
/** |
||||
* 是否存在下一个块 |
||||
* |
||||
* @return 是否存在下一个块 |
||||
* |
||||
* @date 2015-2-12-下午2:41:32 |
||||
* |
||||
*/ |
||||
boolean hasNext(); |
||||
|
||||
/** |
||||
* 获取下一个块的bounds |
||||
* |
||||
* @return 下一个块的bounds |
||||
* |
||||
* @date 2015-2-12-下午2:41:55 |
||||
* |
||||
*/ |
||||
Rectangle nextRectangle(); |
||||
|
||||
/** |
||||
* 获取块的垂直线数组 |
||||
* |
||||
* @return 块的垂直线数组 |
||||
* |
||||
* @date 2015-2-12-下午2:42:27 |
||||
* |
||||
*/ |
||||
int[] getVerticalLine(); |
||||
|
||||
/** |
||||
* 获取块的水平线数组 |
||||
* |
||||
* @return 块的水平线数组 |
||||
* |
||||
* @date 2015-2-12-下午2:42:27 |
||||
* |
||||
*/ |
||||
int[] getHorizontalLine(); |
||||
} |
||||
|
||||
private static class PlacePointing { |
||||
public PlacePointing(int x) { |
||||
this.palce = x; |
||||
} |
||||
|
||||
private boolean isFind() { |
||||
return direction != -1; |
||||
} |
||||
|
||||
private int palce; |
||||
private int direction = -1; |
||||
} |
||||
|
||||
private static void findX(PlacePointing px, Rectangle bounds, int left, int right, int width) { |
||||
if (px.isFind()) { |
||||
return; |
||||
} |
||||
if (Math.abs(bounds.x + bounds.width / 2 - (left + right) / 2) <= SORPTION_UNIT) { |
||||
px.palce = bounds.x + bounds.width / 2 - width / 2; |
||||
px.direction = SwingConstants.CENTER; |
||||
} |
||||
int x1 = bounds.x; |
||||
if (Math.abs(x1 - left) <= SORPTION_UNIT) { |
||||
px.palce = x1; |
||||
px.direction = SwingConstants.LEFT; |
||||
} |
||||
if (Math.abs(x1 - right) <= SORPTION_UNIT) { |
||||
px.palce = x1 - width; |
||||
px.direction = SwingConstants.RIGHT; |
||||
} |
||||
int x2 = bounds.x + bounds.width; |
||||
if (Math.abs(x2 - left) <= SORPTION_UNIT) { |
||||
px.palce = x2; |
||||
px.direction = SwingConstants.LEFT; |
||||
} |
||||
if (Math.abs(x2 - right) <= SORPTION_UNIT) { |
||||
px.palce = x2 - width; |
||||
px.direction = SwingConstants.RIGHT; |
||||
} |
||||
} |
||||
|
||||
private static void findY(PlacePointing py, Rectangle bounds, int top, int bottom, int height) { |
||||
if (py.isFind()) { |
||||
return; |
||||
} |
||||
|
||||
if (Math.abs(bounds.y + bounds.height / 2 - (top + bottom) / 2) <= SORPTION_UNIT) { |
||||
py.palce = bounds.y + bounds.height / 2 - height / 2; |
||||
py.direction = SwingConstants.CENTER; |
||||
} |
||||
int y1 = bounds.y; |
||||
if (Math.abs(y1 - top) <= SORPTION_UNIT) { |
||||
py.palce = y1; |
||||
py.direction = SwingConstants.TOP; |
||||
} |
||||
if (Math.abs(y1 - bottom) <= SORPTION_UNIT) { |
||||
py.palce = y1 - height; |
||||
py.direction = SwingConstants.BOTTOM; |
||||
} |
||||
int y2 = bounds.y + bounds.height; |
||||
if (Math.abs(y2 - top) <= SORPTION_UNIT) { |
||||
py.palce = y2; |
||||
py.direction = SwingConstants.TOP; |
||||
} |
||||
if (Math.abs(y2 - bottom) <= SORPTION_UNIT) { |
||||
py.palce = y2 - height; |
||||
py.direction = SwingConstants.BOTTOM; |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 吸附 |
||||
* |
||||
* @param x x坐标 |
||||
* @param y y坐标 |
||||
* @param width 宽度 |
||||
* @param height 高度 |
||||
* @param designer 块设计器 |
||||
* |
||||
* @return 吸附后坐标 |
||||
* |
||||
* @date 2015-2-12-下午2:39:16 |
||||
* |
||||
*/ |
||||
public static Point sorption(int x, int y, int width, int height, RectangleDesigner designer) { |
||||
|
||||
int left = x, top = y, bottom = top + height, right = left + width; |
||||
|
||||
PlacePointing px = new PlacePointing(x); |
||||
PlacePointing py = new PlacePointing(y); |
||||
RectangleIterator iterator = designer.createRectangleIterator(); |
||||
|
||||
java.util.List<Rectangle> cacheRecs = new ArrayList<Rectangle>(); |
||||
while (iterator.hasNext()) { |
||||
Rectangle bounds = iterator.nextRectangle(); |
||||
cacheRecs.add(bounds); |
||||
findX(px, bounds, left, right, width); |
||||
findY(py, bounds, top, bottom, height); |
||||
if (px.isFind() && py.isFind()) { |
||||
break; |
||||
} |
||||
} |
||||
|
||||
createXAbsorptionline(px, designer, width, cacheRecs); |
||||
createYAbsorptionline(py, designer, height, cacheRecs); |
||||
return new Point(px.palce, py.palce); |
||||
} |
||||
|
||||
private static void createXAbsorptionline(PlacePointing px, RectangleDesigner designer, int width, java.util.List<Rectangle> cacheRecs) { |
||||
Absorptionline line = null; |
||||
RectangleIterator iterator = designer.createRectangleIterator(); |
||||
int[] selfVertical = designer.getVerticalLine(); |
||||
if (px.direction == SwingConstants.CENTER) { |
||||
line = Absorptionline.createXMidAbsorptionline(px.palce + width / 2); |
||||
int left = px.palce; |
||||
int right = px.palce + width; |
||||
for (Rectangle bounds : cacheRecs) { |
||||
if (bounds.x == left || bounds.x + bounds.width == left) { |
||||
line.setFirstLine(left); |
||||
} |
||||
if (bounds.x == right || bounds.x + bounds.width == right) { |
||||
line.setSecondLine(right); |
||||
} |
||||
updateVerticalLine(selfVertical, iterator, line); |
||||
if (line.isFull()) { |
||||
break; |
||||
} |
||||
} |
||||
} else if (px.direction == SwingConstants.LEFT || px.direction == SwingConstants.RIGHT) { |
||||
int left = px.direction == SwingConstants.LEFT ? px.palce + width : px.palce; |
||||
line = Absorptionline.createXAbsorptionline(px.direction == SwingConstants.LEFT ? px.palce : px.palce + width); |
||||
int middle = px.palce + width / 2; |
||||
for (Rectangle bounds : cacheRecs) { |
||||
if (bounds.x == left || bounds.x + bounds.width == left) { |
||||
line.setSecondLine(left); |
||||
} |
||||
if (bounds.x + bounds.width / 2 == middle) { |
||||
line.setMidLine(middle); |
||||
} |
||||
updateVerticalLine(selfVertical, iterator, line); |
||||
if (line.isFull()) { |
||||
break; |
||||
} |
||||
} |
||||
} |
||||
designer.setXAbsorptionline(line); |
||||
} |
||||
|
||||
private static void createYAbsorptionline(PlacePointing py, RectangleDesigner designer, int height, java.util.List<Rectangle> cacheRecs) { |
||||
Absorptionline line = null; |
||||
RectangleIterator iterator = designer.createRectangleIterator(); |
||||
int[] selfHorizontal = designer.getHorizontalLine(); |
||||
if (py.direction == SwingConstants.CENTER) { |
||||
line = Absorptionline.createYMidAbsorptionline(py.palce + height / 2); |
||||
int top = py.palce; |
||||
int bottom = py.palce + height; |
||||
for (Rectangle bounds : cacheRecs) { |
||||
if (bounds.y == top || bounds.y + bounds.height == top) { |
||||
line.setFirstLine(top); |
||||
} |
||||
if (bounds.y == bottom || bounds.y + bounds.height == bottom) { |
||||
line.setSecondLine(bottom); |
||||
} |
||||
updateHorizontalLine(selfHorizontal, iterator, line); |
||||
if (line.isFull()) { |
||||
break; |
||||
} |
||||
} |
||||
} else if (py.direction == SwingConstants.TOP || py.direction == SwingConstants.BOTTOM) { |
||||
int top = py.direction == SwingConstants.TOP ? py.palce + height : py.palce; |
||||
line = Absorptionline.createYAbsorptionline(py.direction == SwingConstants.TOP ? py.palce : py.palce + height); |
||||
int middle = py.palce + height / 2; |
||||
for (Rectangle bounds : cacheRecs) { |
||||
if (bounds.y == top || bounds.y + bounds.height == top) { |
||||
line.setSecondLine(top); |
||||
} |
||||
if (bounds.y + bounds.height / 2 == middle) { |
||||
line.setMidLine(middle); |
||||
} |
||||
updateHorizontalLine(selfHorizontal, iterator, line); |
||||
if (line.isFull()) { |
||||
break; |
||||
} |
||||
} |
||||
} |
||||
designer.setYAbsorptionline(line); |
||||
} |
||||
|
||||
//更新纵向行列线
|
||||
private static void updateVerticalLine(int[] selfVertical, RectangleIterator iterator, Absorptionline line){ |
||||
int[] targetArray = iterator.getVerticalLine(); |
||||
if (intersectArrays(targetArray, selfVertical)){ |
||||
line.setVerticalLines(targetArray); |
||||
} |
||||
} |
||||
|
||||
//更新横向行列线
|
||||
private static void updateHorizontalLine(int[] selfHorizontal, RectangleIterator iterator, Absorptionline line){ |
||||
int[] targetArray = iterator.getHorizontalLine(); |
||||
if (intersectArrays(targetArray, selfHorizontal)){ |
||||
line.setHorizontalLines(targetArray); |
||||
} |
||||
} |
||||
|
||||
//检测两个数组是否有相交的部分
|
||||
private static boolean intersectArrays(int[] targetArray, int[] selfArray){ |
||||
for (int i : targetArray) { |
||||
for (int j : selfArray) { |
||||
if(i == j){ |
||||
return true; |
||||
} |
||||
} |
||||
} |
||||
|
||||
return false; |
||||
} |
||||
} |
@ -0,0 +1,50 @@
|
||||
package com.fr.design.border; |
||||
|
||||
import java.awt.Color; |
||||
import java.awt.Component; |
||||
import java.awt.Graphics; |
||||
import java.awt.Graphics2D; |
||||
import java.awt.RenderingHints; |
||||
import java.awt.geom.RoundRectangle2D; |
||||
|
||||
import javax.swing.border.LineBorder; |
||||
|
||||
import com.fr.base.GraphHelper; |
||||
|
||||
public class UIRoundedBorder extends LineBorder { |
||||
|
||||
private static final long serialVersionUID = 1L; |
||||
|
||||
private int roundedCorner; |
||||
private int lineStyle; |
||||
|
||||
public UIRoundedBorder(Color color) { |
||||
super(color); |
||||
} |
||||
|
||||
public UIRoundedBorder(Color color, int thickness){ |
||||
super(color, thickness); |
||||
} |
||||
|
||||
public UIRoundedBorder(Color color, int thickness, int roundedCorners){ |
||||
super(color, thickness, true); |
||||
this.roundedCorner = roundedCorners; |
||||
} |
||||
|
||||
public UIRoundedBorder(int lineStyle, Color color, int roundedCorners){ |
||||
super(color, GraphHelper.getLineStyleSize(lineStyle), true); |
||||
this.lineStyle = lineStyle; |
||||
this.roundedCorner = roundedCorners; |
||||
} |
||||
|
||||
public void paintBorder(Component c, Graphics g, int x, int y, int width, int height){ |
||||
Color oldColor = g.getColor(); |
||||
|
||||
Graphics2D g2d = (Graphics2D)g; |
||||
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); |
||||
g2d.setColor(lineColor); |
||||
GraphHelper.draw(g2d, new RoundRectangle2D.Double(x, y, width - 1, height-1, roundedCorner, roundedCorner),lineStyle); |
||||
g2d.setColor(oldColor); |
||||
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF); |
||||
} |
||||
} |
@ -0,0 +1,28 @@
|
||||
package com.fr.design.border; |
||||
|
||||
import java.awt.Color; |
||||
|
||||
import javax.swing.BorderFactory; |
||||
import javax.swing.border.TitledBorder; |
||||
|
||||
public class UITitledBorder extends TitledBorder { |
||||
|
||||
private static final long serialVersionUID = 1L; |
||||
|
||||
public static UITitledBorder createBorderWithTitle(String title) { |
||||
return new UITitledBorder(title); |
||||
} |
||||
|
||||
private UITitledBorder(String title) { |
||||
super(null, title, 4, 2, null, new Color(1, 159, 222)); |
||||
init(title); |
||||
} |
||||
|
||||
private void init(String title){ |
||||
UIRoundedBorder roundedborder = new UIRoundedBorder(new Color(204, 204, 204), 1, 10); |
||||
this.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createEmptyBorder(0, 0, 5, 0), roundedborder)); |
||||
|
||||
this.setTitle(title); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,17 @@
|
||||
package com.fr.design.bridge; |
||||
|
||||
/** |
||||
* @author richie |
||||
* @date 14/11/10 |
||||
* @since 8.0 |
||||
* 工具栏界面接口 |
||||
*/ |
||||
public interface DesignToolbarProvider { |
||||
|
||||
public static final String STRING_MARKED = "DesignToolbarProvider"; |
||||
|
||||
/** |
||||
* 刷新工具栏 |
||||
*/ |
||||
public void refreshToolbar(); |
||||
} |
@ -0,0 +1,15 @@
|
||||
/** |
||||
* |
||||
*/ |
||||
package com.fr.design.cell; |
||||
|
||||
/** |
||||
* 悬浮元素 |
||||
* |
||||
* @author focus |
||||
* @time 2014年11月17日下午10:44:10 |
||||
* @version |
||||
*/ |
||||
public interface FloatElementsProvider { |
||||
|
||||
} |
@ -0,0 +1,66 @@
|
||||
package com.fr.design.condition; |
||||
|
||||
import java.awt.event.MouseAdapter; |
||||
import java.awt.event.MouseEvent; |
||||
import java.awt.event.MouseListener; |
||||
|
||||
import com.fr.base.BaseUtils; |
||||
import com.fr.design.gui.ibutton.UIButton; |
||||
import com.fr.design.gui.imenu.UIPopupMenu; |
||||
import com.fr.design.menu.MenuDef; |
||||
import com.fr.design.utils.gui.GUICoreUtils; |
||||
|
||||
/** |
||||
* Define Menu. |
||||
*/ |
||||
public class CellHighlightAddMenuDef extends MenuDef { |
||||
public CellHighlightAddMenuDef() { |
||||
} |
||||
|
||||
public CellHighlightAddMenuDef(String name) { |
||||
this.setName(name); |
||||
} |
||||
|
||||
public CellHighlightAddMenuDef(String name, char mnemonic) { |
||||
this.setName(name); |
||||
this.setMnemonic(mnemonic); |
||||
} |
||||
|
||||
// 生成UIButton,iconpath不可为null
|
||||
public UIButton createUIButton() { |
||||
if (createdButton == null) { |
||||
if (this.iconPath != null && this.name != null) { |
||||
createdButton = new UIButton(BaseUtils.readIcon(this.iconPath)); |
||||
} else if (this.iconPath != null) { |
||||
createdButton = new UIButton(BaseUtils.readIcon(this.iconPath)); |
||||
} else { |
||||
createdButton = new UIButton(this.name); |
||||
} |
||||
createdButton.addMouseListener(mouseListener); |
||||
} |
||||
|
||||
return createdButton; |
||||
} |
||||
|
||||
private MouseListener mouseListener = new MouseAdapter() { |
||||
public void mouseReleased(MouseEvent evt) { |
||||
Object source = evt.getSource(); |
||||
UIButton button = (UIButton) source; |
||||
if (!button.isEnabled()) { |
||||
return; |
||||
} |
||||
|
||||
UIPopupMenu popupMenu = new UIPopupMenu(); |
||||
popupMenu.setInvoker(button); |
||||
CellHighlightAddMenuDef.this.updatePopupMenu(popupMenu); |
||||
|
||||
GUICoreUtils.showPopupMenu(popupMenu, button, 0, button.getSize().height); |
||||
} |
||||
|
||||
public void mouseExited(MouseEvent evt) { |
||||
if (createdButton != null) { |
||||
createdButton.setEnabled(true); |
||||
} |
||||
} |
||||
}; |
||||
} |
@ -0,0 +1,52 @@
|
||||
package com.fr.design.condition; |
||||
|
||||
/** |
||||
* @author richie |
||||
* @date 2015-03-26 |
||||
* @since 8.0 |
||||
*/ |
||||
public abstract class ConditionAttrSingleConditionPane<T> extends SingleConditionPane<T> { |
||||
protected HighLightConditionAction hightLighAttrUpdateAction = null; |
||||
private ConditionAttributesPane conditionAttributesPane; |
||||
|
||||
public ConditionAttrSingleConditionPane(ConditionAttributesPane conditionAttributesPane) { |
||||
this(conditionAttributesPane, true); |
||||
} |
||||
|
||||
public ConditionAttrSingleConditionPane(ConditionAttributesPane conditionAttributesPane, boolean isRemove) { |
||||
super(isRemove); |
||||
this.conditionAttributesPane = conditionAttributesPane; |
||||
} |
||||
|
||||
/** |
||||
* 条目名称 |
||||
* @return 名称 |
||||
*/ |
||||
public abstract String nameForPopupMenuItem(); |
||||
|
||||
@Override |
||||
protected String title4PopupWindow() { |
||||
return nameForPopupMenuItem(); |
||||
} |
||||
|
||||
/** |
||||
* 取消 |
||||
*/ |
||||
public void doCancel() { |
||||
conditionAttributesPane.removeConditionAttrSingleConditionPane(this); |
||||
conditionAttributesPane.resetUseAbleActionList(); |
||||
conditionAttributesPane.updateMenuDef(); |
||||
conditionAttributesPane.checkConditionPane(); |
||||
conditionAttributesPane.redraw(); |
||||
} |
||||
|
||||
public void setDefault() { |
||||
} |
||||
|
||||
public HighLightConditionAction getHighLightConditionAction() { |
||||
if (hightLighAttrUpdateAction == null) { |
||||
hightLighAttrUpdateAction = new HighLightConditionAction(nameForPopupMenuItem(), conditionAttributesPane, this); |
||||
} |
||||
return hightLighAttrUpdateAction; |
||||
} |
||||
} |
@ -0,0 +1,133 @@
|
||||
package com.fr.design.condition; |
||||
|
||||
|
||||
import com.fr.base.FRContext; |
||||
import com.fr.design.actions.UpdateAction; |
||||
import com.fr.design.beans.BasicBeanPane; |
||||
import com.fr.design.gui.itoolbar.UIToolbar; |
||||
import com.fr.design.layout.FRGUIPaneFactory; |
||||
import com.fr.design.menu.ToolBarDef; |
||||
import com.fr.design.utils.gui.GUICoreUtils; |
||||
import com.fr.general.Inter; |
||||
|
||||
import javax.swing.*; |
||||
import java.util.HashMap; |
||||
import java.util.Iterator; |
||||
|
||||
public abstract class ConditionAttributesPane<T> extends BasicBeanPane<T> { |
||||
protected CellHighlightAddMenuDef menuDef; |
||||
|
||||
protected JPanel selectedItemPane; |
||||
|
||||
protected LiteConditionPane liteConditionPane; |
||||
|
||||
protected java.util.Map<Class, ConditionAttrSingleConditionPane> classPaneMap = new HashMap<Class, ConditionAttrSingleConditionPane>(); |
||||
|
||||
//可用的Actions.
|
||||
protected java.util.List<UpdateAction> useAbleActionList = new java.util.ArrayList<UpdateAction>(); |
||||
|
||||
protected void initComponents() { |
||||
this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); |
||||
|
||||
// 属性 界面
|
||||
JPanel propertyChangePane = FRGUIPaneFactory.createY_AXISBoxInnerContainer_S_Pane(); |
||||
this.add(propertyChangePane); |
||||
|
||||
propertyChangePane.setBorder(GUICoreUtils.createTitledBorder(Inter.getLocText("Property") + ":", null)); |
||||
|
||||
// 选择要改变的属性.
|
||||
JPanel addItemPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); |
||||
ToolBarDef toolbarDef = new ToolBarDef(); |
||||
|
||||
menuDef = new CellHighlightAddMenuDef(); |
||||
menuDef.setName(Inter.getLocText("Highlight-Click_to_Choose_Property_To_Modify")); |
||||
menuDef.setIconPath("com/fr/design/images/control/addPopup.png"); |
||||
|
||||
toolbarDef.addShortCut(menuDef); |
||||
|
||||
updateMenuDef(); |
||||
|
||||
UIToolbar toolBar = ToolBarDef.createJToolBar(); |
||||
toolbarDef.updateToolBar(toolBar); |
||||
|
||||
addItemPane.add(toolBar); |
||||
|
||||
propertyChangePane.add(addItemPane); |
||||
|
||||
selectedItemPane = FRGUIPaneFactory.createY_AXISBoxInnerContainer_S_Pane(); |
||||
// selectedItemPane.setLayout(new BoxLayout(selectedItemPane,BoxLayout.Y_AXIS));
|
||||
|
||||
// 选中的添加Itempane
|
||||
JScrollPane selectedItemScrollPane = new JScrollPane(); |
||||
selectedItemScrollPane.setViewportView(selectedItemPane); |
||||
selectedItemScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); |
||||
propertyChangePane.add(selectedItemScrollPane); |
||||
} |
||||
|
||||
public void updateBean(T ob) { |
||||
updateMenuDef(); |
||||
} |
||||
|
||||
protected void updateMenuDef() { |
||||
menuDef.clearShortCuts(); |
||||
for (UpdateAction ac : useAbleActionList) { |
||||
menuDef.addShortCut(ac); |
||||
} |
||||
menuDef.updateMenu(); |
||||
menuDef.setEnabled(true); |
||||
} |
||||
|
||||
public void checkConditionPane() { |
||||
GUICoreUtils.setEnabled(this.liteConditionPane, this.selectedItemPane.getComponentCount() >= 1); |
||||
} |
||||
|
||||
public ConditionAttrSingleConditionPane createConditionAttrSingleConditionPane(Class<? extends ConditionAttrSingleConditionPane> clazz) { |
||||
try { |
||||
return clazz.newInstance(); |
||||
} catch (InstantiationException e) { |
||||
FRContext.getLogger().error(e.getMessage(), e); |
||||
} catch (IllegalAccessException e) { |
||||
FRContext.getLogger().error(e.getMessage(), e); |
||||
} |
||||
return null; |
||||
} |
||||
|
||||
protected void addAction2UseAbleActionList() { |
||||
useAbleActionList.clear(); |
||||
Iterator<ConditionAttrSingleConditionPane> iterator = classPaneMap.values().iterator(); |
||||
|
||||
while (iterator.hasNext()) { |
||||
useAbleActionList.add(iterator.next().getHighLightConditionAction()); |
||||
} |
||||
} |
||||
|
||||
public void resetUseAbleActionList() { |
||||
Iterator<ConditionAttrSingleConditionPane> iterator = classPaneMap.values().iterator(); |
||||
|
||||
while (iterator.hasNext()) { |
||||
ConditionAttrSingleConditionPane pane = iterator.next(); |
||||
if (pane.getParent() != this.selectedItemPane && !this.useAbleActionList.contains(pane.getHighLightConditionAction())) { |
||||
this.useAbleActionList.add(pane.getHighLightConditionAction()); |
||||
} |
||||
} |
||||
} |
||||
|
||||
public void removeConditionAttrSingleConditionPane(JComponent component) { |
||||
selectedItemPane.remove(component); |
||||
} |
||||
|
||||
public void addConditionAttrSingleConditionPane(JComponent component) { |
||||
selectedItemPane.add(component); |
||||
} |
||||
|
||||
|
||||
public void removeUpdateActionFromUsableList(UpdateAction action) { |
||||
useAbleActionList.remove(action); |
||||
} |
||||
|
||||
public void redraw() { |
||||
validate(); |
||||
repaint(); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,128 @@
|
||||
package com.fr.design.condition; |
||||
|
||||
import java.util.ArrayList; |
||||
import java.util.HashMap; |
||||
import java.util.List; |
||||
import java.util.Map; |
||||
|
||||
import javax.swing.tree.DefaultMutableTreeNode; |
||||
import javax.swing.tree.DefaultTreeSelectionModel; |
||||
import javax.swing.tree.TreePath; |
||||
|
||||
import com.fr.general.ComparatorUtils; |
||||
import com.fr.design.utils.gui.GUICoreUtils; |
||||
|
||||
/** |
||||
* 一个层次连续节点. |
||||
*/ |
||||
public class ContinuousTreeSelectionModel extends DefaultTreeSelectionModel { |
||||
public ContinuousTreeSelectionModel() { |
||||
} |
||||
|
||||
public void addSelectionPaths(TreePath[] paths) { |
||||
if (paths == null || paths.length == 0) { |
||||
return; |
||||
} |
||||
|
||||
int firstIndex = 0; |
||||
Map indexTreePathMap = new HashMap(); |
||||
|
||||
TreePath[] oldSelectedPaths = this.getSelectionPaths(); |
||||
//peter:需要检查是否是同一个父亲的孩子
|
||||
if (oldSelectedPaths != null && oldSelectedPaths.length > 0) { |
||||
TreePath parentTreePath = oldSelectedPaths[0].getParentPath(); |
||||
DefaultMutableTreeNode parentTreeNode = (DefaultMutableTreeNode) parentTreePath.getLastPathComponent(); |
||||
|
||||
for (int i = 0; i < oldSelectedPaths.length; i++) { |
||||
if (ComparatorUtils.equals(parentTreePath, oldSelectedPaths[i].getParentPath())) { |
||||
DefaultMutableTreeNode tmpTreeNode = (DefaultMutableTreeNode) oldSelectedPaths[i].getLastPathComponent(); |
||||
int treeNodeIndex = parentTreeNode.getIndex(tmpTreeNode); |
||||
if (i == 0) { |
||||
firstIndex = treeNodeIndex; |
||||
} |
||||
indexTreePathMap.put(new Integer(treeNodeIndex), GUICoreUtils.getTreePath(tmpTreeNode)); |
||||
} |
||||
} |
||||
|
||||
for (int i = 0; i < paths.length; i++) { |
||||
if (ComparatorUtils.equals(parentTreePath, paths[i].getParentPath())) { |
||||
DefaultMutableTreeNode tmpTreeNode = (DefaultMutableTreeNode) paths[i].getLastPathComponent(); |
||||
int treeNodeIndex = parentTreeNode.getIndex(tmpTreeNode); |
||||
indexTreePathMap.put(new Integer(treeNodeIndex), GUICoreUtils.getTreePath(tmpTreeNode)); |
||||
} |
||||
} |
||||
} else { |
||||
firstIndex = findFirstIndexIfNotEmpty(indexTreePathMap, paths); |
||||
} |
||||
|
||||
List newTreePathList = resolveNewTreePathList(firstIndex, indexTreePathMap); |
||||
|
||||
if (newTreePathList.size() > 0) { |
||||
super.addSelectionPaths((TreePath[])newTreePathList.toArray(new TreePath[newTreePathList.size()])); |
||||
} |
||||
} |
||||
|
||||
public int findFirstIndexIfNotEmpty(Map indexTreePathMap, TreePath[] paths) { |
||||
int firstIndex = 0; |
||||
TreePath parentTreePath = paths[0].getParentPath(); |
||||
DefaultMutableTreeNode parentTreeNode = (DefaultMutableTreeNode) parentTreePath.getLastPathComponent(); |
||||
|
||||
for (int i = 0; i < paths.length; i++) { |
||||
if (ComparatorUtils.equals(parentTreePath, paths[i].getParentPath())) { |
||||
DefaultMutableTreeNode tmpTreeNode = (DefaultMutableTreeNode) paths[i].getLastPathComponent(); |
||||
int treeNodeIndex = parentTreeNode.getIndex(tmpTreeNode); |
||||
if (i == 0) { |
||||
firstIndex = treeNodeIndex; |
||||
} |
||||
indexTreePathMap.put(new Integer(treeNodeIndex), GUICoreUtils.getTreePath(tmpTreeNode)); |
||||
} |
||||
} |
||||
|
||||
return firstIndex; |
||||
} |
||||
|
||||
public List resolveNewTreePathList(int firstIndex, Map indexTreePathMap) { |
||||
List newTreePathList = new ArrayList(); |
||||
//peter: 先向下找.
|
||||
for (int i = firstIndex - 1; i >= 0 && indexTreePathMap.size() > 0; i--) { |
||||
Object obj = indexTreePathMap.get(new Integer(i)); |
||||
if (obj == null) { |
||||
break; |
||||
} |
||||
|
||||
newTreePathList.add(obj); |
||||
indexTreePathMap.remove(new Integer(i)); |
||||
} |
||||
|
||||
//peter: 先向下找.
|
||||
for (int i = firstIndex; i < Integer.MAX_VALUE && indexTreePathMap.size() > 0; i++) { |
||||
Object obj = indexTreePathMap.get(new Integer(i)); |
||||
if (obj == null) { |
||||
break; |
||||
} |
||||
|
||||
newTreePathList.add(obj); |
||||
indexTreePathMap.remove(new Integer(i)); |
||||
} |
||||
|
||||
return newTreePathList; |
||||
} |
||||
|
||||
//
|
||||
public void setSelectionPaths(TreePath[] paths) { |
||||
if (paths == null || paths.length == 0) { |
||||
return; |
||||
} |
||||
|
||||
int firstIndex = 0; |
||||
Map indexTreePathMap = new HashMap(); |
||||
|
||||
firstIndex = findFirstIndexIfNotEmpty(indexTreePathMap, paths); |
||||
|
||||
List newTreePathList = resolveNewTreePathList(firstIndex, indexTreePathMap); |
||||
|
||||
if (newTreePathList.size() > 0) { |
||||
super.setSelectionPaths((TreePath[])newTreePathList.toArray(new TreePath[newTreePathList.size()])); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,200 @@
|
||||
package com.fr.design.condition; |
||||
|
||||
import java.awt.BorderLayout; |
||||
import java.awt.Component; |
||||
import java.awt.Dimension; |
||||
|
||||
import javax.swing.DefaultComboBoxModel; |
||||
|
||||
import com.fr.design.file.HistoryTemplateListPane; |
||||
import com.fr.design.gui.ilable.UILabel; |
||||
import javax.swing.JList; |
||||
import javax.swing.JPanel; |
||||
import javax.swing.tree.TreePath; |
||||
|
||||
import com.fr.data.condition.CommonCondition; |
||||
import com.fr.design.mainframe.JTemplate; |
||||
import com.fr.general.ComparatorUtils; |
||||
import com.fr.general.data.Condition; |
||||
import com.fr.data.condition.JoinCondition; |
||||
import com.fr.data.core.Compare; |
||||
import com.fr.design.beans.BasicBeanPane; |
||||
import com.fr.design.formula.CustomVariableResolver; |
||||
import com.fr.design.formula.VariableResolver; |
||||
import com.fr.design.gui.icombobox.UIComboBox; |
||||
import com.fr.design.gui.icombobox.UIComboBoxRenderer; |
||||
import com.fr.design.gui.itree.refreshabletree.ExpandMutableTreeNode; |
||||
import com.fr.design.layout.FRGUIPaneFactory; |
||||
import com.fr.design.layout.TableLayout; |
||||
import com.fr.design.layout.TableLayoutHelper; |
||||
import com.fr.design.editor.ValueEditorPane; |
||||
import com.fr.design.editor.ValueEditorPaneFactory; |
||||
import com.fr.design.editor.editor.ColumnIndexEditor; |
||||
import com.fr.design.editor.editor.ColumnNameEditor; |
||||
import com.fr.design.editor.editor.Editor; |
||||
import com.fr.general.Inter; |
||||
import com.fr.stable.ArrayUtils; |
||||
import com.fr.stable.StringUtils; |
||||
|
||||
public class DSColumnLiteConditionPane extends LiteConditionPane<CommonCondition> { |
||||
/** |
||||
* |
||||
*/ |
||||
private static final long serialVersionUID = 1L; |
||||
private String[] displayNames = ArrayUtils.EMPTY_STRING_ARRAY; |
||||
|
||||
@Override |
||||
protected BasicBeanPane<CommonCondition> createUnFormulaConditionPane() { |
||||
return new CommonConditionPane(); |
||||
} |
||||
|
||||
@Override |
||||
protected VariableResolver variableResolver4FormulaPane() { |
||||
return new CustomVariableResolver(displayNames, false); |
||||
} |
||||
|
||||
/** |
||||
* 刷新数据列 |
||||
* @param displayNames 数据列名称 |
||||
*/ |
||||
public void populateColumns(String[] displayNames) { |
||||
CommonConditionPane ccp = (CommonConditionPane) this.defaultConditionPane; |
||||
this.displayNames = displayNames; |
||||
if(ArrayUtils.isNotEmpty(displayNames)){ |
||||
ccp.setEditor(new Editor[] { new ColumnNameEditor(displayNames), new ColumnIndexEditor(displayNames.length)}, displayNames[0]); |
||||
} |
||||
TreePath selectedTreePath = conditionsTree.getSelectionPath(); |
||||
if (selectedTreePath != null) { |
||||
ExpandMutableTreeNode selectedTreeNode = (ExpandMutableTreeNode) selectedTreePath.getLastPathComponent(); |
||||
JoinCondition joinCondition = (JoinCondition) selectedTreeNode.getUserObject(); |
||||
Condition liteCondition = joinCondition.getCondition(); |
||||
|
||||
if(liteCondition instanceof CommonCondition){ |
||||
CommonCondition commonCondition = (CommonCondition) liteCondition; |
||||
int columnNumber = commonCondition.getColumnNumber(); |
||||
if (columnNumber > 0){ |
||||
ccp.keyColumnPane.populate(columnNumber); |
||||
} else { |
||||
String columnName = commonCondition.getColumnName(); |
||||
ccp.keyColumnPane.populate(columnName); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
protected class CommonConditionPane extends BasicBeanPane<CommonCondition> { |
||||
private static final long serialVersionUID = 1L; |
||||
private ValueEditorPane keyColumnPane; |
||||
private UIComboBox conditionOPComboBox; |
||||
private ValueEditorPane conditionValuePane; |
||||
|
||||
CommonConditionPane() { |
||||
initComponents(); |
||||
} |
||||
|
||||
public void setEditor(Editor[] editors, Object obj) { |
||||
keyColumnPane.setEditors(editors, obj); |
||||
} |
||||
|
||||
protected void initComponents() { |
||||
this.setLayout(FRGUIPaneFactory.createBorderLayout()); |
||||
keyColumnPane = ValueEditorPaneFactory.createValueEditorPane(new Editor[] { new ColumnNameEditor(), new ColumnIndexEditor() }); |
||||
conditionOPComboBox = new UIComboBox(new DefaultComboBoxModel()); |
||||
DefaultComboBoxModel opComboBoxModel = (DefaultComboBoxModel) conditionOPComboBox.getModel(); |
||||
int[] allOperators = Compare.getAllOperators(); |
||||
for (int i = 0; i < allOperators.length; i++) { |
||||
opComboBoxModel.addElement(new Integer(allOperators[i])); |
||||
} |
||||
this.conditionOPComboBox.setRenderer(new UIComboBoxRenderer() { |
||||
|
||||
@Override |
||||
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { |
||||
super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); |
||||
if (value instanceof Integer) { |
||||
this.setText(Compare.operator2String(((Integer) value).intValue())); |
||||
} |
||||
|
||||
return this; |
||||
} |
||||
}); |
||||
conditionValuePane = createValueEditorPane(); |
||||
keyColumnPane.setPreferredSize(new Dimension(175, keyColumnPane.getPreferredSize().height)); |
||||
conditionOPComboBox.setPreferredSize(new Dimension(80, 20)); |
||||
Component[][] components = { |
||||
{ new UILabel(Inter.getLocText("Utils-Available_Columns") + ":"), new UILabel(Inter.getLocText("FR-ConditionB_Operator") + ":"), |
||||
new UILabel() }, { keyColumnPane, conditionOPComboBox, conditionValuePane } }; |
||||
|
||||
double p = TableLayout.PREFERRED; |
||||
double rowSize[] = { p, p }; |
||||
double columnSize[] = { p, p, TableLayout.FILL }; |
||||
|
||||
JPanel leftPanel = TableLayoutHelper.createTableLayoutPane(components, rowSize, columnSize); |
||||
this.add(leftPanel, BorderLayout.CENTER); |
||||
} |
||||
|
||||
protected ValueEditorPane createValueEditorPane() { |
||||
JTemplate jTemplate = HistoryTemplateListPane.getInstance().getCurrentEditingTemplate(); |
||||
if(jTemplate.isChartBook()){ |
||||
return ValueEditorPaneFactory.createBasicEditorWithoutFormulaPane(); |
||||
} |
||||
return ValueEditorPaneFactory.createAllValueEditorPane(); |
||||
} |
||||
|
||||
@Override |
||||
public CommonCondition updateBean() { |
||||
Object value = conditionValuePane.update(); |
||||
int columnNumber = (Integer) keyColumnPane.update(); |
||||
String columnName = StringUtils.EMPTY; |
||||
|
||||
if(keyColumnPane.getCurrentEditor() instanceof ColumnNameEditor && ArrayUtils.isNotEmpty(displayNames)){ |
||||
columnName = DSColumnLiteConditionPane.this.displayNames[columnNumber - 1]; |
||||
columnNumber = -1; |
||||
} |
||||
|
||||
return new CommonCondition(columnName, columnNumber, new Compare( |
||||
((Integer) conditionOPComboBox.getSelectedItem()).intValue(), value)); |
||||
} |
||||
|
||||
@Override |
||||
public void populateBean(CommonCondition condition) { |
||||
|
||||
String selectionColumn = condition.getColumnName(); |
||||
int selectionColumnNumber = condition.getColumnNumber(); |
||||
if(StringUtils.isNotEmpty(selectionColumn)){ |
||||
for (int i = 0; i < DSColumnLiteConditionPane.this.displayNames.length; i++) { |
||||
if(ComparatorUtils.equals(DSColumnLiteConditionPane.this.displayNames[i],selectionColumn)) { |
||||
//keyColumnPane.populate(i + 1);
|
||||
keyColumnPane.populate(selectionColumn); |
||||
break; |
||||
} |
||||
} |
||||
}else{ |
||||
keyColumnPane.populate(selectionColumnNumber); |
||||
} |
||||
|
||||
Compare compare = condition.getCompare(); |
||||
|
||||
if (compare == null) { |
||||
return; |
||||
} |
||||
conditionOPComboBox.setSelectedItem(new Integer(compare.getOp())); |
||||
|
||||
Object value = compare.getValue(); |
||||
|
||||
conditionValuePane.populate(value); |
||||
} |
||||
|
||||
@Override |
||||
protected String title4PopupWindow() { |
||||
return " "; |
||||
} |
||||
|
||||
@Override |
||||
public void checkValid() throws Exception { |
||||
conditionOPComboBox.setSelectedIndex(0); |
||||
conditionValuePane.populate(StringUtils.EMPTY); |
||||
} |
||||
|
||||
|
||||
} |
||||
} |
@ -0,0 +1,21 @@
|
||||
package com.fr.design.condition; |
||||
|
||||
import com.fr.data.condition.CommonCondition; |
||||
import com.fr.design.beans.BasicBeanPane; |
||||
import com.fr.design.editor.ValueEditorPane; |
||||
import com.fr.design.editor.ValueEditorPaneFactory; |
||||
|
||||
public class DSColumnSimpleLiteConditionPane extends DSColumnLiteConditionPane { |
||||
|
||||
@Override |
||||
protected BasicBeanPane<CommonCondition> createUnFormulaConditionPane() { |
||||
return new SimpleCommonConditionPane(); |
||||
} |
||||
|
||||
protected class SimpleCommonConditionPane extends CommonConditionPane { |
||||
|
||||
protected ValueEditorPane createValueEditorPane() { |
||||
return ValueEditorPaneFactory.createNoCRNoColumnValueEditorPane(); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,36 @@
|
||||
package com.fr.design.condition; |
||||
|
||||
import com.fr.design.actions.UpdateAction; |
||||
|
||||
import java.awt.event.ActionEvent; |
||||
|
||||
/** |
||||
* @author richie |
||||
* @date 2015-03-26 |
||||
* @since 8.0 |
||||
*/ |
||||
public class HighLightConditionAction extends UpdateAction { |
||||
private ConditionAttributesPane conditionAttributesPane; |
||||
private ConditionAttrSingleConditionPane conditionAttrSingleConditionPane; |
||||
|
||||
public HighLightConditionAction(String name, ConditionAttributesPane conditionAttributesPane, ConditionAttrSingleConditionPane conditionAttrSingleConditionPane) { |
||||
this.setName(name); |
||||
this.conditionAttributesPane = conditionAttributesPane; |
||||
this.conditionAttrSingleConditionPane = conditionAttrSingleConditionPane; |
||||
} |
||||
|
||||
/** |
||||
* 响应事件 |
||||
* @param e 事件 |
||||
*/ |
||||
@Override |
||||
public void actionPerformed(ActionEvent e) { |
||||
conditionAttributesPane.addConditionAttrSingleConditionPane(conditionAttrSingleConditionPane); |
||||
conditionAttributesPane.removeUpdateActionFromUsableList(this); |
||||
conditionAttributesPane.updateMenuDef(); |
||||
conditionAttributesPane.checkConditionPane(); |
||||
conditionAttributesPane.redraw(); |
||||
conditionAttrSingleConditionPane.setDefault(); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,950 @@
|
||||
package com.fr.design.condition; |
||||
|
||||
import com.fr.base.BaseUtils; |
||||
import com.fr.base.Formula; |
||||
import com.fr.data.DataConstants; |
||||
import com.fr.data.condition.*; |
||||
import com.fr.design.beans.BasicBeanPane; |
||||
import com.fr.design.dialog.DialogActionAdapter; |
||||
import com.fr.design.formula.FormulaFactory; |
||||
import com.fr.design.formula.UIFormula; |
||||
import com.fr.design.formula.VariableResolver; |
||||
import com.fr.design.gui.ibutton.UIButton; |
||||
import com.fr.design.gui.ibutton.UIRadioButton; |
||||
import com.fr.design.gui.ilable.UILabel; |
||||
import com.fr.design.gui.itextarea.UITextArea; |
||||
import com.fr.design.gui.itree.refreshabletree.ExpandMutableTreeNode; |
||||
import com.fr.design.layout.FRGUIPaneFactory; |
||||
import com.fr.design.scrollruler.ModLineBorder; |
||||
import com.fr.design.utils.gui.GUICoreUtils; |
||||
import com.fr.general.ComparatorUtils; |
||||
import com.fr.general.FRLogger; |
||||
import com.fr.general.Inter; |
||||
import com.fr.general.data.Condition; |
||||
|
||||
import javax.swing.*; |
||||
import javax.swing.event.TreeExpansionEvent; |
||||
import javax.swing.event.TreeExpansionListener; |
||||
import javax.swing.event.TreeSelectionEvent; |
||||
import javax.swing.event.TreeSelectionListener; |
||||
import javax.swing.tree.DefaultMutableTreeNode; |
||||
import javax.swing.tree.DefaultTreeCellRenderer; |
||||
import javax.swing.tree.DefaultTreeModel; |
||||
import javax.swing.tree.TreePath; |
||||
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.util.ArrayList; |
||||
import java.util.Enumeration; |
||||
import java.util.List; |
||||
|
||||
/** |
||||
* peter: LiteCondition Pane. |
||||
*/ |
||||
public abstract class LiteConditionPane<T extends Condition> extends BasicBeanPane<Condition> { |
||||
private static int MOVE_UP = 0; |
||||
private static int MOVE_DOWN = 1; |
||||
|
||||
private static final long serialVersionUID = 1L; |
||||
// peter:这两个变量在弹出公式编辑器的时候,需要用.
|
||||
private UIRadioButton commonRadioButton = new UIRadioButton(Inter.getLocText("FR-Designer_LiteCondition_Common")); |
||||
private UIRadioButton formulaRadioButton = new UIRadioButton(Inter.getLocText("FR-Designer_LiteCondition_Formula")); |
||||
private JPanel conditionCardPane; |
||||
protected BasicBeanPane<T> defaultConditionPane; |
||||
// card2
|
||||
private UITextArea formulaTextArea; |
||||
private UIButton modifyButton; |
||||
private UIButton addButton; |
||||
private UIRadioButton andRadioButton = new UIRadioButton(Inter.getLocText("FR-Designer_LiteCondition_ConditionB-AND") + " "); |
||||
private UIRadioButton orRadioButton = new UIRadioButton(Inter.getLocText("FR-Designer_LiteCondition_ConditionB-OR")); |
||||
protected JTree conditionsTree;// Conditions
|
||||
private UIButton removeButton; |
||||
private UIButton moveUpButton; |
||||
private UIButton moveDownButton; |
||||
private UIButton bracketButton; |
||||
private UIButton unBracketButton; |
||||
|
||||
private ActionListener actionListener1 = new ActionListener() { |
||||
|
||||
@Override |
||||
public void actionPerformed(ActionEvent evt) { |
||||
Formula formula; |
||||
|
||||
String text = formulaTextArea.getText(); |
||||
if (text == null || text.length() <= 0) { |
||||
formula = new Formula(""); |
||||
} else { |
||||
formula = new Formula(text); |
||||
} |
||||
|
||||
final UIFormula formulaPane = FormulaFactory.createFormulaPane(); |
||||
formulaPane.populate(formula, variableResolver4FormulaPane()); |
||||
formulaPane.showLargeWindow(SwingUtilities.getWindowAncestor(LiteConditionPane.this), new DialogActionAdapter() { |
||||
|
||||
@Override |
||||
public void doOk() { |
||||
Formula formula = formulaPane.update(); |
||||
if (formula.getContent().length() <= 1) {// 如果没有填任何字符,则是空白文本
|
||||
formulaTextArea.setText(""); |
||||
} else { |
||||
formulaTextArea.setText(formula.getContent().substring(1)); |
||||
} |
||||
} |
||||
}).setVisible(true); |
||||
} |
||||
}; |
||||
|
||||
|
||||
private ActionListener actionListener2 = new ActionListener() { |
||||
|
||||
@Override |
||||
public void actionPerformed(ActionEvent evt) { |
||||
// peter:先获得当前的LiteCondition.
|
||||
|
||||
Condition liteCondition = null; |
||||
if (commonRadioButton.isSelected()) { |
||||
liteCondition = defaultConditionPane.updateBean(); |
||||
} else { |
||||
liteCondition = new FormulaCondition(formulaTextArea.getText()); |
||||
} |
||||
|
||||
JoinCondition newJoinCondition = new JoinCondition(andRadioButton.isSelected() ? DataConstants.AND : DataConstants.OR, liteCondition); |
||||
ExpandMutableTreeNode parentTreeNode = getParentTreeNode(); |
||||
boolean result = isExistedInParentTreeNode(parentTreeNode, newJoinCondition); |
||||
if (result) { |
||||
JOptionPane.showMessageDialog(SwingUtilities.getWindowAncestor(LiteConditionPane.this), |
||||
Inter.getLocText("BindColumn-This_Condition_has_been_existed")); |
||||
return; |
||||
} |
||||
|
||||
ExpandMutableTreeNode newJionConditionTreeNode = new ExpandMutableTreeNode(newJoinCondition); |
||||
parentTreeNode.add(newJionConditionTreeNode); |
||||
DefaultTreeModel defaultTreeModel = (DefaultTreeModel) conditionsTree.getModel(); |
||||
defaultTreeModel.reload(parentTreeNode); |
||||
parentTreeNode.expandCurrentTreeNode(conditionsTree); |
||||
conditionsTree.setSelectionPath(GUICoreUtils.getTreePath(newJionConditionTreeNode)); |
||||
|
||||
// peter:必须要检查Enabled.
|
||||
checkButtonEnabledForList(); |
||||
} |
||||
}; |
||||
|
||||
|
||||
private MouseAdapter mouseAdapter = new MouseAdapter() { |
||||
|
||||
@Override |
||||
public void mouseEntered(MouseEvent evt) { |
||||
TreePath selectedTreePath = conditionsTree.getSelectionPath(); |
||||
// peter:当前的节点
|
||||
if (selectedTreePath != null) { |
||||
ExpandMutableTreeNode selectedTreeNode = (ExpandMutableTreeNode) selectedTreePath.getLastPathComponent(); |
||||
JoinCondition oldJoinCondition = (JoinCondition) selectedTreeNode.getUserObject(); |
||||
oldJoinCondition.setJoin(andRadioButton.isSelected() ? DataConstants.AND : DataConstants.OR); |
||||
|
||||
Condition oldLiteCondition = oldJoinCondition.getCondition(); |
||||
// peter:如果当前选中的是ListCondition,只要改变Join为AND或者OR,直接返回.
|
||||
if (oldLiteCondition instanceof ListCondition) { |
||||
GUICoreUtils.setEnabled(conditionCardPane, false); |
||||
} |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public void mouseExited(MouseEvent evt) { |
||||
GUICoreUtils.setEnabled(conditionCardPane, conditionCardPane.isEnabled()); |
||||
} |
||||
}; |
||||
|
||||
private TreeSelectionListener treeSelectionListener = new TreeSelectionListener() { |
||||
|
||||
@Override |
||||
public void valueChanged(TreeSelectionEvent evt) { |
||||
checkButtonEnabledForList(); |
||||
|
||||
TreePath selectedTreePath = conditionsTree.getSelectionPath(); |
||||
if (selectedTreePath == null) { |
||||
return; |
||||
} |
||||
|
||||
ExpandMutableTreeNode selectedTreeNode = (ExpandMutableTreeNode) selectedTreePath.getLastPathComponent(); |
||||
Object userObject = selectedTreeNode.getUserObject(); |
||||
if (userObject instanceof JoinCondition) { |
||||
JoinCondition joinCondition = (JoinCondition) userObject; |
||||
|
||||
// peter:先弄join.
|
||||
int join = joinCondition.getJoin(); |
||||
if (join == DataConstants.AND) { |
||||
andRadioButton.setSelected(true); |
||||
} else { |
||||
orRadioButton.setSelected(true); |
||||
} |
||||
|
||||
// peter:当前的liteCondtion.
|
||||
Condition liteCondition = joinCondition.getCondition(); |
||||
// elake:两种Condition对应于数据列和高亮.
|
||||
if (liteCondition instanceof CommonCondition || liteCondition instanceof ObjectCondition) { |
||||
Condition commonCondition = liteCondition; |
||||
commonRadioButton.setSelected(true); |
||||
applyCardsPane(); |
||||
|
||||
defaultConditionPane.populateBean((T) commonCondition); |
||||
|
||||
} else if (liteCondition instanceof FormulaCondition) { |
||||
FormulaCondition formulaCondition = (FormulaCondition) liteCondition; |
||||
|
||||
formulaRadioButton.setSelected(true); |
||||
applyCardsPane(); |
||||
|
||||
formulaTextArea.setText(formulaCondition.getFormula()); |
||||
} |
||||
} |
||||
} |
||||
}; |
||||
|
||||
|
||||
private ActionListener actionListener3 = new ActionListener() { |
||||
|
||||
@Override |
||||
public void actionPerformed(ActionEvent evt) { |
||||
TreePath selectedTreePath = conditionsTree.getSelectionPath(); |
||||
if (selectedTreePath == null) { |
||||
return; |
||||
} |
||||
|
||||
int returnVal = JOptionPane.showConfirmDialog(SwingUtilities.getWindowAncestor(LiteConditionPane.this), |
||||
Inter.getLocText("Utils-Are_you_sure_to_remove_the_selected_item") + "?", Inter.getLocText("FR-Designer_Remove"), |
||||
JOptionPane.OK_CANCEL_OPTION); |
||||
if (returnVal == JOptionPane.OK_OPTION) { |
||||
DefaultTreeModel treeModel = (DefaultTreeModel) conditionsTree.getModel(); |
||||
|
||||
TreePath[] selectedTreePaths = conditionsTree.getSelectionPaths(); |
||||
for (int i = selectedTreePaths.length - 1; i >= 0; i--) { |
||||
ExpandMutableTreeNode selectedTreeNode = (ExpandMutableTreeNode) selectedTreePaths[i].getLastPathComponent(); |
||||
ExpandMutableTreeNode parentTreeNode = (ExpandMutableTreeNode) selectedTreeNode.getParent(); |
||||
|
||||
// peter:将要选择节点.
|
||||
ExpandMutableTreeNode nextSelectTreeNode; |
||||
if (parentTreeNode.getChildAfter(selectedTreeNode) != null) { |
||||
nextSelectTreeNode = (ExpandMutableTreeNode) parentTreeNode.getChildAfter(selectedTreeNode); |
||||
} else if (parentTreeNode.getChildBefore(selectedTreeNode) != null) { |
||||
nextSelectTreeNode = (ExpandMutableTreeNode) parentTreeNode.getChildBefore(selectedTreeNode); |
||||
} else { |
||||
nextSelectTreeNode = parentTreeNode; |
||||
} |
||||
|
||||
parentTreeNode.remove(selectedTreeNode); |
||||
|
||||
if (!ComparatorUtils.equals(nextSelectTreeNode, treeModel.getRoot())) { |
||||
conditionsTree.setSelectionPath(GUICoreUtils.getTreePath(nextSelectTreeNode)); |
||||
} |
||||
treeModel.reload(parentTreeNode); |
||||
parentTreeNode.expandCurrentTreeNode(conditionsTree); |
||||
if (!ComparatorUtils.equals(nextSelectTreeNode, treeModel.getRoot())) { |
||||
conditionsTree.setSelectionPath(GUICoreUtils.getTreePath(nextSelectTreeNode)); |
||||
} |
||||
} |
||||
|
||||
// peter:检查Button Enabled.
|
||||
checkButtonEnabledForList(); |
||||
} |
||||
} |
||||
}; |
||||
|
||||
|
||||
private ActionListener actionListener4 = new ActionListener() { |
||||
|
||||
@Override |
||||
public void actionPerformed(ActionEvent evt) { |
||||
TreePath selectedTreePath = conditionsTree.getSelectionPath(); |
||||
if (selectedTreePath == null) { |
||||
return; |
||||
} |
||||
ExpandMutableTreeNode selectedTreeNode = (ExpandMutableTreeNode) selectedTreePath.getLastPathComponent(); |
||||
ExpandMutableTreeNode parentTreeNode = (ExpandMutableTreeNode) selectedTreeNode.getParent(); |
||||
if (parentTreeNode.getChildBefore(selectedTreeNode) != null) { |
||||
swapNodesOfConditionTree(parentTreeNode, (ExpandMutableTreeNode) parentTreeNode.getChildBefore(selectedTreeNode), |
||||
selectedTreeNode, MOVE_UP); |
||||
} |
||||
} |
||||
}; |
||||
|
||||
|
||||
private ActionListener actionListener5 = new ActionListener() { |
||||
|
||||
@Override |
||||
public void actionPerformed(ActionEvent evt) { |
||||
TreePath selectedTreePath = conditionsTree.getSelectionPath(); |
||||
if (selectedTreePath == null) { |
||||
return; |
||||
} |
||||
ExpandMutableTreeNode selectedTreeNode = (ExpandMutableTreeNode) selectedTreePath.getLastPathComponent(); |
||||
ExpandMutableTreeNode parentTreeNode = (ExpandMutableTreeNode) selectedTreeNode.getParent(); |
||||
if (parentTreeNode.getChildAfter(selectedTreeNode) != null) { |
||||
swapNodesOfConditionTree(parentTreeNode, selectedTreeNode, (ExpandMutableTreeNode) parentTreeNode.getChildAfter(selectedTreeNode), MOVE_DOWN); |
||||
} |
||||
} |
||||
}; |
||||
|
||||
|
||||
private ActionListener actionListener6 = new ActionListener() { |
||||
|
||||
@Override |
||||
public void actionPerformed(ActionEvent evt) { |
||||
TreePath[] selectedTreePaths = conditionsTree.getSelectionPaths(); |
||||
// peter:当前的节点
|
||||
if (selectedTreePaths == null || selectedTreePaths.length <= 1) { |
||||
return; |
||||
} |
||||
|
||||
// peter: 找到父亲节点,并且删除所有的节点.
|
||||
TreePath topTreePath = GUICoreUtils.getTopTreePath(conditionsTree, selectedTreePaths); |
||||
ExpandMutableTreeNode leadTreeNode = (ExpandMutableTreeNode) topTreePath.getLastPathComponent(); |
||||
ExpandMutableTreeNode parentTreeNode = (ExpandMutableTreeNode) leadTreeNode.getParent(); |
||||
int topIndex = parentTreeNode.getIndex(leadTreeNode); |
||||
|
||||
JoinCondition firstJionCondition = (JoinCondition) leadTreeNode.getUserObject(); |
||||
for (int i = 0; i < selectedTreePaths.length; i++) { |
||||
ExpandMutableTreeNode tmpTreeNode = (ExpandMutableTreeNode) selectedTreePaths[i].getLastPathComponent(); |
||||
parentTreeNode.remove(tmpTreeNode); |
||||
} |
||||
|
||||
// peter:建立新的节点.
|
||||
JoinCondition newJionCondition = new JoinCondition(); |
||||
newJionCondition.setJoin(firstJionCondition.getJoin()); |
||||
newJionCondition.setCondition(new ListCondition()); |
||||
ExpandMutableTreeNode newTreeNode = new ExpandMutableTreeNode(newJionCondition); |
||||
for (int i = 0; i < selectedTreePaths.length; i++) { |
||||
ExpandMutableTreeNode tmpTreeNode = (ExpandMutableTreeNode) selectedTreePaths[i].getLastPathComponent(); |
||||
newTreeNode.add(tmpTreeNode); |
||||
} |
||||
|
||||
// peter:添加新的节点
|
||||
parentTreeNode.insert(newTreeNode, topIndex); |
||||
|
||||
// peter:需要reload
|
||||
DefaultTreeModel defaultTreeModel = (DefaultTreeModel) conditionsTree.getModel(); |
||||
defaultTreeModel.reload(parentTreeNode); |
||||
parentTreeNode.expandCurrentTreeNode(conditionsTree); |
||||
|
||||
// peter:选择一个节点
|
||||
conditionsTree.setSelectionPath(GUICoreUtils.getTreePath(newTreeNode)); |
||||
} |
||||
}; |
||||
|
||||
|
||||
ActionListener actionListener7 = new ActionListener() { |
||||
|
||||
@Override |
||||
public void actionPerformed(ActionEvent evt) { |
||||
TreePath selectedTreePath = conditionsTree.getSelectionPath(); |
||||
// peter:当前的节点
|
||||
if (selectedTreePath == null) { |
||||
return; |
||||
} |
||||
|
||||
ExpandMutableTreeNode selectedTreeNode = (ExpandMutableTreeNode) selectedTreePath.getLastPathComponent(); |
||||
JoinCondition joinCondition = (JoinCondition) selectedTreeNode.getUserObject(); |
||||
Condition liteCondition = joinCondition.getCondition(); |
||||
if (liteCondition instanceof ListCondition) { |
||||
ExpandMutableTreeNode parentTreeNode = (ExpandMutableTreeNode) selectedTreeNode.getParent(); |
||||
int index = parentTreeNode.getIndex(selectedTreeNode); |
||||
|
||||
// peter:添加节点
|
||||
List<TreePath> treePathList = new ArrayList<TreePath>(); |
||||
for (int i = selectedTreeNode.getChildCount() - 1; i >= 0; i--) { |
||||
ExpandMutableTreeNode tmpTreeNode = (ExpandMutableTreeNode) selectedTreeNode.getChildAt(i); |
||||
parentTreeNode.insert(tmpTreeNode, index); |
||||
treePathList.add(GUICoreUtils.getTreePath(tmpTreeNode)); |
||||
} |
||||
|
||||
// peter;删除这个List节点
|
||||
parentTreeNode.remove(selectedTreeNode); |
||||
|
||||
// peter:需要reload
|
||||
DefaultTreeModel defaultTreeModel = (DefaultTreeModel) conditionsTree.getModel(); |
||||
defaultTreeModel.reload(parentTreeNode); |
||||
parentTreeNode.expandCurrentTreeNode(conditionsTree); |
||||
|
||||
// peter:选择所有选择的节点
|
||||
TreePath[] selectedTreePaths = new TreePath[treePathList.size()]; |
||||
treePathList.toArray(selectedTreePaths); |
||||
conditionsTree.setSelectionPaths(selectedTreePaths); |
||||
} |
||||
} |
||||
}; |
||||
|
||||
|
||||
private ActionListener actionListener8 = new ActionListener() { |
||||
|
||||
@Override |
||||
public void actionPerformed(ActionEvent evt) { |
||||
modify(); |
||||
} |
||||
}; |
||||
|
||||
|
||||
// 图表条件高亮时没有公式选择
|
||||
protected JPanel conditonTypePane; |
||||
|
||||
public LiteConditionPane() { |
||||
this.initComponents(); |
||||
} |
||||
|
||||
protected abstract BasicBeanPane<T> createUnFormulaConditionPane(); |
||||
|
||||
protected abstract VariableResolver variableResolver4FormulaPane(); |
||||
|
||||
protected void initComponents() { |
||||
this.setLayout(FRGUIPaneFactory.createBorderLayout()); |
||||
|
||||
// north
|
||||
initNorth(); |
||||
|
||||
//center
|
||||
JPanel centerPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); |
||||
this.add(centerPane, BorderLayout.CENTER); |
||||
centerPane.setLayout(FRGUIPaneFactory.createBorderLayout()); |
||||
|
||||
// Control
|
||||
JPanel controlPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); |
||||
centerPane.add(controlPane, BorderLayout.NORTH); |
||||
// controlPane.setLayout(FRGUIPaneFactory.createBorderLayout());
|
||||
|
||||
// conditionCardPane
|
||||
initConditionCardPane(controlPane); |
||||
|
||||
// addControlPane, contains or,and Radio, add,modify Button
|
||||
initControlPane(controlPane); |
||||
|
||||
// Preview
|
||||
JPanel previewPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); |
||||
centerPane.add(previewPane, BorderLayout.CENTER); |
||||
previewPane.setBorder(BorderFactory.createEmptyBorder(0, 2, 2, 0)); |
||||
|
||||
|
||||
// conTreeScrollPane.setPreferredSize(new Dimension(400, 125));
|
||||
previewPane.add(iniTreeScrollPane(), BorderLayout.CENTER); |
||||
conditionsTree.addTreeSelectionListener(treeSelectionListener); |
||||
|
||||
JPanel buttonPane = FRGUIPaneFactory.createNColumnGridInnerContainer_S_Pane(1); |
||||
previewPane.add(GUICoreUtils.createBorderPane(buttonPane, BorderLayout.NORTH), BorderLayout.EAST); |
||||
initButtonPane(buttonPane); |
||||
|
||||
// peter:必须要检查Enabled.
|
||||
checkButtonEnabledForList(); |
||||
} |
||||
|
||||
|
||||
private void initButtonPane(JPanel buttonPane) { |
||||
removeButton = new UIButton(Inter.getLocText("FR-Designer_Remove")); |
||||
buttonPane.add(removeButton); |
||||
removeButton.setIcon(BaseUtils.readIcon("com/fr/base/images/cell/control/remove.png")); |
||||
removeButton.setEnabled(false); |
||||
removeButton.addActionListener(actionListener3); |
||||
|
||||
moveUpButton = new UIButton(Inter.getLocText("Utils-Move_Up")); |
||||
buttonPane.add(moveUpButton); |
||||
moveUpButton.setIcon(BaseUtils.readIcon("com/fr/design/images/control/up.png")); |
||||
moveUpButton.addActionListener(actionListener4); |
||||
|
||||
moveDownButton = new UIButton(Inter.getLocText("Utils-Move_Down")); |
||||
buttonPane.add(moveDownButton); |
||||
moveDownButton.setIcon(BaseUtils.readIcon("com/fr/design/images/control/down.png")); |
||||
moveDownButton.addActionListener(actionListener5); |
||||
|
||||
// peter:加括号
|
||||
bracketButton = new UIButton(Inter.getLocText("ConditionB-Add_bracket")); |
||||
buttonPane.add(bracketButton); |
||||
bracketButton.setIcon(BaseUtils.readIcon("com/fr/design/images/condition/bracket.png")); |
||||
bracketButton.addActionListener(actionListener6); |
||||
|
||||
// peter:去掉括号
|
||||
unBracketButton = new UIButton(Inter.getLocText("ConditionB-Remove_bracket")); |
||||
buttonPane.add(unBracketButton); |
||||
unBracketButton.setIcon(BaseUtils.readIcon("com/fr/design/images/condition/unBracket.png")); |
||||
unBracketButton.addActionListener(actionListener7); |
||||
} |
||||
|
||||
private JScrollPane iniTreeScrollPane() { |
||||
conditionsTree = new JTree(new DefaultTreeModel(new ExpandMutableTreeNode(new JoinCondition(DataConstants.AND, new ListCondition())))); |
||||
conditionsTree.setRootVisible(false); |
||||
conditionsTree.setCellRenderer(conditionsTreeCellRenderer); |
||||
conditionsTree.setSelectionModel(new ContinuousTreeSelectionModel()); |
||||
conditionsTree.addTreeExpansionListener(treeExpansionListener); |
||||
conditionsTree.setShowsRootHandles(true); |
||||
return new JScrollPane(conditionsTree); |
||||
|
||||
} |
||||
|
||||
private void initNorth() { |
||||
conditonTypePane = FRGUIPaneFactory.createBorderLayout_S_Pane(); |
||||
this.add(conditonTypePane, BorderLayout.NORTH); |
||||
conditonTypePane.setBorder(new ModLineBorder(ModLineBorder.BOTTOM)); |
||||
|
||||
UILabel conditionTypeLabel = new UILabel(Inter.getLocText("FR-Designer_Type") + ":"); |
||||
conditonTypePane.add(conditionTypeLabel, BorderLayout.WEST); |
||||
conditionTypeLabel.setBorder(BorderFactory.createEmptyBorder(0, 0, 4, 0)); |
||||
|
||||
JPanel northPane = FRGUIPaneFactory.createNColumnGridInnerContainer_S_Pane(2); |
||||
conditonTypePane.add(northPane, BorderLayout.CENTER); |
||||
northPane.setBorder(BorderFactory.createEmptyBorder(0, 0, 4, 0)); |
||||
northPane.add(GUICoreUtils.createFlowPane(commonRadioButton, FlowLayout.CENTER)); |
||||
northPane.add(GUICoreUtils.createFlowPane(formulaRadioButton, FlowLayout.CENTER)); |
||||
commonRadioButton.addActionListener(radioActionListener); |
||||
formulaRadioButton.addActionListener(radioActionListener); |
||||
|
||||
ButtonGroup mainBg = new ButtonGroup(); |
||||
mainBg.add(commonRadioButton); |
||||
mainBg.add(formulaRadioButton); |
||||
commonRadioButton.setSelected(true); |
||||
} |
||||
|
||||
private void initConditionCardPane(JPanel controlPane) { |
||||
conditionCardPane = FRGUIPaneFactory.createCardLayout_S_Pane(); |
||||
controlPane.add(conditionCardPane, BorderLayout.CENTER); |
||||
conditionCardPane.setLayout(new CardLayout()); |
||||
conditionCardPane.setBorder(BorderFactory.createEmptyBorder(1, 0, 1, 0)); |
||||
|
||||
// defaultConditionPane
|
||||
conditionCardPane.add(defaultConditionPane = createUnFormulaConditionPane(), "DEFAULT"); |
||||
|
||||
// formulaConditionPane
|
||||
JPanel formulaConditionPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); |
||||
conditionCardPane.add(formulaConditionPane, "FORMULA"); |
||||
// formulaConditionPane.setLayout(FRGUIPaneFactory.createBorderLayout());
|
||||
|
||||
// formulaPane
|
||||
JPanel formulaPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); |
||||
formulaConditionPane.add(formulaPane, BorderLayout.CENTER); |
||||
formulaPane.setBorder(BorderFactory.createEmptyBorder(2, 0, 2, 2)); |
||||
formulaPane.add(GUICoreUtils.createBorderPane(new UILabel(Inter.getLocText("FR-Designer_LiteCondition_Formula") + "="), BorderLayout.NORTH), BorderLayout.WEST); |
||||
formulaTextArea = new UITextArea(); |
||||
formulaPane.add(new JScrollPane(formulaTextArea), BorderLayout.CENTER); |
||||
UIButton editFormulaButton = new UIButton(Inter.getLocText("FR-Designer_LiteCondition_Define")); |
||||
formulaPane.add(GUICoreUtils.createBorderPane(editFormulaButton, BorderLayout.NORTH), BorderLayout.EAST); |
||||
editFormulaButton.addActionListener(actionListener1); |
||||
applyCardsPane(); |
||||
} |
||||
|
||||
|
||||
private void initControlPane(JPanel controlPane) { |
||||
JPanel addControlPane = FRGUIPaneFactory.createRightFlowInnerContainer_S_Pane(); |
||||
controlPane.add(addControlPane, BorderLayout.SOUTH); |
||||
addControlPane.setBorder(new ModLineBorder(ModLineBorder.TOP)); |
||||
|
||||
ButtonGroup bg = new ButtonGroup(); |
||||
bg.add(andRadioButton); |
||||
bg.add(orRadioButton); |
||||
|
||||
andRadioButton.setSelected(true); |
||||
|
||||
JPanel radioPane = FRGUIPaneFactory.createNColumnGridInnerContainer_S_Pane(3); |
||||
addControlPane.add(radioPane); |
||||
radioPane.add(andRadioButton); |
||||
addControlPane.add(Box.createHorizontalStrut(4)); |
||||
radioPane.add(orRadioButton); |
||||
|
||||
addControlPane.add(Box.createHorizontalStrut(12)); |
||||
|
||||
addButton = new UIButton(Inter.getLocText("FR-Designer_Add"), BaseUtils.readIcon("com/fr/base/images/cell/control/add.png")); |
||||
addButton.setMnemonic('A'); |
||||
addControlPane.add(addButton); |
||||
addButton.addActionListener(actionListener2); |
||||
|
||||
addControlPane.add(Box.createHorizontalStrut(4)); |
||||
|
||||
modifyButton = new UIButton(Inter.getLocText("FR-Designer_Modify"), BaseUtils.readIcon("com/fr/base/images/cell/control/rename.png")); |
||||
modifyButton.setMnemonic('M'); |
||||
addControlPane.add(modifyButton); |
||||
modifyButton.addActionListener(actionListener8); |
||||
|
||||
// peter:当鼠标进入修改按钮的时候,如果是ListConditon内容编辑区域不可编辑
|
||||
modifyButton.addMouseListener(mouseAdapter); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
protected String title4PopupWindow() { |
||||
return Inter.getLocText("FR-Designer-Submit_Condition"); |
||||
} |
||||
|
||||
// samuel:移出来,方便调用
|
||||
protected void modify() { |
||||
TreePath selectedTreePath = conditionsTree.getSelectionPath(); |
||||
// peter:当前的节点
|
||||
if (selectedTreePath != null) { |
||||
ExpandMutableTreeNode selectedTreeNode = (ExpandMutableTreeNode) selectedTreePath.getLastPathComponent(); |
||||
JoinCondition oldJoinCondition = (JoinCondition) selectedTreeNode.getUserObject(); |
||||
oldJoinCondition.setJoin(andRadioButton.isSelected() ? DataConstants.AND : DataConstants.OR); |
||||
|
||||
Condition oldLiteCondition = oldJoinCondition.getCondition(); |
||||
// peter:如果当前选中的是ListCondition,只要改变Join为AND或者OR,直接返回.
|
||||
if (oldLiteCondition != null && !(oldLiteCondition instanceof ListCondition)) { |
||||
// peter:先获得当前的LiteCondition.
|
||||
Condition liteCondition; |
||||
if (commonRadioButton.isSelected()) { |
||||
liteCondition = defaultConditionPane.updateBean(); |
||||
} else { |
||||
liteCondition = new FormulaCondition(formulaTextArea.getText()); |
||||
} |
||||
|
||||
oldJoinCondition.setCondition(liteCondition); |
||||
} |
||||
|
||||
// peter:需要reload parent
|
||||
DefaultTreeModel defaultTreeModel = (DefaultTreeModel) conditionsTree.getModel(); |
||||
ExpandMutableTreeNode parentTreeNode = (ExpandMutableTreeNode) selectedTreeNode.getParent(); |
||||
defaultTreeModel.reload(parentTreeNode); |
||||
parentTreeNode.expandCurrentTreeNode(conditionsTree); |
||||
conditionsTree.setSelectionPath(GUICoreUtils.getTreePath(selectedTreeNode)); |
||||
} |
||||
} |
||||
|
||||
protected void swapNodesOfConditionTree(ExpandMutableTreeNode parentTreeNode, ExpandMutableTreeNode firstSelectTreeNode, |
||||
ExpandMutableTreeNode secondTreeNode, int type) { |
||||
int nextIndex = parentTreeNode.getIndex(firstSelectTreeNode); |
||||
parentTreeNode.remove(firstSelectTreeNode); |
||||
parentTreeNode.remove(secondTreeNode); |
||||
|
||||
parentTreeNode.insert(firstSelectTreeNode, nextIndex); |
||||
parentTreeNode.insert(secondTreeNode, nextIndex); |
||||
|
||||
DefaultTreeModel treeModel = (DefaultTreeModel) conditionsTree.getModel(); |
||||
treeModel.reload(parentTreeNode); |
||||
|
||||
parentTreeNode.expandCurrentTreeNode(conditionsTree); |
||||
if (type == MOVE_UP) { |
||||
conditionsTree.setSelectionPath(GUICoreUtils.getTreePath(secondTreeNode)); |
||||
} else if (type == MOVE_DOWN) { |
||||
conditionsTree.setSelectionPath(GUICoreUtils.getTreePath(firstSelectTreeNode)); |
||||
} |
||||
|
||||
|
||||
// peter:检查Button Enabled.
|
||||
checkButtonEnabledForList(); |
||||
} |
||||
|
||||
|
||||
ActionListener radioActionListener = new ActionListener() { |
||||
|
||||
@Override |
||||
public void actionPerformed(ActionEvent evt) { |
||||
applyCardsPane(); |
||||
} |
||||
}; |
||||
|
||||
private void applyCardsPane() { |
||||
CardLayout cl = (CardLayout) (conditionCardPane.getLayout()); |
||||
if (this.commonRadioButton.isSelected()) { |
||||
this.setBorder(GUICoreUtils.createTitledBorder(Inter.getLocText("FR-Designer_LiteCondition_Common_Condition"), null)); |
||||
cl.show(conditionCardPane, "DEFAULT"); |
||||
} else { |
||||
this.setBorder(GUICoreUtils.createTitledBorder(Inter.getLocText("FR-Designer_LiteCondition_Formula_Condition"), null)); |
||||
cl.show(conditionCardPane, "FORMULA"); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* peter:检查Button是否可以编辑. |
||||
*/ |
||||
private void checkButtonEnabledForList() { |
||||
modifyButton.setEnabled(false); |
||||
removeButton.setEnabled(false); |
||||
this.moveUpButton.setEnabled(false); |
||||
this.moveDownButton.setEnabled(false); |
||||
this.bracketButton.setEnabled(false); |
||||
this.unBracketButton.setEnabled(false); |
||||
|
||||
TreePath selectedTreePath = conditionsTree.getSelectionPath(); |
||||
if (selectedTreePath != null) { |
||||
modifyButton.setEnabled(true); |
||||
removeButton.setEnabled(true); |
||||
|
||||
// peter:根据选中的节点的是否是第一个或者最后一个.
|
||||
ExpandMutableTreeNode selectedTreeNode = (ExpandMutableTreeNode) selectedTreePath.getLastPathComponent(); |
||||
DefaultMutableTreeNode parentTreeNode = (DefaultMutableTreeNode) selectedTreeNode.getParent(); |
||||
if (parentTreeNode.getChildBefore(selectedTreeNode) != null) { |
||||
moveUpButton.setEnabled(true); |
||||
} |
||||
if (parentTreeNode.getChildAfter(selectedTreeNode) != null) { |
||||
moveDownButton.setEnabled(true); |
||||
} |
||||
|
||||
// peter: 连续选中了超过两个条件,同时没有选中所有的节点.
|
||||
int selectionCount = conditionsTree.getSelectionCount(); |
||||
if (selectionCount > 1 && parentTreeNode.getChildCount() > selectionCount) { |
||||
this.bracketButton.setEnabled(true); |
||||
} |
||||
|
||||
// peter:选中的节点必须是ListCondition,才可以删除括号
|
||||
JoinCondition jonCondition = (JoinCondition) selectedTreeNode.getUserObject(); |
||||
Condition liteCondtion = jonCondition.getCondition(); |
||||
if (liteCondtion instanceof ListCondition) { |
||||
this.unBracketButton.setEnabled(true); |
||||
} |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 扩展事件. |
||||
*/ |
||||
TreeExpansionListener treeExpansionListener = new TreeExpansionListener() { |
||||
|
||||
@Override |
||||
public void treeExpanded(TreeExpansionEvent event) { |
||||
TreePath selectedTreePath = event.getPath(); |
||||
if (selectedTreePath == null) { |
||||
return; |
||||
} |
||||
|
||||
ExpandMutableTreeNode selectedTreeNode = (ExpandMutableTreeNode) selectedTreePath.getLastPathComponent(); |
||||
selectedTreeNode.setExpanded(true); |
||||
} |
||||
|
||||
@Override |
||||
public void treeCollapsed(TreeExpansionEvent event) { |
||||
TreePath selectedTreePath = event.getPath(); |
||||
if (selectedTreePath == null) { |
||||
return; |
||||
} |
||||
|
||||
ExpandMutableTreeNode selectedTreeNode = (ExpandMutableTreeNode) selectedTreePath.getLastPathComponent(); |
||||
selectedTreeNode.setExpanded(false); |
||||
} |
||||
}; |
||||
|
||||
private ExpandMutableTreeNode getParentTreeNode() { |
||||
DefaultTreeModel defaultTreeModel = (DefaultTreeModel) conditionsTree.getModel(); |
||||
TreePath selectedTreePath = conditionsTree.getSelectionPath(); |
||||
// peter:如果没有选择的节点,直接添加到根节点.
|
||||
ExpandMutableTreeNode parentTreeNode; |
||||
if (selectedTreePath == null) { |
||||
parentTreeNode = (ExpandMutableTreeNode) defaultTreeModel.getRoot(); |
||||
} else { |
||||
parentTreeNode = (ExpandMutableTreeNode) ((ExpandMutableTreeNode) selectedTreePath.getLastPathComponent()).getParent(); |
||||
} |
||||
// peter:如果没有选中的节点,直接返回.
|
||||
return parentTreeNode; |
||||
} |
||||
|
||||
private boolean isExistedInParentTreeNode(ExpandMutableTreeNode parentTreeNode, JoinCondition newJoinCondition) { |
||||
|
||||
if (parentTreeNode == null) { |
||||
return false; |
||||
} |
||||
JoinCondition parentJoinCondition = (JoinCondition) parentTreeNode.getUserObject(); |
||||
Condition parentLiteCondition = parentJoinCondition.getCondition(); |
||||
if (parentLiteCondition instanceof ListCondition) { |
||||
// peter:在添加UserObject的节点.
|
||||
|
||||
for (int i = 0; i < parentTreeNode.getChildCount(); i++) { |
||||
ExpandMutableTreeNode tempTreeNode = (ExpandMutableTreeNode) parentTreeNode.getChildAt(i); |
||||
Object tempObject = tempTreeNode.getUserObject(); |
||||
if (tempObject instanceof JoinCondition) { |
||||
JoinCondition tempJoinCondition = (JoinCondition) tempObject; |
||||
if (ComparatorUtils.equals(tempJoinCondition, newJoinCondition)) { |
||||
return true; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
return false; |
||||
} |
||||
|
||||
private DefaultTreeCellRenderer conditionsTreeCellRenderer = new DefaultTreeCellRenderer() { |
||||
|
||||
@Override |
||||
public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, |
||||
boolean hasFocus) { |
||||
super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus); |
||||
|
||||
DefaultMutableTreeNode currentTreeNode = (DefaultMutableTreeNode) value; |
||||
adjustParentListCondition(currentTreeNode); |
||||
DefaultMutableTreeNode parentTreeNode = (DefaultMutableTreeNode) currentTreeNode.getParent(); |
||||
|
||||
this.setIcon(null); |
||||
JoinCondition joinCondition = (JoinCondition) currentTreeNode.getUserObject(); |
||||
StringBuilder sBuf = new StringBuilder(); |
||||
|
||||
Condition liteCondition = joinCondition.getCondition(); |
||||
if (parentTreeNode != null && parentTreeNode.getFirstChild() != currentTreeNode) { |
||||
if (joinCondition.getJoin() == DataConstants.AND) { |
||||
sBuf.append("and "); |
||||
} else { |
||||
sBuf.append("or "); |
||||
} |
||||
} |
||||
|
||||
if (liteCondition != null) { |
||||
// TODO alex:这里得到的liteCondition为什么会是null呢?
|
||||
sBuf.append(liteCondition.toString()); |
||||
} |
||||
this.setText(sBuf.toString()); |
||||
|
||||
return this; |
||||
} |
||||
}; |
||||
|
||||
// peter:根据孩子几点,调整当前节点的ListCondition的值.
|
||||
protected void adjustParentListCondition(DefaultMutableTreeNode currentTreeNode) { |
||||
DefaultMutableTreeNode parentTreeNode = (DefaultMutableTreeNode) currentTreeNode.getParent(); |
||||
|
||||
Object userObj = currentTreeNode.getUserObject(); |
||||
if (userObj instanceof JoinCondition) { |
||||
StringBuilder sBuf = new StringBuilder(); |
||||
|
||||
JoinCondition joinCondition = (JoinCondition) userObj; |
||||
Condition liteCondition = joinCondition.getCondition(); |
||||
if (parentTreeNode != null && parentTreeNode.getFirstChild() != currentTreeNode) { |
||||
if (joinCondition.getJoin() == DataConstants.AND) { |
||||
sBuf.append("and "); |
||||
} else { |
||||
sBuf.append("or "); |
||||
} |
||||
} |
||||
|
||||
// peter:这个地方动态产生ListCondition,因为ListCondition的节点会变化的,
|
||||
// 父亲节点的ListCondition这个UserObject需要跟着变化.
|
||||
if (liteCondition instanceof ListCondition) { |
||||
ListCondition listCondition = (ListCondition) liteCondition; |
||||
listCondition.clearJoinConditions(); |
||||
|
||||
// peter:动态添加孩子节点
|
||||
int childCount = currentTreeNode.getChildCount(); |
||||
for (int i = 0; i < childCount; i++) { |
||||
Object tmpUserObject = ((DefaultMutableTreeNode) currentTreeNode.getChildAt(i)).getUserObject(); |
||||
if (tmpUserObject instanceof JoinCondition) { |
||||
listCondition.addJoinCondition((JoinCondition) tmpUserObject); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* Sets whether or not this component is enabled. |
||||
*/ |
||||
@Override |
||||
public void setEnabled(boolean enabled) { |
||||
super.setEnabled(enabled); |
||||
|
||||
// checkenabled.
|
||||
checkButtonEnabledForList(); |
||||
} |
||||
|
||||
/** |
||||
* Populate. |
||||
* |
||||
* @param liteCondition lite condition. |
||||
*/ |
||||
@Override |
||||
public void populateBean(Condition liteCondition) { |
||||
if(liteCondition == null){ |
||||
return; |
||||
} |
||||
// peter: 先删除所有的节点
|
||||
DefaultTreeModel defaultTreeModel = (DefaultTreeModel) this.conditionsTree.getModel(); |
||||
ExpandMutableTreeNode rootTreeNode = (ExpandMutableTreeNode) defaultTreeModel.getRoot(); |
||||
rootTreeNode.setUserObject(new JoinCondition(DataConstants.AND, new ListCondition())); |
||||
rootTreeNode.removeAllChildren(); |
||||
|
||||
// peter:需要构建成ListCondition,加入到里面.
|
||||
if (liteCondition instanceof ListCondition) { |
||||
ListCondition listCondition = (ListCondition) liteCondition; |
||||
|
||||
int joinConditionCount = listCondition.getJoinConditionCount(); |
||||
if (joinConditionCount == 0) { |
||||
commonRadioButton.setSelected(true); |
||||
applyCardsPane(); |
||||
|
||||
} |
||||
for (int i = 0; i < joinConditionCount; i++) { |
||||
addLiteConditionToListCondition(rootTreeNode, listCondition.getJoinCondition(i)); |
||||
} |
||||
} else if (needDoWithCondition(liteCondition)) { |
||||
// peter:直接添加
|
||||
ExpandMutableTreeNode newTreeNode = new ExpandMutableTreeNode(new JoinCondition(DataConstants.AND, liteCondition)); |
||||
rootTreeNode.add(newTreeNode); |
||||
} |
||||
|
||||
// peter:需要reload
|
||||
defaultTreeModel.reload(rootTreeNode); |
||||
rootTreeNode.expandCurrentTreeNode(conditionsTree); |
||||
// marks:默认的选择第一行
|
||||
if (conditionsTree.getRowCount() > 0) { |
||||
conditionsTree.setSelectionRow(0); |
||||
} |
||||
this.checkButtonEnabledForList(); |
||||
if (liteCondition == null) { |
||||
try { |
||||
defaultConditionPane.checkValid(); |
||||
} catch (Exception e) {//not need
|
||||
} |
||||
} |
||||
} |
||||
|
||||
protected boolean needDoWithCondition(Condition liteCondition) { |
||||
return true; |
||||
} |
||||
|
||||
// peter:运用递归方式,构建初始的节点
|
||||
private void addLiteConditionToListCondition(ExpandMutableTreeNode parentTreeNode, JoinCondition joinCondition) { |
||||
ExpandMutableTreeNode newTreeNode = new ExpandMutableTreeNode(joinCondition); |
||||
parentTreeNode.add(newTreeNode); |
||||
|
||||
// peter:继续添加.
|
||||
Condition liteCondition = joinCondition.getCondition(); |
||||
if (liteCondition instanceof ListCondition) { |
||||
ListCondition listCondition = (ListCondition) liteCondition; |
||||
|
||||
int joinConditionCount = listCondition.getJoinConditionCount(); |
||||
for (int i = 0; i < joinConditionCount; i++) { |
||||
addLiteConditionToListCondition(newTreeNode, listCondition.getJoinCondition(i)); |
||||
} |
||||
} |
||||
} |
||||
|
||||
|
||||
/** |
||||
* Update. |
||||
* |
||||
* @return the new lite condition. |
||||
*/ |
||||
@Override |
||||
public Condition updateBean() { |
||||
// Samuel:先按modifybutton
|
||||
modify(); |
||||
// peter: 先删除所有的节点
|
||||
DefaultTreeModel defaultTreeModel = (DefaultTreeModel) this.conditionsTree.getModel(); |
||||
ExpandMutableTreeNode rootTreeNode = (ExpandMutableTreeNode) defaultTreeModel.getRoot(); |
||||
|
||||
int childCount = rootTreeNode.getChildCount(); |
||||
// peter: 如果只有一个孩子节点, 返回空的 ListCondition
|
||||
if (childCount == 0) { |
||||
return new ListCondition(); |
||||
} // peter: 如果roottreeNode只有一个孩子节点.
|
||||
else if (childCount == 1) { |
||||
JoinCondition joinCondition = (JoinCondition) ((ExpandMutableTreeNode) rootTreeNode.getChildAt(0)).getUserObject(); |
||||
return joinCondition.getCondition(); |
||||
} // peter: 有好多的孩子节点.
|
||||
else { |
||||
// peter:深度遍历所有的孩子节点
|
||||
Enumeration depthEnumeration = rootTreeNode.depthFirstEnumeration(); |
||||
while (depthEnumeration.hasMoreElements()) { |
||||
this.adjustParentListCondition((ExpandMutableTreeNode) depthEnumeration.nextElement()); |
||||
} |
||||
|
||||
JoinCondition joinCondition = (JoinCondition) rootTreeNode.getUserObject(); |
||||
Condition newCondition = joinCondition.getCondition(); |
||||
//clone(),防止多个条件分组使用同一个condition对象
|
||||
try{ |
||||
newCondition = (Condition)joinCondition.getCondition().clone(); |
||||
}catch (CloneNotSupportedException e){ |
||||
FRLogger.getLogger().error(e.getMessage()); |
||||
} |
||||
return newCondition; |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,103 @@
|
||||
package com.fr.design.condition; |
||||
|
||||
import java.awt.BorderLayout; |
||||
import java.awt.Component; |
||||
|
||||
import javax.swing.DefaultComboBoxModel; |
||||
import com.fr.design.gui.ilable.UILabel; |
||||
import javax.swing.JList; |
||||
import javax.swing.JPanel; |
||||
|
||||
import com.fr.data.condition.ObjectCondition; |
||||
import com.fr.data.core.Compare; |
||||
import com.fr.design.beans.BasicBeanPane; |
||||
import com.fr.design.formula.VariableResolver; |
||||
import com.fr.design.gui.icombobox.UIComboBox; |
||||
import com.fr.design.gui.icombobox.UIComboBoxRenderer; |
||||
import com.fr.design.layout.FRGUIPaneFactory; |
||||
import com.fr.design.layout.TableLayout; |
||||
import com.fr.design.layout.TableLayoutHelper; |
||||
import com.fr.design.editor.ValueEditorPane; |
||||
import com.fr.design.editor.ValueEditorPaneFactory; |
||||
import com.fr.general.Inter; |
||||
|
||||
public class ObjectLiteConditionPane extends LiteConditionPane<ObjectCondition> { |
||||
|
||||
@Override |
||||
protected BasicBeanPane<ObjectCondition> createUnFormulaConditionPane() { |
||||
return new ObjectConditionPane(); |
||||
} |
||||
|
||||
@Override |
||||
protected VariableResolver variableResolver4FormulaPane() { |
||||
return VariableResolver.DEFAULT; |
||||
} |
||||
|
||||
private class ObjectConditionPane extends BasicBeanPane<ObjectCondition> { |
||||
|
||||
private UIComboBox conditionOPComboBox; |
||||
private ValueEditorPane conditionValuePane; |
||||
|
||||
ObjectConditionPane() { |
||||
this.initComponents(); |
||||
} |
||||
|
||||
protected void initComponents() { |
||||
this.setLayout(FRGUIPaneFactory.createBorderLayout()); |
||||
// condition operation
|
||||
conditionOPComboBox = new UIComboBox(); |
||||
DefaultComboBoxModel opComboBoxModel = (DefaultComboBoxModel) conditionOPComboBox.getModel(); |
||||
int[] allOperators = Compare.getAllOperators(); |
||||
for (int i = 0; i < allOperators.length; i++) { |
||||
opComboBoxModel.addElement(new Integer(allOperators[i])); |
||||
} |
||||
// conditionOPComboBox.setPreferredSize(new Dimension(120, 25));
|
||||
|
||||
this.conditionOPComboBox.setRenderer(new UIComboBoxRenderer() { |
||||
|
||||
@Override |
||||
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { |
||||
super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); |
||||
if (value instanceof Integer) { |
||||
this.setText(Compare.operator2String(((Integer) value).intValue())); |
||||
} |
||||
|
||||
return this; |
||||
} |
||||
}); |
||||
|
||||
conditionValuePane = ValueEditorPaneFactory.createAllValueEditorPane(); |
||||
|
||||
Component[][] components = { { new UILabel(Inter.getLocText("ConditionB-Operator") + ":"), new UILabel() }, |
||||
{ conditionOPComboBox, conditionValuePane } }; |
||||
|
||||
double p = TableLayout.PREFERRED; |
||||
double rowSize[] = { p, p }; |
||||
double columnSize[] = { p, TableLayout.FILL }; |
||||
|
||||
JPanel leftPanel = TableLayoutHelper.createTableLayoutPane(components, rowSize, columnSize); |
||||
this.add(leftPanel, BorderLayout.CENTER); |
||||
} |
||||
|
||||
@Override |
||||
public ObjectCondition updateBean() { |
||||
Object value = conditionValuePane.update(); |
||||
|
||||
return new ObjectCondition(new Compare(((Integer) conditionOPComboBox.getSelectedItem()).intValue(), value)); |
||||
} |
||||
|
||||
@Override |
||||
public void populateBean(ObjectCondition condition) { |
||||
|
||||
Compare compare = condition.getCompare(); |
||||
conditionOPComboBox.setSelectedItem(new Integer(compare.getOp())); |
||||
|
||||
this.conditionValuePane.populate(compare.getValue()); |
||||
} |
||||
|
||||
@Override |
||||
protected String title4PopupWindow() { |
||||
return " "; |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,54 @@
|
||||
package com.fr.design.condition; |
||||
|
||||
|
||||
import java.awt.Insets; |
||||
import java.awt.event.ActionEvent; |
||||
import java.awt.event.ActionListener; |
||||
|
||||
import com.fr.base.BaseUtils; |
||||
import com.fr.design.gui.ibutton.UIButton; |
||||
import com.fr.design.layout.FRGUIPaneFactory; |
||||
import com.fr.design.dialog.BasicPane; |
||||
import com.fr.general.Inter; |
||||
|
||||
public abstract class SingleConditionPane<T> extends BasicPane { |
||||
private static final long serialVersionUID = -4274960170813368817L; |
||||
|
||||
protected UIButton cancel; |
||||
|
||||
public SingleConditionPane(){ |
||||
this(true); |
||||
} |
||||
|
||||
public SingleConditionPane(boolean isRemove) { |
||||
this.setLayout(FRGUIPaneFactory.createLabelFlowLayout()); |
||||
if (isRemove) { |
||||
|
||||
if(cancel == null) { |
||||
cancel = new UIButton(BaseUtils.readIcon("/com/fr/base/images/cell/control/remove.png")); |
||||
cancel.setToolTipText(Inter.getLocText("FR-Action_Remove")); |
||||
cancel.addActionListener(cancleListener); |
||||
cancel.setMargin(new Insets(0, 0, 0, 0)); |
||||
} |
||||
|
||||
this.add(cancel); |
||||
} |
||||
} |
||||
|
||||
ActionListener cancleListener = new ActionListener() { |
||||
public void actionPerformed(ActionEvent e) { |
||||
doCancel(); |
||||
} |
||||
}; |
||||
|
||||
/** |
||||
* 取消 |
||||
*/ |
||||
public abstract void doCancel(); |
||||
|
||||
public abstract void setDefault(); |
||||
|
||||
public abstract void populate(T condition); |
||||
|
||||
public abstract T update(); |
||||
} |
@ -0,0 +1,206 @@
|
||||
package com.fr.design.constants; |
||||
|
||||
/** |
||||
* Created with IntelliJ IDEA. |
||||
* User: richie |
||||
* Date: 13-11-13 |
||||
* Time: 下午6:50 |
||||
*/ |
||||
public class KeyWords { |
||||
private KeyWords() { |
||||
|
||||
} |
||||
|
||||
|
||||
/* parameterEl :object |
||||
返回对象参数界面 |
||||
例如: |
||||
contentPane.parameterEl |
||||
currentPageIndex |
||||
curLGP |
||||
reportTotalPage |
||||
zoom |
||||
*/ |
||||
public static final String[] JAVASCRIPT = new String[]{ |
||||
// normal js
|
||||
"Array", |
||||
"attr", |
||||
"break", |
||||
"case", |
||||
"catch", |
||||
"children", |
||||
"close", |
||||
"concat", |
||||
"continue", |
||||
"default", |
||||
"delete", |
||||
"do", |
||||
"document", |
||||
"else", |
||||
"event", |
||||
"finally", |
||||
"fireEvent", |
||||
"for", |
||||
"function", |
||||
"getElementById", |
||||
"getText", |
||||
"html", |
||||
"if", |
||||
"in", |
||||
"instanceof", |
||||
"length", |
||||
"location", |
||||
"new", |
||||
"open", |
||||
"parent", |
||||
"parseFloat", |
||||
"parseInt", |
||||
"replace", |
||||
"return", |
||||
"search", |
||||
"setInterval", |
||||
"split", |
||||
"substr", |
||||
"switch", |
||||
"this", |
||||
"throw", |
||||
"tostring", |
||||
"try", |
||||
"typeof", |
||||
"var", |
||||
"void", |
||||
"while", |
||||
"window", |
||||
|
||||
// contentPane
|
||||
"cellselect", |
||||
"contentPane", |
||||
"curLGP", |
||||
"currentPageIndex", |
||||
"lgps", |
||||
"options", |
||||
"parameterEl", |
||||
"reportTotalPage", |
||||
"selectedIndex", //当前选中的sheet号
|
||||
"zoom", |
||||
|
||||
"appendReportRC()", |
||||
"appletPrint()", |
||||
"deleteReportRC()", |
||||
"deleteRows()", |
||||
"emailReport()", |
||||
"exportReportToExcel(mode)", |
||||
"exportReportToImage(pattern)", |
||||
"exportReportToPDF(ori)", |
||||
"exportReportToWord()", |
||||
"flashPrint()", |
||||
"getCellValue(reportIndex, columnIndex, rowIndex)", |
||||
"getWidgetByCell(cell)", |
||||
"getWidgetByName(name)", |
||||
"getWidgetsByName(name)", |
||||
"gotoFirstPage()", |
||||
"gotoLastPage()", |
||||
"gotoNextPage()", |
||||
"gotoPage(n)", |
||||
"gotoPreviousPage()", |
||||
"importExcelData()", |
||||
"makeHighlight(color, op)", |
||||
"on()", |
||||
"pageSetup()", |
||||
"parameterCommit()", |
||||
"pdfPrint()", |
||||
"printPreview()", |
||||
"scale()", |
||||
"setCellValue([reportIndex], columnIndex, rowIndex, cv)", |
||||
"stopEditing()", |
||||
"verifyAndWriteReport(true)", //空或false为提交所有sheet,true为提交当前sheet
|
||||
"verifyReport()", |
||||
"writeReportIgnoreVerify(true)", |
||||
"writeReport(index)", |
||||
|
||||
// curLGP
|
||||
"currentTDCell", |
||||
"dirtyCell", |
||||
"write", |
||||
"form", |
||||
|
||||
"cut2ColumnRowString(td)", |
||||
"displayTDCell(tdCell, cv, presentValue)", |
||||
"getColumnWidth(i)", |
||||
"getRowHeight(i)", |
||||
"getTDCell()", |
||||
"getTDCol(td)", |
||||
"getTDRow(td)", |
||||
"getWidgetCell(widget)", |
||||
"resetCellValue(widget)", |
||||
"stopCellEditing()", |
||||
|
||||
// parameterEl
|
||||
//getWidgetByName
|
||||
"name_widgets", |
||||
|
||||
// widget
|
||||
//"fireEvent",
|
||||
"getValue()", |
||||
"isEnabled()", |
||||
"isVisible()", |
||||
"reset()", |
||||
"setValue(value)", |
||||
"setEnable()", |
||||
"setVisible()", |
||||
|
||||
// other
|
||||
"${servletURL}?reportlet=" |
||||
|
||||
}; |
||||
|
||||
public static final String[][] JAVASCRIPT_SHORT = new String[][]{ |
||||
/* |
||||
* FR.Msg |
||||
*/ |
||||
new String[]{"alert", "FR.Msg.alert(title, message, callback)"}, |
||||
new String[]{"confirm", "FR.Msg.confirm(title, message, callback)"}, |
||||
new String[]{"prompt", "FR.Msg.prompt(title, message, value, callback)"}, |
||||
new String[]{"toast", "FR.Msg.toast(message)"}, |
||||
|
||||
/* |
||||
* FR |
||||
*/ |
||||
new String[]{"ajax","FR.ajax(o)"}, |
||||
new String[]{"cellStr2ColumnRow","FR.cellStr2ColumnRow(name)"}, |
||||
new String[]{"chart_Change_Parameter","FR.Chart.WebUtils.chart_Change_Parameter(pos, id, para)"}, |
||||
new String[]{"chart_Refresh()","FR.Chart.WebUtils.chart_Refresh(str)"}, |
||||
new String[]{"cjkDecode","FR.cjkDecode(str)"}, |
||||
new String[]{"cjkEncode","FR.cjkEncode(str)"}, |
||||
new String[]{"closeDialog","FR.closeDialog()"}, |
||||
new String[]{"columnRow2CellStr","FR.columnRow2CellStr(cr)"}, |
||||
new String[]{"destroyDialog","FR.destroyDialog()"}, |
||||
new String[]{"digit2Letter","FR.digit2Letter(k)"}, |
||||
new String[]{"doAppletPrint", "FR.doAppletPrint(sessionID)"}, |
||||
new String[]{"doFlashPrint", "FR.doFlashPrint(sessionID, currentPageIndex)"}, |
||||
new String[]{"doHyperlinkByGet","FR.doHyperlinkByGet(url, para, target, feature)"}, |
||||
new String[]{"doHyperlinkByPost","FR.doHyperlinkByPost(url, para, target, feature)"}, |
||||
new String[]{"doHyperlinkByGet4Reportlet","FR.doHyperlinkByGet4Reportlet(url,para,target,featrue)"}, |
||||
new String[]{"doPDFPrint", "FR.doPDFPrint(sessionID, popupSetup)"}, |
||||
new String[]{"doURLAppletPrint","FR.doURLAppletPrint(printurl,isPopUp,config)"}, |
||||
new String[]{"doURLFlashPrint","FR.doURLFlashPrint(printurl,isPopUp,config)"}, |
||||
new String[]{"doURLPDFPrint","FR.doURLPDFPrint(printurl,isPopUp,config)"}, |
||||
new String[]{"htmlDecode","FR.htmlDecode(text)"}, |
||||
new String[]{"htmlEncode","FR.htmlEncode(text)"}, |
||||
new String[]{"id2ColumnRow","FR.id2ColumnRow(id)"}, |
||||
new String[]{"id2ColumnRowStr","FR.id2ColumnRowStr(id)"}, |
||||
new String[]{"id2Location","FR.id2Location(id)"}, |
||||
new String[]{"isEmptyArray","FR.isEmptyArray(array)"}, |
||||
new String[]{"letter2Digit","FR.letter2Digit(abc)"}, |
||||
new String[]{"showDialog","FR.showDialog(title, width, height, innerContent)"}, |
||||
new String[]{"showIframeDialog","FR.showIframeDialog(o)"}, |
||||
new String[]{"showHyperlinkDialog","FR.showHyperlinkDialog(url,featur)"}, |
||||
|
||||
/* |
||||
* FS |
||||
*/ |
||||
new String[]{"signOut","FS.Trans.signOut()"}, |
||||
new String[]{"closeActiveTab","FS.tabPane.closeActiveTab()"}, |
||||
new String[]{"addItem","FS.tabPane.addItem(o)"} |
||||
}; |
||||
} |
@ -0,0 +1 @@
|
||||
package com.fr.design.constants;
/**
* Created by IntelliJ IDEA.
* Author : Richer
* Version: 7.0.3
* Date: 12-12-27
* Time: 下午2:28
* 所有的间隙常数都从这里取,注意写上PMD检测规则来检查
*/
public class LayoutConstants {
private LayoutConstants() {
}
/**
* 水平间隙
*/
public static final int HGAP_SMALL = 1;
/**
* 水平间隙
*/
public static final int HGAP_LARGE = 4;
/**
* 垂直间隙
*/
public static final int VGAP_SMALL = 4;
/**
* 垂直间隙
*/
public static final int VGAP_MEDIUM = 6;
/**
* 垂直间隙
*/
public static final int VGAP_LARGE = 10;
/**
* 图表属性表中二级菜单距离右边框的距离
*/
public static final int CHART_ATTR_TOMARGIN = 46;
} |
@ -0,0 +1,172 @@
|
||||
/* |
||||
* Copyright(c) 2001-2010, FineReport Inc, All Rights Reserved. |
||||
*/ |
||||
package com.fr.design.constants; |
||||
|
||||
import com.fr.base.BaseUtils; |
||||
import com.fr.general.Inter; |
||||
import com.fr.stable.Constants; |
||||
|
||||
import javax.swing.*; |
||||
import java.awt.*; |
||||
import java.awt.image.BufferedImage; |
||||
|
||||
/** |
||||
* This class defines the constants used in the designer. |
||||
*/ |
||||
public interface UIConstants { |
||||
|
||||
|
||||
public static final Icon BLACK_ICON = BaseUtils.readIcon("/com/fr/base/images/cell/blank.gif"); |
||||
|
||||
|
||||
public static final int SIZE = 17; |
||||
|
||||
/** |
||||
* Cell default cursor. |
||||
*/ |
||||
public static final Cursor CELL_DEFAULT_CURSOR = Toolkit.getDefaultToolkit().createCustomCursor( |
||||
BaseUtils.readImage("/com/fr/base/images/cell/cursor/cell_default.png"), |
||||
new Point(16, 16), "CellDefaultCursor"); |
||||
public static final Cursor DRAW_CURSOR = Toolkit.getDefaultToolkit().createCustomCursor( |
||||
BaseUtils.readImage("/com/fr/base/images/cell/cursor/cursor_draw.png"), |
||||
new Point(16, 16), "DrawCursor"); |
||||
|
||||
|
||||
public static final Cursor FORMAT_BRUSH_CURSOR = Toolkit.getDefaultToolkit().createCustomCursor( |
||||
BaseUtils.readImage("/com/fr/base/images/cell/cursor/brush_cursor0.png"), |
||||
new Point(16, 16), "formatBrushCursor"); |
||||
|
||||
/** |
||||
* Border style array. |
||||
*/ |
||||
public final static int[] BORDER_LINE_STYLE_ARRAY = new int[]{ |
||||
Constants.LINE_THIN, //Thin border.
|
||||
Constants.LINE_MEDIUM, //Medium border
|
||||
Constants.LINE_DASH, //dash border
|
||||
Constants.LINE_HAIR, //hair-line border
|
||||
Constants.LINE_HAIR2, //hair-line border
|
||||
Constants.LINE_THICK, //Thick border
|
||||
Constants.LINE_DOUBLE, //double-line border
|
||||
Constants.LINE_DOT, //dot border
|
||||
Constants.LINE_MEDIUM_DASH, //Medium dashed border
|
||||
Constants.LINE_DASH_DOT, //dash-dot border
|
||||
Constants.LINE_MEDIUM_DASH_DOT, //medium dash-dot border
|
||||
Constants.LINE_DASH_DOT_DOT, //dash-dot-dot border
|
||||
Constants.LINE_MEDIUM_DASH_DOT_DOT, //medium dash-dot-dot border
|
||||
Constants.LINE_SLANTED_DASH_DOT, //slanted dash-dot border
|
||||
}; |
||||
public static final Color LINE_COLOR = new Color(153, 153, 153); |
||||
public static final Color FONT_COLOR = new Color(51, 51, 51); |
||||
public static final Color LIGHT_BLUE = new Color(182, 217, 253); |
||||
public static final Color SKY_BLUE = new Color(164, 192, 220); |
||||
public static final Color OCEAN_BLUE = new Color(141, 179, 217); |
||||
public static final Color DARK_BLUE = new Color(0, 88, 144); |
||||
public static final Color NORMAL_BACKGROUND = new Color(240, 240, 240); |
||||
public static final Color SHADOW_GREY = new Color(0xe2e2e2); |
||||
public static final Color SHADOW_CENTER = new Color(200, 200, 200); |
||||
public static final Color SHADOW_PURPLE = new Color(255, 0, 255); |
||||
public static final Color FLESH_BLUE = new Color(168, 180, 202); |
||||
public static final Color HOVER_BLUE = new Color(0xd2d2d2); |
||||
public static final Color DOTTED_LINE_COLOR = new Color(35, 108, 184); |
||||
public static final Color AUTHORITY_COLOR = new Color(88, 125, 153); |
||||
public static final Color AUTHORITY_BLUE = new Color(0xe2e2e2); |
||||
public static final Color AUTHORITY_DARK_BLUE = new Color(136, 164, 186); |
||||
public static final Color AUTHORITY_PRESS_BLUE = new Color(131, 159, 181); |
||||
public static final Color AUTHORITY_LINE_COLOR = new Color(0, 124, 229); |
||||
public static final Color AUTHORITY_SHEET_DARK = new Color(86, 120, 143); |
||||
public static final Color AUTHORITY_SHEET_LIGHT = new Color(156, 204, 238); |
||||
public static final Color AUTHORITY_SHEET_UNSELECTED = new Color(146, 192, 225); |
||||
public static final Color ATTRIBUTE_PRESS = new Color(0xdfecfc); |
||||
public static final Color ATTRIBUTE_NORMAL = new Color(0xe2e2e2); |
||||
public static final Color ATTRIBUTE_HOVER = new Color(0xd3d3d3); |
||||
public static final Color CHECKBOX_HOVER_SELECTED = new Color(0x3394f0); |
||||
public static final Color TEXT_FILED_BORDER_SELECTED = new Color(0x3384f0); |
||||
public static final Color SHEET_NORMAL = new Color(0xc8c8ca); |
||||
public static final Color SELECTED_BACKGROUND = new Color(0xdeedfe); |
||||
public static final Color SELECTED_BORDER_LINE_COLOR = new Color(0x3384f0); |
||||
public static final Color DEFAULT_BG_RULER = new Color(0xf7f7f7); |
||||
public static final Color RULER_LINE_COLOR = new Color(0xababab); |
||||
public static final Color RULER_SCALE_COLOR = new Color(0x4e504f); |
||||
|
||||
|
||||
|
||||
public static final BufferedImage DRAG_BAR = BaseUtils.readImage("com/fr/design/images/control/bar.png"); |
||||
public static final BufferedImage DRAG_BAR_RIGHT = BaseUtils.readImage("com/fr/design/images/control/barm.png"); |
||||
public static final BufferedImage DRAG_BAR_LEFT = BaseUtils.readImage("com/fr/design/images/control/barl.png"); |
||||
public static final BufferedImage DRAG_UP_NORMAL = BaseUtils.readImage("com/fr/design/images/control/upnor.png"); |
||||
public static final BufferedImage DRAG_UP_PRESS = BaseUtils.readImage("com/fr/design/images/control/uppre.png"); |
||||
public static final BufferedImage DRAG_DOWN_NORMAL = BaseUtils.readImage("com/fr/design/images/control/downnor.png"); |
||||
public static final BufferedImage DRAG_DOWN_PRESS = BaseUtils.readImage("com/fr/design/images/control/downpre.png"); |
||||
public static final BufferedImage DRAG_RIGHT_NORMAL = BaseUtils.readImage("com/fr/design/images/control/rightnor.png"); |
||||
public static final BufferedImage DRAG_RIGHT_PRESS = BaseUtils.readImage("com/fr/design/images/control/rightpre.png"); |
||||
public static final BufferedImage DRAG_LEFT_NORMAL = BaseUtils.readImage("com/fr/design/images/control/leftnor.png"); |
||||
public static final BufferedImage DRAG_LEFT_PRESS = BaseUtils.readImage("com/fr/design/images/control/leftpre.png"); |
||||
public static final BufferedImage DRAG_DOT = BaseUtils.readImage("com/fr/design/images/control/dot.png"); |
||||
public static final BufferedImage DRAG_DOT_VERTICAL = BaseUtils.readImage("com/fr/design/images/control/dotv.png"); |
||||
public static final int MODEL_NORMAL = 0; |
||||
public static final int MODEL_PRESS = 1; |
||||
public static final Icon ARROW_DOWN_ICON = BaseUtils.readIcon("com/fr/design/images/buttonicon/arrowdown.png"); |
||||
public static final Icon ARROW_UP_ICON = BaseUtils.readIcon("com/fr/design/images/buttonicon/arrowup.png"); |
||||
public static final Icon YES_ICON = BaseUtils.readIcon("com/fr/design/images/buttonicon/yes.png"); |
||||
public static final Icon CHOOSEN_ICON = BaseUtils.readIcon("com/fr/design/images/buttonicon/select_item.png"); |
||||
public static final Icon PRE_WIDGET_ICON = BaseUtils.readIcon("com/fr/design/images/buttonicon/prewidget.png"); |
||||
public static final Icon EDIT_NORMAL_ICON = BaseUtils.readIcon("com/fr/design/images/buttonicon/editn.png"); |
||||
public static final Icon EDIT_PRESSED_ICON = BaseUtils.readIcon("com/fr/design/images/buttonicon/editp.png"); |
||||
public static final Icon HIDE_NORMAL_ICON = BaseUtils.readIcon("com/fr/design/images/buttonicon/hiden.png"); |
||||
public static final Icon HIDE_PRESSED_ICON = BaseUtils.readIcon("com/fr/design/images/buttonicon/hidep.png"); |
||||
public static final Icon VIEW_NORMAL_ICON = BaseUtils.readIcon("com/fr/design/images/buttonicon/viewn.png"); |
||||
public static final Icon VIEW_PRESSED_ICON = BaseUtils.readIcon("com/fr/design/images/buttonicon/viewp.png"); |
||||
public static final Icon RUN_BIG_ICON = BaseUtils.readIcon("com/fr/design/images/buttonicon/run24.png"); |
||||
public static final Icon RUN_SMALL_ICON = BaseUtils.readIcon("com/fr/design/images/buttonicon/runs.png"); |
||||
public static final Icon PAGE_BIG_ICON = BaseUtils.readIcon("com/fr/design/images/buttonicon/pageb24.png"); |
||||
public static final Icon WRITE_BIG_ICON = BaseUtils.readIcon("com/fr/design/images/buttonicon/writeb24.png"); |
||||
public static final Icon ANA_BIG_ICON = BaseUtils.readIcon("com/fr/design/images/buttonicon/anab24.png"); |
||||
public static final Icon PAGE_SMALL_ICON = BaseUtils.readIcon("com/fr/design/images/buttonicon/pages.png"); |
||||
public static final Icon WRITE_SMALL_ICON = BaseUtils.readIcon("com/fr/design/images/buttonicon/writes.png"); |
||||
public static final Icon ANA_SMALL_ICON = BaseUtils.readIcon("com/fr/design/images/buttonicon/anas.png"); |
||||
public static final Icon REFRESH_ICON = BaseUtils.readIcon("com/fr/design/images/buttonicon/refresh.png"); |
||||
public static final Icon FONT_ICON = BaseUtils.readIcon("/com/fr/design/images/gui/color/foreground.png"); |
||||
public static final Icon HISTORY_ICON = BaseUtils.readIcon("com/fr/design/images/buttonicon/history.png"); |
||||
public static final Icon DELETE_ICON = BaseUtils.readIcon("com/fr/design/images/m_file/close.png"); |
||||
public static final Icon EDIT_ICON = BaseUtils.readIcon("com/fr/design/images/m_file/edit.png"); |
||||
public static final Icon SEARCH_ICON = BaseUtils.readIcon("/com/fr/design/images/data/search.png"); |
||||
public static final Icon CLEAR_ICON = BaseUtils.readIcon("/com/fr/design/images/data/source/delete.png"); |
||||
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(153, 153, 153); |
||||
public static final int ARC = 0; |
||||
public static final int LARGEARC = 0; |
||||
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 = BaseUtils.readIcon("com/fr/design/images/buttonicon/prevew_down_icon.png"); |
||||
public static final Icon CLOSE_OF_AUTHORITY = BaseUtils.readIcon("/com/fr/design/images/m_report/close.png"); |
||||
public static final Icon CLOSE_OVER_AUTHORITY = BaseUtils.readIcon("/com/fr/design/images/m_report/close_over.png"); |
||||
public static final Icon CLOSE_PRESS_AUTHORITY = BaseUtils.readIcon("/com/fr/design/images/m_report/close_press.png"); |
||||
public static final int CLOSE_AUTHORITY_HEIGHT_AND_WIDTH = 24; |
||||
|
||||
|
||||
/** |
||||
* 正在加载的界面 |
||||
*/ |
||||
public static final Object PENDING = new Object() { |
||||
|
||||
@Override |
||||
public String toString() { |
||||
return Inter.getLocText("Loading") + "..."; |
||||
} |
||||
}; |
||||
/** |
||||
* 数据库连接失败的界面 |
||||
*/ |
||||
public static final Object CONNECTION_FAILED = new Object() { |
||||
|
||||
public String toString() { |
||||
return Inter.getLocText(new String[]{"Database", "Datasource-Connection_failed"}) + "!"; |
||||
} |
||||
}; |
||||
|
||||
/** |
||||
* 自动补全的默认快捷键,一般来说是 alt + /. |
||||
*/ |
||||
public static final String DEFAULT_AUTO_COMPLETE = "alt + SLASH"; |
||||
} |
@ -0,0 +1,12 @@
|
||||
package com.fr.design.data; |
||||
|
||||
import javax.swing.*; |
||||
|
||||
/** |
||||
* Created by richie on 15/11/16. |
||||
*/ |
||||
public interface DataCreatorUI { |
||||
|
||||
JComponent toSwingComponent(); |
||||
|
||||
} |
@ -0,0 +1,468 @@
|
||||
package com.fr.design.data; |
||||
|
||||
import com.fr.base.Env; |
||||
import com.fr.base.FRContext; |
||||
import com.fr.base.StoreProcedureParameter; |
||||
import com.fr.base.TableData; |
||||
import com.fr.data.TableDataSource; |
||||
import com.fr.data.core.DataCoreXmlUtils; |
||||
import com.fr.design.data.datapane.preview.PreviewTablePane; |
||||
import com.fr.data.impl.EmbeddedTableData; |
||||
import com.fr.data.impl.storeproc.ProcedureDataModel; |
||||
import com.fr.data.impl.storeproc.StoreProcedure; |
||||
import com.fr.data.impl.storeproc.StoreProcedureConstants; |
||||
import com.fr.design.data.tabledata.wrapper.*; |
||||
import com.fr.design.DesignModelAdapter; |
||||
import com.fr.design.gui.iprogressbar.AutoProgressBar; |
||||
import com.fr.design.mainframe.DesignerContext; |
||||
import com.fr.design.parameter.ParameterInputPane; |
||||
import com.fr.design.dialog.DialogActionAdapter; |
||||
import com.fr.file.DatasourceManager; |
||||
import com.fr.file.DatasourceManagerProvider; |
||||
import com.fr.general.ComparatorUtils; |
||||
import com.fr.general.data.DataModel; |
||||
import com.fr.general.data.TableDataException; |
||||
import com.fr.script.Calculator; |
||||
import com.fr.stable.ArrayUtils; |
||||
import com.fr.stable.ParameterProvider; |
||||
import com.fr.stable.StringUtils; |
||||
import com.fr.stable.xml.XMLPrintWriter; |
||||
|
||||
import javax.swing.event.ChangeEvent; |
||||
import javax.swing.event.ChangeListener; |
||||
import java.io.ByteArrayOutputStream; |
||||
import java.text.Collator; |
||||
import java.util.*; |
||||
import java.util.Map.Entry; |
||||
|
||||
/** |
||||
* 设计器管理操作数据集的类: |
||||
* 1.对于每个TableData,会生成相应的TableDataWrapper.TableDataWrapper里面有TableData的数据列缓存 |
||||
* 2.TableDataWrapper是不支持对TableData的修改查询语句 重命名等修改删除操作 |
||||
* 如果TableData变化了,那么TableDataWrapper 也会重新生成,然后存进缓存.这样保证缓存是正确的,不会取到错误的数据列。 |
||||
* 3.对于模板数据集,关键词应该保证各个模板数据集之间不同,所以默认有个加上模板名的操作。 |
||||
* 4.个人觉得完全没有必要做成那种一个SQL语句对应一个数据列的情况,那样子太复杂了。而且每次比较关键词都很慢 |
||||
* <p/> |
||||
* !!!Notice: 除了预览数据集的操作,其他所有涉及到数据集的界面操作,都要经过这个类(因为它有数据集的缓存,不需要重复计算) |
||||
* |
||||
* @author zhou |
||||
*/ |
||||
public abstract class DesignTableDataManager { |
||||
/** |
||||
* 其实globalDsCache没有绝对的必要,只是为了操作方便。如果没有它,那么每次清空服务器数据集或者存储过程的时候,还要去遍历找一下, |
||||
* 这个操作可能比较复杂 。 从减少代码复杂度的角度看,还是很有必要的 |
||||
*/ |
||||
private static java.util.Map<String, TableDataWrapper> globalDsCache = new java.util.HashMap<String, TableDataWrapper>(); |
||||
private static java.util.Map<String, String> dsNameChangedMap = new HashMap<String, String>(); |
||||
private static List<ChangeListener> dsListeners = new ArrayList<ChangeListener>(); |
||||
|
||||
public static String NO_PARAMETER = "no_paramater_pane"; |
||||
|
||||
//用于记录是否要弹出参数框
|
||||
private static ThreadLocal<String> threadLocal = new ThreadLocal<String>(); |
||||
|
||||
|
||||
/** |
||||
* 清除全局 数据集缓存. |
||||
*/ |
||||
public static void clearGlobalDs() { |
||||
globalDsCache.clear(); |
||||
} |
||||
|
||||
/** |
||||
* 响应数据集改变. |
||||
*/ |
||||
private static void fireDsChanged() { |
||||
for (int i = 0; i < dsListeners.size(); i++) { |
||||
//增强for循环用的iterator实现的, 如果中间哪个listener修改或删除了(如ChartEditPane.dsChangeListener),
|
||||
// 由于dsListeners是arraylist, 此时会ConcurrentModifyException
|
||||
// for (ChangeListener l : dsListeners) {
|
||||
ChangeEvent e = null; |
||||
dsListeners.get(i).stateChanged(e); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 响应数据集改变 |
||||
* |
||||
* @param dsNameChangedMap 改变名字的数据集 |
||||
*/ |
||||
public static void fireDSChanged(Map<String, String> dsNameChangedMap) { |
||||
if (!dsNameChangedMap.isEmpty()) { |
||||
setDsNameChangedMap(dsNameChangedMap); |
||||
} |
||||
fireDsChanged(); |
||||
dsNameChangedMap.clear(); |
||||
} |
||||
|
||||
private static void setDsNameChangedMap(Map<String, String> map) { |
||||
Iterator iterator = map.keySet().iterator(); |
||||
while (iterator.hasNext()) { |
||||
String key = (String) iterator.next(); |
||||
dsNameChangedMap.put(key, map.get(key)); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 数据库是否改变 |
||||
* |
||||
* @param oldDsName 旧名字 |
||||
* @return 是则返回true |
||||
*/ |
||||
public static boolean isDsNameChanged(String oldDsName) { |
||||
return dsNameChangedMap.containsKey(oldDsName); |
||||
} |
||||
|
||||
public static String getChangedDsNameByOldDsName(String oldDsName) { |
||||
if (isDsNameChanged(oldDsName)) { |
||||
return dsNameChangedMap.get(oldDsName); |
||||
} else { |
||||
return StringUtils.EMPTY; |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 添加模板数据集改变 监听事件. |
||||
* |
||||
* @param l ChangeListener监听器 |
||||
*/ |
||||
public static void addDsChangeListener(ChangeListener l) { |
||||
dsListeners.add(l); |
||||
} |
||||
|
||||
/** |
||||
* 获取数据源source中dsName的所有字段 |
||||
* |
||||
* @param source 数据源 |
||||
* @param dsName 数据集名字 |
||||
* @return |
||||
*/ |
||||
public static String[] getSelectedColumnNames(TableDataSource source, String dsName) { |
||||
java.util.Map<String, TableDataWrapper> resMap = getAllEditingDataSet(source); |
||||
java.util.Map<String, TableDataWrapper> dsMap = getAllDataSetIncludingProcedure(resMap); |
||||
TableDataWrapper tabledataWrapper = dsMap.get(dsName); |
||||
return tabledataWrapper == null ? new String[0] : tabledataWrapper.calculateColumnNameList().toArray(new String[0]); |
||||
} |
||||
|
||||
/** |
||||
* august:返回当前正在编辑的具有报表数据源的模板(基本报表、聚合报表) 包括 : 图表模板 |
||||
* |
||||
* @return TableDataSource |
||||
* attention:与这个方法有关系的静态组件(不随着切换模板tab而变化的),应该重新执行该方法,再刷新组件 |
||||
*/ |
||||
public static TableDataSource getEditingTableDataSource() { |
||||
return DesignModelAdapter.getCurrentModelAdapter() == null ? null : DesignModelAdapter.getCurrentModelAdapter().getBook(); |
||||
} |
||||
|
||||
/** |
||||
* 返回当前模板(source)数据集、服务器数据集和存储过程中所有的数据集名字 |
||||
* |
||||
* @param source |
||||
* @return |
||||
*/ |
||||
public static String[] getAllDSNames(TableDataSource source) { |
||||
Iterator<Entry<String, TableDataWrapper>> entryIt = getAllEditingDataSet(source).entrySet().iterator(); |
||||
List<String> list = new ArrayList<String>(); |
||||
while (entryIt.hasNext()) { |
||||
Entry<String, TableDataWrapper> entry = entryIt.next(); |
||||
list.add(entry.getKey()); |
||||
} |
||||
return list.toArray(new String[list.size()]); |
||||
} |
||||
|
||||
/** |
||||
* 不根据过滤设置,返回当前模板数据集、服务器数据集、存储过程本身,是有顺序的 |
||||
*/ |
||||
public static java.util.Map<String, TableDataWrapper> getAllEditingDataSet(TableDataSource source) { |
||||
java.util.Map<String, TableDataWrapper> resMap = new java.util.LinkedHashMap<String, TableDataWrapper>(); |
||||
// 模板数据集
|
||||
addTemplateData(resMap, source); |
||||
|
||||
// 服务器数据集
|
||||
addServerData(resMap); |
||||
// 存储过程
|
||||
addStoreProcedureData(resMap); |
||||
|
||||
return resMap; |
||||
} |
||||
|
||||
public static java.util.Map<String, TableDataWrapper> getAllDataSetIncludingProcedure(java.util.Map<String, TableDataWrapper> resMap) { |
||||
java.util.LinkedHashMap<String, TableDataWrapper> dsMap = new java.util.LinkedHashMap<String, TableDataWrapper>(); |
||||
Iterator<Entry<String, TableDataWrapper>> entryIt = resMap.entrySet().iterator(); |
||||
while (entryIt.hasNext()) { |
||||
String key = entryIt.next().getKey(); |
||||
TableDataWrapper tableDataWrapper = resMap.get(key); |
||||
if (tableDataWrapper.getTableData() instanceof StoreProcedure) { |
||||
StoreProcedure storeProcedure = (StoreProcedure) tableDataWrapper.getTableData(); |
||||
boolean hasSchemaOrResult = false; |
||||
StoreProcedureParameter[] parameters = StoreProcedure.getSortPara(storeProcedure.getParameters()); |
||||
String name = tableDataWrapper.getTableDataName(); |
||||
ArrayList<String> resultNames = storeProcedure.getResultNames(); |
||||
TableDataWrapper tdw = new StoreProcedureNameWrapper(name + "_Table", storeProcedure); |
||||
|
||||
for (StoreProcedureParameter parameter : parameters) { |
||||
if (parameter.getSchema() != StoreProcedureConstants.IN) { |
||||
String parameterName = name + "_" + parameter.getName(); |
||||
TableDataWrapper newTwd = new StoreProcedureDataWrapper(storeProcedure, name, parameterName, false); |
||||
dsMap.put(parameterName, newTwd); |
||||
hasSchemaOrResult = true; |
||||
} |
||||
} |
||||
|
||||
if (!resultNames.isEmpty()) { |
||||
hasSchemaOrResult = true; |
||||
for (int i = 0; i < resultNames.size(); i++) { |
||||
String parameterName = name + "_" + resultNames.get(i); |
||||
TableDataWrapper newTwd = new StoreProcedureDataWrapper(storeProcedure, name, parameterName, false); |
||||
dsMap.put(parameterName, newTwd); |
||||
} |
||||
} |
||||
|
||||
if (!hasSchemaOrResult) { |
||||
dsMap.put(name + "_Table", tdw); |
||||
} |
||||
} else { |
||||
dsMap.put(key, tableDataWrapper); |
||||
} |
||||
} |
||||
return dsMap; |
||||
} |
||||
|
||||
/** |
||||
* 不根据过滤设置,返回当前服务器数据集、存储过程所有的数据集,是有顺序的 |
||||
*/ |
||||
public static java.util.Map<String, TableDataWrapper> getGlobalDataSet() { |
||||
java.util.Map<String, TableDataWrapper> resMap = new java.util.LinkedHashMap<String, TableDataWrapper>(); |
||||
|
||||
// 服务器数据集
|
||||
addServerData(resMap); |
||||
// 存储过程
|
||||
addStoreProcedureData(resMap); |
||||
|
||||
return resMap; |
||||
} |
||||
|
||||
/** |
||||
* 根据过滤设置,返回当前模板数据集、服务器数据集、存储过程所有的数据集,是有顺序的 |
||||
*/ |
||||
public static List<Map<String, TableDataWrapper>> getEditingDataSet(TableDataSource source) { |
||||
Map<String, TableDataWrapper> templateDataMap = new LinkedHashMap<String, TableDataWrapper>(); |
||||
Map<String, TableDataWrapper> serverDataMap = new LinkedHashMap<String, TableDataWrapper>(); |
||||
Map<String, TableDataWrapper> storeProcedureMap = new LinkedHashMap<String, TableDataWrapper>(); |
||||
|
||||
addTemplateData(templateDataMap, source); |
||||
addServerData(serverDataMap); |
||||
addStoreProcedureData(storeProcedureMap); |
||||
|
||||
List<Map<String, TableDataWrapper>> list = new ArrayList<Map<String, TableDataWrapper>>(); |
||||
list.add(templateDataMap); |
||||
list.add(serverDataMap); |
||||
list.add(storeProcedureMap); |
||||
return list; |
||||
} |
||||
|
||||
private static void addTemplateData(java.util.Map<String, TableDataWrapper> resMap, TableDataSource source) { |
||||
if (source != null) { |
||||
String[] namearray = TableDataFactory.getSortOfChineseNameOfTemplateData(source); |
||||
for (String tabledataname : namearray) { |
||||
TableData td = source.getTableData(tabledataname); |
||||
TableDataWrapper tdw = new TemplateTableDataWrapper(td, tabledataname); |
||||
resMap.put(tabledataname, tdw); |
||||
} |
||||
} |
||||
} |
||||
|
||||
private static void addServerData(java.util.Map<String, TableDataWrapper> resMap) { |
||||
DatasourceManagerProvider mgr = DatasourceManager.getProviderInstance(); |
||||
String[] namearray = TableDataFactory.getSortOfChineseNameOfServerData(mgr); |
||||
for (String name : namearray) { |
||||
if (globalDsCache.containsKey(name)) { |
||||
resMap.put(name, globalDsCache.get(name)); |
||||
} else { |
||||
TableDataWrapper tdw = new ServerTableDataWrapper(mgr.getTableData(name), name); |
||||
resMap.put(name, tdw); |
||||
globalDsCache.put(name, tdw); |
||||
} |
||||
} |
||||
} |
||||
|
||||
|
||||
|
||||
private static void addStoreProcedureData(java.util.Map<String, TableDataWrapper> resMap) { |
||||
DatasourceManagerProvider mgr = DatasourceManager.getProviderInstance(); |
||||
String[] namearray = new String[0]; |
||||
@SuppressWarnings("unchecked") |
||||
java.util.Iterator<String> nameIt = mgr.getProcedureNameIterator(); |
||||
while (nameIt.hasNext()) { |
||||
namearray = (String[]) ArrayUtils.add(namearray, nameIt.next()); |
||||
} |
||||
Arrays.sort(namearray, Collator.getInstance(java.util.Locale.CHINA)); |
||||
|
||||
for (String name : namearray) { |
||||
StoreProcedure storeProcedure = mgr.getProcedure(name); |
||||
if (globalDsCache.containsKey(name)) { |
||||
resMap.put(name, globalDsCache.get(name)); |
||||
} else { |
||||
TableDataWrapper tdw = new StoreProcedureNameWrapper(name, storeProcedure); |
||||
resMap.put(name, tdw); |
||||
globalDsCache.put(name, tdw); |
||||
} |
||||
} |
||||
} |
||||
|
||||
|
||||
/** |
||||
* 预览需要参数的数据集 |
||||
* |
||||
* @param tabledata 数据集 |
||||
* @param rowCount 需要预览的行数 |
||||
* @param needLoadingBar 是否需要加载进度条 |
||||
* @return 数据集 |
||||
* @throws Exception 异常 |
||||
*/ |
||||
public static EmbeddedTableData previewTableDataNeedInputParameters(TableData tabledata, int rowCount, boolean needLoadingBar) throws Exception { |
||||
return previewTableData(tabledata, rowCount, true, needLoadingBar); |
||||
} |
||||
|
||||
/** |
||||
* 预览不需要参数的数据集 |
||||
* |
||||
* @param tabledata 数据集 |
||||
* @param rowCount 需要预览的行数 |
||||
* @param needLoadingBar 是否需要加载进度条 |
||||
* @return 数据集 |
||||
* @throws Exception 异常 |
||||
*/ |
||||
public static EmbeddedTableData previewTableDataNotNeedInputParameters(TableData tabledata, int rowCount, boolean needLoadingBar) throws Exception { |
||||
return previewTableData(tabledata, rowCount, false, needLoadingBar); |
||||
} |
||||
|
||||
/** |
||||
* 获取预览后的EmbeddedTableData,考虑到Env |
||||
* |
||||
* @param tabledata |
||||
* @param rowCount |
||||
* @param isMustInputParameters 是否必须输入参数值(不管参数有没有默认值)。一般预览时这个值为true,因为一般预览是要看不同的参数的结果的。 |
||||
* 而获取数据集的字段名字时,则没必要 |
||||
* @return |
||||
*/ |
||||
private static EmbeddedTableData previewTableData(TableData tabledata, int rowCount, boolean isMustInputParameters, boolean needLoadingBar) throws Exception { |
||||
final AutoProgressBar loadingBar = PreviewTablePane.getInstance().getProgressBar(); |
||||
Env currentEnv = FRContext.getCurrentEnv(); |
||||
EmbeddedTableData embeddedTableData = null; |
||||
ParameterProvider[] parameters = currentEnv.getTableDataParameters(tabledata); |
||||
boolean isNullParameter = parameters == null || parameters.length == 0; |
||||
ParameterProvider[] tableDataParameter = tabledata.getParameters(Calculator.createCalculator()); |
||||
boolean isOriginalNUllParameter = tableDataParameter == null || tableDataParameter.length == 0; |
||||
if (isNullParameter && !isOriginalNUllParameter) { |
||||
parameters = tableDataParameter; |
||||
} |
||||
boolean hasValue = true; |
||||
for (ParameterProvider parameter : parameters) { |
||||
if (parameter.getValue() == null || ComparatorUtils.equals(StringUtils.EMPTY, parameter.getValue())) { |
||||
hasValue = false; |
||||
break; |
||||
} |
||||
} |
||||
final Map<String, Object> parameterMap = new HashMap<String, Object>(); |
||||
if (!hasValue || isMustInputParameters) { |
||||
if (parameters != null && parameters.length > 0) { |
||||
final ParameterInputPane pPane = new ParameterInputPane(parameters); |
||||
pPane.showSmallWindow(DesignerContext.getDesignerFrame(), new DialogActionAdapter() { |
||||
|
||||
public void doOk() { |
||||
parameterMap.putAll(pPane.update()); |
||||
} |
||||
}).setVisible(true); |
||||
} |
||||
} else { |
||||
for (int i = 0; i < parameters.length; i++) { |
||||
parameterMap.put(parameters[i].getName(), parameters[i].getValue()); |
||||
} |
||||
} |
||||
if (loadingBar != null && needLoadingBar) { |
||||
loadingBar.start(); |
||||
} |
||||
try { |
||||
embeddedTableData = currentEnv.previewTableData(tabledata, parameterMap, rowCount); |
||||
} catch (TableDataException e) { |
||||
throw new TableDataException(e.getMessage(), e); |
||||
} finally { |
||||
new Timer().schedule(new TimerTask() { |
||||
public void run() { |
||||
loadingBar.close(); |
||||
} |
||||
}, 100); |
||||
} |
||||
return embeddedTableData; |
||||
} |
||||
|
||||
/** |
||||
* 返回<code>TableData</code>的数据列,注意<code>TableData</code> |
||||
* 是没有考虑参数的。用于简单的查询语句生成的<code>TableData</code>, 或者 |
||||
* <code>EmbeddedTableData</code>. 比如说:数据字典-数据库表生成的<code>TableData</code>。 |
||||
* 使用该方法是没有数据集缓存的功能的 |
||||
* |
||||
* @return List<String> |
||||
*/ |
||||
public static List<String> getColumnNamesByTableData(TableData tableData) { |
||||
List<String> columnNames = new ArrayList<String>(); |
||||
if (tableData != null) { |
||||
DataModel rs = tableData.createDataModel(Calculator.createCalculator()); |
||||
int value; |
||||
try { |
||||
value = rs.getColumnCount(); |
||||
for (int i = 0; i < value; i++) { |
||||
columnNames.add(rs.getColumnName(i)); |
||||
} |
||||
rs.release(); |
||||
} catch (Exception e) { |
||||
FRContext.getLogger().error(e.getMessage()); |
||||
} |
||||
|
||||
} |
||||
|
||||
return columnNames; |
||||
} |
||||
|
||||
/** |
||||
* 该方法主要利用了StoreProcedure里面的“dataModelList有缓存作用”的机制 |
||||
* 所以用该方法,不会对一个已经计算了的存储过程重复计算.和分页预览时处理机制一样,这样对有多个返回数据集的存储过程来说很有必要 |
||||
* |
||||
* @param needLoadingBar 是否需要进度条 |
||||
* @param storeProcedure 存储过程 |
||||
* @return 数据 |
||||
*/ |
||||
public static ProcedureDataModel[] createLazyDataModel(StoreProcedure storeProcedure, boolean needLoadingBar) throws Exception { |
||||
ByteArrayOutputStream out = new ByteArrayOutputStream(); |
||||
XMLPrintWriter writer = XMLPrintWriter.create(out); |
||||
// 把storeProcedure写成xml文件到out
|
||||
DataCoreXmlUtils.writeXMLStoreProcedure(writer, storeProcedure, null); |
||||
Env currentEnv = FRContext.getCurrentEnv(); |
||||
if (storeProcedure.getDataModelSize() > 0 && !storeProcedure.isFirstExpand()) { |
||||
return storeProcedure.creatLazyDataModel(); |
||||
} |
||||
ParameterProvider[] inParameters = currentEnv.getStoreProcedureParameters(storeProcedure); |
||||
final Map<String, Object> parameterMap = new HashMap<String, Object>(); |
||||
if (inParameters.length > 0 && !ComparatorUtils.equals(threadLocal.get(), NO_PARAMETER)) {// 检查Parameter.
|
||||
final ParameterInputPane pPane = new ParameterInputPane(inParameters); |
||||
pPane.showSmallWindow(DesignerContext.getDesignerFrame(), new DialogActionAdapter() { |
||||
public void doOk() { |
||||
parameterMap.putAll(pPane.update()); |
||||
} |
||||
}).setVisible(true); |
||||
|
||||
} |
||||
storeProcedure.setFirstExpand(false); |
||||
if (needLoadingBar) { |
||||
StoreProcedureDataWrapper.loadingBar.start(); |
||||
} |
||||
return FRContext.getCurrentEnv().previewProcedureDataModel(storeProcedure, parameterMap, 0); |
||||
} |
||||
|
||||
public static void setThreadLocal(String value) { |
||||
threadLocal.set(value); |
||||
} |
||||
|
||||
|
||||
} |
@ -0,0 +1,602 @@
|
||||
package com.fr.design.data.datapane; |
||||
|
||||
import com.fr.base.BaseUtils; |
||||
import com.fr.base.FRContext; |
||||
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.DialectFactory; |
||||
import com.fr.data.impl.DBTableData; |
||||
import com.fr.dav.LocalEnv; |
||||
import com.fr.design.DesignerEnvManager; |
||||
import com.fr.design.beans.BasicBeanPane; |
||||
import com.fr.design.data.DesignTableDataManager; |
||||
import com.fr.design.data.datapane.RefreshLabel.Refreshable; |
||||
import com.fr.design.data.datapane.preview.PreviewLabel; |
||||
import com.fr.design.data.datapane.preview.PreviewLabel.Previewable; |
||||
import com.fr.design.data.datapane.preview.PreviewTablePane; |
||||
import com.fr.design.data.tabledata.Prepare4DataSourceChange; |
||||
import com.fr.design.gui.icombobox.*; |
||||
import com.fr.design.gui.ilable.UILabel; |
||||
import com.fr.design.gui.itree.refreshabletree.ExpandMutableTreeNode; |
||||
import com.fr.design.layout.FRGUIPaneFactory; |
||||
import com.fr.design.layout.TableLayout; |
||||
import com.fr.design.layout.TableLayoutHelper; |
||||
import com.fr.design.mainframe.DesignerContext; |
||||
import com.fr.design.mainframe.DesignerFrame; |
||||
import com.fr.design.utils.gui.GUICoreUtils; |
||||
import com.fr.file.DatasourceManager; |
||||
import com.fr.file.DatasourceManagerProvider; |
||||
import com.fr.general.ComparatorUtils; |
||||
import com.fr.general.FRLogger; |
||||
import com.fr.general.Inter; |
||||
import com.fr.stable.StringUtils; |
||||
|
||||
import javax.swing.*; |
||||
import javax.swing.event.ChangeEvent; |
||||
import javax.swing.event.ChangeListener; |
||||
import javax.swing.event.PopupMenuEvent; |
||||
import javax.swing.event.PopupMenuListener; |
||||
import javax.swing.tree.*; |
||||
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.Enumeration; |
||||
import java.util.Iterator; |
||||
import java.util.List; |
||||
|
||||
/** |
||||
* @author zhou |
||||
* @since 2012-7-11下午4:49:39 |
||||
*/ |
||||
public class ChoosePane extends BasicBeanPane<DataBaseItems> implements Refreshable, Previewable, Prepare4DataSourceChange { |
||||
private static final double COLUMN_SIZE = 24; |
||||
|
||||
/** |
||||
* 数据库 |
||||
*/ |
||||
protected StringUIComboBox dsNameComboBox; |
||||
|
||||
/** |
||||
* 模式 |
||||
*/ |
||||
protected StringUIComboBox schemaBox; |
||||
|
||||
/** |
||||
* 表名 |
||||
*/ |
||||
protected FRTreeComboBox tableNameComboBox; |
||||
|
||||
private SwingWorker populateWorker; |
||||
|
||||
|
||||
private PopupMenuListener popupMenuListener = new PopupMenuListener() { |
||||
|
||||
public void popupMenuWillBecomeVisible(PopupMenuEvent e) { |
||||
new Thread() { |
||||
@Override |
||||
public void run() { |
||||
calculateTableDataNames(); |
||||
} |
||||
}.start(); |
||||
} |
||||
|
||||
public void popupMenuWillBecomeInvisible(PopupMenuEvent e) { |
||||
} |
||||
|
||||
public void popupMenuCanceled(PopupMenuEvent e) { |
||||
} |
||||
}; |
||||
|
||||
|
||||
private PopupMenuListener listener = new PopupMenuListener() { |
||||
public void popupMenuCanceled(PopupMenuEvent e) { |
||||
} |
||||
|
||||
public void popupMenuWillBecomeInvisible(PopupMenuEvent e) { |
||||
} |
||||
|
||||
public void popupMenuWillBecomeVisible(PopupMenuEvent e) { |
||||
executePopulateWorker(); |
||||
} |
||||
}; |
||||
|
||||
public ChoosePane() { |
||||
this(null); |
||||
} |
||||
|
||||
public ChoosePane(Previewable parent) { |
||||
this(parent, -1); |
||||
} |
||||
|
||||
public ChoosePane(Previewable parent, int labelSize) { |
||||
this.initBasicComponet(); |
||||
this.initComponentsLayout(new PreviewLabel(parent == null ? this : parent), labelSize); |
||||
} |
||||
|
||||
private void initBasicComponet() { |
||||
this.setLayout(FRGUIPaneFactory.createBorderLayout()); |
||||
|
||||
dsNameComboBox = new StringUIComboBox(); |
||||
initDsNameComboBox(); |
||||
|
||||
schemaBox = new StringUIComboBox(); |
||||
schemaBox.setEditor(new ComboBoxEditor()); |
||||
|
||||
tableNameComboBox = new FRTreeComboBox(new JTree(new DefaultMutableTreeNode()), tableNameTreeRenderer, false); |
||||
tableNameComboBox.setEditable(true); |
||||
tableNameComboBox.setRenderer(listCellRenderer); |
||||
registerDSChangeListener(); |
||||
initBoxListener(); |
||||
} |
||||
|
||||
private void initBoxListener() { |
||||
addDSBoxListener(); |
||||
schemaBox.addItemListener(new ItemListener() { |
||||
public void itemStateChanged(ItemEvent evt) { |
||||
tableNameComboBox.setSelectedItem(""); |
||||
} |
||||
}); |
||||
schemaBox.addPopupMenuListener(listener); |
||||
addFocusListener(); |
||||
this.tableNameComboBox.addPopupMenuListener(popupMenuListener); |
||||
} |
||||
|
||||
protected void addDSBoxListener() { |
||||
dsNameComboBox.addItemListener(new ItemListener() { |
||||
|
||||
@Override |
||||
public void itemStateChanged(ItemEvent e) { |
||||
schemaBox.setSelectedIndex(-1); |
||||
tableNameComboBox.setSelectedItem(""); |
||||
JTree tree = tableNameComboBox.getTree(); |
||||
if (tree == null) { |
||||
return; |
||||
} |
||||
DefaultMutableTreeNode rootTreeNode = (DefaultMutableTreeNode) tree.getModel().getRoot(); |
||||
rootTreeNode.removeAllChildren(); |
||||
rootTreeNode.add(new ExpandMutableTreeNode("Loading...")); |
||||
((DefaultTreeModel) tree.getModel()).reload(); |
||||
|
||||
} |
||||
}); |
||||
} |
||||
|
||||
protected void addFocusListener() { |
||||
schemaBox.addFocusListener(new FocusAdapter() { |
||||
public void focusGained(FocusEvent e) { |
||||
if (schemaBox.getSelectedIndex() == -1) { |
||||
schemaBox.updateUI(); |
||||
schemaBox.showPopup(); |
||||
} |
||||
} |
||||
}); |
||||
} |
||||
|
||||
protected void initDsNameComboBox() { |
||||
dsNameComboBox.setRefreshingModel(true); |
||||
DatasourceManagerProvider datasourceManager = DatasourceManager.getProviderInstance(); |
||||
@SuppressWarnings("unchecked") |
||||
Iterator<String> datasourceNameIterator = datasourceManager.getConnectionNameIterator(); |
||||
List<String> dsList = new ArrayList<String>(); |
||||
while (datasourceNameIterator.hasNext()) { |
||||
dsList.add((String) datasourceNameIterator.next()); |
||||
} |
||||
FilterableComboBoxModel dsNameComboBoxModel = new FilterableComboBoxModel(dsList); |
||||
dsNameComboBox.setModel(dsNameComboBoxModel); |
||||
dsNameComboBox.setRefreshingModel(false); |
||||
} |
||||
|
||||
protected void initComponentsLayout(PreviewLabel previewLabel, int labelSize) { |
||||
UILabel l1 = new UILabel(Inter.getLocText("FR-Designer_Database") + ":"); |
||||
UILabel l2 = new UILabel(Inter.getLocText("FR-Designer_Model") + ":"); |
||||
UILabel l3 = new UILabel(Inter.getLocText("FR-Designer_Table") + ":"); |
||||
|
||||
if (labelSize > 0) { |
||||
Dimension pSize = new Dimension(labelSize, 25); |
||||
l1.setPreferredSize(pSize); |
||||
l2.setPreferredSize(pSize); |
||||
l3.setPreferredSize(pSize); |
||||
} |
||||
|
||||
Component[][] coms = new Component[][]{{l1, dsNameComboBox, l2, schemaBox, |
||||
l3, this.tableNameComboBox, new RefreshLabel(this), previewLabel}}; |
||||
|
||||
double p = TableLayout.PREFERRED; |
||||
double f = TableLayout.FILL; |
||||
JPanel northDSPane = TableLayoutHelper.createTableLayoutPane(coms, new double[]{p}, new double[]{p, f, p, f, p, f, COLUMN_SIZE, COLUMN_SIZE}); |
||||
|
||||
this.add(northDSPane, BorderLayout.CENTER); |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void populateBean(final DataBaseItems ob) { |
||||
this.dsNameComboBox.setSelectedItem(ob.getDatabaseName()); |
||||
schemaBox.setSelectedItem(ob.getSchemaName()); |
||||
this.tableNameComboBox.setSelectedItem(ob.getTableName()); |
||||
} |
||||
|
||||
|
||||
private void executePopulateWorker() { |
||||
if (populateWorker != null) { |
||||
populateWorker.cancel(true); |
||||
} |
||||
populateWorker = new SwingWorker<com.fr.data.impl.Connection, Void>() { |
||||
|
||||
protected com.fr.data.impl.Connection doInBackground() throws Exception { |
||||
schemaBox.addItem(Inter.getLocText("FR-Designer_Loading") + "..."); |
||||
schemaBox.setSelectedItem(null); |
||||
return getConnection(); |
||||
} |
||||
|
||||
public void done() { |
||||
try { |
||||
com.fr.data.impl.Connection selectedDatabase = get(); |
||||
String selectedItem = schemaBox.getSelectedItem(); |
||||
schemaBox.setRefreshingModel(true); |
||||
schemaBox.removeAllItems(); |
||||
schemaBox.updateUI(); |
||||
if (selectedDatabase == null) { |
||||
return; |
||||
} |
||||
String[] schema = DataCoreUtils.getDatabaseSchema(selectedDatabase); |
||||
schema = schema == null ? new String[]{""} : schema; |
||||
for (String aa : schema) { |
||||
schemaBox.addItem(aa); |
||||
} |
||||
int index = schemaBox.getSelectedIndex(); |
||||
if (selectedItem != null) { |
||||
schemaBox.setSelectedItem(selectedItem); |
||||
} else if (index < schema.length) { |
||||
schemaBox.setSelectedIndex(index); |
||||
} |
||||
} catch (Exception e) { |
||||
FRLogger.getLogger().error(e.getMessage()); |
||||
} |
||||
schemaBox.setRefreshingModel(false); |
||||
schemaBox.removePopupMenuListener(listener); |
||||
schemaBox.setPopupVisible(true); |
||||
schemaBox.addPopupMenuListener(listener); |
||||
} |
||||
}; |
||||
populateWorker.execute(); |
||||
} |
||||
|
||||
@Override |
||||
public DataBaseItems updateBean() { |
||||
return new DataBaseItems(this.getDSName(), this.schemaBox.getSelectedItem(), getTableName()); |
||||
} |
||||
|
||||
/** |
||||
* 重置选中的box |
||||
*/ |
||||
public void resetComponets() { |
||||
GUICoreUtils.setSelectedItemQuietly(dsNameComboBox, -1); |
||||
GUICoreUtils.setSelectedItemQuietly(schemaBox, -1); |
||||
GUICoreUtils.setSelectedItemQuietly(tableNameComboBox, -1); |
||||
} |
||||
|
||||
protected com.fr.data.impl.Connection getConnection() { |
||||
String selectedDSName = this.getDSName(); |
||||
if (StringUtils.isEmpty(selectedDSName)) { |
||||
return null; // peter:选中了当前的零长度的节点,直接返回.
|
||||
} |
||||
DatasourceManagerProvider datasourceManager = DatasourceManager.getProviderInstance(); |
||||
@SuppressWarnings("unchecked") |
||||
Iterator<String> datasourceNameIterator = datasourceManager.getConnectionNameIterator(); |
||||
while (datasourceNameIterator.hasNext()) { |
||||
String datasourceName = datasourceNameIterator.next(); |
||||
if (ComparatorUtils.equals(selectedDSName, datasourceName)) { |
||||
return datasourceManager.getConnection(datasourceName); |
||||
} |
||||
} |
||||
return null; |
||||
} |
||||
|
||||
/** |
||||
* 刷新没多大用。而且要刷新也不是这儿刷新。 |
||||
*/ |
||||
public void refresh() { |
||||
DBUtils.refreshDatabase(); |
||||
String schema = StringUtils.isEmpty(schemaBox.getSelectedItem()) ? null : schemaBox.getSelectedItem(); |
||||
DataCoreUtils.refreshTables(getConnection(), TableProcedure.TABLE, schema); |
||||
JOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), Inter.getLocText("FR-Designer_Refresh_Successfully") + "!", Inter.getLocText("FR-Designer_Refresh_Database"), |
||||
JOptionPane.INFORMATION_MESSAGE); |
||||
} |
||||
|
||||
TreeCellRenderer tableNameTreeRenderer = new DefaultTreeCellRenderer() { |
||||
public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row, boolean hasFocus) { |
||||
super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus); |
||||
if (value instanceof DefaultMutableTreeNode) { |
||||
DefaultMutableTreeNode node = (DefaultMutableTreeNode) value; |
||||
Object userObj = node.getUserObject(); |
||||
if (userObj instanceof String) { |
||||
this.setIcon(BaseUtils.readIcon("com/fr/design/images/m_insert/expandCell.gif")); |
||||
} else if (userObj instanceof TableProcedure) { |
||||
this.setText(((TableProcedure) userObj).getName()); |
||||
} |
||||
} |
||||
return this; |
||||
} |
||||
}; |
||||
|
||||
public static UIComboBoxRenderer listCellRenderer = new UIComboBoxRenderer() { |
||||
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { |
||||
super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); |
||||
if (value instanceof TreePath) { |
||||
DefaultMutableTreeNode dmt = (DefaultMutableTreeNode) ((TreePath) value).getLastPathComponent(); |
||||
if (dmt.getUserObject() instanceof TableProcedure) { |
||||
this.setText(((TableProcedure) dmt.getUserObject()).getName()); |
||||
} else { |
||||
this.setText(null); |
||||
} |
||||
} |
||||
return this; |
||||
} |
||||
}; |
||||
|
||||
|
||||
/** |
||||
* 添加项目监听事件 |
||||
* @param aListener 事件监听器 |
||||
*/ |
||||
public void addItemListener(ItemListener aListener) { |
||||
this.tableNameComboBox.addItemListener(aListener); |
||||
} |
||||
|
||||
/** |
||||
* 删除项目监听事件 |
||||
* @param aListener 事件监听器 |
||||
*/ |
||||
public void removeItemListener(ItemListener aListener) { |
||||
this.tableNameComboBox.removeItemListener(aListener); |
||||
} |
||||
|
||||
@Override |
||||
protected String title4PopupWindow() { |
||||
return "choosepane"; |
||||
} |
||||
|
||||
protected void calculateTableDataNames() { |
||||
JTree tree = tableNameComboBox.getTree(); |
||||
if (tree == null) { |
||||
return; |
||||
} |
||||
DefaultMutableTreeNode rootTreeNode = (DefaultMutableTreeNode) tree.getModel().getRoot(); |
||||
rootTreeNode.removeAllChildren(); |
||||
|
||||
String selectedDSName = this.getDSName(); |
||||
com.fr.data.impl.Connection selectedDatabase = this.getConnection(); |
||||
if (selectedDatabase == null) { |
||||
return; |
||||
} |
||||
try { |
||||
String schema = StringUtils.isEmpty(this.schemaBox.getSelectedItem()) ? null : this.schemaBox.getSelectedItem(); |
||||
TableProcedure[] sqlTableArray = DataCoreUtils.getTables(selectedDatabase, TableProcedure.TABLE, schema, DesignerEnvManager.getEnvManager().isOracleSystemSpace()); |
||||
if (sqlTableArray.length > 0) { |
||||
ExpandMutableTreeNode tableTreeNode = new ExpandMutableTreeNode(selectedDSName + "-" + Inter.getLocText("FR-Designer_SQL-Table")); |
||||
rootTreeNode.add(tableTreeNode); |
||||
for (int i = 0; i < sqlTableArray.length; i++) { |
||||
ExpandMutableTreeNode tableChildTreeNode = new ExpandMutableTreeNode(sqlTableArray[i]); |
||||
tableTreeNode.add(tableChildTreeNode); |
||||
} |
||||
} |
||||
TableProcedure[] sqlViewArray = DataCoreUtils.getTables(selectedDatabase, TableProcedure.VIEW, schema, DesignerEnvManager.getEnvManager().isOracleSystemSpace()); |
||||
if (sqlViewArray.length > 0) { |
||||
ExpandMutableTreeNode viewTreeNode = new ExpandMutableTreeNode(selectedDSName + "-" + Inter.getLocText("FR-Designer_SQL-View")); |
||||
rootTreeNode.add(viewTreeNode); |
||||
for (int i = 0; i < sqlViewArray.length; i++) { |
||||
ExpandMutableTreeNode viewChildTreeNode = new ExpandMutableTreeNode(sqlViewArray[i]); |
||||
viewTreeNode.add(viewChildTreeNode); |
||||
} |
||||
} |
||||
((DefaultTreeModel) tree.getModel()).reload(); |
||||
/** |
||||
* daniel 展开所有tree |
||||
*/ |
||||
TreeNode root = (TreeNode) tree.getModel().getRoot(); |
||||
TreePath parent = new TreePath(root); |
||||
TreeNode node = (TreeNode) parent.getLastPathComponent(); |
||||
for (Enumeration e = node.children(); e.hasMoreElements(); ) { |
||||
TreeNode n = (TreeNode) e.nextElement(); |
||||
TreePath path = parent.pathByAddingChild(n); |
||||
tree.expandPath(path); |
||||
} |
||||
} catch (Exception e) { |
||||
FRContext.getLogger().error(e.getMessage(), e); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 创建选中的数据集数据 |
||||
* @return 数据集数据 |
||||
*/ |
||||
public TableData createSelectTableData() { |
||||
DataBaseItems paras = this.updateBean(); |
||||
boolean connect = false; |
||||
com.fr.data.impl.Connection database = DBUtils.checkDBConnection(paras.getDatabaseName()); |
||||
if (database == null) { |
||||
failedToFindTable(); |
||||
return TableData.EMPTY_TABLEDATA; |
||||
} |
||||
try { |
||||
connect = FRContext.getCurrentEnv().testConnection(database); |
||||
} catch (Exception e1) { |
||||
connect = false; |
||||
} |
||||
if (!connect) { |
||||
DesignerFrame designerFrame = DesignerContext.getDesignerFrame(); |
||||
JOptionPane.showMessageDialog(designerFrame, Inter.getLocText("Datasource-Connection_failed"), |
||||
Inter.getLocText("FR-Designer_Failed"), JOptionPane.INFORMATION_MESSAGE); |
||||
failedToFindTable(); |
||||
return null; |
||||
} |
||||
// 显示Table数据.
|
||||
|
||||
TableData tableData = null; |
||||
if (FRContext.getCurrentEnv() instanceof LocalEnv) { |
||||
TableData tableDataLocal = new DBTableData(database, DataCoreUtils.createSelectSQL(paras.getSchemaName(), paras.getTableName(), |
||||
DialectFactory.getDialectByName(paras.getDatabaseName()))); |
||||
tableData = tableDataLocal; |
||||
} else { |
||||
try { |
||||
TableData tableDataLocal = new DBTableData(database, DataCoreUtils.createSelectSQL(paras.getSchemaName(), paras.getTableName(), DialectFactory.getDialectByName(paras.getDatabaseName()))); |
||||
tableData = FRContext.getCurrentEnv().previewTableData(tableDataLocal, java.util.Collections.EMPTY_MAP, |
||||
DesignerEnvManager.getEnvManager().getMaxNumberOrPreviewRow()); |
||||
} catch (Exception e) { |
||||
failedToFindTable(); |
||||
FRContext.getLogger().error(e.getMessage(), e); |
||||
} |
||||
} |
||||
|
||||
return tableData; |
||||
} |
||||
|
||||
protected String getDSName() { |
||||
return this.dsNameComboBox.getSelectedItem(); |
||||
} |
||||
|
||||
protected void failedToFindTable() { |
||||
} |
||||
|
||||
protected String getTableName() { |
||||
String tableName = ""; |
||||
Object obj = this.tableNameComboBox.getSelectedItem(); |
||||
if (obj == null) { |
||||
obj = this.tableNameComboBox.getEditor().getItem(); |
||||
} |
||||
if (obj instanceof TreePath) { |
||||
Object tp = ((ExpandMutableTreeNode) ((TreePath) obj).getLastPathComponent()).getUserObject(); |
||||
if (tp instanceof TableProcedure) { |
||||
tableName = ((TableProcedure) tp).getName(); |
||||
} |
||||
} else if (obj instanceof String) { |
||||
tableName = (String) obj; |
||||
} |
||||
return tableName; |
||||
} |
||||
|
||||
/** |
||||
* 得到当前的ColumnName[] |
||||
* @return 返回当前的ColumnName[] |
||||
*/ |
||||
public String[] currentColumnNames() { |
||||
String[] colNames = null; |
||||
|
||||
DataBaseItems paras = this.updateBean(); |
||||
String selectedDSName = paras.getDatabaseName(); |
||||
if (StringUtils.isBlank(selectedDSName)) { |
||||
return colNames = new String[0]; // peter:选中了当前的零长度的节点,直接返回.
|
||||
} |
||||
|
||||
String selectedTableObject = paras.getTableName(); |
||||
if (StringUtils.isEmpty(selectedTableObject)) { |
||||
return colNames = new String[0]; |
||||
} |
||||
java.sql.Connection conn = null; |
||||
try { |
||||
// daniel:增加参数
|
||||
colNames = FRContext.getCurrentEnv().getColumns(selectedDSName, paras.getSchemaName(), selectedTableObject); |
||||
} catch (Exception e2) { |
||||
FRContext.getLogger().error(e2.getMessage(), e2); |
||||
} finally { |
||||
DBUtils.closeConnection(conn); |
||||
} |
||||
|
||||
if (colNames == null) { |
||||
colNames = new String[0]; |
||||
} |
||||
return colNames; |
||||
} |
||||
|
||||
/** |
||||
* 预览key value对应的数据 |
||||
* @param key 键 |
||||
* @param value 值 |
||||
*/ |
||||
public void preview(int key, int value) { |
||||
PreviewTablePane.previewTableData(createSelectTableData(), key, value); |
||||
} |
||||
|
||||
/** |
||||
* 默认预览 |
||||
*/ |
||||
public void preview() { |
||||
preview(-1, -1); |
||||
} |
||||
|
||||
/** |
||||
* 设置数据集名. |
||||
*/ |
||||
public void setTableNameComboBoxPopSize(int width, int height) { |
||||
tableNameComboBox.setPopSize(width, height); |
||||
} |
||||
|
||||
/** |
||||
*注册listener,相应数据集改变 |
||||
*/ |
||||
public void registerDSChangeListener() { |
||||
DesignTableDataManager.addDsChangeListener(new ChangeListener() { |
||||
public void stateChanged(ChangeEvent e) { |
||||
initDsNameComboBox(); |
||||
} |
||||
}); |
||||
} |
||||
|
||||
|
||||
protected class StringUIComboBox extends UIComboBox { |
||||
private boolean refreshingModel = false; |
||||
|
||||
@Override |
||||
protected void fireItemStateChanged(ItemEvent e) { |
||||
if (!isRefreshingModel()) { |
||||
super.fireItemStateChanged(e); |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public String getSelectedItem() { |
||||
Object ob = super.getSelectedItem(); |
||||
if (ob instanceof String) { |
||||
return (String) ob; |
||||
} else |
||||
return StringUtils.EMPTY; |
||||
} |
||||
|
||||
public boolean isRefreshingModel() { |
||||
return refreshingModel; |
||||
} |
||||
|
||||
public void setRefreshingModel(boolean refreshingModel) { |
||||
this.refreshingModel = refreshingModel; |
||||
} |
||||
|
||||
public void setSelectedItem(Object ob) { |
||||
this.getModel().setSelectedItem(ob); |
||||
if (ob != null && StringUtils.isEmpty(ob.toString())) { |
||||
super.setSelectedIndex(-1); |
||||
} else { |
||||
super.setSelectedItem(ob); |
||||
} |
||||
} |
||||
} |
||||
|
||||
private class ComboBoxEditor extends UIComboBoxEditor { |
||||
private Object item; |
||||
|
||||
public void setItem(Object item) { |
||||
this.item = item; |
||||
textField.setText((item == null) ? "" : item.toString()); |
||||
} |
||||
|
||||
public Object getItem() { |
||||
return this.item; |
||||
} |
||||
} |
||||
|
||||
} |
File diff suppressed because one or more lines are too long
@ -0,0 +1,48 @@
|
||||
package com.fr.design.data.datapane; |
||||
|
||||
import com.fr.design.constants.UIConstants; |
||||
import com.fr.design.gui.ibutton.UIButtonGroup; |
||||
import com.fr.design.mainframe.WestRegionContainerPane; |
||||
|
||||
import javax.swing.*; |
||||
import java.awt.*; |
||||
|
||||
/** |
||||
* Created with IntelliJ IDEA. |
||||
* User: pony |
||||
* Date: 13-4-27 |
||||
* Time: 上午10:32 |
||||
* To change this template use File | Settings | File Templates. |
||||
*/ |
||||
public class DSButtonGroup extends UIButtonGroup<Integer> { |
||||
|
||||
public DSButtonGroup(Icon[] iconArray, Integer[] objects) { |
||||
super(iconArray, objects); |
||||
} |
||||
|
||||
|
||||
|
||||
|
||||
protected void paintBorder(Graphics g) { |
||||
int tabledatatreepaneWidth = WestRegionContainerPane.getInstance().getWidth()-10; |
||||
int labelX = 54 - (290 - tabledatatreepaneWidth) / 4 - 1; |
||||
Graphics2D g2d = (Graphics2D) g; |
||||
g2d.setColor(UIConstants.LINE_COLOR); |
||||
|
||||
int width = 0; |
||||
|
||||
width += labelButtonList.get(0).getWidth() + 1; |
||||
int height = labelButtonList.get(0).getHeight(); |
||||
g.drawLine(width + labelX, 0, width + labelX, height); |
||||
|
||||
width += labelButtonList.get(labelButtonList.size() - 1).getWidth() + 1; |
||||
|
||||
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); |
||||
g2d.drawRoundRect( labelX, 0, width, getHeight() - 1, UIConstants.ARC, UIConstants.ARC); |
||||
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF); |
||||
|
||||
|
||||
g2d.drawLine(labelX / 2, getHeight() / 2, width + 3 * labelX / 2 , getHeight() / 2); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,49 @@
|
||||
package com.fr.design.data.datapane; |
||||
|
||||
import com.fr.stable.StringUtils; |
||||
|
||||
/** |
||||
* |
||||
* @author zhou |
||||
* @since 2012-7-11下午5:11:31 |
||||
*/ |
||||
public class DataBaseItems { |
||||
private String databaseName; |
||||
private String schemaName; |
||||
private String tableName; |
||||
|
||||
public DataBaseItems() { |
||||
this(null, null, null); |
||||
} |
||||
|
||||
public DataBaseItems(String databaseName, String schemaName, String tableName) { |
||||
this.setDatabaseName(databaseName); |
||||
this.setSchemaName(schemaName); |
||||
this.setTableName(tableName); |
||||
} |
||||
|
||||
public String getDatabaseName() { |
||||
return databaseName; |
||||
} |
||||
|
||||
public void setDatabaseName(String databaseName) { |
||||
this.databaseName = databaseName == null ? StringUtils.EMPTY : databaseName; |
||||
} |
||||
|
||||
public String getSchemaName() { |
||||
return schemaName; |
||||
} |
||||
|
||||
public void setSchemaName(String schemaName) { |
||||
this.schemaName = schemaName == null ? StringUtils.EMPTY : schemaName; |
||||
} |
||||
|
||||
public String getTableName() { |
||||
return tableName; |
||||
} |
||||
|
||||
public void setTableName(String tableName) { |
||||
this.tableName = tableName == null ? StringUtils.EMPTY : tableName; |
||||
} |
||||
|
||||
} |
@ -0,0 +1,34 @@
|
||||
package com.fr.design.data.datapane; |
||||
|
||||
import java.awt.Cursor; |
||||
|
||||
import com.fr.design.gui.ilable.UILabel; |
||||
import javax.swing.JPanel; |
||||
|
||||
import com.fr.base.BaseUtils; |
||||
import com.fr.design.data.datapane.FlashLookLabelMouseAdapter.ReleaseAction; |
||||
import com.fr.general.Inter; |
||||
|
||||
|
||||
public class EditOrNewLabel extends UILabel { |
||||
JPanel editTablePane; |
||||
Editable editable; |
||||
|
||||
public EditOrNewLabel(Editable editable, JPanel editPane) { |
||||
super(BaseUtils.readIcon("/com/fr/design/images/m_file/edit.png")); |
||||
this.setToolTipText(Inter.getLocText("Edit")); |
||||
this.setCursor(new Cursor(Cursor.HAND_CURSOR)); |
||||
this.editable = editable; |
||||
this.editTablePane = editPane; |
||||
this.addMouseListener(new FlashLookLabelMouseAdapter(this, new ReleaseAction() { |
||||
@Override |
||||
public void releaseAction() { |
||||
EditOrNewLabel.this.editable.edit(EditOrNewLabel.this.editTablePane); |
||||
} |
||||
})); |
||||
} |
||||
|
||||
public static interface Editable { |
||||
public void edit(JPanel jPanel); |
||||
} |
||||
} |
@ -0,0 +1,57 @@
|
||||
package com.fr.design.data.datapane; |
||||
|
||||
import java.awt.event.MouseAdapter; |
||||
import java.awt.event.MouseEvent; |
||||
|
||||
import javax.swing.BorderFactory; |
||||
|
||||
import com.fr.design.constants.UIConstants; |
||||
import com.fr.design.gui.ilable.UILabel; |
||||
import javax.swing.border.Border; |
||||
|
||||
public class FlashLookLabelMouseAdapter extends MouseAdapter { |
||||
boolean mouseEntered = false; |
||||
boolean buttonPressed = false; |
||||
|
||||
private UILabel label; |
||||
private ReleaseAction releaseAction; |
||||
private static final Border NORMAL_BORDER = BorderFactory.createLineBorder(UIConstants.NORMAL_BACKGROUND); |
||||
private static final Border ENTERED_BORDER = BorderFactory.createLineBorder(java.awt.Color.GRAY); |
||||
|
||||
public FlashLookLabelMouseAdapter(UILabel label, ReleaseAction releaseAction) { |
||||
this.label = label; |
||||
label.setBorder(NORMAL_BORDER); |
||||
this.releaseAction = releaseAction; |
||||
} |
||||
|
||||
public void mouseEntered(MouseEvent e) { //当鼠标进入时候调用.
|
||||
mouseEntered = true; |
||||
if(!buttonPressed){ |
||||
label.setBackground(java.awt.Color.WHITE); |
||||
label.setOpaque(true); |
||||
label.setBorder(ENTERED_BORDER); |
||||
} |
||||
} |
||||
public void mouseExited(MouseEvent e) { |
||||
mouseEntered = false; |
||||
label.setOpaque(false); |
||||
label.setBorder(NORMAL_BORDER); |
||||
} |
||||
|
||||
public void mousePressed(MouseEvent e){ |
||||
buttonPressed = true; |
||||
label.setBackground(java.awt.Color.lightGray); |
||||
} |
||||
public void mouseReleased(MouseEvent e){ |
||||
buttonPressed = false; |
||||
if(mouseEntered){ |
||||
label.setBackground(java.awt.Color.WHITE); |
||||
|
||||
this.releaseAction.releaseAction(); |
||||
} |
||||
} |
||||
|
||||
public static interface ReleaseAction { |
||||
public void releaseAction(); |
||||
} |
||||
} |
@ -0,0 +1,22 @@
|
||||
package com.fr.design.data.datapane; |
||||
|
||||
import com.fr.design.data.DesignTableDataManager; |
||||
import com.fr.data.TableDataSource; |
||||
|
||||
/** |
||||
* Created with IntelliJ IDEA. |
||||
* User: pony |
||||
* Date: 13-4-20 |
||||
* Time: 上午11:16 |
||||
* To change this template use File | Settings | File Templates. |
||||
*/ |
||||
public class GlobalTableDataComboBox extends TableDataComboBox { |
||||
|
||||
public GlobalTableDataComboBox(TableDataSource source, String treeName) { |
||||
super(source, treeName); |
||||
} |
||||
protected void setResMap(TableDataSource source){ |
||||
resMap = DesignTableDataManager.getGlobalDataSet(); |
||||
|
||||
} |
||||
} |
@ -0,0 +1,21 @@
|
||||
package com.fr.design.data.datapane; |
||||
|
||||
import com.fr.design.data.DesignTableDataManager; |
||||
|
||||
/** |
||||
* Created with IntelliJ IDEA. |
||||
* User: pony |
||||
* Date: 13-4-20 |
||||
* Time: 上午11:27 |
||||
* To change this template use File | Settings | File Templates. |
||||
*/ |
||||
public class GlobalTreeTableDataDictPane extends TreeTableDataDictPane { |
||||
|
||||
public GlobalTreeTableDataDictPane(String treeName) { |
||||
super(treeName); |
||||
} |
||||
|
||||
protected void setTableDataNameComboBox(String string) { |
||||
tableDataNameComboBox = new GlobalTableDataComboBox(DesignTableDataManager.getEditingTableDataSource(),string); |
||||
} |
||||
} |
@ -0,0 +1,37 @@
|
||||
package com.fr.design.data.datapane; |
||||
|
||||
import java.awt.Cursor; |
||||
import java.awt.Dimension; |
||||
import java.awt.event.ActionEvent; |
||||
import java.awt.event.ActionListener; |
||||
|
||||
import com.fr.base.BaseUtils; |
||||
import com.fr.design.gui.ibutton.UIButton; |
||||
import com.fr.general.Inter; |
||||
|
||||
|
||||
|
||||
public class RefreshLabel extends UIButton { |
||||
private Refreshable refreshable; |
||||
|
||||
public RefreshLabel(Refreshable refreshable) { |
||||
super(BaseUtils.readIcon("/com/fr/design/images/control/refresh.png")); |
||||
|
||||
this.refreshable = refreshable; |
||||
|
||||
this.setToolTipText(Inter.getLocText("Refresh_Database")); |
||||
this.setCursor(new Cursor(Cursor.HAND_CURSOR)); |
||||
this.addActionListener(new ActionListener() { |
||||
|
||||
@Override |
||||
public void actionPerformed(ActionEvent e) { |
||||
RefreshLabel.this.refreshable.refresh(); |
||||
} |
||||
}); |
||||
this.setPreferredSize(new Dimension(24, 20)); |
||||
} |
||||
|
||||
public static interface Refreshable { |
||||
public void refresh(); |
||||
} |
||||
} |
@ -0,0 +1,62 @@
|
||||
/* |
||||
* Copyright(c) 2001-2010, FineReport Inc, All Rights Reserved. |
||||
*/ |
||||
package com.fr.design.data.datapane; |
||||
|
||||
import com.fr.data.TableDataSource; |
||||
import com.fr.design.gui.controlpane.NameableCreator; |
||||
import com.fr.design.gui.frpane.LoadingBasicPane; |
||||
import com.fr.design.layout.FRGUIPaneFactory; |
||||
import com.fr.general.Inter; |
||||
|
||||
import javax.swing.*; |
||||
import java.awt.*; |
||||
import java.util.Map; |
||||
|
||||
/** |
||||
* @author richer |
||||
* @since 6.5.5 |
||||
* 创建于2011-6-14 |
||||
*/ |
||||
public class ReportTableDataPane extends LoadingBasicPane { |
||||
private TableDataListPane tdListPane; |
||||
|
||||
@Override |
||||
protected void initComponents(JPanel container) { |
||||
container.setLayout(FRGUIPaneFactory.createBorderLayout()); |
||||
this.tdListPane = new TableDataListPane() { |
||||
@Override |
||||
public NameableCreator[] createNameableCreators() { |
||||
|
||||
return TableDataCreatorProducer.getInstance().createReportTableDataCreator(); |
||||
} |
||||
}; |
||||
container.add(tdListPane, BorderLayout.CENTER); |
||||
} |
||||
|
||||
@Override |
||||
protected String title4PopupWindow() { |
||||
return Inter.getLocText("DS-Report_TableData"); |
||||
} |
||||
|
||||
public void populate(TableDataSource tds) { |
||||
tdListPane.populate(tds); |
||||
} |
||||
|
||||
public void update(TableDataSource tds) { |
||||
tdListPane.update(tds); |
||||
} |
||||
|
||||
/** |
||||
* 检查tdListPane有效性check Valid |
||||
* |
||||
* @throws Exception 异常 |
||||
*/ |
||||
public void checkValid() throws Exception { |
||||
this.tdListPane.checkValid(); |
||||
} |
||||
|
||||
public Map<String, String> getDsNameChangedMap() { |
||||
return tdListPane.getDsNameChangedMap(); |
||||
} |
||||
} |
@ -0,0 +1,149 @@
|
||||
package com.fr.design.data.datapane; |
||||
|
||||
import java.awt.Component; |
||||
import java.awt.event.ItemEvent; |
||||
import java.util.Iterator; |
||||
import java.util.Map.Entry; |
||||
|
||||
import javax.swing.DefaultComboBoxModel; |
||||
import javax.swing.JLabel; |
||||
import javax.swing.JList; |
||||
import javax.swing.event.ChangeEvent; |
||||
import javax.swing.event.ChangeListener; |
||||
|
||||
import com.fr.design.constants.UIConstants; |
||||
import com.fr.design.data.DesignTableDataManager; |
||||
import com.fr.data.TableDataSource; |
||||
import com.fr.design.data.tabledata.Prepare4DataSourceChange; |
||||
import com.fr.design.data.tabledata.wrapper.TemplateTableDataWrapper; |
||||
import com.fr.design.data.tabledata.wrapper.TableDataWrapper; |
||||
import com.fr.design.gui.icombobox.UIComboBox; |
||||
import com.fr.design.gui.icombobox.UIComboBoxRenderer; |
||||
import com.fr.general.ComparatorUtils; |
||||
import com.fr.stable.StringUtils; |
||||
|
||||
/** |
||||
* 包含所有数据集的下拉框 |
||||
* |
||||
* @author zhou |
||||
* @since 2012-4-20上午10:34:30 |
||||
*/ |
||||
public class TableDataComboBox extends UIComboBox implements Prepare4DataSourceChange { |
||||
protected java.util.Map<String, TableDataWrapper> resMap; |
||||
private java.util.Map<String, TableDataWrapper> dsMap; |
||||
private static final long serialVersionUID = 1L; |
||||
private boolean refresModel = false; |
||||
private String treeName; //树数据集本身的名字
|
||||
|
||||
public TableDataComboBox(TableDataSource source){ |
||||
this(source,StringUtils.EMPTY); |
||||
} |
||||
public TableDataComboBox(TableDataSource source, String treeName) { |
||||
super(); |
||||
this.treeName = treeName; |
||||
this.setRenderer(new UIComboBoxRenderer() { |
||||
private static final long serialVersionUID = 1L; |
||||
|
||||
@Override |
||||
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { |
||||
JLabel renderer = (JLabel)super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); |
||||
if (value instanceof TableDataWrapper) { |
||||
TableDataWrapper tabledatawrappe = (TableDataWrapper)value; |
||||
renderer.setIcon(tabledatawrappe.getIcon()); |
||||
renderer.setText(tabledatawrappe.getTableDataName()); |
||||
renderer.setToolTipText(tabledatawrappe.getTableDataName()); |
||||
} else { |
||||
renderer.setIcon(null); |
||||
renderer.setText(StringUtils.EMPTY); |
||||
} |
||||
return renderer; |
||||
} |
||||
}); |
||||
refresh(source); |
||||
registerDSChangeListener(); |
||||
} |
||||
|
||||
/** |
||||
* refresh ComboBox |
||||
* @param source |
||||
*/ |
||||
public void refresh(TableDataSource source) { |
||||
TableDataWrapper dataWrapper = getSelectedItem(); |
||||
refresModel = true; |
||||
setResMap(source); |
||||
setDsMap(); |
||||
DefaultComboBoxModel model = new DefaultComboBoxModel(); |
||||
this.setModel(model); |
||||
model.addElement(UIConstants.PENDING); |
||||
Iterator<Entry<String, TableDataWrapper>> entryIt = dsMap.entrySet().iterator(); |
||||
while (entryIt.hasNext()) { |
||||
TableDataWrapper tableDataWrapper = entryIt.next().getValue(); |
||||
if (!ComparatorUtils.equals(tableDataWrapper.getTableDataName(), treeName)) { |
||||
model.addElement(tableDataWrapper); |
||||
} |
||||
} |
||||
if (dataWrapper != null) { |
||||
if (DesignTableDataManager.isDsNameChanged(dataWrapper.getTableDataName())) { |
||||
this.setSelectedTableDataByName(DesignTableDataManager.getChangedDsNameByOldDsName(dataWrapper.getTableDataName())); |
||||
} else { |
||||
this.getModel().setSelectedItem(dataWrapper); |
||||
} |
||||
} |
||||
refresModel = false; |
||||
} |
||||
|
||||
protected void setResMap(TableDataSource source) { |
||||
this.resMap = DesignTableDataManager.getAllEditingDataSet(source); |
||||
} |
||||
|
||||
private void setDsMap() { |
||||
dsMap = DesignTableDataManager.getAllDataSetIncludingProcedure(resMap); |
||||
} |
||||
|
||||
|
||||
|
||||
/** |
||||
* 向resMap中添加TableData信息 |
||||
* @param name 数据集名字 |
||||
* @param templateTableDataWrappe 数据集 |
||||
*/ |
||||
public void putTableDataIntoMap(String name, TemplateTableDataWrapper templateTableDataWrappe) { |
||||
if (dsMap.containsKey(name)) { |
||||
return; |
||||
} |
||||
this.addItem(templateTableDataWrappe); |
||||
dsMap.put(name, templateTableDataWrappe); |
||||
} |
||||
|
||||
public void setSelectedTableDataByName(String name) { |
||||
TableDataWrapper tableDataWrappe = dsMap.get(name) == null? dsMap.get(name + "_P_CURSOR") : dsMap.get(name); |
||||
this.getModel().setSelectedItem(tableDataWrappe); |
||||
} |
||||
|
||||
@Override |
||||
public TableDataWrapper getSelectedItem() { |
||||
if (dataModel.getSelectedItem() instanceof TableDataWrapper) { |
||||
return (TableDataWrapper)dataModel.getSelectedItem(); |
||||
} |
||||
return null; |
||||
} |
||||
|
||||
//august:addElement方法竟然会fireItemStateChanged,蛋疼
|
||||
@Override |
||||
protected void fireItemStateChanged(ItemEvent e) { |
||||
if (!refresModel) { |
||||
super.fireItemStateChanged(e); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
*注册listener,相应数据集改变 |
||||
*/ |
||||
public void registerDSChangeListener() { |
||||
DesignTableDataManager.addDsChangeListener(new ChangeListener() { |
||||
public void stateChanged(ChangeEvent e) { |
||||
TableDataComboBox.this.refresh(DesignTableDataManager.getEditingTableDataSource()); |
||||
} |
||||
}); |
||||
} |
||||
} |
@ -0,0 +1,134 @@
|
||||
/* |
||||
* Copyright (c) 2001-2014,FineReport Inc, All Rights Reserved. |
||||
*/ |
||||
|
||||
package com.fr.design.data.datapane; |
||||
|
||||
import com.fr.data.impl.*; |
||||
import com.fr.data.impl.storeproc.StoreProcedure; |
||||
import com.fr.design.ExtraDesignClassManager; |
||||
import com.fr.design.data.tabledata.tabledatapane.*; |
||||
import com.fr.design.fun.TableDataCreatorProvider; |
||||
import com.fr.general.Inter; |
||||
import com.fr.stable.ArrayUtils; |
||||
|
||||
import java.util.ArrayList; |
||||
import java.util.List; |
||||
|
||||
/** |
||||
* @author : richie |
||||
* @since : 8.0 |
||||
*/ |
||||
public class TableDataCreatorProducer { |
||||
|
||||
private static TableDataCreatorProducer ourInstance = new TableDataCreatorProducer(); |
||||
|
||||
public static TableDataCreatorProducer getInstance() { |
||||
return ourInstance; |
||||
} |
||||
|
||||
private TableDataCreatorProducer() { |
||||
|
||||
} |
||||
|
||||
public TableDataNameObjectCreator[] createReportTableDataCreator() { |
||||
TableDataNameObjectCreator dataBase = new TableDataNameObjectCreator(Inter.getLocText("DS-Database_Query"), |
||||
"ds", |
||||
"/com/fr/design/images/data/database.png", DBTableData.class, DBTableDataPane.class); |
||||
TableDataNameObjectCreator ds_Class = new TableDataNameObjectCreator(Inter.getLocText("DS-Class"), |
||||
"/com/fr/design/images/data/source/classTableData.png", ClassTableData.class, ClassTableDataPane.class); |
||||
TableDataNameObjectCreator table = new TableDataNameObjectCreator(Inter.getLocText("DS-Embedded_TableData"), |
||||
"Embedded", |
||||
"/com/fr/design/images/data/dataTable.png", EmbeddedTableData.class, EmbeddedTableDataPane.class); |
||||
TableDataNameObjectCreator multiTable = new TableDataNameObjectCreator(Inter.getLocText("DS-Relation_TableData"), |
||||
"Multi", |
||||
"/com/fr/design/images/data/multi.png", ConditionTableData.class, MultiTDTableDataPane.class) { |
||||
public boolean isNeedParameterWhenPopulateJControlPane() { |
||||
return true; |
||||
} |
||||
}; |
||||
TableDataNameObjectCreator fileTable = new TableDataNameObjectCreator(Inter.getLocText(new String[]{"File", "DS-TableData"}), |
||||
"File", |
||||
"/com/fr/design/images/data/file.png", FileTableData.class, FileTableDataSmallHeightPane.class); |
||||
TableDataNameObjectCreator treeTable = new TableDataNameObjectCreator(Inter.getLocText(new String[]{"Tree", "DS-TableData"}), |
||||
"Tree", |
||||
"/com/fr/design/images/data/tree.png", RecursionTableData.class, TreeTableDataPane.class) { |
||||
public boolean isNeedParameterWhenPopulateJControlPane() { |
||||
return true; |
||||
} |
||||
}; |
||||
TableDataNameObjectCreator storeProcedure = new TableDataNameObjectCreator(Inter.getLocText("Datasource-Stored_Procedure"), |
||||
"Proc", |
||||
"/com/fr/design/images/data/store_procedure.png", |
||||
StoreProcedure.class, ProcedureDataPane.class) { |
||||
public boolean shouldInsertSeparator() { |
||||
return true; |
||||
} |
||||
}; |
||||
TableDataNameObjectCreator[] creators = new TableDataNameObjectCreator[]{dataBase, ds_Class, table, fileTable, storeProcedure, multiTable, treeTable}; |
||||
return merge(creators, ExtraDesignClassManager.getInstance().getReportTableDataCreators()); |
||||
} |
||||
|
||||
public TableDataNameObjectCreator[] createServerTableDataCreator() { |
||||
TableDataNameObjectCreator dataBase = new TableDataNameObjectCreator(Inter.getLocText("DS-Database_Query"), "/com/fr/design/images/data/dock/serverdatabase.png", DBTableData.class, |
||||
DBTableDataPane.class); |
||||
TableDataNameObjectCreator ds_Class = new TableDataNameObjectCreator(Inter.getLocText("DS-Class"), "/com/fr/design/images/data/dock/serverclasstabledata.png", ClassTableData.class, |
||||
ClassTableDataPane.class); |
||||
TableDataNameObjectCreator table = new TableDataNameObjectCreator(Inter.getLocText("DS-Embedded_TableData"), "/com/fr/design/images/data/dock/serverdatatable.png", EmbeddedTableData.class, |
||||
EmbeddedTableDataPane.class); |
||||
TableDataNameObjectCreator fileTable = new TableDataNameObjectCreator(Inter.getLocText(new String[]{"File", "DS-TableData"}), "/com/fr/design/images/data/file.png", FileTableData.class, |
||||
FileTableDataSmallPane.class); |
||||
|
||||
TableDataNameObjectCreator treeTable = new TableDataNameObjectCreator(Inter.getLocText(new String[]{"Tree", "DS-TableData"}), "/com/fr/design/images/data/tree.png", |
||||
RecursionTableData.class, GlobalTreeTableDataPane.class) { |
||||
public boolean isNeedParameterWhenPopulateJControlPane() { |
||||
return true; |
||||
} |
||||
}; |
||||
TableDataNameObjectCreator multiTable = new TableDataNameObjectCreator(Inter.getLocText("DS-Relation_TableData"), "/com/fr/design/images/data/multi.png", |
||||
ConditionTableData.class, GlobalMultiTDTableDataPane.class) { |
||||
public boolean isNeedParameterWhenPopulateJControlPane() { |
||||
return true; |
||||
} |
||||
}; |
||||
TableDataNameObjectCreator storeProcedure = new TableDataNameObjectCreator(Inter.getLocText("Datasource-Stored_Procedure"), "/com/fr/design/images/data/store_procedure.png", |
||||
StoreProcedure.class, ProcedureDataPane.class) { |
||||
public boolean shouldInsertSeparator() { |
||||
return true; |
||||
} |
||||
}; |
||||
|
||||
TableDataNameObjectCreator[] creators = new TableDataNameObjectCreator[]{dataBase, ds_Class, table, fileTable, storeProcedure, multiTable, treeTable}; |
||||
|
||||
TableDataCreatorProvider creatorProvider = ExtraDesignClassManager.getInstance().getTableDataCreatorProvider(); |
||||
if (creatorProvider != null) { |
||||
return creatorProvider.produceServerTableDataCreator(creators); |
||||
} |
||||
return merge(creators, ExtraDesignClassManager.getInstance().getServerTableDataCreators()); |
||||
} |
||||
|
||||
private TableDataNameObjectCreator[] merge(TableDataNameObjectCreator[] creators, TableDataNameObjectCreator[] extraCreators) { |
||||
if (ArrayUtils.isEmpty(extraCreators)) { |
||||
return creators; |
||||
} |
||||
List<TableDataNameObjectCreator> list = new ArrayList<>(); |
||||
List<Integer> coverIndexList = new ArrayList<>(); |
||||
List<TableDataNameObjectCreator> coverCreators = new ArrayList<>(); |
||||
for (TableDataNameObjectCreator ex : extraCreators) { |
||||
int index = ArrayUtils.indexOf(creators, ex); |
||||
// 说明已经存在了一个同类型的数据集,需要用插件的覆盖掉原先的
|
||||
if (index != ArrayUtils.INDEX_NOT_FOUND) { |
||||
// 需要替换到列表里的
|
||||
coverIndexList.add(index); |
||||
coverCreators.add(ex); |
||||
} else { |
||||
// 需要添加到列表中去的
|
||||
list.add(ex); |
||||
} |
||||
} |
||||
for (int i = 0; i < coverIndexList.size(); i ++) { |
||||
creators[coverIndexList.get(i)] = coverCreators.get(i); |
||||
} |
||||
return (TableDataNameObjectCreator[])ArrayUtils.addAll(creators, list.toArray(new TableDataNameObjectCreator[list.size()])); |
||||
} |
||||
} |
@ -0,0 +1,261 @@
|
||||
package com.fr.design.data.datapane; |
||||
|
||||
import com.fr.base.TableData; |
||||
import com.fr.data.TableDataSource; |
||||
import com.fr.data.impl.storeproc.StoreProcedure; |
||||
import com.fr.design.data.DesignTableDataManager; |
||||
import com.fr.design.gui.controlpane.JControlPane; |
||||
import com.fr.design.gui.controlpane.NameableCreator; |
||||
import com.fr.design.gui.ilist.ListModelElement; |
||||
import com.fr.file.DatasourceManagerProvider; |
||||
import com.fr.general.ComparatorUtils; |
||||
import com.fr.general.Inter; |
||||
import com.fr.general.NameObject; |
||||
import com.fr.stable.Nameable; |
||||
import com.fr.stable.StringUtils; |
||||
import com.fr.stable.core.PropertyChangeAdapter; |
||||
|
||||
import javax.swing.*; |
||||
import java.util.*; |
||||
|
||||
/** |
||||
* TableDataList Pane. |
||||
*/ |
||||
public class TableDataListPane extends JControlPane { |
||||
private Map<String, String> dsNameChangedMap = new HashMap<String, String>(); |
||||
private boolean isNamePermitted = true; |
||||
|
||||
public TableDataListPane() { |
||||
super(); |
||||
dsNameChangedMap.clear(); |
||||
this.addEditingListner(new PropertyChangeAdapter() { |
||||
@Override |
||||
public void propertyChange() { |
||||
isNamePermitted = true; |
||||
TableDataSource source = DesignTableDataManager.getEditingTableDataSource(); |
||||
String[] allDSNames = DesignTableDataManager.getAllDSNames(source); |
||||
String[] allListNames = nameableList.getAllNames(); |
||||
allListNames[nameableList.getSelectedIndex()] = StringUtils.EMPTY; |
||||
String tempName = getEditingName(); |
||||
Object editingType = getEditingType(); |
||||
if (StringUtils.isEmpty(tempName)) { |
||||
String[] warning = new String[]{"NOT_NULL_Des", "Please_Rename"}; |
||||
String[] sign = new String[]{",", "!"}; |
||||
isNamePermitted = false; |
||||
nameableList.stopEditing(); |
||||
JOptionPane.showMessageDialog(SwingUtilities.getWindowAncestor(TableDataListPane.this), Inter.getLocText(warning, sign)); |
||||
setWarnigText(editingIndex); |
||||
return; |
||||
} |
||||
|
||||
if (!ComparatorUtils.equals(tempName, selectedName) |
||||
&& isNameRepeted(new List[]{Arrays.asList(allDSNames), Arrays.asList(allListNames)}, tempName)) { |
||||
String[] waning = new String[]{"already_exists", "TableData", "Please_Rename"}; |
||||
String[] sign = new String[]{"", tempName + ",", "!"}; |
||||
isNamePermitted = false; |
||||
nameableList.stopEditing(); |
||||
JOptionPane.showMessageDialog(SwingUtilities.getWindowAncestor(TableDataListPane.this), Inter.getLocText(waning, sign)); |
||||
setWarnigText(editingIndex); |
||||
} else if (editingType instanceof StoreProcedure && isIncludeUnderline(tempName)) { |
||||
String[] datasource_underline = new String[]{"Datasource-Stored_Procedure", "Name", "can_not_include_underline"}; |
||||
String[] sign = new String[]{"", "", "!"}; |
||||
isNamePermitted = false; |
||||
nameableList.stopEditing(); |
||||
JOptionPane.showMessageDialog(SwingUtilities.getWindowAncestor(TableDataListPane.this), Inter.getLocText(datasource_underline, sign)); |
||||
setWarnigText(editingIndex); |
||||
} |
||||
if (nameableList.getSelectedValue() instanceof ListModelElement) { |
||||
Nameable selected = ((ListModelElement) nameableList.getSelectedValue()).wrapper; |
||||
if (!ComparatorUtils.equals(tempName, selected.getName())) { |
||||
rename(selected.getName(), tempName); |
||||
|
||||
} |
||||
} |
||||
} |
||||
}); |
||||
} |
||||
|
||||
protected void rename(String oldName, String newName) { |
||||
dsNameChangedMap.put(oldName, newName); |
||||
} |
||||
|
||||
/** |
||||
* 名字是否允许 |
||||
* |
||||
* @return 是/否 |
||||
*/ |
||||
public boolean isNamePermitted() { |
||||
return isNamePermitted; |
||||
} |
||||
|
||||
|
||||
/** |
||||
* 检查按钮可用状态 Check button enabled. |
||||
*/ |
||||
public void checkButtonEnabled() { |
||||
super.checkButtonEnabled(); |
||||
isNamePermitted = !isContainsRename(); |
||||
} |
||||
|
||||
private boolean isIncludeUnderline(String name) { |
||||
return ComparatorUtils.equals(name.indexOf(StoreProcedure.SPLIT), -1) ? false : true; |
||||
} |
||||
|
||||
/** |
||||
* 创建服务器数据集所需要的NameableCreator数组 |
||||
* |
||||
* @return 数组 |
||||
*/ |
||||
public NameableCreator[] createNameableCreators() { |
||||
return TableDataCreatorProducer.getInstance().createServerTableDataCreator(); |
||||
} |
||||
|
||||
|
||||
// 只能保证当前模板不重名了
|
||||
|
||||
/** |
||||
* 新建不重名的面板 |
||||
* |
||||
* @param prefix 前缀字符 |
||||
* @return 生成的名字 |
||||
*/ |
||||
@Override |
||||
public String createUnrepeatedName(String prefix) { |
||||
TableDataSource source = DesignTableDataManager.getEditingTableDataSource(); |
||||
if (source == null) { |
||||
return super.createUnrepeatedName(prefix); |
||||
} |
||||
String[] allDsNames = DesignTableDataManager.getAllDSNames(source); |
||||
DefaultListModel model = this.getModel(); |
||||
Nameable[] all = new Nameable[model.getSize()]; |
||||
for (int i = 0; i < model.size(); i++) { |
||||
all[i] = ((ListModelElement) model.get(i)).wrapper; |
||||
} |
||||
// richer:生成的名字从1开始. kunsnat: 添加属性从0开始.
|
||||
int count = all.length + 1; |
||||
while (true) { |
||||
String name_test = prefix + count; |
||||
boolean repeated = false; |
||||
for (int i = 0, len = model.size(); i < len; i++) { |
||||
Nameable nameable = all[i]; |
||||
if (ComparatorUtils.equals(nameable.getName(), name_test)) { |
||||
repeated = true; |
||||
break; |
||||
} |
||||
} |
||||
for (String dsname : allDsNames) { |
||||
if (ComparatorUtils.equals(dsname, name_test)) { |
||||
repeated = true; |
||||
break; |
||||
} |
||||
} |
||||
|
||||
if (!repeated) { |
||||
return name_test; |
||||
} |
||||
|
||||
count++; |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
protected String title4PopupWindow() { |
||||
return "TableData"; |
||||
} |
||||
|
||||
/** |
||||
* Populate. |
||||
*/ |
||||
public void populate(TableDataSource tds) { |
||||
List<NameObject> nameObjectList = new ArrayList<NameObject>(); |
||||
|
||||
Iterator tableDataNameIterator = tds.getTableDataNameIterator(); |
||||
while (tableDataNameIterator.hasNext()) { |
||||
String tableDataName = (String) tableDataNameIterator.next(); |
||||
TableData tableData = tds.getTableData(tableDataName); |
||||
|
||||
if (tableData != null) { |
||||
nameObjectList.add(new NameObject(tableDataName, tableData)); |
||||
} |
||||
} |
||||
|
||||
populate(nameObjectList.toArray(new NameObject[nameObjectList.size()])); |
||||
} |
||||
|
||||
/** |
||||
* Populate. |
||||
*/ |
||||
public void populate(DatasourceManagerProvider datasourceManager) { |
||||
Iterator<String> nameIt = datasourceManager.getTableDataNameIterator(); |
||||
Iterator<String> procedurenameIt = datasourceManager.getProcedureNameIterator(); |
||||
List<NameObject> nameObjectList = new ArrayList<NameObject>(); |
||||
while (nameIt.hasNext()) { |
||||
String name = nameIt.next(); |
||||
nameObjectList.add(new NameObject(name, datasourceManager.getTableData(name))); |
||||
} |
||||
while (procedurenameIt.hasNext()) { |
||||
String name = procedurenameIt.next(); |
||||
nameObjectList.add(new NameObject(name, datasourceManager.getProcedureByName(name))); |
||||
} |
||||
|
||||
populate(nameObjectList.toArray(new NameObject[nameObjectList.size()])); |
||||
} |
||||
|
||||
public void update(DatasourceManagerProvider datasourceManager) { |
||||
datasourceManager.clearAllTableData(); |
||||
datasourceManager.clearAllProcedure(); |
||||
Nameable[] tableDataArray = this.update(); |
||||
for (int i = 0; i < tableDataArray.length; i++) { |
||||
NameObject nameObject = (NameObject) tableDataArray[i]; |
||||
datasourceManager.putTableData(nameObject.getName(), (TableData) nameObject.getObject()); |
||||
} |
||||
} |
||||
|
||||
public void update(TableDataSource tds) { |
||||
tds.clearAllTableData(); |
||||
|
||||
Nameable[] tableDataArray = this.update(); |
||||
for (int i = 0; i < tableDataArray.length; i++) { |
||||
NameObject nameObject = (NameObject) tableDataArray[i]; |
||||
tds.putTableData(nameObject.getName(), (TableData) nameObject.getObject()); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 判断数据集是否重名 |
||||
*/ |
||||
public void checkValid() throws Exception { |
||||
List<String> exsitTableDataNameList = new ArrayList<String>(); |
||||
// _denny: 判断是否有重复的数据集名
|
||||
checkRepeatedDSName(exsitTableDataNameList); |
||||
|
||||
Nameable[] tableDataArray = this.update(); |
||||
for (int i = 0; i < tableDataArray.length; i++) { |
||||
NameObject nameObject = (NameObject) tableDataArray[i]; |
||||
|
||||
if (exsitTableDataNameList.contains(nameObject.getName())) { |
||||
String[] waring = new String[]{"TableData", "Error_TableDataNameRepeat"}; |
||||
String[] sign = new String[]{": " + nameObject.getName()}; |
||||
throw new Exception(Inter.getLocText(waring, sign)); |
||||
} |
||||
|
||||
exsitTableDataNameList.add(nameObject.getName()); |
||||
} |
||||
} |
||||
|
||||
protected void checkRepeatedDSName(List<String> exsitTableDataNameList) { |
||||
} |
||||
|
||||
/** |
||||
* 在JJControlPane的左侧Tree里面选中某一Item |
||||
* |
||||
* @param name 被选择的Item名称 |
||||
*/ |
||||
public void selectName(String name) { |
||||
this.setSelectedName(name); |
||||
} |
||||
|
||||
public Map<String, String> getDsNameChangedMap() { |
||||
return this.dsNameChangedMap; |
||||
} |
||||
} |
@ -0,0 +1,178 @@
|
||||
package com.fr.design.data.datapane; |
||||
|
||||
import com.fr.base.BaseUtils; |
||||
import com.fr.base.FRContext; |
||||
import com.fr.data.impl.DBTableData; |
||||
import com.fr.design.actions.tabledata.TableDataAction; |
||||
import com.fr.design.beans.BasicBeanPane; |
||||
import com.fr.design.gui.controlpane.NameObjectCreator; |
||||
import com.fr.design.icon.WarningIcon; |
||||
import com.fr.general.ComparatorUtils; |
||||
import com.fr.general.Inter; |
||||
import com.fr.stable.ArrayUtils; |
||||
import com.fr.stable.StringUtils; |
||||
|
||||
import javax.swing.*; |
||||
import java.awt.*; |
||||
import java.text.Collator; |
||||
import java.util.*; |
||||
import java.util.List; |
||||
|
||||
/** |
||||
* Created by IntelliJ IDEA. |
||||
* Author : daisy |
||||
* Version: 6.5.6 |
||||
* Date: 13-12-20 |
||||
* Time: 上午9:55 |
||||
*/ |
||||
public class TableDataNameObjectCreator extends NameObjectCreator { |
||||
private boolean b = false; |
||||
private Image menuImage; |
||||
private String iconPath; |
||||
private boolean isNeedInsertSeparator = false; |
||||
private String prefix = ""; |
||||
private java.util.List<String> names = new ArrayList<String>(); |
||||
|
||||
public TableDataNameObjectCreator(TableDataAction action) { |
||||
super(action.getDisplayName(), action.getIconPath(), action.getTableDataClass(), action.getUpdateTableDataPaneClass()); |
||||
this.iconPath = action.getIconPath(); |
||||
menuImage = BaseUtils.readImage(iconPath); |
||||
isNeedInsertSeparator = action.isNeedInsertSeparator(); |
||||
prefix = action.getPrefix(); |
||||
} |
||||
|
||||
public TableDataNameObjectCreator(TableDataAction action, Class clazz4Init) { |
||||
super(action.getDisplayName(), action.getIconPath(), action.getTableDataClass(), clazz4Init, action.getUpdateTableDataPaneClass()); |
||||
isNeedInsertSeparator = action.isNeedInsertSeparator(); |
||||
prefix = action.getPrefix(); |
||||
} |
||||
|
||||
public TableDataNameObjectCreator(String menuName, String iconPath, Class clazz, Class<? extends BasicBeanPane> updatePane) { |
||||
super(menuName, iconPath, clazz, updatePane); |
||||
if (iconPath != null) { |
||||
this.iconPath = iconPath; |
||||
menuImage = BaseUtils.readImage(iconPath); |
||||
} |
||||
} |
||||
|
||||
public TableDataNameObjectCreator(String menuName, String prefix, String iconPath, Class clazz, Class<? extends BasicBeanPane> updatePane) { |
||||
super(menuName, iconPath, clazz, updatePane); |
||||
if (iconPath != null) { |
||||
this.iconPath = iconPath; |
||||
menuImage = BaseUtils.readImage(iconPath); |
||||
} |
||||
this.prefix = prefix; |
||||
} |
||||
|
||||
public TableDataNameObjectCreator(String menuName, String iconPath, Class clazz, Class clazz4Init, Class<? extends BasicBeanPane> updatePane) { |
||||
super(menuName, iconPath, clazz, clazz4Init, updatePane); |
||||
if (iconPath != null) { |
||||
this.iconPath = iconPath; |
||||
menuImage = BaseUtils.readImage(iconPath); |
||||
} |
||||
} |
||||
|
||||
public TableDataNameObjectCreator(String menuName, String prefix, String iconPath, Class clazz, Class clazz4Init, Class<? extends BasicBeanPane> updatePane) { |
||||
super(menuName, iconPath, clazz, clazz4Init, updatePane); |
||||
if (iconPath != null) { |
||||
this.iconPath = iconPath; |
||||
menuImage = BaseUtils.readImage(iconPath); |
||||
} |
||||
this.prefix = prefix; |
||||
} |
||||
|
||||
|
||||
@Override |
||||
protected void doSthChanged4Icon(Object ob) { |
||||
if (ob instanceof DBTableData) { |
||||
DBTableData db = (DBTableData) ob; |
||||
b = StringUtils.isBlank(db.getQuery()); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 取得菜单的图片 |
||||
* |
||||
* @return 图片 |
||||
*/ |
||||
public Icon menuIcon() { |
||||
return createMenuIcon(); |
||||
} |
||||
|
||||
public String getIconPath() { |
||||
return iconPath; |
||||
} |
||||
|
||||
private Icon createMenuIcon() { |
||||
return b ? new WarningIcon(this.menuImage) : this.menuIcon; |
||||
} |
||||
|
||||
/** |
||||
* 创建提示 |
||||
* |
||||
* @return 提示 |
||||
*/ |
||||
public String createTooltip() { |
||||
return b ? Inter.getLocText("Connect_SQL_Cannot_Null") : null; |
||||
} |
||||
|
||||
public String getPrefix() { |
||||
return StringUtils.isNotBlank(prefix) ? prefix : menuName(); |
||||
} |
||||
|
||||
/** |
||||
* 将names排序 |
||||
* |
||||
* @return |
||||
*/ |
||||
public List<String> getNames() { |
||||
String[] namearray = names.toArray(ArrayUtils.EMPTY_STRING_ARRAY); |
||||
Arrays.sort(namearray, Collator.getInstance(java.util.Locale.CHINA)); |
||||
return Arrays.asList(namearray); |
||||
} |
||||
|
||||
public Object createObject() { |
||||
try { |
||||
return clazzOfObject.newInstance(); |
||||
} catch (InstantiationException e) { |
||||
try { |
||||
return clazzOfInitCase.newInstance(); |
||||
} catch (InstantiationException | IllegalAccessException e1) { |
||||
FRContext.getLogger().error(e.getMessage(), e); |
||||
} |
||||
} catch (IllegalAccessException e) { |
||||
FRContext.getLogger().error(e.getMessage(), e); |
||||
} |
||||
return null; |
||||
} |
||||
|
||||
/** |
||||
* 加入名字 |
||||
* |
||||
* @param names 名字 |
||||
*/ |
||||
public void addNames(String names) { |
||||
this.names.add(names); |
||||
} |
||||
|
||||
/** |
||||
* 清除 |
||||
*/ |
||||
public void clear() { |
||||
this.names.clear(); |
||||
} |
||||
|
||||
public boolean shouldInsertSeparator() { |
||||
return false; |
||||
} |
||||
|
||||
public boolean equals(Object obj) { |
||||
return obj instanceof TableDataNameObjectCreator |
||||
&& ComparatorUtils.equals(menuName, ((TableDataNameObjectCreator) obj).menuName); |
||||
} |
||||
|
||||
@Override |
||||
public int hashCode() { |
||||
return menuName == null ? 0 : menuName.hashCode(); |
||||
} |
||||
} |
@ -0,0 +1,236 @@
|
||||
package com.fr.design.data.datapane; |
||||
|
||||
import java.util.ArrayList; |
||||
import java.util.Collections; |
||||
import java.util.Iterator; |
||||
import java.util.List; |
||||
import java.util.Map; |
||||
import java.util.Map.Entry; |
||||
|
||||
import com.fr.general.NameObject; |
||||
import com.fr.base.StoreProcedureParameter; |
||||
import com.fr.base.TableData; |
||||
import com.fr.design.data.DesignTableDataManager; |
||||
import com.fr.data.TableDataSource; |
||||
import com.fr.data.impl.storeproc.StoreProcedure; |
||||
import com.fr.data.impl.storeproc.StoreProcedureConstants; |
||||
import com.fr.design.data.tabledata.wrapper.StoreProcedureDataWrapper; |
||||
import com.fr.design.data.tabledata.wrapper.StoreProcedureNameWrapper; |
||||
import com.fr.design.data.tabledata.wrapper.TableDataWrapper; |
||||
import com.fr.design.DesignModelAdapter; |
||||
import com.fr.design.gui.itree.refreshabletree.ExpandMutableTreeNode; |
||||
import com.fr.design.gui.itree.refreshabletree.UserObjectOP; |
||||
import com.fr.general.Inter; |
||||
|
||||
/** |
||||
* 数据集树的操作 |
||||
* |
||||
* @editor zhou |
||||
* @since 2012-3-28下午9:58:53 |
||||
*/ |
||||
public class TableDataSourceOP implements UserObjectOP<TableDataWrapper> { |
||||
public static final int TEMPLATE_TABLE_DATA = 0; |
||||
public static final int SERVER_TABLE_DATA = 1; |
||||
public static final int STORE_PRECEDURE_DATA = 2; |
||||
public static int dataMode = -1; |
||||
|
||||
private DesignModelAdapter<?, ?> tc; |
||||
|
||||
|
||||
public TableDataSourceOP(DesignModelAdapter<?, ?> tc) { |
||||
this.tc = tc; |
||||
} |
||||
|
||||
/** |
||||
* 初始化数据集的list |
||||
* |
||||
* @return |
||||
*/ |
||||
@Override |
||||
public List<Map<String, TableDataWrapper>> init() { |
||||
if (tc != null) { |
||||
return DesignTableDataManager.getEditingDataSet(tc.getBook()); |
||||
} |
||||
List<Map<String, TableDataWrapper>> empty = new ArrayList<Map<String, TableDataWrapper>>(); |
||||
empty.add(Collections.<String, TableDataWrapper>emptyMap());//数据集
|
||||
empty.add(Collections.<String, TableDataWrapper>emptyMap());//服务器数据集
|
||||
empty.add(Collections.<String, TableDataWrapper>emptyMap());//存储过程
|
||||
return empty; |
||||
} |
||||
|
||||
/** |
||||
* ButtonEnabled intercept |
||||
* @return interceptbuttonEnabled |
||||
*/ |
||||
@Override |
||||
public boolean interceptButtonEnabled() { |
||||
return tc == null; |
||||
} |
||||
|
||||
/** |
||||
* 移除名字是name的TableData |
||||
* @param name tabledata name |
||||
*/ |
||||
public void removeAction(String name) { |
||||
if (tc != null) { |
||||
TableDataSource tds = tc.getBook(); |
||||
tds.removeTableData(name); |
||||
|
||||
tc.fireTargetModified(); |
||||
} |
||||
} |
||||
|
||||
private ExpandMutableTreeNode[] getNodeArrayFromMap(Map<String, TableDataWrapper> map) { |
||||
List<ExpandMutableTreeNode> dataList = new ArrayList<ExpandMutableTreeNode>(); |
||||
Iterator<Entry<String, TableDataWrapper>> entryIt = map.entrySet().iterator(); |
||||
while (entryIt.hasNext()) { |
||||
Entry<String, TableDataWrapper> entry = entryIt.next(); |
||||
String name = entry.getKey(); |
||||
TableDataWrapper t = entry.getValue(); |
||||
|
||||
ExpandMutableTreeNode newChildTreeNode = new ExpandMutableTreeNode(new NameObject(name, t)); |
||||
dataList.add(newChildTreeNode); |
||||
newChildTreeNode.add(new ExpandMutableTreeNode()); |
||||
} |
||||
return dataList.toArray(new ExpandMutableTreeNode[dataList.size()]); |
||||
} |
||||
|
||||
private ExpandMutableTreeNode initTemplateDataNode(Map<String, TableDataWrapper> templateDataMap) { |
||||
ExpandMutableTreeNode templateNode = new ExpandMutableTreeNode(new NameObject(Inter.getLocText("DS-TableData"), TEMPLATE_TABLE_DATA), true); |
||||
templateNode.addChildTreeNodes(getNodeArrayFromMap(templateDataMap)); |
||||
return templateNode; |
||||
} |
||||
|
||||
private ExpandMutableTreeNode initServerDataNode(Map<String, TableDataWrapper> serverDataMap) { |
||||
ExpandMutableTreeNode templateNode = new ExpandMutableTreeNode(new NameObject(Inter.getLocText("DS-Server_TableData"), SERVER_TABLE_DATA), false); |
||||
templateNode.addChildTreeNodes(getNodeArrayFromMap(serverDataMap)); |
||||
return templateNode; |
||||
} |
||||
|
||||
private ExpandMutableTreeNode initStoreProcedureNode(Map<String, TableDataWrapper> storeProcedureMap) { |
||||
ExpandMutableTreeNode templateNode = new ExpandMutableTreeNode(new NameObject(Inter.getLocText("Datasource-Stored_Procedure"), STORE_PRECEDURE_DATA), false); |
||||
templateNode.addChildTreeNodes(getNodeArrayFromMap(storeProcedureMap)); |
||||
return templateNode; |
||||
} |
||||
|
||||
/** |
||||
* 根据不同模式生成子节点 |
||||
* |
||||
* @return |
||||
*/ |
||||
@Override |
||||
public ExpandMutableTreeNode[] load() { |
||||
Map<String, TableDataWrapper> templateDataMap = null; |
||||
Map<String, TableDataWrapper> serverDataMap = null; |
||||
Map<String, TableDataWrapper> storeProcedureMap = null; |
||||
|
||||
if (this != null) { |
||||
templateDataMap = this.init().get(0); |
||||
serverDataMap = this.init().get(1); |
||||
storeProcedureMap = this.init().get(2); |
||||
} else { |
||||
templateDataMap = Collections.emptyMap(); |
||||
serverDataMap = Collections.emptyMap(); |
||||
storeProcedureMap = Collections.emptyMap(); |
||||
} |
||||
List<ExpandMutableTreeNode> list = new ArrayList<ExpandMutableTreeNode>(); //所有的数据集
|
||||
List<ExpandMutableTreeNode> templist = new ArrayList<ExpandMutableTreeNode>(); //模板数据集
|
||||
List<ExpandMutableTreeNode> serverlist = new ArrayList<ExpandMutableTreeNode>(); //服务器数据集
|
||||
|
||||
list.add(initTemplateDataNode(templateDataMap)); |
||||
addNodeToList(templateDataMap, templist); |
||||
if (!serverDataMap.isEmpty()) { |
||||
list.add(initServerDataNode(serverDataMap)); |
||||
addNodeToList(serverDataMap, serverlist); |
||||
} |
||||
if (!storeProcedureMap.isEmpty()) { |
||||
list.add(initStoreProcedureNode(storeProcedureMap)); |
||||
for (int i = 0; i < getNodeArrayFromMap(storeProcedureMap).length; i++) { |
||||
ExpandMutableTreeNode tmpNode = getNodeArrayFromMap(storeProcedureMap)[i]; |
||||
if (((NameObject) tmpNode.getUserObject()).getObject() instanceof StoreProcedureNameWrapper) { |
||||
TableData tableData = ((StoreProcedureNameWrapper) (((NameObject) tmpNode.getUserObject()).getObject())).getStoreProcedure(); |
||||
setStoreProcedureTree(tableData, tmpNode); |
||||
serverlist.add(tmpNode); |
||||
} |
||||
} |
||||
} |
||||
switch (dataMode) { |
||||
case TEMPLATE_TABLE_DATA: |
||||
return templist.toArray(new ExpandMutableTreeNode[templist.size()]); |
||||
case SERVER_TABLE_DATA: |
||||
return serverlist.toArray(new ExpandMutableTreeNode[serverlist.size()]); |
||||
default: |
||||
return list.toArray(new ExpandMutableTreeNode[list.size()]); |
||||
} |
||||
} |
||||
|
||||
private void addNodeToList(Map<String, TableDataWrapper> dataMap, List<ExpandMutableTreeNode> dataList) { |
||||
for (int i = 0; i < getNodeArrayFromMap(dataMap).length; i++) { |
||||
ExpandMutableTreeNode tmpNode = getNodeArrayFromMap(dataMap)[i]; |
||||
TableData tableData = ((TableDataWrapper) (((NameObject) tmpNode.getUserObject()).getObject())).getTableData(); |
||||
if (tableData instanceof StoreProcedure) { |
||||
setStoreProcedureTree(tableData, tmpNode); |
||||
dataList.add(tmpNode); |
||||
} else { |
||||
dataList.add(tmpNode); |
||||
} |
||||
} |
||||
} |
||||
|
||||
private void setStoreProcedureTree(TableData tableData, ExpandMutableTreeNode tmpNode) { |
||||
ArrayList<String> nodeName = new ArrayList<String>(); |
||||
StoreProcedure storeProcedure = (StoreProcedure) tableData; |
||||
String name = ((NameObject) tmpNode.getUserObject()).getName(); |
||||
StoreProcedureParameter[] parameters = StoreProcedure.getSortPara(storeProcedure.getParameters()); |
||||
ArrayList<String> resultNames = storeProcedure.getResultNames(); |
||||
boolean hasChild = false; |
||||
tmpNode.remove(0); |
||||
TableDataWrapper tdw = new StoreProcedureNameWrapper(name + "_Table1", storeProcedure); |
||||
ExpandMutableTreeNode childNode = new ExpandMutableTreeNode(new NameObject("Table", tdw)); |
||||
childNode.add(new ExpandMutableTreeNode()); |
||||
tmpNode.add(childNode); |
||||
for (StoreProcedureParameter parameter : parameters) { |
||||
if (parameter.getSchema() != StoreProcedureConstants.IN) { |
||||
if (!nodeName.contains(parameter.getName())) { |
||||
nodeName.add(parameter.getName()); |
||||
hasChild = true; |
||||
String parameterName = name + "_" + parameter.getName(); |
||||
TableDataWrapper newTwd = new StoreProcedureDataWrapper(storeProcedure, name, parameterName, false); |
||||
ExpandMutableTreeNode newChildNode = new ExpandMutableTreeNode(new NameObject(parameter.getName(), newTwd)); |
||||
newChildNode.add(new ExpandMutableTreeNode()); |
||||
tmpNode.add(newChildNode); |
||||
} |
||||
} |
||||
} |
||||
|
||||
if (!resultNames.isEmpty()) { |
||||
for (int i = 0; i < resultNames.size(); i++) { |
||||
if (!nodeName.contains(resultNames.get(i))) { |
||||
nodeName.add(resultNames.get(i)); |
||||
hasChild = true; |
||||
String parameterName = name + "_" + resultNames.get(i); |
||||
TableDataWrapper newTwd = new StoreProcedureDataWrapper(storeProcedure, name, parameterName, false); |
||||
ExpandMutableTreeNode newChildNode = new ExpandMutableTreeNode(new NameObject(resultNames.get(i), newTwd)); |
||||
newChildNode.add(new ExpandMutableTreeNode()); |
||||
tmpNode.add(newChildNode); |
||||
} |
||||
|
||||
} |
||||
|
||||
} |
||||
|
||||
if (hasChild) { |
||||
tmpNode.remove(0); |
||||
} |
||||
} |
||||
|
||||
|
||||
protected void setDataMode(int i) { |
||||
this.dataMode = i; |
||||
} |
||||
|
||||
protected int getDataMode() { |
||||
return dataMode; |
||||
} |
||||
|
||||
} |
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue