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.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; /** * 设计器模式 FormModel or WorkBookModel *

* 指的是编辑的模板是普通报表还是决策报表 * * @author zhou * @since 2012-7-26上午11:24:54 */ public abstract class DesignModelAdapter> { /** * 当前的设计模式 FormModel or WorkBookModel */ private static DesignModelAdapter currentModelAdapter; /** * 模板 */ protected S jTemplate; /** * 全部的参数,包括全局参数,模板参数和数据集参数 */ protected Parameter[] parameters; /** * 数据集参数 */ private Parameter[] tableDataParameters; /** * 模板参数 */ private Parameter[] templateParameters; /** * 数据集参数缓存 更新时刷新 */ protected Map 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]; } /** * 获取编辑模板的所有参数 *

* 由于在参数面板拖动过程中频繁获取 * 远程设计时数据集参数rpc 调用需要考虑网络等因素,因此会比较缓慢,引起参数面板拖动卡顿, * 所以缓存一下,并且在参数改动时及时缓存 * * @return Parameter[] 模板的所有参数 */ public Parameter[] getParameters() { return parameters == null ? new Parameter[0] : parameters; } /** * 模板参数(报表参数) *

* 既然全部参数都,那么这个也缓存一下,并且在参数改动时及时缓存 * * @return Parameter[] 模板参数 * @deprecated use {@link DesignModelAdapter#getTemplateParameters()} instead */ @Deprecated public Parameter[] getReportParameters() { return getTemplateParameters(); } /** * 模板参数(报表参数) *

* 既然全部参数都,那么这个也缓存一下,并且在参数改动时及时缓存 * * @return Parameter[] 模板参数 */ public Parameter[] getTemplateParameters() { return templateParameters == null ? new Parameter[0] : templateParameters; } /** * 数据源参数 *

* 既然全部参数都,那么这个也缓存一下,并且在参数改动时及时缓存 * * @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 map) { if (map.isEmpty()) { return; } Iterator iterator = map.keySet().iterator(); while (iterator.hasNext()) { String key = iterator.next(); renameTableData(key, map.get(key)); } } public abstract Widget[] getLinkableWidgets(); public abstract List 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 map, Filter filter) { Iterator 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 map, Filter filter) { // 更新下缓存名称 替换下数据集名称 ParameterProvider[] providers = tableDataParametersMap.remove(oldName); if (providers != null) { tableDataParametersMap.put(tdName, providers); } try { for (Map.Entry entry : tableDataParametersMap.entrySet()) { ParameterProvider[] parameterProviders; if (ComparatorUtils.equals(entry.getKey(), tdName)) { parameterProviders = DataOperator.getInstance().getTableDataParameters(tableData); // 用来更新缓存 providers = parameterProviders; } else { parameterProviders = entry.getValue(); } if (filter != null) { ParameterApplyHelper.addPara2Map(map, parameterProviders, filter); } else { ParameterApplyHelper.addPara2Map(map, parameterProviders); } } } catch (Exception e) { FineLoggerFactory.getLogger().error(e.getMessage(), e); } // 更新缓存 tableDataParametersMap.put(tdName, providers); } protected void addGlobalParameters(Map 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(); }