package com.fr.start.module; import com.fr.base.BaseFormula; import com.fr.base.BaseUtils; import com.fr.base.FRContext; import com.fr.base.Formula; import com.fr.base.MultiFieldParameter; import com.fr.base.Style; import com.fr.base.TempNameStyle; import com.fr.base.extension.FileExtension; import com.fr.base.frpx.exception.FRPackageRunTimeException; import com.fr.base.frpx.exception.InvalidWorkBookException; import com.fr.base.io.XMLEncryptUtils; import com.fr.base.process.ProcessOperator; import com.fr.base.remote.RemoteDeziConstants; import com.fr.chart.chartattr.ChartCollection; import com.fr.config.ServerPreferenceConfig; import com.fr.design.ChartTypeInterfaceManager; import com.fr.design.DesignerEnvManager; import com.fr.design.ExtraDesignClassManager; import com.fr.design.actions.core.ActionFactory; import com.fr.design.actions.insert.cell.BiasCellAction; import com.fr.design.actions.insert.cell.ChartCellAction; import com.fr.design.actions.insert.cell.DSColumnCellAction; import com.fr.design.actions.insert.cell.FormulaCellAction; import com.fr.design.actions.insert.cell.GeneralCellAction; import com.fr.design.actions.insert.cell.ImageCellAction; import com.fr.design.actions.insert.cell.RichTextCellAction; import com.fr.design.actions.insert.cell.SubReportCellAction; import com.fr.design.actions.insert.flot.ChartFloatAction; import com.fr.design.actions.insert.flot.FormulaFloatAction; import com.fr.design.actions.insert.flot.ImageFloatAction; import com.fr.design.actions.insert.flot.TextBoxFloatAction; import com.fr.design.actions.server.StyleListAction; import com.fr.design.bridge.DesignToolbarProvider; import com.fr.design.chart.ChartDialog; import com.fr.design.chart.gui.ChartComponent; import com.fr.design.file.HistoryTemplateListPane; import com.fr.design.form.parameter.FormParaDesigner; import com.fr.design.fun.ElementUIProvider; import com.fr.design.gui.controlpane.NameObjectCreator; import com.fr.design.gui.controlpane.NameableCreator; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.ilable.UILabel; import com.fr.design.hyperlink.ReportletHyperlinkPane; import com.fr.design.hyperlink.WebHyperlinkPane; import com.fr.design.javascript.EmailPane; import com.fr.design.javascript.JavaScriptImplPane; import com.fr.design.javascript.ParameterJavaScriptPane; import com.fr.design.javascript.ProcessTransitionAdapter; import com.fr.design.mainframe.App; import com.fr.design.mainframe.BaseJForm; import com.fr.design.mainframe.ChartPropertyPane; import com.fr.design.mainframe.DecodeDialog; import com.fr.design.mainframe.DesignerFrame; import com.fr.design.mainframe.ElementCaseThumbnail; import com.fr.design.mainframe.FormHierarchyTreePane; import com.fr.design.mainframe.InformationCollector; import com.fr.design.mainframe.JForm; import com.fr.design.mainframe.JTemplate; import com.fr.design.mainframe.JWorkBook; import com.fr.design.mainframe.WidgetPropertyPane; import com.fr.design.mainframe.WidgetToolBarPane; import com.fr.design.mainframe.actions.NewFormAction; import com.fr.design.mainframe.bbs.BBSGuestPane; import com.fr.design.mainframe.form.FormECCompositeProvider; import com.fr.design.mainframe.form.FormECDesignerProvider; import com.fr.design.mainframe.form.FormElementCaseDesigner; import com.fr.design.mainframe.form.FormReportComponentComposite; import com.fr.design.mainframe.loghandler.DesignerLogImpl; import com.fr.design.module.ChartHyperlinkGroup; import com.fr.design.module.ChartPreStyleAction; import com.fr.design.module.DesignModuleFactory; import com.fr.design.parameter.FormParameterReader; import com.fr.design.parameter.ParameterPropertyPane; import com.fr.design.parameter.WorkBookParameterReader; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.design.widget.ui.btn.FormSubmitButtonDetailPane; import com.fr.file.FILE; import com.fr.form.stable.ElementCaseThumbnailProcessor; import com.fr.form.ui.ChartEditor; import com.fr.general.ComparatorUtils; import com.fr.general.Inter; import com.fr.general.ModuleContext; import com.fr.general.xml.GeneralXMLTools; import com.fr.io.importer.Excel2007ReportImporter; import com.fr.io.importer.ExcelReportImporter; import com.fr.io.utils.ResourceIOUtils; import com.fr.js.EmailJavaScript; import com.fr.js.JavaScriptImpl; import com.fr.js.ParameterJavaScript; import com.fr.js.ReportletHyperlink; import com.fr.js.WebHyperlink; import com.fr.locale.InterMutableKey; import com.fr.log.FineLoggerFactory; import com.fr.main.impl.WorkBook; import com.fr.main.impl.WorkBookAdapter; import com.fr.main.impl.WorkBookX; import com.fr.module.Activator; import com.fr.module.extension.Prepare; import com.fr.plugin.chart.vanchart.imgevent.design.DesignImageEvent; import com.fr.quickeditor.cellquick.CellBiasTextPainterEditor; import com.fr.quickeditor.cellquick.CellDSColumnEditor; import com.fr.quickeditor.cellquick.CellFormulaQuickEditor; import com.fr.quickeditor.cellquick.CellImageQuickEditor; import com.fr.quickeditor.cellquick.CellRichTextEditor; import com.fr.quickeditor.cellquick.CellStringQuickEditor; import com.fr.quickeditor.cellquick.CellSubReportEditor; import com.fr.quickeditor.chartquick.BasicChartQuickEditor; import com.fr.quickeditor.chartquick.FloatChartQuickEditor; import com.fr.quickeditor.floatquick.FloatImageQuickEditor; import com.fr.quickeditor.floatquick.FloatStringQuickEditor; import com.fr.report.cell.CellElementValueConverter; import com.fr.report.cell.cellattr.core.RichText; import com.fr.report.cell.cellattr.core.SubReport; import com.fr.report.cell.cellattr.core.group.DSColumn; import com.fr.report.cell.painter.BiasTextPainter; import com.fr.report.cell.painter.CellImagePainter; import com.fr.stable.ArrayUtils; import com.fr.stable.ParameterProvider; import com.fr.stable.StringUtils; import com.fr.stable.bridge.StableFactory; import com.fr.stable.fun.LogProvider; import com.fr.stable.plugin.ExtraChartDesignClassManagerProvider; import com.fr.stable.plugin.ExtraDesignClassManagerProvider; import com.fr.stable.script.CalculatorProviderContext; import com.fr.stable.script.ValueConverter; import com.fr.stable.web.ServletContext; import com.fr.stable.web.ServletContextAdapter; import com.fr.stable.xml.ObjectTokenizer; import com.fr.stable.xml.ObjectXMLWriterFinder; import com.fr.start.BBSGuestPaneProvider; import com.fr.van.chart.DownloadOnlineSourcesHelper; import com.fr.van.chart.map.server.ChartMapEditorAction; import com.fr.xml.ReportXMLUtils; import javax.swing.JDialog; import javax.swing.JPanel; import javax.swing.SwingConstants; import java.awt.BorderLayout; import java.awt.Image; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.image.BufferedImage; import java.io.InputStream; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Set; import static com.fr.stable.module.Module.ENGINE_MODULE; /** * Created by juhaoyu on 2018/1/31. * 触发原来的DesignerModule的启动 * 之后慢慢将DesignerModule拆成Activator */ public class DesignerModuleActivator extends Activator implements Prepare { static { ServletContext.addServletContextListener(new ServletContextAdapter() { @Override public void onServletStart() { designerModuleStart(); } }); } @Override public void start() { designerModuleStart(); } private static void designerModuleStart() { if (com.fr.module.ModuleContext.getModule(DesignerModuleActivator.class).isRunning()) { return; } App[] apps = apps4TemplateOpener(); for (App app : apps) { DesignerFrame.registApp(app); } StableFactory.registerMarkedClass(ExtraDesignClassManagerProvider.XML_TAG, ExtraDesignClassManager.class); ActionFactory.registerCellInsertActionClass(actionsForInsertCellElement()); ActionFactory.registerFloatInsertActionClass(actionsForInsertFloatElement()); DesignModuleFactory.registerCreators4Hyperlink(hyperlinkTypes()); justStartModules4Engine(); justStartModules4Designer(); CalculatorProviderContext.setValueConverter(valueConverter()); GeneralXMLTools.Object_Tokenizer = startXMLReadObjectTokenizer(); GeneralXMLTools.Object_XML_Writer_Finder = startObjectXMLWriterFinder(); addAdapterForPlate(); designerRegister(); InformationCollector.getInstance().collectStartTime(); ExtraDesignClassManager.getInstance().getFeedback().didFeedback(); StableFactory.registerMarkedObject(LogProvider.MARK_STRING, DesignerLogImpl.getInstance()); } private static Class[] actionsForInsertCellElement() { List> classes = new ArrayList<>(); Set providers = ExtraDesignClassManager.getInstance().getArray(ElementUIProvider.MARK_STRING); for (ElementUIProvider provider : providers) { classes.add(provider.actionForInsertCellElement()); } return ArrayUtils.addAll(new Class[]{ DSColumnCellAction.class, GeneralCellAction.class, RichTextCellAction.class, FormulaCellAction.class, ChartCellAction.class, ImageCellAction.class, BiasCellAction.class, SubReportCellAction.class }, classes.toArray(new Class[classes.size()])); } private static Class[] actionsForInsertFloatElement() { List> classes = new ArrayList<>(); Set providers = ExtraDesignClassManager.getInstance().getArray(ElementUIProvider.MARK_STRING); for (ElementUIProvider provider : providers) { classes.add(provider.actionForInsertFloatElement()); } return ArrayUtils.addAll(new Class[]{ TextBoxFloatAction.class, FormulaFloatAction.class, ChartFloatAction.class, ImageFloatAction.class }, classes.toArray(new Class[classes.size()])); } private static NameableCreator[] hyperlinkTypes() { return new NameableCreator[]{ new NameObjectCreator(Inter.getLocText("FR-Hyperlink_Reportlet"), ReportletHyperlink.class, ReportletHyperlinkPane.ChartNoRename.class), new NameObjectCreator(Inter.getLocText("FR-Designer_Email"), EmailJavaScript.class, EmailPane.class), new NameObjectCreator(Inter.getLocText("Hyperlink-Web_link"), WebHyperlink.class, WebHyperlinkPane.ChartNoRename.class), new NameObjectCreator(Inter.getLocText("JavaScript-Dynamic_Parameters"), ParameterJavaScript.class, ParameterJavaScriptPane.ChartNoRename.class), new NameObjectCreator(Inter.getLocText("FR-Designer_JavaScript"), JavaScriptImpl.class, JavaScriptImplPane.ChartNoRename.class) }; } /** * kunsnat: 一些模块信息 必须跟随设计器启动, * 比如 读取CC.XML, 设计器启动之后, 马上会读取XML, 需要Chart_Module中的注册信息 */ private static void justStartModules4Engine() { ModuleContext.startModule(ENGINE_MODULE); } private static void justStartModules4Designer() { chartDesignerRegister(); formDesignerRegister(); } /** * CellElementValueConverter用来处理设计器格子里的值,将公式/数组/其他元素转换成对应的值。 * * @return 返回处理格子值的转换器 */ private static ValueConverter valueConverter() { return new CellElementValueConverter(); } /* * 针对不同的对象,在读取Object对象的xml的时候需要使用不同的对象生成器 * @return 返回对象生成器 */ private static ObjectTokenizer startXMLReadObjectTokenizer() { return new ReportXMLUtils.ReportObjectTokenizer(); } /** * 针对不同的对象,在写对象的XML时需要使用不同的XML生成器 * * @return 返回xml生成器 */ private static ObjectXMLWriterFinder startObjectXMLWriterFinder() { return new ReportXMLUtils.ReportObjectXMLWriterFinder(); } //wei:fs的模块中可能有需要设计器界面做设置的地方,在这边添加 private static void addAdapterForPlate() { ProcessTransitionAdapter.setProcessTransitionAdapter(new ProcessTransitionAdapter() { @Override protected String[] getTransitionNamesByBook(String book) { return StableFactory.getMarkedObject(ProcessOperator.MARK_STRING, ProcessOperator.class, ProcessOperator.EMPTY).getTransitionNamesByBook(book); } @Override protected String[] getParaNames(String book) { return StableFactory.getMarkedObject(ProcessOperator.MARK_STRING, ProcessOperator.class, ProcessOperator.EMPTY).getParaNames(book); } @Override protected ParameterProvider[] getParas(String book) { return StableFactory.getMarkedObject(ProcessOperator.MARK_STRING, ProcessOperator.class, ProcessOperator.EMPTY).getParas(book); } @Override protected MultiFieldParameter[] getAllMultiFieldParas(String book) { return StableFactory.getMarkedObject(ProcessOperator.MARK_STRING, ProcessOperator.class, ProcessOperator.EMPTY).getAllMultiFieldParas(book); } }); } private static abstract class AbstractWorkBookApp implements App { @Override public int currentAPILevel() { return CURRENT_LEVEL; } @Override public JTemplate openTemplate(FILE tplFile) { return new JWorkBook(asIOFile(tplFile), tplFile); } @Override public String mark4Provider() { return getClass().getName(); } @Override public void process() { } @Override public void undo() { } } /* * 返回设计器能打开的模板类型的一个数组列表 * @return 可以打开的模板类型的数组 */ private static App[] apps4TemplateOpener() { return new App[]{getCptxApp(), getCptApp(), getXlsApp(), getXlsxApp()}; } private static AbstractWorkBookApp getXlsxApp() { return new AbstractWorkBookApp() { @Override public String[] defaultExtensions() { return new String[]{FileExtension.XLSX.getExtension()}; } @Override public WorkBook asIOFile(FILE tplFile) { WorkBook workbook = null; try { workbook = new Excel2007ReportImporter().generateWorkBookByStream(tplFile.asInputStream()); } catch (Exception exp) { FRContext.getLogger().error("Failed to generate xlsx from " + tplFile, exp); } return workbook; } }; } private static AbstractWorkBookApp getXlsApp() { return new AbstractWorkBookApp() { @Override public String[] defaultExtensions() { return new String[]{FileExtension.XLS.getExtension()}; } @Override public WorkBook asIOFile(FILE tplFile) { WorkBook workbook = null; try { workbook = new ExcelReportImporter().generateWorkBookByStream(tplFile.asInputStream()); } catch (Exception exp) { FRContext.getLogger().error("Failed to generate xls from " + tplFile, exp); } return workbook; } }; } private static AbstractWorkBookApp getCptApp() { return new AbstractWorkBookApp() { @Override public String[] defaultExtensions() { return new String[]{FileExtension.CPT.getExtension()}; } @Override public WorkBook asIOFile(FILE file) { if (XMLEncryptUtils.isCptEncoded() && !XMLEncryptUtils.checkVaild(DesignerEnvManager.getEnvManager().getEncryptionKey())) { if (!new DecodeDialog(file).isPwdRight()) { FRContext.getLogger().error(Inter.getLocText("ECP-error_pwd")); return new WorkBook(); } } WorkBook tpl = new WorkBook(); // richer:打开报表通知 FRContext.getLogger().info(Inter.getLocText(new String[]{"LOG-Is_Being_Openned", "LOG-Please_Wait"}, new String[]{"\"" + file.getName() + "\"" + ",", "..."})); TempNameStyle namestyle = TempNameStyle.getInstance(); namestyle.clear(); String checkStr = StringUtils.EMPTY; try { checkStr = ResourceIOUtils.inputStream2String(file.asInputStream()); tpl.readStream(file.asInputStream()); } catch (Exception exp) { String errorMessage = StringUtils.EMPTY; errorMessage = ComparatorUtils.equals(RemoteDeziConstants.INVALID_USER, checkStr) ? Inter.getLocText("FR-Designer_No-Privilege") : Inter.getLocText("NS-exception_readError"); FRContext.getLogger().error(errorMessage + file, exp); } checkNameStyle(namestyle); return tpl; } }; } private static AbstractWorkBookApp getCptxApp() { return new AbstractWorkBookApp() { @Override public String[] defaultExtensions() { return new String[]{FileExtension.CPTX.getExtension()}; } @Override public WorkBook asIOFile(FILE file) { FRContext.getLogger().info(Inter.getLocText(new String[]{"LOG-Is_Being_Openned", "LOG-Please_Wait"}, new String[]{"\"" + file.getName() + "\"" + ",", "..."})); WorkBookX tpl; InputStream inputStream; try { inputStream = file.asInputStream(); long time = System.currentTimeMillis(); tpl = new WorkBookX(inputStream); FRContext.getLogger().error("cost: " + (System.currentTimeMillis() - time) + " ms"); } catch (Exception exp) { if (exp instanceof FRPackageRunTimeException) { throw (FRPackageRunTimeException) exp; } throw new InvalidWorkBookException(file + ":" + exp.getMessage(), exp); } return new WorkBookAdapter(tpl); } }; } private static void checkNameStyle(TempNameStyle namestyle) { Iterator it = namestyle.getIterator(); ArrayList al = new ArrayList(); while (it.hasNext()) { al.add((String) it.next()); } if (!al.isEmpty()) { showConfirmDialog(al); } } private static void showConfirmDialog(final ArrayList namelist) { final JDialog jd = new JDialog(); // 模态一下,因为可能会多个样式丢失 // jd.setModal(true); jd.setAlwaysOnTop(true); jd.setSize(450, 150); jd.setResizable(false); jd.setIconImage(BaseUtils.readImage("/com/fr/base/images/oem/logo.png")); String message = namelist.toString().replaceAll("\\[", "").replaceAll("\\]", ""); UILabel jl = new UILabel(Inter.getLocText(new String[]{"Current_custom_global", "Has_been_gone"}, new String[]{message})); jl.setHorizontalAlignment(SwingConstants.CENTER); jd.add(jl, BorderLayout.CENTER); JPanel jp = new JPanel(); // ”是“按钮,点击之后将生成一个全局样式,并写入xml UIButton confirmButton = new UIButton(Inter.getLocText("FR-Designer_Yes")); confirmButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { try { for (int i = 0; i < namelist.size(); i++) { ServerPreferenceConfig.getInstance().putStyle(namelist.get(i), Style.DEFAULT_STYLE); } } catch (Exception ex) { FineLoggerFactory.getLogger().error(ex.getMessage()); } jd.dispose(); new StyleListAction().actionPerformed(e);// 弹窗 } }); UIButton noButton = new UIButton(Inter.getLocText("FR-Designer_No")); noButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { jd.dispose(); } }); jp.add(confirmButton); jp.add(noButton); jd.setTitle(Inter.getLocText("FR-Custom_styles_lost")); jd.add(jp, BorderLayout.SOUTH); GUICoreUtils.centerWindow(jd); jd.setVisible(true); } private static void designerRegister() { registerCellEditor(); registerFloatEditor(); registerData4Form(); registerOtherPane(); } private static void registerOtherPane() { StableFactory.registerMarkedClass(BBSGuestPaneProvider.XML_TAG, BBSGuestPane.class); } /** * kunsnat:注册单元格选中Editor */ private static void registerCellEditor() { ActionFactory.registerCellEditor(String.class, new CellStringQuickEditor()); ActionFactory.registerCellEditor(Number.class, new CellStringQuickEditor()); ActionFactory.registerCellEditor(BaseFormula.class, new CellFormulaQuickEditor()); ActionFactory.registerCellEditor(SubReport.class, new CellSubReportEditor()); ActionFactory.registerCellEditor(RichText.class, new CellRichTextEditor()); ActionFactory.registerCellEditor(DSColumn.class, new CellDSColumnEditor()); ActionFactory.registerCellEditor(Image.class, new CellImageQuickEditor()); ActionFactory.registerCellEditor(BiasTextPainter.class, new CellBiasTextPainterEditor()); ActionFactory.registerCellEditor(BufferedImage.class, new CellImageQuickEditor()); ActionFactory.registerCellEditor(CellImagePainter.class, new CellImageQuickEditor()); //todo 图表编辑器populate没能实现刷新面板显示 ActionFactory.registerCellEditorClass(ChartCollection.class, BasicChartQuickEditor.class); Set providers = ExtraDesignClassManager.getInstance().getArray(ElementUIProvider.MARK_STRING); for (ElementUIProvider provider : providers) { try { ActionFactory.registerCellEditor(provider.targetObjectClass(), provider.quickEditor().newInstance()); } catch (Exception e) { FineLoggerFactory.getLogger().error(e.getMessage(), e); } } } /** * kunnat: 注册悬浮选中Editor */ private static void registerFloatEditor() { ActionFactory.registerFloatEditor(String.class, new FloatStringQuickEditor()); ActionFactory.registerFloatEditor(Formula.class, new FloatStringQuickEditor()); ActionFactory.registerFloatEditor(Image.class, new FloatImageQuickEditor()); ActionFactory.registerFloatEditor(BufferedImage.class, new FloatImageQuickEditor()); ActionFactory.registerFloatEditor(CellImagePainter.class, new FloatImageQuickEditor()); //todo 图表编辑器populate没能实现刷新面板显示 ActionFactory.registerFloatEditorClass(ChartCollection.class, FloatChartQuickEditor.class); } private static void registerData4Form() { StableFactory.registerMarkedClass(FormECDesignerProvider.XML_TAG, FormElementCaseDesigner.class); StableFactory.registerMarkedClass(FormECCompositeProvider.XML_TAG, FormReportComponentComposite.class); DesignModuleFactory.registerParameterReader(new WorkBookParameterReader()); } private static void chartDesignerRegister() { StableFactory.registerMarkedClass(ExtraChartDesignClassManagerProvider.XML_TAG, ChartTypeInterfaceManager.class); StableFactory.getStaticMarkedInstanceObjectFromClass(ExtraChartDesignClassManagerProvider.XML_TAG, ExtraChartDesignClassManagerProvider.class); DesignModuleFactory.registerHyperlinkGroupType(new ChartHyperlinkGroup()); DesignModuleFactory.registerChartEditorClass(ChartEditor.class); DesignModuleFactory.registerChartComponentClass(ChartComponent.class); DesignModuleFactory.registerChartDialogClass(ChartDialog.class); DesignModuleFactory.registerChartPropertyPaneClass(ChartPropertyPane.class); ActionFactory.registerChartPreStyleAction(new ChartPreStyleAction()); ActionFactory.registerChartMapEditorAction(new ChartMapEditorAction()); ActionFactory.registerChartCollection(ChartCollection.class); DesignModuleFactory.registerExtraWidgetOptions(ChartTypeInterfaceManager.initWidgetOption()); DesignImageEvent.registerDefaultCallbackEvent(HistoryTemplateListPane.getInstance()); DesignImageEvent.registerDownloadSourcesEvent(new DownloadOnlineSourcesHelper()); } private static void formDesignerRegister() { StableFactory.registerMarkedObject(DesignToolbarProvider.STRING_MARKED, WidgetToolBarPane.getInstance()); DesignModuleFactory.registerNewFormActionClass(NewFormAction.class); DesignModuleFactory.registerFormParaDesignerClass(FormParaDesigner.class); DesignModuleFactory.registerParaPropertyPaneClass(ParameterPropertyPane.class); DesignModuleFactory.registerFormHierarchyPaneClass(FormHierarchyTreePane.class); DesignModuleFactory.registerWidgetPropertyPaneClass(WidgetPropertyPane.class); DesignModuleFactory.registerButtonDetailPaneClass(FormSubmitButtonDetailPane.class); DesignModuleFactory.registerParameterReader(new FormParameterReader()); StableFactory.registerMarkedClass(BaseJForm.XML_TAG, JForm.class); StableFactory.registerMarkedObject(ElementCaseThumbnailProcessor.MARK_STRING, new ElementCaseThumbnail()); } @Override public void stop() { } @Override public void prepare() { addMutable(InterMutableKey.Path, "com/fr/design/i18n/main", "com/fr/design/i18n/chart"); } }