/******************************************************************************
* 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/ *
*****************************************************************************/
package org.adempiere.webui.editor;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import org.adempiere.webui.apps.AEnv;
import org.adempiere.webui.component.Locationbox;
import org.adempiere.webui.event.ContextMenuEvent;
import org.adempiere.webui.event.ContextMenuListener;
import org.adempiere.webui.event.ValueChangeEvent;
import org.adempiere.webui.window.WFieldRecordInfo;
import org.adempiere.webui.window.WLocationDialog;
import org.compiere.model.GridField;
import org.compiere.model.MLocation;
import org.compiere.model.MLocationLookup;
import org.compiere.util.CLogger;
import org.compiere.util.Env;
import org.compiere.util.Msg;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zk.ui.event.Events;
/**
* @author Sendy Yagambrum
* @date July 16, 2007
*
* This class is based on VLocation written by Jorg Janke
**/
public class WLocationEditor extends WEditor implements EventListener, PropertyChangeListener, ContextMenuListener
{
private static final String[] LISTENER_EVENTS = {Events.ON_CLICK};
private static CLogger log = CLogger.getCLogger(WLocationEditor.class);
private MLocationLookup m_Location;
private MLocation m_value;
private WEditorPopupMenu popupMenu;
/**
* Constructor without GridField
* @param columnName column name
* @param mandatory mandatory
* @param isReadOnly read only
* @param isUpdateable updateable
* @param mLocation location model
**/
public WLocationEditor(String columnName, boolean mandatory, boolean isReadOnly, boolean isUpdateable,
MLocationLookup mLocation)
{
super(new Locationbox(), "Address","",mandatory,isReadOnly,isUpdateable);
setColumnName(columnName);
m_Location = mLocation;
init();
}
/**
*
* @param gridField
*/
public WLocationEditor(GridField gridField) {
super(new Locationbox(), gridField);
m_Location = (MLocationLookup)gridField.getLookup();
}
private void init()
{
getComponent().setButtonImage("/images/Location10.png");
popupMenu = new WEditorPopupMenu(false, false, true);
popupMenu.addMenuListener(this);
if (gridField != null && gridField.getGridTab() != null)
{
WFieldRecordInfo.addMenu(popupMenu);
}
getComponent().setContext(popupMenu.getId());
}
@Override
public String getDisplay()
{
return getComponent().getText();
}
@Override
public Object getValue()
{
if (m_value == null)
return null;
return new Integer(m_value.getC_Location_ID());
}
@Override
public void setValue(Object value)
{
if (value == null)
{
m_value = null;
getComponent().setText(null);
}
else
{
m_value = m_Location.getLocation(value, null);
if (m_value == null)
getComponent().setText("<" + value + ">");
else
getComponent().setText(m_value.toString());
}
}
@Override
public Locationbox getComponent() {
return (Locationbox) component;
}
@Override
public boolean isReadWrite() {
return getComponent().isEnabled();
}
@Override
public void setReadWrite(boolean readWrite) {
getComponent().setEnabled(readWrite);
}
/**
* Return Editor value
* @return value
*/
public int getC_Location_ID()
{
if (m_value == null)
return 0;
return m_value.getC_Location_ID();
}
/**
* Property Change Listener
* @param evt PropertyChangeEvent
*/
public void propertyChange (PropertyChangeEvent evt)
{
if (evt.getPropertyName().equals(org.compiere.model.GridField.PROPERTY))
setValue(evt.getNewValue());
}
public void onEvent(Event event) throws Exception
{
//
if ("onClick".equals(event.getName()))
{
log.config( "actionPerformed - " + m_value);
WLocationDialog ld = new WLocationDialog(Msg.getMsg(Env.getCtx(), "Location"), m_value);
ld.setVisible(true);
AEnv.showWindow(ld);
m_value = ld.getValue();
//
if (!ld.isChanged())
return;
// Data Binding
int C_Location_ID = 0;
if (m_value != null)
C_Location_ID = m_value.getC_Location_ID();
Integer ii = new Integer(C_Location_ID);
// force Change - user does not realize that embedded object is already saved.
ValueChangeEvent valuechange = new ValueChangeEvent(this,getColumnName(),null,null);
fireValueChange(valuechange); // resets m_mLocation
if (C_Location_ID != 0)
{
ValueChangeEvent vc = new ValueChangeEvent(this,getColumnName(),null,ii);
fireValueChange(vc);
}
setValue(ii);
}
}
/**
* return listener events to be associated with editor component
*/
public String[] getEvents()
{
return LISTENER_EVENTS;
}
@Override
public void onMenu(ContextMenuEvent evt) {
if (WEditorPopupMenu.CHANGE_LOG_EVENT.equals(evt.getContextEvent()))
{
WFieldRecordInfo.start(gridField);
}
}
}