You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
403 lines
12 KiB
403 lines
12 KiB
package com.fr.design; |
|
|
|
import com.fr.base.Parameter; |
|
import com.fr.base.ParameterConfig; |
|
import com.fr.base.TableData; |
|
import com.fr.base.io.BaseBook; |
|
import com.fr.data.TableDataSource; |
|
import com.fr.data.operator.DataOperator; |
|
import com.fr.design.file.HistoryTemplateListCache; |
|
import com.fr.design.mainframe.DesignerFrameFileDealerPane; |
|
import com.fr.design.mainframe.JTemplate; |
|
import com.fr.design.mainframe.JTemplateProvider; |
|
import com.fr.form.ui.DataControl; |
|
import com.fr.form.ui.MultiFileEditor; |
|
import com.fr.form.ui.Widget; |
|
import com.fr.general.ComparatorUtils; |
|
import com.fr.log.FineLoggerFactory; |
|
import com.fr.stable.Filter; |
|
import com.fr.stable.ParameterProvider; |
|
import com.fr.stable.StringUtils; |
|
import com.fr.stable.js.WidgetName; |
|
|
|
import com.fr.util.ParameterApplyHelper; |
|
import java.util.ArrayList; |
|
import java.util.Arrays; |
|
import java.util.HashMap; |
|
import java.util.Iterator; |
|
import java.util.List; |
|
import java.util.Map; |
|
|
|
/** |
|
* 设计器模式 FormModel or WorkBookModel |
|
* <p> |
|
* 指的是编辑的模板是普通报表还是决策报表 |
|
* |
|
* @author zhou |
|
* @since 2012-7-26上午11:24:54 |
|
*/ |
|
public abstract class DesignModelAdapter<T extends BaseBook, S extends JTemplateProvider<T>> { |
|
|
|
/** |
|
* 当前的设计模式 FormModel or WorkBookModel |
|
*/ |
|
private static DesignModelAdapter<?, ?> currentModelAdapter; |
|
/** |
|
* 模板 |
|
*/ |
|
protected S jTemplate; |
|
|
|
/** |
|
* 全部的参数,包括全局参数,模板参数和数据集参数 |
|
*/ |
|
protected Parameter[] parameters; |
|
|
|
/** |
|
* 数据集参数 |
|
*/ |
|
private Parameter[] tableDataParameters; |
|
|
|
/** |
|
* 模板参数 |
|
*/ |
|
private Parameter[] templateParameters; |
|
|
|
/** |
|
* 数据集参数缓存 更新时刷新 |
|
*/ |
|
protected Map<String, ParameterProvider[]> tableDataParametersMap = new HashMap<>(); |
|
|
|
|
|
|
|
public DesignModelAdapter(S jTemplate) { |
|
this.jTemplate = jTemplate; |
|
updateCachedParameter(); |
|
setCurrentModelAdapter(this); |
|
} |
|
|
|
public static void setCurrentModelAdapter(DesignModelAdapter<?, ?> model) { |
|
currentModelAdapter = model; |
|
} |
|
|
|
public static DesignModelAdapter<?, ?> getCurrentModelAdapter() { |
|
return currentModelAdapter; |
|
} |
|
|
|
/** |
|
* 获取当前编辑的模板 |
|
* |
|
* @return template |
|
* @see DesignerFrameFileDealerPane#setCurrentEditingTemplate(JTemplate) |
|
* @see HistoryTemplateListCache#getCurrentEditingTemplate() |
|
* @deprecated use {@link HistoryTemplateListCache#setCurrentEditingTemplate(JTemplate)} instead |
|
*/ |
|
@Deprecated |
|
public S getjTemplate() { |
|
return jTemplate; |
|
} |
|
|
|
/** |
|
* 设置当前编辑的模板 |
|
* 不要脱离上下文直接调用 |
|
* |
|
* @param jTemplate jt |
|
* @see DesignerFrameFileDealerPane#setCurrentEditingTemplate(JTemplate) |
|
* @deprecated use {@link HistoryTemplateListCache#setCurrentEditingTemplate(JTemplate)} instead |
|
*/ |
|
@Deprecated |
|
public void setjTemplate(S jTemplate) { |
|
this.jTemplate = jTemplate; |
|
} |
|
|
|
public T getBook() { |
|
return jTemplate.getTarget(); |
|
} |
|
|
|
|
|
/** |
|
* 响应正在编辑的模板改变事件. |
|
*/ |
|
public void fireTargetModified() { |
|
this.jTemplate.fireTargetModified(); |
|
} |
|
|
|
/** |
|
* 获取悬浮元素名称数组 |
|
* |
|
* @return String[] 悬浮元素名称数组 |
|
*/ |
|
public String[] getFloatNames() { |
|
return new String[0]; |
|
} |
|
|
|
/** |
|
* 获取编辑模板的所有参数 |
|
* <p> |
|
* 由于在参数面板拖动过程中频繁获取 |
|
* 远程设计时数据集参数rpc 调用需要考虑网络等因素,因此会比较缓慢,引起参数面板拖动卡顿, |
|
* 所以缓存一下,并且在参数改动时及时缓存 |
|
* |
|
* @return Parameter[] 模板的所有参数 |
|
*/ |
|
public Parameter[] getParameters() { |
|
return parameters == null ? new Parameter[0] : parameters; |
|
} |
|
|
|
/** |
|
* 模板参数(报表参数) |
|
* <p> |
|
* 既然全部参数都,那么这个也缓存一下,并且在参数改动时及时缓存 |
|
* |
|
* @return Parameter[] 模板参数 |
|
* @deprecated use {@link DesignModelAdapter#getTemplateParameters()} instead |
|
*/ |
|
@Deprecated |
|
public Parameter[] getReportParameters() { |
|
return getTemplateParameters(); |
|
} |
|
|
|
/** |
|
* 模板参数(报表参数) |
|
* <p> |
|
* 既然全部参数都,那么这个也缓存一下,并且在参数改动时及时缓存 |
|
* |
|
* @return Parameter[] 模板参数 |
|
*/ |
|
public Parameter[] getTemplateParameters() { |
|
return templateParameters == null ? new Parameter[0] : templateParameters; |
|
} |
|
|
|
/** |
|
* 数据源参数 |
|
* <p> |
|
* 既然全部参数都,那么这个也缓存一下,并且在参数改动时及时缓存 |
|
* |
|
* @return Parameter[] 数据源参数 |
|
*/ |
|
public Parameter[] getTableDataParameters() { |
|
return tableDataParameters == null ? new Parameter[0] : tableDataParameters; |
|
} |
|
|
|
|
|
/** |
|
* 重命名TableData后的一些操作 |
|
* |
|
* @param oldName 旧名字 |
|
* @param newName 新名字. |
|
* @return 返回是否名字一样. |
|
*/ |
|
public boolean renameTableData(String oldName, String newName) { |
|
return renameTableData(oldName, newName, true); |
|
} |
|
|
|
/** |
|
* 重命名数据集 |
|
* |
|
* @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 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(); |
|
|
|
/** |
|
* 判断是否是值编辑器可以设置的控件类型 |
|
* @param widget 控件 |
|
* @return 可以设置返回true,否则返回false |
|
*/ |
|
public boolean widgetAccepted(Widget widget) { |
|
return widget != null |
|
&& StringUtils.isNotEmpty(widget.getWidgetName()) |
|
&& (widget instanceof DataControl || widget instanceof MultiFileEditor); |
|
} |
|
|
|
/** |
|
* 更新缓存的参数 |
|
*/ |
|
public void updateCachedParameter() { |
|
// 全部参数 |
|
this.parameters = getLatestParameters(); |
|
// 数据及参数 |
|
this.tableDataParameters = getLatestTableDataParameters(); |
|
// 模板参数 |
|
this.templateParameters = getLatestTemplateParameters(); |
|
|
|
} |
|
|
|
protected void addTableDataParameters(Map<String, ParameterProvider> map, Filter<ParameterProvider> filter) { |
|
Iterator<String> it = this.getBook().getTableDataNameIterator(); |
|
try { |
|
// 清空下缓存 |
|
tableDataParametersMap.clear(); |
|
while (it.hasNext()) { |
|
String name = it.next(); |
|
TableData tableData = this.getBook().getTableData(name); |
|
ParameterProvider[] parameterProviders = DataOperator.getInstance().getTableDataParameters(tableData); |
|
if (filter != null) { |
|
ParameterApplyHelper.addPara2Map(map, parameterProviders, filter); |
|
} else { |
|
ParameterApplyHelper.addPara2Map(map, parameterProviders); |
|
} |
|
tableDataParametersMap.put(name, parameterProviders); |
|
} |
|
} catch (Exception e) { |
|
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
|
} |
|
} |
|
|
|
protected void updateTableDataParameters(String oldName, |
|
String tdName, |
|
TableData tableData, |
|
Map<String, ParameterProvider> map, |
|
Filter<ParameterProvider> filter) { |
|
|
|
// 兼容下通过老数据集参数获取 |
|
tableDataParameters = getLatestTableDataParameters(); |
|
|
|
// 处理初始化添加 |
|
if (tableDataParametersMap.isEmpty()) { |
|
addTableDataParameters(map, filter); |
|
return; |
|
} |
|
|
|
ParameterProvider[] providers = null; |
|
|
|
if (!ComparatorUtils.equals(oldName, tdName)) { |
|
// 更新下缓存名称 替换下数据集名称 |
|
providers = tableDataParametersMap.remove(oldName); |
|
if (providers != null) { |
|
tableDataParametersMap.put(tdName, providers); |
|
} |
|
} |
|
|
|
|
|
try { |
|
for (Map.Entry<String, ParameterProvider[]> entry : tableDataParametersMap.entrySet()) { |
|
ParameterProvider[] parameterProviders; |
|
if (ComparatorUtils.equals(entry.getKey(), tdName)) { |
|
parameterProviders = DataOperator.getInstance().getTableDataParameters(tableData); |
|
// 用来更新缓存 |
|
providers = parameterProviders; |
|
} else { |
|
parameterProviders = entry.getValue(); |
|
} |
|
updateParaMap(map, parameterProviders, filter); |
|
} |
|
|
|
// 处理非初始化(已存在数据集参数)时 添加逻辑 |
|
if (!tableDataParametersMap.containsKey(tdName)) { |
|
providers = DataOperator.getInstance().getTableDataParameters(tableData); |
|
updateParaMap(map, providers, filter); |
|
} |
|
} catch (Exception e) { |
|
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
|
} |
|
|
|
if (providers != null) { |
|
// 更新缓存 |
|
tableDataParametersMap.put(tdName, providers); |
|
} |
|
} |
|
|
|
/** |
|
* 更新全部参数中的数据集参数 |
|
*/ |
|
private void updateParaMap(Map<String, ParameterProvider> map, ParameterProvider[] parameterProviders, Filter<ParameterProvider> filter) { |
|
if (filter != null) { |
|
ParameterApplyHelper.addPara2Map(map, parameterProviders, filter); |
|
} else { |
|
ParameterApplyHelper.addPara2Map(map, parameterProviders); |
|
} |
|
} |
|
|
|
public void removeTableDataParameters(String tdName) { |
|
ParameterProvider[] tableDataParameters = tableDataParametersMap.remove(tdName); |
|
List<Parameter> allParameterList = new ArrayList<>(Arrays.asList(parameters)); |
|
List<Parameter> tableDataParameterList = new ArrayList<>(); |
|
for (ParameterProvider parameterProvider : tableDataParameters) { |
|
tableDataParameterList.add((Parameter) parameterProvider); |
|
} |
|
allParameterList.removeAll(tableDataParameterList); |
|
parameters = allParameterList.toArray(new Parameter[0]); |
|
} |
|
|
|
|
|
public void updateAllParameters() { |
|
parameters = getLatestParameters(); |
|
} |
|
|
|
protected void addGlobalParameters(Map<String, ParameterProvider> map) { |
|
// 添加全局参数 |
|
Parameter[] glbParas = ParameterConfig.getInstance().getGlobalParameters(); |
|
ParameterApplyHelper.addPara2Map(map, glbParas); |
|
|
|
} |
|
|
|
/** |
|
* 环境改变. |
|
*/ |
|
public abstract void envChanged(); |
|
|
|
/** |
|
* 参数改变. |
|
*/ |
|
public abstract void parameterChanged(); |
|
|
|
/** |
|
* 数据集参数改变 |
|
*/ |
|
public abstract void tableDataParametersChanged(String oldName, String tdName, TableData tableData); |
|
|
|
/** |
|
* 控件配置改变. |
|
*/ |
|
public abstract void widgetConfigChanged(); |
|
|
|
/** |
|
* 获取变更后的模板参数 |
|
*/ |
|
protected abstract Parameter[] getLatestTemplateParameters(); |
|
|
|
/** |
|
* 获取变更后的数据集参数 |
|
*/ |
|
protected abstract Parameter[] getLatestTableDataParameters(); |
|
|
|
/** |
|
* 获取变更后的全部参数 |
|
*/ |
|
protected abstract Parameter[] getLatestParameters(); |
|
} |