/* * RHQ Management Platform * Copyright (C) 2005-2011 Red Hat, Inc. * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License, version 2, as * published by the Free Software Foundation, and/or the GNU Lesser * General Public License, version 2.1, also 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 and the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU General Public License * and the GNU Lesser General Public License along with this program; * if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ package org.rhq.coregui.client.components.form; import com.google.gwt.event.dom.client.KeyCodes; import com.smartgwt.client.types.VerticalAlignment; import com.smartgwt.client.widgets.events.MouseOutEvent; import com.smartgwt.client.widgets.events.MouseOutHandler; import com.smartgwt.client.widgets.events.MouseOverEvent; import com.smartgwt.client.widgets.events.MouseOverHandler; import com.smartgwt.client.widgets.form.DynamicForm; import com.smartgwt.client.widgets.form.FormItemIfFunction; import com.smartgwt.client.widgets.form.fields.FormItem; import com.smartgwt.client.widgets.form.fields.FormItemIcon; import com.smartgwt.client.widgets.form.fields.events.FormItemClickHandler; import com.smartgwt.client.widgets.form.fields.events.FormItemIconClickEvent; import com.smartgwt.client.widgets.form.fields.events.KeyPressEvent; import com.smartgwt.client.widgets.form.fields.events.KeyPressHandler; import org.rhq.coregui.client.ImageManager; /** * This form item can be used to display a value normally in "read-only" form (i.e. as a StaticTextItem), * but can be toggled into an "editable" form that allows the user to enter a different value. * * This default implementation provides editing the value within a text field. However, this class * is designed to be extended, thus allowing the subclasses to edit values via checkboxes, radio buttons, etc. * * @author John Mazzitelli */ public class EditableFormItem extends SimpleEditableFormItem { public EditableFormItem() { super(); } public EditableFormItem(String name, String title) { super(name, title); } public EditableFormItem(String name, String title, ValueEditedHandler handler) { super(name, title, handler); } protected void addHandlers() { final FormItemIcon blankIcon = createBlankIcon(); final FormItemIcon editIcon = createEditIcon(); // if we are not in edit-mode, we want to show the edit icon, but only if the mouse hovers over us this.innerForm.addMouseOutHandler(new MouseOutHandler() { public void onMouseOut(MouseOutEvent event) { if (!isEditing()) { EditableFormItem.this.staticItem.setIcons(blankIcon); EditableFormItem.this.markForRedraw(); } } }); this.innerForm.addMouseOverHandler(new MouseOverHandler() { public void onMouseOver(MouseOverEvent event) { if (!isEditing() && !isReadOnly()) { EditableFormItem.this.staticItem.setIcons(editIcon); EditableFormItem.this.markForRedraw(); } } }); } protected FormItem prepareStaticFormItem() { FormItemIcon blankIcon = createBlankIcon(); FormItem item = instantiateStaticFormItem(); item.setShowTitle(false); item.setIcons(blankIcon); item.setIconVAlign(VerticalAlignment.CENTER); item.setIconHeight(16); item.setIconWidth(16); item.setShowIcons(true); item.setShowIfCondition(new FormItemIfFunction() { public boolean execute(FormItem item, Object value, DynamicForm form) { return !isEditing(); } }); item.setTextBoxStyle("editableText"); return item; } protected FormItem prepareEditFormItem() { FormItemIcon cancelIcon = createCancelIcon(); FormItemIcon approveIcon = createApproveIcon(); FormItem item = instantiateEditFormItem(); item.setShowTitle(false); item.setIcons(approveIcon, cancelIcon); item.setIconVAlign(VerticalAlignment.CENTER); item.setIconHeight(16); item.setIconWidth(16); item.setShowIcons(true); item.setShowIfCondition(new FormItemIfFunction() { public boolean execute(FormItem item, Object value, DynamicForm form) { return isEditing(); } }); item.addKeyPressHandler(new KeyPressHandler() { public void onKeyPress(KeyPressEvent event) { if ((event.getCharacterValue() != null) && (event.getCharacterValue() == KeyCodes.KEY_ENTER)) { if (EditableFormItem.this.innerForm.validate(false)) { Object newValue = event.getItem().getValue(); setApprovedNewValue(newValue); switchToStaticMode(); } } } }); return item; } protected FormItemIcon createEditIcon() { FormItemIcon editIcon = new FormItemIcon(); editIcon.setSrc(ImageManager.getEditIcon()); editIcon.setPrompt(MSG.common_button_edit()); // TODO have better message? editIcon.addFormItemClickHandler(new FormItemClickHandler() { public void onFormItemClick(FormItemIconClickEvent event) { // should never get here if read-only (the icon is hidden) but just to be sure, check read-only status again if (!isReadOnly()) { switchToEditMode(); } } }); return editIcon; } protected FormItemIcon createApproveIcon() { FormItemIcon approveIcon = new FormItemIcon(); approveIcon.setSrc(ImageManager.getApproveIcon()); approveIcon.setPrompt(MSG.common_button_ok()); // TODO have better message? approveIcon.addFormItemClickHandler(new FormItemClickHandler() { public void onFormItemClick(FormItemIconClickEvent event) { if (EditableFormItem.this.innerForm.validate(false)) { Object newValue = event.getItem().getValue(); setApprovedNewValue(newValue); switchToStaticMode(); } } }); return approveIcon; } protected FormItemIcon createCancelIcon() { FormItemIcon cancelIcon = new FormItemIcon(); cancelIcon.setSrc(ImageManager.getCancelIcon()); cancelIcon.setPrompt(MSG.common_button_cancel()); // TODO have better message? cancelIcon.addFormItemClickHandler(new FormItemClickHandler() { public void onFormItemClick(FormItemIconClickEvent event) { switchToStaticMode(); } }); return cancelIcon; } protected FormItemIcon createBlankIcon() { FormItemIcon blankIcon = new FormItemIcon(); blankIcon.setSrc("blank.png"); return blankIcon; } }