/****************************************************************************** * Copyright (C) 2008 Low Heng Sin * * Copyright (C) 2008 Idalica Corporation * * 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. * *****************************************************************************/ package org.adempiere.webui.desktop; import java.util.List; import org.adempiere.webui.apps.ProcessDialog; import org.adempiere.webui.apps.wf.WFPanel; import org.adempiere.webui.component.DesktopTabpanel; import org.adempiere.webui.component.Tabbox; import org.adempiere.webui.component.Tabpanel; import org.adempiere.webui.component.Window; import org.adempiere.webui.panel.ADForm; import org.adempiere.webui.part.WindowContainer; import org.adempiere.webui.window.ADWindow; import org.adempiere.webui.window.WTask; import org.compiere.model.MQuery; import org.compiere.model.MTask; import org.compiere.util.Env; import org.compiere.util.WebDoc; import org.compiere.wf.MWorkflow; import org.zkoss.util.media.AMedia; import org.zkoss.zk.ui.Component; import org.zkoss.zul.Iframe; import org.zkoss.zul.Tab; import org.zkoss.zul.Tabpanels; /** * A Tabbed MDI implementation * @author hengsin * */ public abstract class TabbedDesktop extends AbstractDesktop { protected WindowContainer windowContainer; public TabbedDesktop() { super(); windowContainer = new WindowContainer(); } /** * * @param processId * @param soTrx * @return ProcessDialog */ public ProcessDialog openProcessDialog(int processId, boolean soTrx) { ProcessDialog pd = new ProcessDialog (processId, soTrx); if (pd.isValid()) { DesktopTabpanel tabPanel = new DesktopTabpanel(); pd.setParent(tabPanel); String title = pd.getTitle(); pd.setTitle(null); preOpenNewTab(); windowContainer.addWindow(tabPanel, title, true); } return pd; } /** * * @param formId * @return ADWindow */ public ADForm openForm(int formId) { ADForm form = ADForm.openForm(formId); DesktopTabpanel tabPanel = new DesktopTabpanel(); form.setParent(tabPanel); //do not show window title when open as tab form.setTitle(null); preOpenNewTab(); windowContainer.addWindow(tabPanel, form.getFormName(), true); return form; } /** * * @param workflow_ID */ public void openWorkflow(int workflow_ID) { WFPanel p = new WFPanel(); p.load(workflow_ID); DesktopTabpanel tabPanel = new DesktopTabpanel(); p.setParent(tabPanel); preOpenNewTab(); windowContainer.addWindow(tabPanel, p.getWorkflow().get_Translation(MWorkflow.COLUMNNAME_Name), true); } /** * * @param windowId * @return ADWindow */ public ADWindow openWindow(int windowId) { ADWindow adWindow = new ADWindow(Env.getCtx(), windowId); DesktopTabpanel tabPanel = new DesktopTabpanel(); if (adWindow.createPart(tabPanel) != null) { preOpenNewTab(); windowContainer.addWindow(tabPanel, adWindow.getTitle(), true); return adWindow; } else { //user cancel return null; } } /** * * @param windowId * @param query * @return ADWindow */ public ADWindow openWindow(int windowId, MQuery query) { ADWindow adWindow = new ADWindow(Env.getCtx(), windowId, query); DesktopTabpanel tabPanel = new DesktopTabpanel(); if (adWindow.createPart(tabPanel) != null) { preOpenNewTab(); windowContainer.addWindow(tabPanel, adWindow.getTitle(), true); return adWindow; } else { //user cancel return null; } } /** * * @param taskId */ public void openTask(int taskId) { MTask task = new MTask(Env.getCtx(), taskId, null); new WTask(task.getName(), task); } /** * @param url */ public void showURL(String url, boolean closeable) { showURL(url, url, closeable); } /** * * @param url * @param title * @param closeable */ public void showURL(String url, String title, boolean closeable) { Iframe iframe = new Iframe(url); addWin(iframe, title, closeable); } /** * @param webDoc * @param title * @param closeable */ public void showURL(WebDoc webDoc, String title, boolean closeable) { Iframe iframe = new Iframe(); AMedia media = new AMedia(title, "html", "text/html", webDoc.toString().getBytes()); iframe.setContent(media); addWin(iframe, title, closeable); } /** * * @param fr * @param title * @param closeable */ private void addWin(Iframe fr, String title, boolean closeable) { fr.setWidth("100%"); fr.setHeight("100%"); fr.setStyle("padding: 0; margin: 0; border: none; position: absolute"); Window window = new Window(); window.setWidth("100%"); window.setHeight("100%"); window.setStyle("padding: 0; margin: 0; border: none"); window.appendChild(fr); window.setStyle("position: absolute"); Tabpanel tabPanel = new Tabpanel(); window.setParent(tabPanel); preOpenNewTab(); windowContainer.addWindow(tabPanel, title, closeable); } /** * @param AD_Window_ID * @param query */ public void showZoomWindow(int AD_Window_ID, MQuery query) { ADWindow wnd = new ADWindow(Env.getCtx(), AD_Window_ID, query); DesktopTabpanel tabPanel = new DesktopTabpanel(); if (wnd.createPart(tabPanel) != null) { preOpenNewTab(); windowContainer.insertAfter(windowContainer.getSelectedTab(), tabPanel, wnd.getTitle(), true, true); } } /** * @param AD_Window_ID * @param query * @deprecated */ public void showWindow(int AD_Window_ID, MQuery query) { openWindow(AD_Window_ID, query); } /** * * @param window */ protected void showEmbedded(Window window) { Tabpanel tabPanel = new Tabpanel(); window.setParent(tabPanel); String title = window.getTitle(); window.setTitle(null); preOpenNewTab(); if (Window.INSERT_NEXT.equals(window.getAttribute(Window.INSERT_POSITION_KEY))) windowContainer.insertAfter(windowContainer.getSelectedTab(), tabPanel, title, true, true); else windowContainer.addWindow(tabPanel, title, true); } /** * Close active tab * @return boolean */ public boolean closeActiveWindow() { if (windowContainer.getSelectedTab() != null) { Tabpanel panel = (Tabpanel) windowContainer.getSelectedTab().getLinkedPanel(); Component component = panel.getFirstChild(); Object att = component.getAttribute(WINDOWNO_ATTRIBUTE); if ( windowContainer.closeActiveWindow() ) { if (att != null && (att instanceof Integer)) { unregisterWindow((Integer) att); } return true; } else { return false; } } return false; } /** * @return Component */ public Component getActiveWindow() { return windowContainer.getSelectedTab().getLinkedPanel().getFirstChild(); } /** * * @param windowNo * @return boolean */ public boolean closeWindow(int windowNo) { Tabbox tabbox = windowContainer.getComponent(); Tabpanels panels = tabbox.getTabpanels(); List<?> childrens = panels.getChildren(); for (Object child : childrens) { Tabpanel panel = (Tabpanel) child; Component component = panel.getFirstChild(); Object att = component.getAttribute(WINDOWNO_ATTRIBUTE); if (att != null && (att instanceof Integer)) { if (windowNo == (Integer)att) { Tab tab = panel.getLinkedTab(); panel.getLinkedTab().onClose(); if (tab.getParent() == null) { unregisterWindow(windowNo); return true; } else { return false; } } } } return false; } /** * invoke before a new tab is added to the desktop */ protected void preOpenNewTab() { } }