/******************************************************************************
* Product: Adempiere ERP & CRM Smart Business Solution *
* Copyright (C) 2007 Adempiere, Inc. All Rights Reserved. *
* This program is free software; you can redistribute it and/or modify it *
* under the terms version 2 of the GNU General Public License as published *
* by the Free Software Foundation. This program is distributed in the hope *
* that it will be useful, but WITHOUT ANY WARRANTY; without even the implied *
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *
* See the GNU General Public License for more details. *
* You should have received a copy of the GNU General Public License along *
* with this program; if not, write to the Free Software Foundation, Inc., *
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. *
*
* Copyright (C) 2007 Low Heng Sin hengsin@avantz.com
* _____________________________________________
*****************************************************************************/
package org.adempiere.webui.window;
import java.io.File;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Properties;
import java.util.TreeMap;
import java.util.logging.Level;
import javax.activation.FileDataSource;
import javax.servlet.http.HttpServletRequest;
import org.adempiere.base.Core;
import org.adempiere.base.upload.IUploadService;
import org.adempiere.exceptions.DBException;
import org.adempiere.pdf.Document;
import org.adempiere.util.Callback;
import org.adempiere.webui.ClientInfo;
import org.adempiere.webui.Extensions;
import org.adempiere.webui.LayoutUtils;
import org.adempiere.webui.apps.AEnv;
import org.adempiere.webui.apps.BusyDialog;
import org.adempiere.webui.apps.ProcessDialog;
import org.adempiere.webui.apps.ProcessModalDialog;
import org.adempiere.webui.apps.WReport;
import org.adempiere.webui.apps.form.WReportCustomization;
import org.adempiere.webui.component.Checkbox;
import org.adempiere.webui.component.Label;
import org.adempiere.webui.component.ListItem;
import org.adempiere.webui.component.Listbox;
import org.adempiere.webui.component.Mask;
import org.adempiere.webui.component.ProcessInfoDialog;
import org.adempiere.webui.component.Tabpanel;
import org.adempiere.webui.component.ToolBarButton;
import org.adempiere.webui.component.Window;
import org.adempiere.webui.desktop.IDesktop;
import org.adempiere.webui.editor.WEditor;
import org.adempiere.webui.editor.WStringEditor;
import org.adempiere.webui.editor.WTableDirEditor;
import org.adempiere.webui.event.DialogEvents;
import org.adempiere.webui.event.DrillEvent;
import org.adempiere.webui.event.DrillEvent.DrillData;
import org.adempiere.webui.event.ZoomEvent;
import org.adempiere.webui.panel.ADForm;
import org.adempiere.webui.panel.StatusBarPanel;
import org.adempiere.webui.session.SessionManager;
import org.adempiere.webui.theme.ThemeManager;
import org.adempiere.webui.util.IServerPushCallback;
import org.adempiere.webui.util.ServerPushTemplate;
import org.adempiere.webui.util.ZKUpdateUtil;
import org.adempiere.webui.util.ZkContextRunnable;
import org.compiere.model.GridField;
import org.compiere.model.MArchive;
import org.compiere.model.MAttachment;
import org.compiere.model.MAuthorizationAccount;
import org.compiere.model.MClient;
import org.compiere.model.MLanguage;
import org.compiere.model.MProcess;
import org.compiere.model.MQuery;
import org.compiere.model.MRole;
import org.compiere.model.MSysConfig;
import org.compiere.model.MTable;
import org.compiere.model.MToolBarButtonRestrict;
import org.compiere.model.MUser;
import org.compiere.model.PO;
import org.compiere.model.PrintInfo;
import org.compiere.model.SystemIDs;
import org.compiere.model.X_AD_ToolBarButton;
import org.compiere.print.ArchiveEngine;
import org.compiere.print.MPrintFormat;
import org.compiere.print.ReportEngine;
import org.compiere.print.ServerReportCtl;
import org.compiere.process.ProcessCall;
import org.compiere.process.ProcessInfo;
import org.compiere.process.ProcessInfoParameter;
import org.compiere.process.ProcessInfoUtil;
import org.compiere.tools.FileUtil;
import org.compiere.util.CLogger;
import org.compiere.util.DB;
import org.compiere.util.Env;
import org.compiere.util.KeyNamePair;
import org.compiere.util.Language;
import org.compiere.util.Msg;
import org.compiere.util.Util;
import org.compiere.util.ValueNamePair;
import org.idempiere.print.renderer.CSVReportRendererConfiguration;
import org.idempiere.print.renderer.HTMLReportRendererConfiguration;
import org.idempiere.print.renderer.PDFReportRendererConfiguration;
import org.idempiere.print.renderer.XLSReportRendererConfiguration;
import org.idempiere.print.renderer.XLSXReportRendererConfiguration;
import org.idempiere.ui.zk.media.IMediaView;
import org.idempiere.ui.zk.media.WMediaOptions;
import org.idempiere.ui.zk.report.IReportViewerRenderer;
import org.zkoss.util.media.AMedia;
import org.zkoss.util.media.Media;
import org.zkoss.zk.au.out.AuScript;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.Desktop;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.HtmlBasedComponent;
import org.zkoss.zk.ui.Page;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zk.ui.event.Events;
import org.zkoss.zk.ui.event.KeyEvent;
import org.zkoss.zk.ui.ext.render.DynamicMedia;
import org.zkoss.zk.ui.util.Clients;
import org.zkoss.zul.A;
import org.zkoss.zul.Borderlayout;
import org.zkoss.zul.Center;
import org.zkoss.zul.Div;
import org.zkoss.zul.Iframe;
import org.zkoss.zul.Listitem;
import org.zkoss.zul.Menuitem;
import org.zkoss.zul.North;
import org.zkoss.zul.Popup;
import org.zkoss.zul.Separator;
import org.zkoss.zul.South;
import org.zkoss.zul.Toolbar;
import org.zkoss.zul.Toolbarbutton;
import org.zkoss.zul.Vlayout;
import org.zkoss.zul.impl.Utils;
import org.zkoss.zul.impl.XulElement;
import net.sf.jasperreports.engine.JasperPrint;
/**
* Report Viewer.
*
* @author Jorg Janke
* globalqss: integrate phib contribution from
* https://sourceforge.net/p/adempiere/patches/4/
* globalqss: integrate Teo Sarca bug fixing
* Colin Rooney 2007/03/20 RFE#1670185 and BUG#1684142
* Extend security to Info queries
*
* @author Teo Sarca, SC ARHIPAC SERVICE SRL
*
FR [ 1762466 ] Add "Window" menu to report viewer.
* FR [ 1894640 ] Report Engine: Excel Export support
*
* @author Low Heng Sin
*/
public class ZkReportViewer extends Window implements EventListener, IReportViewerExportSource {
/**
* generated serial id
*/
private static final long serialVersionUID = 3732290698059632847L;
protected static final String CSV_OUTPUT_TYPE = CSVReportRendererConfiguration.ID;
protected static final String HTML_OUTPUT_TYPE = HTMLReportRendererConfiguration.ID;
protected static final String PDF_OUTPUT_TYPE = PDFReportRendererConfiguration.ID;
protected static final String XLS_OUTPUT_TYPE = XLSReportRendererConfiguration.ID;
protected static final String XLSX_OUTPUT_TYPE = XLSXReportRendererConfiguration.ID;
/** Window No */
protected int m_WindowNo = -1;
/** Print Context */
private Properties m_ctx;
/** Setting Values */
private boolean m_setting = false;
/** Report Engine */
protected ReportEngine m_reportEngine;
/** Table ID */
private int m_AD_Table_ID = 0;
private boolean m_isCanExport;
/** Process ID */
private int m_AD_Process_ID = 0;
private MQuery m_ddQ = null;
private MQuery m_daQ = null;
private Menuitem m_ddM = null;
private Menuitem m_daM = null;
/** Logger */
private static final CLogger log = CLogger.getCLogger(ZkReportViewer.class);
//
private StatusBarPanel statusBar = new StatusBarPanel();
private Toolbar toolBar = new Toolbar();
private ToolBarButton bSendMail = new ToolBarButton();
private ToolBarButton bArchive = new ToolBarButton();
private ToolBarButton bAttachment = new ToolBarButton();
private ToolBarButton bCustomize = new ToolBarButton();
private ToolBarButton bFind = new ToolBarButton();
private ToolBarButton bExport = new ToolBarButton();
private ToolBarButton bWizard = new ToolBarButton();
private Listbox comboReport = new Listbox();
private Listitem previousSelected = new Listitem();
private WTableDirEditor wLanguage;
/** List box for preview type (pdf, html, etc) */
protected Listbox previewType = new Listbox();
private ToolBarButton bRefresh = new ToolBarButton();
private ToolBarButton bReRun = new ToolBarButton();
private Iframe iframe;
private Checkbox summary = new Checkbox();
protected AMedia media;
private int mediaVersion = 0;
private A reportLink;
private boolean init;
private BusyDialog progressWindow;
private Mask mask;
private final static String ON_RENDER_REPORT_EVENT = "onRenderReport";
private Popup toolbarPopup;
private ToolBarButton bCloudUpload = new ToolBarButton();
protected Map uploadServicesMap = new HashMap<>();
/** Row count label */
private Label rowCount;
private final Map exportMap = new LinkedHashMap<>();
private final Map rendererMap = new TreeMap<>();
private Center center;
private FindWindow find;
/**
* SysConfig USE_ESC_FOR_TAB_CLOSING
*/
private boolean isUseEscForTabClosing = MSysConfig.getBooleanValue(MSysConfig.USE_ESC_FOR_TAB_CLOSING, false, Env.getAD_Client_ID(Env.getCtx()));
private JasperPrintRenderer jasperPrintRenderer = null;
/**
* @param re
* @param title
*/
public ZkReportViewer(ReportEngine re, String title) {
super();
init = false;
m_WindowNo = SessionManager.getAppDesktop().registerWindow(this);
setAttribute(IDesktop.WINDOWNO_ATTRIBUTE, m_WindowNo);
Env.setContext(re.getCtx(), m_WindowNo, "_WinInfo_IsReportViewer", "Y");
m_reportEngine = re;
m_AD_Table_ID = re.getPrintFormat().getAD_Table_ID();
setTitle(Util.cleanAmp(Msg.getMsg(Env.getCtx(), "Report") + ": " +
m_reportEngine.getPrintFormat().get_Translation(MPrintFormat.COLUMNNAME_Name)));
if (!MRole.getDefault().isCanReport(m_AD_Table_ID))
{
Dialog.error(m_WindowNo, "AccessCannotReport", m_reportEngine.getName());
this.onClose();
return;
}
m_isCanExport = MRole.getDefault().isCanExport(m_AD_Table_ID);
addEventListener(ON_RENDER_REPORT_EVENT, this);
addEventListener("onPostInit", e -> {
postRenderReportEvent();
});
initMediaSuppliers();
}
/**
* @param contentType
* @param fileExtension
* @return renderer id
*/
private String toRendererId(String contentType, String fileExtension) {
for(Map.Entry entry : exportMap.entrySet()) {
if (entry.getKey().contentType.equals(contentType) && entry.getKey().extension.equals(fileExtension))
return entry.getValue();
}
return null;
}
/**
* Create media supplier for supported format (pdf, html, etc)
*/
private void initMediaSuppliers() {
List renderers = Extensions.getReportViewerRenderers();
Collections.sort(renderers, new Comparator() {
@Override
public int compare(IReportViewerRenderer r1, IReportViewerRenderer r2) {
return r1.getExportLabel().compareTo(r2.getExportLabel());
}
});
for(IReportViewerRenderer renderer : renderers) {
if (renderer.isExport()) {
ExportFormat exportFormat = new ExportFormat(renderer.getExportLabel(), renderer.getFileExtension(), renderer.getContentType());
exportMap.put(exportFormat, renderer.getId());
}
rendererMap.put(renderer.getId(), renderer);
}
}
@Override
public void onPageAttached(Page newpage, Page oldpage) {
super.onPageAttached(newpage, oldpage);
if (newpage != null && !init && m_reportEngine != null) {
try
{
m_ctx = m_reportEngine.getCtx();
init();
dynInit();
SessionManager.getSessionApplication().getKeylistener().addEventListener(Events.ON_CTRL_KEY, this);
addEventListener(IDesktop.ON_CLOSE_WINDOW_SHORTCUT_EVENT, this);
}
catch(Exception e)
{
log.log(Level.SEVERE, "", e);
Dialog.error(m_WindowNo, "LoadError", e.getLocalizedMessage());
this.onClose();
}
}
}
@Override
public void onPageDetached(Page page) {
super.onPageDetached(page);
try {
SessionManager.getSessionApplication().getKeylistener().removeEventListener(Events.ON_CTRL_KEY, this);
removeEventListener(IDesktop.ON_CLOSE_WINDOW_SHORTCUT_EVENT, this);
} catch (Exception e) {}
cleanUp();
}
/**
* Layout viewer
*/
private void init() {
Borderlayout layout = new Borderlayout();
layout.setWidth("100%");
layout.setHeight("100%");
this.appendChild(layout);
this.setWidth("100%");
this.setHeight("100%");
ZKUpdateUtil.setHeight(toolBar, "32px");
ZKUpdateUtil.setWidth(toolBar, "100%");
previewType.setMold("select");
setupPreviewType();
toolBar.appendChild(previewType);
previewType.addEventListener(Events.ON_SELECT, this);
toolBar.appendChild(new Separator("vertical"));
String type = null;
if (m_reportEngine.getReportType() != null)
{
type = m_reportEngine.getReportType();
}
else
{
//set default type
type = m_reportEngine.getPrintFormat().isForm() || m_reportEngine.getPrintFormat().getJasperProcess_ID() > 0
? MSysConfig.getValue(MSysConfig.ZK_REPORT_FORM_OUTPUT_TYPE,PDF_OUTPUT_TYPE,Env.getAD_Client_ID(m_ctx),Env.getAD_Org_ID(m_ctx))
: MSysConfig.getValue(MSysConfig.ZK_REPORT_TABLE_OUTPUT_TYPE,PDF_OUTPUT_TYPE,Env.getAD_Client_ID(m_ctx),Env.getAD_Org_ID(m_ctx));
}
int defaultIndex = -1;
for(int i = 0; i < previewType.getItemCount(); i++) {
ListItem item = previewType.getItemAtIndex(i);
if (item.getValue().equals(type)) {
previewType.setSelectedIndex(i);
break;
} else if (item.getValue().equals("PDF")) {
defaultIndex = i;
}
}
if (previewType.getSelectedIndex() < 0) {
previewType.setSelectedIndex(defaultIndex >= 0 ? defaultIndex : 0);
}
Vlayout toolbarPopupLayout = null;
if (ClientInfo.maxWidth(ClientInfo.SMALL_WIDTH-1))
{
toolbarPopup = new Popup();
appendChild(toolbarPopup);
toolbarPopupLayout = new Vlayout();
toolbarPopup.appendChild(toolbarPopupLayout);
}
if (toolbarPopup == null)
toolBar.appendChild(new Separator("vertical"));
comboReport.setMold("select");
comboReport.setTooltiptext(Msg.translate(Env.getCtx(), "AD_PrintFormat_ID"));
if (toolbarPopup != null)
{
toolbarPopupLayout.appendChild(comboReport);
}
else
{
toolBar.appendChild(comboReport);
toolBar.appendChild(new Separator("vertical"));
}
MClient client = MClient.get(m_ctx);
if (client.isMultiLingualDocument()){
try {
wLanguage = AEnv.getListDocumentLanguage(client);
wLanguage.getComponent().setTooltiptext(Msg.translate(Env.getCtx(), "AD_PrintFormat_ID"));
if (toolbarPopup != null)
{
toolbarPopupLayout.appendChild(wLanguage.getComponent());
}
else
{
toolBar.appendChild(wLanguage.getComponent());
}
// Init Language from Printformat
int languageID = 0;
if(m_reportEngine.getPrintFormat() != null && m_reportEngine.getPrintFormat().getLanguage() != null) {
MLanguage language = MLanguage.get(m_ctx, m_reportEngine.getPrintFormat().getLanguage());
if(language != null)
languageID = language.getAD_Language_ID();
}
if(m_reportEngine.getLanguageID() > 0)
languageID = m_reportEngine.getLanguageID();
wLanguage.setValue(languageID);
wLanguage.getComponent().addEventListener(Events.ON_SELECT, this);
} catch (Exception e) {
log.log(Level.SEVERE, e.getLocalizedMessage());
}
}
if (toolbarPopup == null && client.isMultiLingualDocument())
toolBar.appendChild(new Separator("vertical"));
summary.setText(Msg.getMsg(Env.getCtx(), "Summary"));
summary.setChecked(m_reportEngine.isSummary());
if (toolbarPopup != null)
{
toolbarPopupLayout.appendChild(summary);
}
else
{
toolBar.appendChild(summary);
toolBar.appendChild(new Separator("vertical"));
}
bCustomize.setName("Customize");
if (ThemeManager.isUseFontIconForImage())
bCustomize.setIconSclass("z-icon-Preference");
else
bCustomize.setImage(ThemeManager.getThemeResource("images/Preference24.png"));
bCustomize.setTooltiptext(Util.cleanAmp(Msg.getMsg(Env.getCtx(), "PrintCustomize")));
if (toolbarPopup != null)
{
toolbarPopupLayout.appendChild(bCustomize);
bCustomize.setLabel(bCustomize.getTooltiptext());
}
else
toolBar.appendChild(bCustomize);
bCustomize.addEventListener(Events.ON_CLICK, this);
if (ThemeManager.isUseFontIconForImage())
LayoutUtils.addSclass("medium-toolbarbutton", bCustomize);
bFind.setName("Find");
if (ThemeManager.isUseFontIconForImage())
bFind.setIconSclass("z-icon-Find");
else
bFind.setImage(ThemeManager.getThemeResource("images/Find24.png"));
bFind.setTooltiptext(Util.cleanAmp(Msg.getMsg(Env.getCtx(), "Find")));
bFind.addEventListener(Events.ON_CLICK, this);
if (getAD_Tab_ID(m_reportEngine.getPrintFormat().getAD_Table_ID()) <= 0) {
bFind.setVisible(false); // IDEMPIERE-1185
}
if (toolbarPopup != null)
{
toolbarPopupLayout.appendChild(bFind);
bFind.setLabel(bFind.getTooltiptext());
}
else
{
toolBar.appendChild(bFind);
toolBar.appendChild(new Separator("vertical"));
}
if (ThemeManager.isUseFontIconForImage())
LayoutUtils.addSclass("medium-toolbarbutton", bFind);
bSendMail.setName("SendMail");
if (ThemeManager.isUseFontIconForImage())
bSendMail.setIconSclass("z-icon-SendMail");
else
bSendMail.setImage(ThemeManager.getThemeResource("images/SendMail24.png"));
bSendMail.setTooltiptext(Util.cleanAmp(Msg.getMsg(Env.getCtx(), "SendMail")));
if (toolbarPopup != null)
{
toolbarPopupLayout.appendChild(bSendMail);
bSendMail.setLabel(bSendMail.getTooltiptext());
}
else
toolBar.appendChild(bSendMail);
bSendMail.addEventListener(Events.ON_CLICK, this);
if (ThemeManager.isUseFontIconForImage())
LayoutUtils.addSclass("medium-toolbarbutton", bSendMail);
bArchive.setName("Archive");
if (ThemeManager.isUseFontIconForImage())
bArchive.setIconSclass("z-icon-Archive");
else
bArchive.setImage(ThemeManager.getThemeResource("images/Archive24.png"));
bArchive.setTooltiptext(Util.cleanAmp(Msg.getMsg(Env.getCtx(), "Archive")));
if (toolbarPopup != null)
{
toolbarPopupLayout.appendChild(bArchive);
bArchive.setLabel(bArchive.getTooltiptext());
}
else
toolBar.appendChild(bArchive);
bArchive.addEventListener(Events.ON_CLICK, this);
if (ThemeManager.isUseFontIconForImage())
LayoutUtils.addSclass("medium-toolbarbutton", bArchive);
int tableId = m_reportEngine.getPrintInfo().getAD_Table_ID();
int recordId = m_reportEngine.getPrintInfo().getRecord_ID();
if (tableId > 0 && recordId > 0) {
bAttachment.setName("Attachment");
if (ThemeManager.isUseFontIconForImage())
bAttachment.setIconSclass("z-icon-Attachment");
else
bAttachment.setImage(ThemeManager.getThemeResource("images/Attachment24.png"));
bAttachment.setTooltiptext(Util.cleanAmp(Msg.getMsg(Env.getCtx(), "Attachment")));
if (toolbarPopup != null)
{
toolbarPopupLayout.appendChild(bAttachment);
bAttachment.setLabel(bAttachment.getTooltiptext());
}
else
toolBar.appendChild(bAttachment);
bAttachment.addEventListener(Events.ON_CLICK, this);
if (ThemeManager.isUseFontIconForImage())
LayoutUtils.addSclass("medium-toolbarbutton", bAttachment);
}
if ( m_isCanExport )
{
bExport.setName("Export");
if (ThemeManager.isUseFontIconForImage())
bExport.setIconSclass("z-icon-Export");
else
bExport.setImage(ThemeManager.getThemeResource("images/Export24.png"));
bExport.setTooltiptext(Util.cleanAmp(Msg.getMsg(Env.getCtx(), "Export")));
if (toolbarPopup != null)
{
toolbarPopupLayout.appendChild(bExport);
bExport.setLabel(bExport.getTooltiptext());
}
else
toolBar.appendChild(bExport);
bExport.addEventListener(Events.ON_CLICK, this);
if (ThemeManager.isUseFontIconForImage())
LayoutUtils.addSclass("medium-toolbarbutton", bExport);
}
if (toolbarPopup == null)
toolBar.appendChild(new Separator("vertical"));
bRefresh.setName("Refresh");
if (ThemeManager.isUseFontIconForImage())
bRefresh.setIconSclass("z-icon-Refresh");
else
bRefresh.setImage(ThemeManager.getThemeResource("images/Refresh24.png"));
bRefresh.setTooltiptext(Util.cleanAmp(Msg.getMsg(Env.getCtx(), "Refresh")));
if (toolbarPopup != null)
{
toolbarPopupLayout.appendChild(bRefresh);
bRefresh.setLabel(bRefresh.getTooltiptext());
}
else
toolBar.appendChild(bRefresh);
bRefresh.addEventListener(Events.ON_CLICK, this);
if (ThemeManager.isUseFontIconForImage())
LayoutUtils.addSclass("medium-toolbarbutton", bRefresh);
MPrintFormat pf = m_reportEngine.getPrintFormat();
if (pf != null) {
if((!pf.isForm()) && (pf.getAD_ReportView_ID() > 0)) {
bReRun.setName("ReRun");
if (ThemeManager.isUseFontIconForImage())
bReRun.setIconSclass("z-icon-ReRun");
else
bReRun.setImage(ThemeManager.getThemeResource("images/ReRun24.png"));
bReRun.setTooltiptext(Util.cleanAmp(Msg.getMsg(Env.getCtx(), "ReRun")));
if (toolbarPopup != null)
{
toolbarPopupLayout.appendChild(bReRun);
bReRun.setLabel(bReRun.getTooltiptext());
}
else
toolBar.appendChild(bReRun);
bReRun.addEventListener(Events.ON_CLICK, this);
if (ThemeManager.isUseFontIconForImage())
LayoutUtils.addSclass("medium-toolbarbutton", bReRun);
}
}
bWizard.setName("Wizard");
if (ThemeManager.isUseFontIconForImage())
bWizard.setIconSclass("z-icon-Wizard");
else
bWizard.setImage(ThemeManager.getThemeResource("images/Wizard24.png"));
bWizard.setTooltiptext(Util.cleanAmp(Msg.getMsg(Env.getCtx(), "PrintWizard")));
if (toolbarPopup != null)
{
toolbarPopupLayout.appendChild(bWizard);
bWizard.setLabel(bWizard.getTooltiptext());
}
else
toolBar.appendChild(bWizard);
bWizard.addEventListener(Events.ON_CLICK, this);
if (ThemeManager.isUseFontIconForImage())
LayoutUtils.addSclass("medium-toolbarbutton", bWizard);
if (toolbarPopup != null)
{
ToolBarButton more = new ToolBarButton();
if (ThemeManager.isUseFontIconForImage())
more.setIconSclass("z-icon-Expand");
else
more.setImage(ThemeManager.getThemeResource("images/expand-header.png"));
toolBar.appendChild(more);
LayoutUtils.addSclass("space-between-content", toolBar);
more.addEventListener(Events.ON_CLICK, evt -> {
toolbarPopup.open(more, "before_end");
});
}
if (m_isCanExport)
{
uploadServicesMap = MAuthorizationAccount.getUserUploadServices();
if (uploadServicesMap.size() > 0) {
bCloudUpload.setName("CloudUpload");
if (ThemeManager.isUseFontIconForImage())
bCloudUpload.setIconSclass("z-icon-FileImport");
else
bCloudUpload.setImage(ThemeManager.getThemeResource("images/FileImport24.png"));
bCloudUpload.setTooltiptext(Util.cleanAmp(Msg.getMsg(Env.getCtx(), "CloudUpload")));
if (toolbarPopup != null)
{
toolbarPopupLayout.appendChild(bCloudUpload);
bCloudUpload.setLabel(bCloudUpload.getTooltiptext());
}
else
toolBar.appendChild(bCloudUpload);
bCloudUpload.addEventListener(Events.ON_CLICK, this);
}
}
North north = new North();
layout.appendChild(north);
north.appendChild(toolBar);
ZKUpdateUtil.setVflex(north, "min");
center = new Center();
layout.appendChild(center);
iframe = new Iframe();
ZKUpdateUtil.setWidth(iframe, "100%");
ZKUpdateUtil.setHeight(iframe, "100%");
iframe.setId("reportFrame");
center.appendChild(iframe);
South south = new South();
ZKUpdateUtil.setHeight(south, "50px");
layout.appendChild(south);
reportLink = new A();
reportLink.setTarget("_blank");
Div linkDiv = new Div();
linkDiv.setStyle("width:100%; height: 40px; padding: 4px;");
linkDiv.appendChild(reportLink);
rowCount = new Label();
rowCount.setStyle("float: right;");
linkDiv.appendChild(rowCount);
if (m_reportEngine.getPrintData() != null)
rowCount.setText(Msg.getMsg(m_ctx, "RowCount", new Object[] {m_reportEngine.getPrintData().getRowCount(false)}));
south.appendChild(linkDiv);
//m_WindowNo
int AD_Window_ID = Env.getContextAsInt(Env.getCtx(), m_reportEngine.getWindowNo(), "_WinInfo_AD_Window_ID", true);
if (AD_Window_ID == 0)
AD_Window_ID = Env.getZoomWindowID(m_reportEngine.getQuery());
m_AD_Process_ID = m_reportEngine.getPrintInfo() != null ? m_reportEngine.getPrintInfo().getAD_Process_ID() : 0;
updateToolbarAccess(AD_Window_ID, m_AD_Process_ID);
this.setBorder("normal");
this.addEventListener("onZoom", new EventListener() {
public void onEvent(Event event) throws Exception {
if (event instanceof ZoomEvent) {
Clients.clearBusy();
ZoomEvent ze = (ZoomEvent) event;
if (ze.getData() != null && ze.getData() instanceof MQuery) {
AEnv.zoom((MQuery) ze.getData());
}
}
}
});
this.addEventListener(DrillEvent.ON_DRILL_ACROSS, new EventListener() {
public void onEvent(Event event) throws Exception {
if (event instanceof DrillEvent) {
Clients.clearBusy();
DrillEvent de = (DrillEvent) event;
if (de.getData() != null && de.getData() instanceof DrillData) {
DrillData data = (DrillData) de.getData();
AEnv.actionDrill(data, m_WindowNo, m_AD_Process_ID);
}
}
}
});
this.addEventListener(DrillEvent.ON_DRILL_DOWN, new EventListener() {
public void onEvent(Event event) throws Exception {
if (event instanceof DrillEvent) {
Clients.clearBusy();
DrillEvent de = (DrillEvent) event;
if (de.getData() != null && de.getData() instanceof DrillData) {
DrillData data = (DrillData) de.getData();
executeDrillDown(data, event.getTarget());
}
}
}
});
init = true;
Events.echoEvent("onPostInit", this, null);
setTabOnCloseHandler();
}
private void setupPreviewType() {
String selectedValue = null;
if (previewType.getItemCount() > 0) {
if (previewType.getSelectedIndex() >= 0) {
selectedValue = previewType.getSelectedItem().getValue();
}
previewType.getChildren().clear();
}
if (m_reportEngine.getPrintFormat().getJasperProcess_ID() > 0) {
for (ValueNamePair vnp : JasperPrintRenderer.getPreviewType(m_isCanExport)) {
ListItem li = previewType.appendItem(vnp.getName(), vnp.getValue());
if (selectedValue != null && selectedValue.equals(li.getValue()))
previewType.setSelectedItem(li);
}
if (summary != null)
summary.setVisible(false);
} else {
for(String id : rendererMap.keySet()) {
IReportViewerRenderer renderer = rendererMap.get(id);
if (!renderer.isPreview(m_isCanExport))
continue;
ListItem li = previewType.appendItem(renderer.getPreviewLabel(), renderer.getId());
if (selectedValue != null && selectedValue.equals(li.getValue()))
previewType.setSelectedItem(li);
}
if (summary != null)
summary.setVisible(true);
}
}
/**
* Set dummy onCloseHandler for parent tab
*/
private void setTabOnCloseHandler() {
Component parent = this.getParent();
while (parent != null) {
if (parent instanceof Tabpanel) {
Tabpanel parentTabPanel = (Tabpanel) parent;
parentTabPanel.setOnCloseHandler(t -> {
});
break;
}
parent = parent.getParent();
}
}
/**
* Get the maintenance tab of the table associated to the report engine
* @return AD_Tab_ID or -1 if not found
*/
private int getAD_Tab_ID(int AD_Table_ID) {
// Get Find Tab Info
final String sql = "SELECT t.AD_Tab_ID "
+ "FROM AD_Tab t"
+ " INNER JOIN AD_Window w ON (t.AD_Window_ID=w.AD_Window_ID)"
+ " INNER JOIN AD_Table tt ON (t.AD_Table_ID=tt.AD_Table_ID) "
+ "WHERE tt.AD_Table_ID=? "
+ "ORDER BY w.IsDefault DESC, t.SeqNo, ABS (tt.AD_Window_ID-t.AD_Window_ID)";
int AD_Tab_ID = DB.getSQLValueEx(null, sql, AD_Table_ID);
return AD_Tab_ID;
}
/**
* Render report
*/
private void renderReport() {
media = null;
Listitem selected = previewType.getSelectedItem();
new RendererRunnable(this, selected.getValue()).run();
}
/**
* Call from renderer runnable to show report output
*/
private void onPreviewReport() {
try {
if(media == null) {
iframe.setSrc(null);
iframe.setContent(null);
reportLink.setHref("");
reportLink.setLabel("");
if (rowCount != null)
rowCount.setText("");
return;
}
mediaVersion++;
String url = Utils.getDynamicMediaURI(this, mediaVersion, media.getName(), media.getFormat());
String pdfJsUrl = AEnv.toPdfJsUrl(url);
HttpServletRequest request = (HttpServletRequest) Executions.getCurrent().getNativeRequest();
if (url.startsWith(request.getContextPath() + "/"))
url = url.substring((request.getContextPath() + "/").length());
reportLink.setHref(url);
reportLink.setLabel(media.getName());
Listitem selected = previewType.getSelectedItem();
String outputType = previewType.getSelectedItem().getValue();
if (ClientInfo.isMobile()) {
if (selected == null || PDF_OUTPUT_TYPE.equals(selected.getValue())) {
attachIFrame();
iframe.setSrc(pdfJsUrl);
} else if (HTML_OUTPUT_TYPE.equals(outputType)) {
attachIFrame();
iframe.setSrc(null);
iframe.setContent(media);
} else {
IMediaView view = null;
boolean showOptions = false;
if (XLS_OUTPUT_TYPE.equals(outputType) || XLSX_OUTPUT_TYPE.equals(outputType)) {
if (XLS_OUTPUT_TYPE.equals(outputType))
view = Extensions.getMediaView(EXCEL_MIME_TYPE, EXCEL_FILE_EXT, true);
else
view = Extensions.getMediaView(EXCEL_XML_MIME_TYPE, EXCEL_XML_FILE_EXT, true);
showOptions = true;
} else if (CSV_OUTPUT_TYPE.equals(outputType)) {
view = Extensions.getMediaView(CSV_MIME_TYPE, CSV_FILE_EXT, true);
showOptions = true;
}
if (showOptions && (view != null || uploadServicesMap.size() > 0)) {
detachIFrame();
final IMediaView fview = view;
WMediaOptions options = new WMediaOptions(media, fview != null ? () -> fview.renderMediaView(center, media, true) : null, uploadServicesMap);
options.setPage(getPage());
options.doHighlighted();
} else {
attachIFrame();
iframe.setSrc(null);
iframe.setContent(null);
String script = "zk.Widget.$('#" + reportLink.getUuid()+"').$n().click();";
Clients.evalJavaScript(script);
}
}
} else {
if (MSysConfig.getBooleanValue(MSysConfig.ZK_USE_PDF_JS_VIEWER, false, Env.getAD_Client_ID(Env.getCtx()))
&& (selected == null || PDF_OUTPUT_TYPE.equals(selected.getValue()))) {
attachIFrame();
iframe.setSrc(pdfJsUrl);
} else {
IMediaView view = null;
boolean showOptions = false;
if (XLS_OUTPUT_TYPE.equals(outputType) || XLSX_OUTPUT_TYPE.equals(outputType)) {
if (XLS_OUTPUT_TYPE.equals(outputType))
view = Extensions.getMediaView(EXCEL_MIME_TYPE, EXCEL_FILE_EXT, false);
else
view = Extensions.getMediaView(EXCEL_XML_MIME_TYPE, EXCEL_XML_FILE_EXT, false);
showOptions = true;
} else if (CSV_OUTPUT_TYPE.equals(outputType)) {
view = Extensions.getMediaView(CSV_MIME_TYPE, CSV_FILE_EXT, false);
showOptions = true;
}
if (showOptions && (view != null || uploadServicesMap.size() > 0)) {
detachIFrame();
final IMediaView fview = view;
WMediaOptions options = new WMediaOptions(media, fview != null ? () -> fview.renderMediaView(center, media, true) : null, uploadServicesMap);
options.setPage(getPage());
options.doHighlighted();
} else {
attachIFrame();
iframe.setSrc(null);
iframe.setContent(media);
}
}
}
revalidate();
} finally {
hideBusyDialog();
}
}
/**
* Remove iframe
*/
private void detachIFrame() {
center.getChildren().clear();
}
/**
* Add iframe to center
*/
private void attachIFrame() {
if (iframe != null && iframe.getPage() == null) {
center.getChildren().clear();
center.appendChild(iframe);
}
}
/**
* Dynamic Init
*/
private void dynInit()
{
summary.addActionListener(this);
fillComboReport(m_reportEngine.getPrintFormat().get_ID());
revalidate();
if (Window.REPLACE.equals(getAttribute(Window.INSERT_POSITION_KEY))) {
if (m_reportEngine != null && m_reportEngine.getProcessInfo() != null) {
ProcessInfo pi = m_reportEngine.getProcessInfo();
checkProcessInfo(pi);
}
}
} // dynInit
/**
* Open {@link ProcessInfoDialog} if pi has error or logs
* @param pi
*/
private void checkProcessInfo(ProcessInfo pi) {
ProcessInfoUtil.setLogFromDB(pi);
if (pi.isError() || (pi.getLogs() != null && pi.getLogs().length > 0)) {
ProcessInfoDialog dialog = new ProcessInfoDialog(pi, false);
dialog.setAutoCloseAfterZoom(false);
dialog.setPage(this.getPage());
dialog.doHighlighted();
}
}
/**
* Fill ComboBox comboReport with print formats available and option to create new print format.
* @param AD_PrintFormat_ID item to be selected
*/
private void fillComboReport(int AD_PrintFormat_ID)
{
comboReport.removeEventListener(Events.ON_SELECT, this);
comboReport.getItems().clear();
KeyNamePair selectValue = null;
int AD_Window_ID = Env.getContextAsInt(Env.getCtx(), m_reportEngine.getWindowNo(), "_WinInfo_AD_Window_ID", true);
if (AD_Window_ID == 0)
AD_Window_ID = Env.getZoomWindowID(m_reportEngine.getQuery());
int reportViewID = m_reportEngine.getPrintFormat().getAD_ReportView_ID();
// fill Report Options
String sql = MRole.getDefault().addAccessSQL(
"SELECT * "
+ "FROM AD_PrintFormat "
+ "WHERE AD_Table_ID=? "
//Added Lines by Armen
+ "AND IsActive='Y' "
//End of Added Lines
+ (AD_Window_ID > 0 ? "AND (AD_Window_ID=? OR AD_Window_ID IS NULL) " : "")
+ (reportViewID > 0 ? "AND AD_ReportView_ID=? " : "")
+ "ORDER BY Name",
"AD_PrintFormat", MRole.SQL_NOTQUALIFIED, MRole.SQL_RO);
int AD_Table_ID = m_reportEngine.getPrintFormat().getAD_Table_ID();
PreparedStatement pstmt = null;
ResultSet rs = null;
try
{
pstmt = DB.prepareStatement(sql, null);
int idx = 1;
pstmt.setInt(idx++, AD_Table_ID);
if (AD_Window_ID > 0)
pstmt.setInt(idx++, AD_Window_ID);
if (reportViewID > 0)
pstmt.setInt(idx++, reportViewID);
rs = pstmt.executeQuery();
while (rs.next())
{
MPrintFormat printFormat = new MPrintFormat (Env.getCtx(), rs, null);
KeyNamePair pp = new KeyNamePair(printFormat.get_ID(), printFormat.get_Translation(MPrintFormat.COLUMNNAME_Name, Env.getAD_Language(Env.getCtx()), true));
Listitem li = comboReport.appendItem(pp.getName(), pp.getKey());
if (rs.getInt(1) == AD_PrintFormat_ID)
{
selectValue = pp;
if(selectValue != null)
previousSelected = comboReport.getSelectedItem();
comboReport.setSelectedItem(li);
}
}
}
catch (SQLException e)
{
log.log(Level.SEVERE, sql, e);
}
finally
{
DB.close(rs, pstmt);
rs = null;
pstmt = null;
}
// IDEMPIERE-297 - Check for Table Access and Window Access for New Report
int pfAD_Window_ID = MPrintFormat.getZoomWindowID(AD_PrintFormat_ID);
if ( MRole.getDefault().isTableAccess(MPrintFormat.Table_ID, false)
&& Boolean.TRUE.equals(MRole.getDefault().getWindowAccess(pfAD_Window_ID)))
{
StringBuffer sb = new StringBuffer("** ").append(Msg.getMsg(Env.getCtx(), "NewReport")).append(" **");
KeyNamePair pp = new KeyNamePair(-1, sb.toString());
comboReport.appendItem(pp.getName(), pp.getKey());
sb = new StringBuffer("** ").append(Msg.getMsg(m_ctx, "CopyReport")).append(" **");
pp = new KeyNamePair(-2, sb.toString());
comboReport.addItem(pp);
}
comboReport.addEventListener(Events.ON_SELECT, this);
} // fillComboReport
/**
* Update title, status text and state of {@link #bWizard}
*/
private void revalidate()
{
// Report Info
setTitle(Util.cleanAmp(Msg.getMsg(Env.getCtx(), "Report") + ": " + m_reportEngine.getName()));
StringBuilder sb = new StringBuilder ();
sb.append(Msg.getMsg(Env.getCtx(), "DataCols")).append("=")
.append(m_reportEngine.getColumnCount())
.append(", ").append(Msg.getMsg(Env.getCtx(), "DataRows")).append("=")
.append(m_reportEngine.getRowCount());
statusBar.setStatusLine(sb.toString());
//
bWizard.setDisabled(
( m_reportEngine.getPrintFormat() == null
|| (m_reportEngine.getPrintFormat().getAD_Client_ID() == 0 && Env.getAD_Client_ID(Env.getCtx()) != 0)
|| m_reportEngine.getPrintFormat().isForm()));
updateRowCount();
this.invalidate();
} // revalidate
/**
* Close viewer
*/
public void onClose()
{
cleanUp();
super.onClose();
} // dispose
private void cleanUp() {
if (m_reportEngine != null || m_WindowNo >= 0)
{
SessionManager.getAppDesktop().unregisterWindow(m_WindowNo);
m_reportEngine = null;
m_ctx = null;
m_WindowNo = -1;
}
}
@Override
public void onEvent(Event event) throws Exception {
if(event.getName().equals(Events.ON_CLICK) || event.getName().equals(Events.ON_SELECT))
actionPerformed(event);
else if (event.getTarget() == summary)
{
m_reportEngine.setSummary(summary.isSelected());
cmd_report();
}
else if (event.getName().equals(ON_RENDER_REPORT_EVENT))
{
onRenderReportEvent();
} else if (event.getName().equals(Events.ON_CTRL_KEY)) {
KeyEvent keyEvent = (KeyEvent) event;
if (LayoutUtils.isReallyVisible(this))
this.onCtrlKeyEvent(keyEvent);
}
else if (event.getTarget() instanceof ProcessModalDialog)
{
if(DialogEvents.ON_WINDOW_CLOSE.equals(event.getName()))
{
hideBusyMask();
ProcessModalDialog dialog = (ProcessModalDialog) event.getTarget();
if (dialog.isCancel())
{
if (getDesktop() != null)
clearTabOnCloseHandler();
}
ProcessInfo pi = dialog.getProcessInfo();
if (pi != null)
checkProcessInfo(pi);
}
}
else if(IDesktop.ON_CLOSE_WINDOW_SHORTCUT_EVENT.equals(event.getName())) {
IDesktop desktop = SessionManager.getAppDesktop();
if (m_WindowNo > 0 && desktop.isCloseTabWithShortcut())
desktop.closeWindow(m_WindowNo);
else
desktop.setCloseTabWithShortcut(true);
}
}
/**
* Open {@link WReportUploadDialog} to upload report to external destination
*/
private void cmd_upload() {
if (media == null)
return;
WReportUploadDialog winUploadFile = new WReportUploadDialog(this);
winUploadFile.setTitle(Msg.getMsg(Env.getCtx(), "CloudUpload") + ": " + getTitle());
winUploadFile.setAttribute(Window.MODE_KEY, Window.MODE_HIGHLIGHTED);
AEnv.showWindow(winUploadFile);
}
/**
* Handle key event
* @param keyEvent
*/
private void onCtrlKeyEvent(KeyEvent keyEvent) {
if ((keyEvent.isAltKey() && keyEvent.getKeyCode() == 0x58) // Alt-X
|| (keyEvent.getKeyCode() == 0x1B && isUseEscForTabClosing)) { // ESC
if (m_WindowNo > 0) {
keyEvent.stopPropagation();
SessionManager.getAppDesktop().closeWindow(m_WindowNo);
}
}
}
/**
* Handle onRenderReportEvent
*/
private void onRenderReportEvent() {
renderReport();
}
/**
* Handle event
* @param e event
*/
public void actionPerformed (Event e)
{
if (m_setting)
return;
if (e.getTarget() == comboReport)
cmd_report();
else if (MClient.get(m_ctx).isMultiLingualDocument() && e.getTarget() == wLanguage.getComponent()){
cmd_report();
}else if (e.getTarget() == bFind)
cmd_find();
else if (e.getTarget() == bExport)
cmd_export();
else if (e.getTarget() == previewType)
cmd_render();
else if (e.getTarget() == bSendMail)
cmd_sendMail();
else if (e.getTarget() == bArchive)
cmd_archive();
else if (e.getTarget() == bAttachment)
cmd_attachment();
else if (e.getTarget() == bCustomize)
cmd_customize();
else if (e.getTarget() == bWizard)
cmd_Wizard();
else if (e.getTarget() == bRefresh)
cmd_refresh();
else if (e.getTarget() == bReRun)
cmd_reRun();
//
else if (e.getTarget() == m_ddM)
cmd_window(m_ddQ);
else if (e.getTarget() == m_daM)
cmd_window(m_daQ);
else if (e.getTarget() == bCloudUpload)
cmd_upload();
} // actionPerformed
/**
* Handle onSelect event from {@link #previewType}
*/
private void cmd_render() {
postRenderReportEvent();
}
/**
* Execute Drill to Query
* @param data query
* @param component
*/
private void executeDrillDown (DrillData data, Component component)
{
int AD_Table_ID = MTable.getTable_ID(data.getQuery().getTableName());
if (!MRole.getDefault().isCanReport(AD_Table_ID))
{
Dialog.error(m_WindowNo, "AccessCannotReport", data.getQuery().getTableName());
return;
}
if (AD_Table_ID != 0) {
new WReport (AD_Table_ID, data.getQuery(), component, m_WindowNo);
}
else
log.warning("No Table found for " + data.getQuery().getWhereClause(true));
} // executeDrill
/**
* Zoom to window
* @param query query
*/
private void cmd_window (MQuery query)
{
if (query == null)
return;
AEnv.zoom(query);
} // cmd_window
/**
* Send Mail
*/
private void cmd_sendMail()
{
String to = "";
MUser from = MUser.get(Env.getCtx(), Env.getAD_User_ID(Env.getCtx()));
String subject = m_reportEngine.getName();
String message = "";
File attachment = null;
try
{
attachment = new File(FileUtil.getTempMailName(subject, ".pdf"));
m_reportEngine.getPDF(attachment);
}
catch (Exception e)
{
log.log(Level.SEVERE, "", e);
}
WEMailDialog dialog = new WEMailDialog (Msg.getMsg(Env.getCtx(), "SendMail"),
from, to, subject, message, new FileDataSource(attachment),
m_WindowNo, m_reportEngine.getPrintInfo().getAD_Table_ID(),
m_reportEngine.getPrintInfo().getRecord_ID(),
m_reportEngine.getPrintInfo().getRecord_UU(),
m_reportEngine.getPrintInfo());
AEnv.showWindow(dialog);
} // cmd_sendMail
/**
* Archive Report directly
*/
private void cmd_archive ()
{
boolean success = false;
byte[] data = Document.getPDFAsArray(m_reportEngine.getLayout().getPageable(false)); // No Copy
if (data != null)
{
MArchive archive = new MArchive (Env.getCtx(), m_reportEngine.getPrintInfo(), null);
archive.setBinaryData(data);
success = archive.save();
}
if (success)
Dialog.info(m_WindowNo, "Archived");
else
Dialog.error(m_WindowNo, "ArchiveError");
} // cmd_archive
/**
* Add Report to Attachment directly
*/
private void cmd_attachment()
{
int tableId = m_reportEngine.getPrintInfo().getAD_Table_ID();
int recordId = m_reportEngine.getPrintInfo().getRecord_ID();
if (tableId == 0 || recordId == 0)
return;
boolean success = false;
MTable table = MTable.get(tableId);
PO po = table.getPO(recordId, null);
MAttachment attachment = po.createAttachment();
byte[] data = media.isBinary() ? media.getByteData() : media.getStringData().getBytes();
String fileName = m_reportEngine.getName().replace(" ", "_") + "." + media.getFormat();
attachment.addEntry(fileName, data);
success = attachment.save();
if (success)
Dialog.info(m_WindowNo, "DocumentAttached", fileName);
else
Dialog.error(m_WindowNo, "AttachError");
} // cmd_attachment
/**
* Open {@link WReportExportDialog} to export report
*/
private void cmd_export()
{
if (!m_isCanExport)
{
Dialog.error(m_WindowNo, "AccessCannotExport", getTitle());
return;
}
WReportExportDialog winExportFile = new WReportExportDialog(this);
winExportFile.setTitle(Msg.getMsg(Env.getCtx(), "Export") + ": " + getTitle());
winExportFile.setAttribute(Window.MODE_KEY, Window.MODE_HIGHLIGHTED);
AEnv.showWindow(winExportFile);
} // cmd_export
/**
* Sets AD_PrintFormat_Trl Name to AD_PrintFormat Name
* @param pf
*/
private void resetPrintFormatTrl(MPrintFormat pf) {
String sql = "UPDATE AD_PrintFormat_Trl pf "
+ " SET Name = '" + pf.getName() + "' "
+ " WHERE pf.AD_PrintFormat_ID = " + pf.getAD_PrintFormat_ID();
DB.executeUpdate(sql, null);
}
/**
* Report Combo - Start other Report or create new one
*/
private void cmd_report()
{
ListItem li = comboReport.getSelectedItem();
if(li == null || li.getValue() == null) return;
Object pp = li.getValue();
if (pp == null)
return;
jasperPrintRenderer = null;
setTabOnCloseHandler();
//
MPrintFormat pf = null;
int AD_PrintFormat_ID = Integer.valueOf(pp.toString());
// create new
if (AD_PrintFormat_ID == -1)
{
WEditor editor = new WStringEditor();
ZKUpdateUtil.setWidth((HtmlBasedComponent)editor.getComponent(), "98%");
Dialog.askForInputWithCancel(m_WindowNo, editor, "CreateNewPrintFormat", Msg.getMsg(m_ctx, "CreateNewPrintFormatTitle"), new Callback>() {
public void onCallback(Map.Entry result) {
if((result == null) || (!(result.getValue() instanceof String)) || (!result.getKey())) {
comboReport.setSelectedItem(previousSelected);
return;
}
MPrintFormat pf = null;
if (!Util.isEmpty((String)result.getValue())) {
int AD_ReportView_ID = m_reportEngine.getPrintFormat().getAD_ReportView_ID();
if (AD_ReportView_ID != 0)
{
String name = (String)result.getValue();
pf = MPrintFormat.createFromReportView(m_ctx, AD_ReportView_ID, name);
}
else
{
int AD_Table_ID = m_reportEngine.getPrintFormat().getAD_Table_ID();
pf = MPrintFormat.createFromTable(m_ctx, AD_Table_ID);
}
if (pf != null) {
pf.setName((String)result.getValue());
if(!pf.save()) {
Calendar cal = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
String dt = sdf.format(cal.getTime());
pf.setName(pf.getName() + "_" + dt);
pf.saveEx();
}
resetPrintFormatTrl(pf);
fillComboReport(pf.get_ID());
}
else
return;
// Get Language from previous - thanks Gunther Hoppe
if (m_reportEngine.getPrintFormat() != null)
{
setLanguage();
pf.setLanguage(m_reportEngine.getPrintFormat().getLanguage()); // needs to be re-set - otherwise viewer will be blank
pf.setTranslationLanguage(m_reportEngine.getPrintFormat().getLanguage());
}
if (m_reportEngine.getPrintFormat().getJasperProcess_ID() != pf.getJasperProcess_ID()) {
m_reportEngine.setPrintFormat(pf);
setupPreviewType();
if (m_reportEngine.getPrintFormat().getJasperProcess_ID() == 0) {
m_reportEngine.setQuery(m_reportEngine.getQuery());
m_reportEngine.getLayout();
}
} else {
m_reportEngine.setPrintFormat(pf);
}
m_reportEngine.initName();
postRenderReportEvent();
}
else {
comboReport.setSelectedItem(previousSelected);
}
}
});
} else if (AD_PrintFormat_ID == -2) {
WEditor editor = new WStringEditor();
ZKUpdateUtil.setWidth((HtmlBasedComponent)editor.getComponent(), "90%");
Dialog.askForInputWithCancel(m_WindowNo, editor, "CreatePrintFormatCopy", Msg.getMsg(m_ctx, "CreatePrintFormatCopyTitle"), new Callback>() {
public void onCallback(Map.Entry result) {
if((result == null) || (!(result.getValue() instanceof String)) || (!result.getKey())) {
comboReport.setSelectedItem(previousSelected);
return;
}
MPrintFormat pf = null;
if (!Util.isEmpty((String)result.getValue())) {
MPrintFormat current = m_reportEngine.getPrintFormat();
if (current != null) {
pf = MPrintFormat.copyToClient(m_ctx,
current.getAD_PrintFormat_ID(),
Env.getAD_Client_ID(m_ctx));
if (pf != null) {
pf.setName((String)result.getValue());
if(!pf.save()) {
Calendar cal = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
String dt = sdf.format(cal.getTime());
pf.setName(pf.getName() + "_" + dt);
pf.saveEx();
}
resetPrintFormatTrl(pf);
fillComboReport(pf.get_ID());
}
else
return;
} else
return;
// Get Language from previous - thanks Gunther Hoppe
if (m_reportEngine.getPrintFormat() != null)
{
setLanguage();
pf.setLanguage(m_reportEngine.getPrintFormat().getLanguage()); // needs to be re-set - otherwise viewer will be blank
pf.setTranslationLanguage(m_reportEngine.getPrintFormat().getLanguage());
}
m_reportEngine.initName();
if (m_reportEngine.getPrintFormat().getJasperProcess_ID() != pf.getJasperProcess_ID()) {
m_reportEngine.setPrintFormat(pf);
setupPreviewType();
if (m_reportEngine.getPrintFormat().getJasperProcess_ID() == 0) {
m_reportEngine.setQuery(m_reportEngine.getQuery());
m_reportEngine.getLayout();
}
} else {
m_reportEngine.setPrintFormat(pf);
}
postRenderReportEvent();
}
else {
comboReport.setSelectedItem(previousSelected);
}
}
});
}
else {
// Get Language from previous - thanks Gunther Hoppe
pf = MPrintFormat.get (Env.getCtx(), AD_PrintFormat_ID, true);
if (m_reportEngine.getPrintFormat() != null)
{
setLanguage();
pf.setLanguage(m_reportEngine.getPrintFormat().getLanguage()); // needs to be re-set - otherwise viewer will be blank
pf.setTranslationLanguage(m_reportEngine.getPrintFormat().getLanguage());
}
if (m_reportEngine.getPrintFormat().getJasperProcess_ID() != pf.getJasperProcess_ID()) {
m_reportEngine.setPrintFormat(pf);
setupPreviewType();
if (m_reportEngine.getPrintFormat().getJasperProcess_ID() == 0) {
m_reportEngine.setQuery(m_reportEngine.getQuery());
m_reportEngine.getLayout();
}
} else {
m_reportEngine.setPrintFormat(pf);
}
m_reportEngine.initName();
postRenderReportEvent();
}
setTitle(Util.cleanAmp(Msg.getMsg(Env.getCtx(), "Report") + ": " + m_reportEngine.getName()));
} // cmd_report
/**
* Refresh with same parameters
*/
private void cmd_refresh() {
int AD_Process_ID = m_reportEngine.getPrintInfo() != null ? m_reportEngine.getPrintInfo().getAD_Process_ID() : 0;
if(AD_Process_ID <= 0 || m_reportEngine.getPrintInfo().getRecord_ID() > 0)
this.cmd_report();
else
this.cmd_reRun(MProcess.SHOWHELP_RunSilently_TakeDefaults);
}
/**
* Rerun report
*/
private void cmd_reRun() {
this.cmd_reRun(null);
}
/**
* Rerun report
* @param showHelp if SHOWHELP_RunSilently_TakeDefaults, re-run with same parameter (i.e just refresh)
*/
private void cmd_reRun(String showHelp) {
int AD_Process_ID = m_reportEngine.getPrintInfo() != null ? m_reportEngine.getPrintInfo().getAD_Process_ID() : 0;
if(AD_Process_ID <= 0)
return;
ProcessInfo pi = new ProcessInfo("RefreshWithParameters", AD_Process_ID);
pi.setLanguageID(m_reportEngine.getLanguageID());
pi.setReportType(m_reportEngine.getReportType());
pi.setSerializableObject(m_reportEngine.getPrintFormat());
pi.setReplaceTabContent();
if(!Util.isEmpty(showHelp))
pi.setShowHelp(showHelp);
setTabOnCloseHandler();
String predefined = (String) getAttribute(ProcessDialog.SAVED_PREDEFINED_CONTEXT_VARIABLES);
if (!Util.isEmpty(predefined, true)) {
Env.setContext(Env.getCtx(), m_WindowNo, ProcessDialog.SAVED_PREDEFINED_CONTEXT_VARIABLES, predefined);
Env.setPredefinedVariables(Env.getCtx(), m_WindowNo, predefined);
}
if (getAttribute("IsSOTrx") != null) {
Env.setContext(Env.getCtx(), m_WindowNo, "IsSOTrx", getAttribute("IsSOTrx").toString());
}
ProcessModalDialog processModalDialog = new ProcessModalDialog(this, m_WindowNo, pi);
ZKUpdateUtil.setWindowWidthX(processModalDialog, 850);
this.getParent().appendChild(processModalDialog);
if (ClientInfo.isMobile())
{
processModalDialog.doHighlighted();
}
else
{
showBusyMask(processModalDialog);
LayoutUtils.openOverlappedWindow(this, processModalDialog, "middle_center");
}
processModalDialog.focus();
} // cmd_reRun
/**
* Set language to {@link #m_reportEngine}
*/
protected void setLanguage (){
if (MClient.get(m_ctx).isMultiLingualDocument() && wLanguage != null && wLanguage.getValue() != null){
MLanguage language = new MLanguage (m_ctx, (int)wLanguage.getValue(), null);
Language lang = new Language(language.getName(), language.getAD_Language(), language.getLocale());
m_reportEngine.setLanguageID(language.getAD_Language_ID());
m_reportEngine.getPrintFormat().setLanguage(lang);
m_reportEngine.getPrintFormat().setTranslationLanguage(lang);
}
}
/**
* Set preview type to {@link #m_reportEngine}
*/
protected void setPreviewType() {
String type = Objects.toString(previewType.getValue());
// get default from SysConfig
if(type == null) {
type = m_reportEngine.getPrintFormat().isForm()
? MSysConfig.getValue(MSysConfig.ZK_REPORT_FORM_OUTPUT_TYPE,PDF_OUTPUT_TYPE,Env.getAD_Client_ID(m_ctx),Env.getAD_Org_ID(m_ctx))
: MSysConfig.getValue(MSysConfig.ZK_REPORT_TABLE_OUTPUT_TYPE,PDF_OUTPUT_TYPE,Env.getAD_Client_ID(m_ctx),Env.getAD_Org_ID(m_ctx));
}
m_reportEngine.setReportType(type);
}
/**
* Echo {@link #ON_RENDER_REPORT_EVENT} event
*/
private void postRenderReportEvent() {
showBusyDialog();
setLanguage();
setPreviewType();
Events.echoEvent(ON_RENDER_REPORT_EVENT, this, null);
}
/**
* Query Report
*/
private void cmd_find()
{
String title = null;
String tableName = null;
int AD_Table_ID = m_reportEngine.getPrintFormat().getAD_Table_ID();
int AD_Tab_ID = getAD_Tab_ID(AD_Table_ID);
// ASP
MClient client = MClient.get(Env.getCtx());
String ASPFilter = "";
if (client.isUseASP())
ASPFilter =
" AND ( AD_Tab_ID IN ( "
// Just ASP subscribed tabs for client "
+ " SELECT t.AD_Tab_ID "
+ " FROM ASP_Tab t, ASP_Window w, ASP_Level l, ASP_ClientLevel cl "
+ " WHERE w.ASP_Level_ID = l.ASP_Level_ID "
+ " AND cl.AD_Client_ID = " + client.getAD_Client_ID()
+ " AND cl.ASP_Level_ID = l.ASP_Level_ID "
+ " AND t.ASP_Window_ID = w.ASP_Window_ID "
+ " AND t.IsActive = 'Y' "
+ " AND w.IsActive = 'Y' "
+ " AND l.IsActive = 'Y' "
+ " AND cl.IsActive = 'Y' "
+ " AND t.ASP_Status = 'S') " // Show
+ " OR AD_Tab_ID IN ( "
// + show ASP exceptions for client
+ " SELECT AD_Tab_ID "
+ " FROM ASP_ClientException ce "
+ " WHERE ce.AD_Client_ID = " + client.getAD_Client_ID()
+ " AND ce.IsActive = 'Y' "
+ " AND ce.AD_Tab_ID IS NOT NULL "
+ " AND ce.AD_Field_ID IS NULL "
+ " AND ce.ASP_Status = 'S') " // Show
+ " ) "
+ " AND AD_Tab_ID NOT IN ( "
// minus hide ASP exceptions for client
+ " SELECT AD_Tab_ID "
+ " FROM ASP_ClientException ce "
+ " WHERE ce.AD_Client_ID = " + client.getAD_Client_ID()
+ " AND ce.IsActive = 'Y' "
+ " AND ce.AD_Tab_ID IS NOT NULL "
+ " AND ce.AD_Field_ID IS NULL "
+ " AND ce.ASP_Status = 'H')"; // Hide
//
String sql = null;
if (!Env.isBaseLanguage(Env.getCtx(), "AD_Tab")) {
sql = "SELECT Name, TableName FROM AD_Tab_vt WHERE AD_Tab_ID=?"
+ " AND AD_Language='" + Env.getAD_Language(Env.getCtx()) + "' " + ASPFilter;
} else {
sql = "SELECT Name, TableName FROM AD_Tab_v WHERE AD_Tab_ID=? " + ASPFilter;
}
PreparedStatement pstmt = null;
ResultSet rs = null;
try
{
pstmt = DB.prepareStatement(sql, null);
pstmt.setInt(1, AD_Tab_ID);
rs = pstmt.executeQuery();
//
if (rs.next())
{
title = rs.getString(1);
tableName = rs.getString(2);
}
}
catch (SQLException e)
{
throw new DBException(e);
}
finally
{
DB.close(rs, pstmt);
rs = null;
pstmt = null;
}
GridField[] findFields = null;
if (tableName != null)
findFields = GridField.createFields(m_ctx, m_WindowNo, 0, AD_Tab_ID);
if (findFields == null) // No Tab for Table exists
bFind.setVisible(false);
else
{
if (find == null)
{
find = Extensions.getFindWindow(m_WindowNo, 0, title, AD_Table_ID, tableName,m_reportEngine.getWhereExtended(), findFields, 1, AD_Tab_ID, null);
if (!find.initialize())
{
find = null;
return;
}
find.addEventListener(DialogEvents.ON_WINDOW_CLOSE, new EventListener() {
@Override
public void onEvent(Event event) throws Exception {
if (!find.isCancel())
{
m_reportEngine.setQuery(find.getQuery());
postRenderReportEvent();
}
}
});
setupFindwindow(find);
}
getParent().appendChild(find);
LayoutUtils.openHighlightedWindow(toolBar, find, "after_start");
LayoutUtils.sameWidth(find, this);
}
} // cmd_find
/**
* Open print format window
*/
private void cmd_customize()
{
int AD_PrintFormat_ID = m_reportEngine.getPrintFormat().get_ID();
int pfAD_Window_ID = MPrintFormat.getZoomWindowID(AD_PrintFormat_ID);
AEnv.zoom(pfAD_Window_ID, MQuery.getEqualQuery("AD_PrintFormat_ID", AD_PrintFormat_ID));
} // cmd_customize
/**
* IDEMPIERE-379 Report customization wizard
*/
private void cmd_Wizard()
{
ADForm form = ADForm.openForm(SystemIDs.FORM_REPORT_WIZARD);
WReportCustomization av = (WReportCustomization) form.getICustomForm();
av.setReportEngine(m_reportEngine);
form.setClosable(true);
ZKUpdateUtil.setWidth(form, "70%");
ZKUpdateUtil.setHeight(form, "85%");
form.addEventListener(DialogEvents.ON_WINDOW_CLOSE, new EventListener() {
@Override
public void onEvent(Event event) throws Exception {
if (DialogEvents.ON_WINDOW_CLOSE.equals(event.getName())) {
fillComboReport (m_reportEngine.getPrintFormat().get_ID());
cmd_report();
}
}
});
form.setAttribute(Window.MODE_KEY, Window.MODE_HIGHLIGHTED);
SessionManager.getAppDesktop().showWindow(form);
} // cmd_Wizard
//-- ComponentCtrl --//
public Object getExtraCtrl() {
return new ExtraCtrl();
}
/** A utility class to implement {@link #getExtraCtrl}.
* It is used only by component developers.
*/
protected class ExtraCtrl extends XulElement.ExtraCtrl
implements DynamicMedia {
//-- DynamicMedia --//
public Media getMedia(String pathInfo) {
return media;
}
}
private boolean ToolBarMenuRestictionLoaded = false;
/**
* Hide not accessible toolbar
* @param AD_Window_ID
* @param AD_Process_ID
*/
public void updateToolbarAccess(int AD_Window_ID, int AD_Process_ID) {
if (ToolBarMenuRestictionLoaded)
return;
Properties m_ctx = Env.getCtx();
int ToolBarButton_ID = 0;
int[] restrictionList = AD_Window_ID > 0
? MToolBarButtonRestrict.getOfWindow(m_ctx, MRole.getDefault().getAD_Role_ID(), AD_Window_ID, true, null)
: MToolBarButtonRestrict.getOfReport(m_ctx, MRole.getDefault().getAD_Role_ID(), AD_Process_ID, null);
if (log.isLoggable(Level.INFO))
log.info("restrictionList="+restrictionList.toString());
for (int i = 0; i < restrictionList.length; i++)
{
ToolBarButton_ID= restrictionList[i];
X_AD_ToolBarButton tbt = new X_AD_ToolBarButton(m_ctx, ToolBarButton_ID, null);
if (!"R".equals(tbt.getAction()))
continue;
String restrictName = tbt.getComponentName();
if (log.isLoggable(Level.CONFIG)) log.config("tbt="+tbt.getAD_ToolBarButton_ID() + " / " + restrictName);
for (Component p = this.toolBar.getFirstChild(); p != null; p = p.getNextSibling()) {
if (p instanceof Toolbarbutton) {
if ( restrictName.equals(((ToolBarButton)p).getName()) ) {
this.toolBar.removeChild(p);
break;
}
}
}
} // All restrictions
ToolBarMenuRestictionLoaded = true;
}//updateToolbarAccess
private void showBusyDialog() {
progressWindow = new BusyDialog();
progressWindow.setStyle("position: absolute;");
this.appendChild(progressWindow);
showBusyMask(progressWindow);
LayoutUtils.openOverlappedWindow(this, progressWindow, "middle_center");
}
private Div getMask() {
if (mask == null) {
mask = new Mask();
}
return mask;
}
private void showBusyMask(Window window) {
getParent().appendChild(getMask());
StringBuilder script = new StringBuilder("(function(){let w=zk.Widget.$('#");
script.append(getParent().getUuid()).append("');");
if (window != null) {
script.append("let d=zk.Widget.$('#").append(window.getUuid()).append("');w.busy=d;");
} else {
script.append("w.busy=true;");
}
script.append("})()");
Clients.response(new AuScript(script.toString()));
}
public void hideBusyMask() {
if (mask != null && mask.getParent() != null) {
mask.detach();
StringBuilder script = new StringBuilder("(function(){let w=zk.Widget.$('#");
script.append(getParent().getUuid()).append("');if(w){w.busy=false;}");
script.append("})()");
Clients.response(new AuScript(script.toString()));
}
}
private void hideBusyDialog() {
hideBusyMask();
if (progressWindow != null) {
progressWindow.dispose();
progressWindow = null;
}
if (getDesktop() != null)
clearTabOnCloseHandler();
}
private void clearTabOnCloseHandler() {
Executions.schedule(getDesktop(), e -> {
Component parent = this.getParent();
while (parent != null) {
if (parent instanceof Tabpanel) {
Tabpanel parentTabPanel = (Tabpanel) parent;
parentTabPanel.setOnCloseHandler(null);
break;
}
parent = parent.getParent();
}
}, new Event("onClearTabOnCloseHandler"));
}
private static class RendererRunnable extends ZkContextRunnable implements IServerPushCallback {
private ZkReportViewer viewer;
private String rendererId;
public RendererRunnable(ZkReportViewer viewer, String rendererId) {
this.viewer = viewer;
this.rendererId = rendererId;
}
@Override
public void updateUI() {
viewer.onPreviewReport();
}
@Override
protected void doRun() {
try {
if (viewer.m_reportEngine.getPrintFormat().getJasperProcess_ID() > 0) {
if (viewer.jasperPrintRenderer == null) {
MPrintFormat format = viewer.m_reportEngine.getPrintFormat();
PrintInfo printInfo = viewer.m_reportEngine.getPrintInfo();
ProcessInfo jasperProcessInfo = new ProcessInfo (viewer.getTitle(), format.getJasperProcess_ID());
jasperProcessInfo.setRecord_ID (printInfo.getRecord_ID());
jasperProcessInfo.setTable_ID(printInfo.getAD_Table_ID());
jasperProcessInfo.setSerializableObject(format);
ArrayList jasperPrintParams = new ArrayList();
ProcessInfoParameter pip = new ProcessInfoParameter(ServerReportCtl.PARAM_PRINT_FORMAT, format, null, null, null);
jasperPrintParams.add(pip);
pip = new ProcessInfoParameter(ServerReportCtl.PARAM_PRINT_INFO, printInfo, null, null, null);
jasperPrintParams.add(pip);
jasperProcessInfo.setParameter(jasperPrintParams.toArray(new ProcessInfoParameter[]{}));
jasperProcessInfo.setExport(true);
jasperProcessInfo.setExportFileExtension("JasperPrint");
ProcessCall pc = Core.getProcess("org.adempiere.report.jasper.ReportStarter");
pc.startProcess(Env.getCtx(), jasperProcessInfo, null);
JasperPrint jasperPrint = (JasperPrint) jasperProcessInfo.getInternalReportObject();
viewer.jasperPrintRenderer = new JasperPrintRenderer(jasperPrint, viewer.getTitle());
viewer.jasperPrintRenderer.setRowCount(jasperProcessInfo.getRowCount());
}
} else {
viewer.m_reportEngine.initName();
List archiveList = Arrays.asList(PDF_OUTPUT_TYPE, HTML_OUTPUT_TYPE, XLS_OUTPUT_TYPE, XLSX_OUTPUT_TYPE);
if (archiveList.contains(rendererId)) {
if (!ArchiveEngine.isValid(viewer.m_reportEngine.getLayout()))
log.warning("Cannot archive Document");
}
}
viewer.createNewMedia(rendererId);
} catch (Exception e) {
if (e instanceof RuntimeException)
throw (RuntimeException)e;
else
throw new RuntimeException(e);
} finally {
Desktop desktop = AEnv.getDesktop();
if (desktop != null && desktop.isAlive()) {
new ServerPushTemplate(desktop).executeAsync(this);
}
}
}
}
private void createNewMedia(String rendererId) {
media = null;
media = getMedia(rendererId);
}
@Override
public AMedia getMedia(String contentType, String fileExtension) {
if (jasperPrintRenderer != null) {
return jasperPrintRenderer.getMedia(contentType, fileExtension);
}
IReportViewerRenderer renderer = rendererMap.get(toRendererId(contentType, fileExtension));
if (renderer.isSameContentForExportAndPreview() && media != null
&& media.getContentType().equals(contentType) && media.getFormat().equals(fileExtension))
return media;
return renderer != null ? renderer.renderMedia(this, true) : null;
}
public AMedia getMedia(String rendererId) {
if (jasperPrintRenderer != null) {
return jasperPrintRenderer.getMedia(JasperPrintRenderer.getMIMEType(rendererId), JasperPrintRenderer.getFileExtension(rendererId));
}
IReportViewerRenderer renderer = rendererMap.get(rendererId);
return renderer != null ? renderer.renderMedia(this, false) : null;
}
@Override
public ExportFormat[] getExportFormats() {
if (jasperPrintRenderer != null) {
return jasperPrintRenderer.getExportFormats();
}
return exportMap.keySet().toArray(new ExportFormat[0]);
}
@Override
public String getContentType() {
return media != null ? media.getContentType() : null;
}
@Override
public String getFileExtension() {
return media != null ? media.getFormat() : null;
}
@Override
public Map getUploadServiceMap() {
return Collections.unmodifiableMap(uploadServicesMap);
}
@Override
public String getReportName() {
return m_reportEngine.getName();
}
/**
* Get report engine
* @return report engine
*/
public ReportEngine getReportEngine() {
return m_reportEngine;
}
private void setupFindwindow(FindWindow findWindow) {
findWindow.setTitle(null);
findWindow.setBorder("none");
if (ClientInfo.maxHeight(ClientInfo.MEDIUM_HEIGHT-1))
ZKUpdateUtil.setHeight(findWindow, "100%");
else
ZKUpdateUtil.setHeight(findWindow, "60%");
findWindow.setSizable(false);
findWindow.setContentStyle("background-color: #fff; width: 99%; margin: auto;");
}
/**
* Update Row Count label
*/
private void updateRowCount() {
if(rowCount != null) {
if (jasperPrintRenderer != null) {
rowCount.setValue("");
} else if (m_reportEngine.getPrintData() != null) {
rowCount.setValue(Msg.getMsg(Env.getCtx(), "RowCount", new Object[] {m_reportEngine.getPrintData().getRowCount(false)}));
} else {
rowCount.setValue("");
}
}
}
}