/******************************************************************************
* Product: Posterita Ajax UI *
* Copyright (C) 2007 Posterita Ltd. 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. *
* For the text or an alternative of this public license, you may reach us *
* Posterita Ltd., 3, Draper Avenue, Quatre Bornes, Mauritius *
* or via info@posterita.org or http://www.posterita.org/ *
* *
* Contributors: *
* - Heng Sin Low *
* *
* Sponsors: *
* - Idalica Corporation *
*****************************************************************************/
package org.adempiere.webui.adwindow;
import java.util.Properties;
import org.adempiere.util.Callback;
import org.adempiere.webui.LayoutUtils;
import org.adempiere.webui.component.Tabpanel;
import org.adempiere.webui.panel.IHelpContext;
import org.adempiere.webui.panel.ITabOnCloseHandler;
import org.adempiere.webui.part.WindowContainer;
import org.adempiere.webui.session.SessionManager;
import org.adempiere.webui.util.ZKUpdateUtil;
import org.compiere.model.X_AD_CtxHelp;
import org.compiere.util.CLogger;
import org.zkoss.zk.ui.Component;
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.zul.Div;
import org.zkoss.zul.Tab;
import org.zkoss.zul.Vlayout;
/**
* Content area of {@link ADWindow}.
*
* @author Ashley G Ramdass
* @author Low Heng Sin
* @date Feb 25, 2007
* @version $Revision: 0.10 $
*/
public class ADWindowContent extends AbstractADWindowContent
{
@SuppressWarnings("unused")
private static final CLogger logger = CLogger.getCLogger(ADWindowContent.class);
/** Main layout component **/
private Vlayout layout;
/** Center Div of {@link #layout}, host {@link CompositeADTabbox} **/
private Div contentArea;
/**
* @param ctx
* @param windowNo
* @param adWindowId
*/
public ADWindowContent(Properties ctx, int windowNo, int adWindowId)
{
super(ctx, windowNo, adWindowId);
}
/**
* Layout UI.
* Vertical layout of toolbar, breadCrumb, statusBar and {@link #contentArea}.
*/
@Override
protected Component doCreatePart(Component parent)
{
layout = new ADWindowVlayout(this);
if (parent != null) {
layout.setParent(parent);
layout.setSclass("adwindow-layout");
} else {
layout.setPage(page);
}
layout.setSpacing("0px");
//toolbar
Div north = new Div();
north.setParent(layout);
north.setSclass("adwindow-north");
Div div = new Div();
div.setStyle("height: 100%; width: 100%");
north.appendChild(div);
ZKUpdateUtil.setVflex(north, "0");
toolbar.setParent(div);
toolbar.setWindowNo(getWindowNo());
breadCrumb = new BreadCrumb(this, getWindowNo());
breadCrumb.setToolbarListener(this);
breadCrumb.setId("breadCrumb");
div.appendChild(breadCrumb);
//status bar
div.appendChild(statusBar);
LayoutUtils.addSclass("adwindow-status", statusBar);
//IADTabbox
contentArea = new Div();
contentArea.setParent(layout);
ZKUpdateUtil.setVflex(contentArea, "1");
ZKUpdateUtil.setHflex(contentArea, "1");
contentArea.setStyle("overflow: auto;");
adTabbox.createPart(contentArea);
if (parent instanceof Tabpanel) {
TabOnCloseHanlder handler = new TabOnCloseHanlder();
((Tabpanel)parent).setOnCloseHandler(handler);
}
SessionManager.getSessionApplication().getKeylistener().addEventListener(Events.ON_CTRL_KEY, this);
layout.addEventListener(WindowContainer.ON_WINDOW_CONTAINER_SELECTION_CHANGED_EVENT, this);
return layout;
}
/**
* Create {@link CompositeADTabbox}
*/
@Override
protected IADTabbox createADTab()
{
CompositeADTabbox composite = new CompositeADTabbox();
return composite;
}
/**
* Get main layout component
* @return {@link Vlayout}
*/
@Override
public Vlayout getComponent() {
return layout;
}
/**
* @param event
* @see EventListener#onEvent(Event)
*/
@Override
public void onEvent(Event event) {
if (Events.ON_CTRL_KEY.equals(event.getName())) {
KeyEvent keyEvent = (KeyEvent) event;
//enter == 13
if (keyEvent.getKeyCode() == 13 && this.getComponent().getParent().isVisible()) {
IADTabpanel panel = adTabbox.getSelectedTabpanel();
if (panel != null) {
if (panel.onEnterKey()) {
keyEvent.stopPropagation();
}
}
}
}
else if (event.getName().equals(WindowContainer.ON_WINDOW_CONTAINER_SELECTION_CHANGED_EVENT)) {
SessionManager.getAppDesktop().updateHelpContext(X_AD_CtxHelp.CTXTYPE_Tab, adTabbox.getSelectedGridTab().getAD_Tab_ID());
}
else {
super.onEvent(event);
}
}
/**
* ITabOnCloseHandler to call {@link ADWindowContent#onExit(Callback)} when user wants to close an AD Window
*/
class TabOnCloseHanlder implements ITabOnCloseHandler, Callback {
private Tabpanel tabPanel;
public void onClose(Tabpanel tabPanel) {
this.tabPanel = tabPanel;
ADWindowContent.this.onExit(this);
}
@Override
public void onCallback(Boolean result) {
if (result){
closeTab (tabPanel);
}
this.tabPanel = null;
}
}
/**
* Close tab related to tabPanel
* @param tabPanel Tabpanel that represent AD_Window
*/
protected void closeTab (Tabpanel tabPanel) {
Tab tab = tabPanel.getLinkedTab();
tab.close();
if (getWindowNo() > 0)
SessionManager.getAppDesktop().unregisterWindow(getWindowNo());
}
/**
* Vlayout subclass to override onPageDetached.
*/
public static class ADWindowVlayout extends Vlayout implements IHelpContext {
/**
* generated serial id
*/
private static final long serialVersionUID = 6104341168705201721L;
private ADWindowContent content;
protected ADWindowVlayout(ADWindowContent content) {
super();
this.content = content;
}
/**
* clean up listeners
*/
@Override
public void onPageDetached(Page page) {
super.onPageDetached(page);
try {
SessionManager.getSessionApplication().getKeylistener().removeEventListener(Events.ON_CTRL_KEY, content);
} catch (Exception e){}
content.layout.removeEventListener(WindowContainer.ON_WINDOW_CONTAINER_SELECTION_CHANGED_EVENT, content);
}
}
@Override
protected void switchEditStatus(boolean editStatus) {
layout.setWidgetOverride("isEditting", "'" + String.valueOf(editStatus) + "'");
}
}