/****************************************************************************** * 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.util.List; import org.adempiere.webui.ValuePreference; import org.adempiere.webui.component.Combobox; import org.adempiere.webui.component.Textbox; import org.adempiere.webui.component.Window; import org.adempiere.webui.event.ContextMenuEvent; import org.adempiere.webui.event.ContextMenuListener; import org.adempiere.webui.event.ValueChangeEvent; import org.adempiere.webui.session.SessionManager; import org.adempiere.webui.window.WFieldRecordInfo; import org.adempiere.webui.window.WTextEditorDialog; import org.compiere.model.GridField; import org.compiere.model.MRole; import org.compiere.util.DisplayType; import org.compiere.util.Env; import org.compiere.util.Msg; import org.zkoss.zk.ui.event.Event; import org.zkoss.zk.ui.event.Events; import org.zkoss.zul.Menuitem; /** * * @author <a href="mailto:agramdass@gmail.com">Ashley G Ramdass</a> * @date Mar 11, 2007 * @version $Revision: 0.10 $ */ public class WStringEditor extends WEditor implements ContextMenuListener { private static final String EDITOR_EVENT = "EDITOR"; private static final String[] LISTENER_EVENTS = {Events.ON_CHANGE, Events.ON_OK}; private String oldValue; private WEditorPopupMenu popupMenu; private boolean tableEditor = false; /** * to ease porting of swing form */ public WStringEditor() { this("String", false, false, true, 30, 30, "", null); } public WStringEditor(GridField gridField) { this(gridField, false); } public WStringEditor(GridField gridField, boolean tableEditor) { super(gridField.isAutocomplete() ? new Combobox() : new Textbox(), gridField); this.tableEditor = tableEditor; init(gridField.getObscureType()); } /** * to ease porting of swing form * @param columnName * @param mandatory * @param isReadOnly * @param isUpdateable * @param displayLength * @param fieldLength * @param vFormat * @param obscureType */ public WStringEditor(String columnName, boolean mandatory, boolean isReadOnly, boolean isUpdateable, int displayLength, int fieldLength, String vFormat, String obscureType) { super(new Textbox(), columnName, null, null, mandatory, isReadOnly,isUpdateable); init(obscureType); } @Override public org.zkoss.zul.Textbox getComponent() { return (org.zkoss.zul.Textbox) component; } @Override public boolean isReadWrite() { return !getComponent().isReadonly(); } @Override public void setReadWrite(boolean readWrite) { getComponent().setReadonly(!readWrite); } private void init(String obscureType) { if (gridField != null) { getComponent().setMaxlength(gridField.getFieldLength()); int displayLength = gridField.getDisplayLength(); if (displayLength <= 0 || displayLength > MAX_DISPLAY_LENGTH) { displayLength = MAX_DISPLAY_LENGTH; } getComponent().setCols(displayLength); if (gridField.getDisplayType() == DisplayType.Text) { getComponent().setMultiline(true); getComponent().setRows(3); } else if (gridField.getDisplayType() == DisplayType.TextLong) { getComponent().setMultiline(true); getComponent().setRows(5); } else if (gridField.getDisplayType() == DisplayType.Memo) { getComponent().setMultiline(true); getComponent().setRows(8); } if (getComponent() instanceof Textbox) ((Textbox)getComponent()).setObscureType(obscureType); popupMenu = new WEditorPopupMenu(false, false, true); Menuitem editor = new Menuitem(Msg.getMsg(Env.getCtx(), "Editor"), "images/Editor16.png"); editor.setAttribute("EVENT", EDITOR_EVENT); editor.addEventListener(Events.ON_CLICK, popupMenu); popupMenu.appendChild(editor); if (gridField != null && gridField.getGridTab() != null) { WFieldRecordInfo.addMenu(popupMenu); } getComponent().setContext(popupMenu.getId()); if (gridField.isAutocomplete()) { Combobox combo = (Combobox)getComponent(); combo.setAutodrop(true); combo.setAutocomplete(true); combo.setButtonVisible(false); List<String> items = gridField.getEntries(); for(String s : items) { combo.appendItem(s); } } } } public void onEvent(Event event) { if (Events.ON_CHANGE.equals(event.getName()) || Events.ON_OK.equals(event.getName())) { String newValue = getComponent().getValue(); if (oldValue != null && newValue != null && oldValue.equals(newValue)) { return; } if (oldValue == null && newValue == null) { return; } ValueChangeEvent changeEvent = new ValueChangeEvent(this, this.getColumnName(), oldValue, newValue); super.fireValueChange(changeEvent); oldValue = newValue; } } @Override public String getDisplay() { return getComponent().getValue(); } @Override public Object getValue() { return getComponent().getValue(); } @Override public void setValue(Object value) { if (value != null) { getComponent().setValue(value.toString()); } else { getComponent().setValue(""); } oldValue = getComponent().getValue(); } protected void setTypePassword(boolean password) { if (password) { getComponent().setType("password"); } else { getComponent().setType("text"); } } @Override public String[] getEvents() { return LISTENER_EVENTS; } public WEditorPopupMenu getPopupMenu() { return popupMenu; } public void onMenu(ContextMenuEvent evt) { if (WEditorPopupMenu.PREFERENCE_EVENT.equals(evt.getContextEvent())) { if (MRole.getDefault().isShowPreference()) ValuePreference.start (this.getGridField(), getValue()); return; } else if (EDITOR_EVENT.equals(evt.getContextEvent())) { WTextEditorDialog dialog = new WTextEditorDialog(this.getColumnName(), getDisplay(), isReadWrite(), gridField.getFieldLength()); dialog.setAttribute(Window.MODE_KEY, Window.MODE_MODAL); SessionManager.getAppDesktop().showWindow(dialog); if (!dialog.isCancelled()) { getComponent().setText(dialog.getText()); String newText = getComponent().getValue(); ValueChangeEvent changeEvent = new ValueChangeEvent(this, this.getColumnName(), oldValue, newText); super.fireValueChange(changeEvent); oldValue = newText; } } else if (WEditorPopupMenu.CHANGE_LOG_EVENT.equals(evt.getContextEvent())) { WFieldRecordInfo.start(gridField); } } @Override public void dynamicDisplay() { //referesh auto complete list if (gridField.isAutocomplete()) { Combobox combo = (Combobox)getComponent(); List<String> items = gridField.getEntries(); if (items.size() != combo.getItemCount()) { combo.removeAllItems(); for(String s : items) { combo.appendItem(s); } } } } }