package com.fr.van.chart.custom.component; import com.fr.base.BaseFormula; import com.fr.chart.chartattr.Plot; import com.fr.chart.web.ChartHyperPoplink; import com.fr.chart.web.ChartHyperRelateCellLink; import com.fr.chart.web.ChartHyperRelateFloatLink; import com.fr.design.ExtraDesignClassManager; import com.fr.design.beans.BasicBeanPane; import com.fr.design.chart.javascript.ChartEmailPane; import com.fr.design.chart.series.SeriesCondition.impl.ChartHyperPoplinkPane; import com.fr.design.chart.series.SeriesCondition.impl.ChartHyperRelateCellLinkPane; import com.fr.design.chart.series.SeriesCondition.impl.ChartHyperRelateFloatLinkPane; import com.fr.design.chart.series.SeriesCondition.impl.FormHyperlinkPane; import com.fr.design.designer.TargetComponent; import com.fr.design.file.HistoryTemplateListCache; import com.fr.design.fun.HyperlinkProvider; import com.fr.design.gui.controlpane.NameObjectCreator; import com.fr.design.gui.controlpane.NameableCreator; import com.fr.design.gui.imenutable.UIMenuNameableCreator; import com.fr.design.hyperlink.ReportletHyperlinkPane; import com.fr.design.hyperlink.WebHyperlinkPane; import com.fr.design.javascript.JavaScriptImplPane; import com.fr.design.javascript.ParameterJavaScriptPane; import com.fr.design.mainframe.BaseJForm; import com.fr.design.mainframe.JTemplate; import com.fr.design.module.DesignModuleFactory; import com.fr.general.ComparatorUtils; import com.fr.general.NameObject; import com.fr.js.EmailJavaScript; import com.fr.js.FormHyperlinkProvider; import com.fr.js.JavaScript; import com.fr.js.JavaScriptImpl; import com.fr.js.NameJavaScript; import com.fr.js.NameJavaScriptGroup; import com.fr.js.ParameterJavaScript; import com.fr.js.ReportletHyperlink; import com.fr.js.WebHyperlink; import com.fr.log.FineLoggerFactory; import com.fr.stable.ListMap; import com.fr.stable.Nameable; import com.fr.stable.bridge.StableFactory; import com.fr.van.chart.designer.component.VanChartUIListControlPane; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import java.util.Set; /** * Created by Fangjie on 2016/4/28. */ public class VanChartHyperLinkPane extends VanChartUIListControlPane { public VanChartHyperLinkPane() { super(); } @Override public NameableCreator[] createNameableCreators() { //面板初始化,需要在populate的时候更新 Map nameCreators = new ListMap<>(); NameableCreator[] creators = DesignModuleFactory.getHyperlinkGroupType().getHyperlinkCreators(); for (NameableCreator creator : creators) { nameCreators.put(creator.menuName(), creator); } Set providers = ExtraDesignClassManager.getInstance().getArray(HyperlinkProvider.XML_TAG); for (HyperlinkProvider provider : providers) { NameableCreator nc = provider.createHyperlinkCreator(); nameCreators.put(nc.menuName(), nc); } return nameCreators.values().toArray(new NameableCreator[nameCreators.size()]); } public BasicBeanPane createPaneByCreators(NameableCreator creator) { Constructor constructor = null; try { constructor = creator.getUpdatePane().getConstructor(HashMap.class, boolean.class); return constructor.newInstance(getHyperLinkEditorMap(), false); } catch (InstantiationException e) { FineLoggerFactory.getLogger().error(e.getMessage(), e); } catch (IllegalAccessException e) { FineLoggerFactory.getLogger().error(e.getMessage(), e); } catch (NoSuchMethodException e) { return super.createPaneByCreators(creator); } catch (InvocationTargetException e) { FineLoggerFactory.getLogger().error(e.getMessage(), e); } return null; } protected Map getHyperLinkEditorMap() { return getPlot().getHyperLinkEditorMap(); } /** * 弹出列表的标题. * * @return 返回标题字符串. */ public String title4PopupWindow() { return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Hyperlink"); } @Override protected String getAddItemText() { return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Add_Hyperlink"); } @Override protected void initShortCutFactory() { this.shortCutFactory = VanChartShortCutFactory.newInstance(this); } public void populate(NameJavaScriptGroup nameHyperlink_array) { java.util.List list = new ArrayList(); if (nameHyperlink_array != null) { for (int i = 0; i < nameHyperlink_array.size(); i++) { list.add(new NameObject(nameHyperlink_array.getNameHyperlink(i).getName(), nameHyperlink_array.getNameHyperlink(i).getJavaScript())); } } this.populate(list.toArray(new NameObject[list.size()])); } public void populate(TargetComponent elementCasePane) { //populate } /** * updateJs的Group * * @return 返回NameJavaScriptGroup */ public NameJavaScriptGroup updateJSGroup() { Nameable[] res = this.update(); NameJavaScript[] res_array = new NameJavaScript[res.length]; for (int i = 0; i < res.length; i++) { NameObject no = (NameObject) res[i]; res_array[i] = new NameJavaScript(no.getName(), (JavaScript) no.getObject()); } return new NameJavaScriptGroup(res_array); } public void populate(Plot plot) { setPlot(plot); HashMap paneMap = getHyperlinkMap(plot); java.util.List list = refreshList(paneMap); Map creators = new ListMap<>(); int size = list.size(); for (int i = 0; i < size; i++) { UIMenuNameableCreator uiMenuNameableCreator = list.get(i); NameObjectCreator creator = new NameObjectCreator(uiMenuNameableCreator.getName(), uiMenuNameableCreator.getObj().getClass(), uiMenuNameableCreator.getPaneClazz()); creators.put(uiMenuNameableCreator.getName(), creator); } //安装平台内打开插件时, 添加/替换 相应按钮 Set providers = ExtraDesignClassManager.getInstance().getArray(HyperlinkProvider.XML_TAG); for (HyperlinkProvider provider : providers) { NameableCreator creator = provider.createHyperlinkCreator(); if (creator != null) { creators.put(creator.menuName(), new NameObjectCreator(creator.menuName(), creator.getHyperlink(), creator.getUpdatePane())); } } refreshNameableCreator(creators.values().toArray(new NameObjectCreator[0])); java.util.List nameObjects = new ArrayList(); NameJavaScriptGroup nameGroup = populateHotHyperLink(plot); for (int i = 0; nameGroup != null && i < nameGroup.size(); i++) { NameJavaScript javaScript = nameGroup.getNameHyperlink(i); if (javaScript != null && javaScript.getJavaScript() != null) { JavaScript script = javaScript.getJavaScript(); UIMenuNameableCreator uiMenuNameableCreator = new UIMenuNameableCreator(javaScript.getName(), script, getUseMap(paneMap, script.getClass())); nameObjects.add(new NameObject(uiMenuNameableCreator.getName(), uiMenuNameableCreator.getObj())); } } this.populate(nameObjects.toArray(new NameObject[nameObjects.size()])); doLayout(); } protected NameJavaScriptGroup populateHotHyperLink(Plot plot) { return plot.getHotHyperLink(); } protected HashMap getHyperlinkMap(Plot plot) { HashMap map = new HashMap(); map.put(ReportletHyperlink.class, ReportletHyperlinkPane.class); map.put(EmailJavaScript.class, ChartEmailPane.class); map.put(WebHyperlink.class, WebHyperlinkPane.class); map.put(ParameterJavaScript.class, ParameterJavaScriptPane.class); map.put(JavaScriptImpl.class, JavaScriptImplPane.class); map.put(ChartHyperPoplink.class, ChartHyperPoplinkPane.class); map.put(ChartHyperRelateCellLink.class, ChartHyperRelateCellLinkPane.class); map.put(ChartHyperRelateFloatLink.class, ChartHyperRelateFloatLinkPane.class); map.put(FormHyperlinkProvider.class, FormHyperlinkPane.class); return map; } public void update(Plot plot) { NameJavaScriptGroup nameGroup = updateNameGroup(); updateHotHyperLink(plot, nameGroup); } protected void updateHotHyperLink(Plot plot, NameJavaScriptGroup nameGroup) { plot.setHotHyperLink(nameGroup); } private NameJavaScriptGroup updateNameGroup() { Nameable[] nameables = update(); NameJavaScriptGroup nameGroup = new NameJavaScriptGroup(); nameGroup.clear(); for (int i = 0; i < nameables.length; i++) { JavaScript javaScript = (JavaScript) ((NameObject) nameables[i]).getObject(); String name = nameables[i].getName(); NameJavaScript nameJava = new NameJavaScript(name, javaScript); nameGroup.addNameHyperlink(nameJava); } return nameGroup; } protected java.util.List refreshList(HashMap map) { java.util.List list = new ArrayList(); list.add(new UIMenuNameableCreator(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Link_Reportlet"), new ReportletHyperlink(), getUseMap(map, ReportletHyperlink.class))); list.add(new UIMenuNameableCreator(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Link_Mail"), new EmailJavaScript(), VanChartEmailPane.class)); list.add(new UIMenuNameableCreator(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Link_Web"), new WebHyperlink(), getUseMap(map, WebHyperlink.class))); list.add(new UIMenuNameableCreator(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Link_Dynamic_Parameters"), new ParameterJavaScript(), getUseMap(map, ParameterJavaScript.class))); list.add(new UIMenuNameableCreator("JavaScript", new JavaScriptImpl(), getUseMap(map, JavaScriptImpl.class))); list.add(new UIMenuNameableCreator(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Float_Chart"), new ChartHyperPoplink(), getUseMap(map, ChartHyperPoplink.class))); list.add(new UIMenuNameableCreator(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Link_Cell"), new ChartHyperRelateCellLink(), getUseMap(map, ChartHyperRelateCellLink.class))); list.add(new UIMenuNameableCreator(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Link_Float"), new ChartHyperRelateFloatLink(), getUseMap(map, ChartHyperRelateFloatLink.class))); FormHyperlinkProvider hyperlink = StableFactory.getMarkedInstanceObjectFromClass(FormHyperlinkProvider.XML_TAG, FormHyperlinkProvider.class); list.add(new UIMenuNameableCreator(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Link_Form"), hyperlink, getUseMap(map, FormHyperlinkProvider.class))); return list; } protected Class getUseMap(HashMap map, Object key) { if (map.get(key) != null) { return (Class) map.get(key); } //引擎在这边放了个provider,当前表单对象 for (Object tempKey : map.keySet()) { if (((Class) tempKey).isAssignableFrom((Class) key)) { return (Class) map.get(tempKey); } } return null; } //邮箱 public static class VanChartEmailPane extends ChartEmailPane { @Override protected boolean needRenamePane() { return false; } } @Override protected void initCreatorsFilter() { this.creatorsFilter = nameableCreator -> { Class clazz = nameableCreator.getHyperlink(); JTemplate template = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); if (template == null) { return false; } if (template.isJWorkBook()) { // 如果是普通报表单元格,那么没有 FormHyperlink 选项 FormHyperlinkProvider formHyperlink = StableFactory.getMarkedInstanceObjectFromClass(FormHyperlinkProvider.XML_TAG, FormHyperlinkProvider.class); return !ComparatorUtils.equals(clazz, formHyperlink.getClass()); } else { // 如果是决策报表 if (template.getEditingReportIndex() == BaseJForm.ELEMENTCASE_TAB) { // 编辑的是决策报表中的报表块,那么没有 ChartHyperRelateFloatLink选项 return !ComparatorUtils.equals(clazz, ChartHyperRelateFloatLink.class); } Class[] classes = new Class[]{ChartHyperRelateCellLink.class, ChartHyperRelateFloatLink.class}; for (Class aClass : classes) { if (template.getEditingReportIndex() == BaseJForm.FORM_TAB) { // 编辑的是决策报表中的图表,那么没有 ChartHyperRelateFloatLink 和 ChartHyperRelateCellLink 选项 if (ComparatorUtils.equals(aClass, clazz)) { return false; } } } } return true; }; } }