/******************************************************************************* * Copyright (c) 2014 Open Door Logistics (www.opendoorlogistics.com) * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Lesser Public License v3 * which accompanies this distribution, and is available at http://www.gnu.org/licenses/lgpl.txt ******************************************************************************/ package com.opendoorlogistics.components.reports; import java.awt.Component; import java.io.File; import java.util.AbstractMap; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.prefs.Preferences; import javax.swing.JDialog; import javax.swing.JFileChooser; import javax.swing.JOptionPane; import javax.swing.SwingUtilities; import javax.swing.filechooser.FileNameExtensionFilter; import net.sf.jasperreports.engine.type.OrientationEnum; import com.opendoorlogistics.api.ExecutionReport; import com.opendoorlogistics.api.ODLApi; import com.opendoorlogistics.api.components.ComponentConfigurationEditorAPI; import com.opendoorlogistics.api.tables.ODLDatastore; import com.opendoorlogistics.api.tables.ODLTableDefinition; import com.opendoorlogistics.components.reports.builder.SubreportsWithProviderBuilder; import com.opendoorlogistics.components.reports.builder.SubreportsWithProviderBuilder.BuildResult; import com.opendoorlogistics.core.utils.IOUtils; import com.opendoorlogistics.core.utils.strings.Strings; public class ReporterTools { private static final String REPORT_TEMPLATES_DIR_PREF_KEY = "ReportsTemplateDir"; private static final String REPORT_TEMPLATES_PREFIX_PREF_KEY = "ReportsTemplatePrefix"; static void exportReportTemplate(ComponentConfigurationEditorAPI editorApi,ReporterConfig config, OrientationEnum orientation, Component parentComponent) { ODLDatastore<? extends ODLTableDefinition> inputData = editorApi.getAvailableInputDatastore(); // find default value String initial = "Report"; for (int i = 0; i < inputData.getTableCount(); i++) { ODLTableDefinition table = inputData.getTableAt(i); if (Strings.equalsStd(table.getName(), editorApi.getApi().standardComponents().reporter().getHeaderMapTableName()) == false) { initial = table.getName(); break; } } Object inputTitle = JOptionPane.showInputDialog(parentComponent, "Please enter the report title", initial); if (inputTitle == null) { return; } BuildResult result = null; try { result = SubreportsWithProviderBuilder.buildWizard(editorApi.getApi(),inputData, inputTitle.toString(), orientation); } catch (Throwable e2) { showError(editorApi,e2, parentComponent); return; } // show multi file export dialog ArrayList<Map.Entry<String, String>> list = new ArrayList<>(); for (int i = 0; i < result.baseFilenames.size(); i++) { for (boolean compiled : new boolean[] { true, false }) { list.add(new AbstractMap.SimpleEntry<String, String>(result.baseFilenames.get(i) + (compiled ? ".jasper" : ".jrxml"), "\"" + result.tableNames.get(i) + "\" table " + (compiled ? "compiled report" : "report template"))); } } String defaultDir = editorApi.getComponentPreferences().get(REPORT_TEMPLATES_DIR_PREF_KEY, null); String prefix = editorApi.getComponentPreferences().get(REPORT_TEMPLATES_PREFIX_PREF_KEY, null); File dir = defaultDir != null ? new File(defaultDir) : null; MultiExportDialog dlg = new MultiExportDialog(SwingUtilities.getWindowAncestor(parentComponent), (dir != null && dir.exists()? dir.getAbsolutePath() : ""),prefix, list); dlg.setLocationRelativeTo(parentComponent); if (dlg.showModal() == MultiExportDialog.OK_OPTION) { dir = new File(dlg.getExportDirectory()); editorApi.getComponentPreferences().put(REPORT_TEMPLATES_DIR_PREF_KEY, dir.getAbsolutePath()); editorApi.getComponentPreferences().put(REPORT_TEMPLATES_PREFIX_PREF_KEY,dlg.getExportPrefix()); boolean exportOk = false; try { List<String> compiled = SubreportsWithProviderBuilder.exportResultFiles(result, dir.getAbsolutePath(), dlg.getExportPrefix(), true, true); if (compiled == null || compiled.size() == 0) { throw new RuntimeException(); } // update the configuration to use the new template config.setCompiledReport(compiled.get(0)); // showMessage("Files successfully exported to directory " + dir.getAbsolutePath()); exportOk = true; } catch (Throwable e2) { showError(editorApi,e2, parentComponent); } if (exportOk) { String okMessage = "Files successfully exported to directory " + dir.getAbsolutePath(); JOptionPane.showMessageDialog(parentComponent, okMessage); } } } private static void showError(ComponentConfigurationEditorAPI editorApi,Throwable e2, Component parentComponent) { ExecutionReport report = editorApi.getApi().uiFactory().createExecutionReport(); report.setFailed(e2); report.setFailed("An error occurred when generating the report templates."); JDialog dlg = editorApi.getApi().uiFactory().createExecutionReportDialog(editorApi.getAncestorFrame(), "Error", report, false); dlg.setVisible(true); } /** * * @param prefKey e.g. PrefKey.LAST_GRID_VIEW_JRXML * @return */ private static JFileChooser createJRXMLBrowser(Preferences preferences, String key) { JFileChooser chooser = new JFileChooser(); String s = preferences.get(key, null); File lastJrXML =s!=null? new File(s):null; IOUtils.setFile(lastJrXML, chooser); chooser.setFileFilter(new FileNameExtensionFilter("JasperReports template (jrxml)", "jrxml")); chooser.setDialogTitle("JasperReports template file"); return chooser; } public static File chooseJRXMLFile(Preferences preferences, String key, Component parentUI){ JFileChooser chooser = createJRXMLBrowser(preferences,key); if (chooser.showOpenDialog(SwingUtilities.getWindowAncestor(parentUI)) == JFileChooser.APPROVE_OPTION) { preferences.put(key, chooser.getSelectedFile().getAbsolutePath()); return chooser.getSelectedFile(); } return null; } }