001 /* 002 Copyright (C) 2001-2003 Laurent Martelli <laurent@aopsys.com> 003 004 This program is free software; you can redistribute it and/or modify 005 it under the terms of the GNU Lesser General Public License as 006 published by the Free Software Foundation; either version 2 of the 007 License, or (at your option) any later version. 008 009 This program is distributed in the hope that it will be useful, 010 but WITHOUT ANY WARRANTY; without even the implied warranty of 011 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 012 GNU Lesser General Public License for more details. 013 014 You should have received a copy of the GNU Lesser General Public License 015 along with this program; if not, write to the Free Software 016 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ 017 018 package org.objectweb.jac.aspects.gui.web; 019 020 import java.lang.IllegalAccessException; 021 import org.apache.log4j.Logger; 022 import org.objectweb.jac.aspects.gui.FieldEditor; 023 import org.objectweb.jac.aspects.gui.FieldUpdate; 024 import org.objectweb.jac.aspects.gui.GuiAC; 025 import org.objectweb.jac.aspects.gui.Utils; 026 import org.objectweb.jac.core.Collaboration; 027 import org.objectweb.jac.core.rtti.ClassItem; 028 import org.objectweb.jac.core.rtti.FieldItem; 029 import org.objectweb.jac.core.rtti.MethodItem; 030 031 /** 032 * Base class for field editors 033 */ 034 public abstract class AbstractFieldEditor extends AbstractView 035 implements FieldEditor, FieldUpdate 036 { 037 static Logger logger = Logger.getLogger("gui.editor"); 038 039 // substance and field are required so that we can register and 040 // unregister ourself from fieldUpdated events on close() 041 protected Object substance; 042 protected FieldItem field; 043 protected ClassItem type; 044 protected MethodItem setter; 045 protected Object value; 046 Object oldValue; 047 protected boolean isEmbedded; 048 boolean isValueSet = false; 049 050 public AbstractFieldEditor(Object substance, FieldItem field) { 051 this.substance = substance; 052 setField(field); 053 width = 10; 054 } 055 056 public Object getValue() { 057 return value; 058 } 059 060 public void setValue(Object value) { 061 logger.debug(this+".setValue "+oldValue+"->"+value); 062 this.value = value; 063 if (!isValueSet) { 064 oldValue = value; 065 isValueSet = true; 066 } 067 } 068 069 public void setSubstance(Object substance) { 070 this.substance = substance; 071 } 072 073 public Object getSubstance() { 074 return substance; 075 } 076 077 public void setEditedType(ClassItem type) { 078 this.type = type; 079 } 080 081 public void setField(FieldItem field) { 082 Utils.unregisterField(substance,this.field,this); 083 this.field = field; 084 if (field!=null) 085 this.setter = field.getSetter(); 086 Utils.registerField(substance,field,this); 087 } 088 089 public FieldItem getField() { 090 return field; 091 } 092 093 public void setAutoUpdate(boolean autoUpdate) { 094 } 095 096 public void setEmbedded(boolean isEmbedded) { 097 this.isEmbedded = isEmbedded; 098 } 099 100 public void close(boolean validate) { 101 if (validate) { 102 Object paramValue = 103 WebDisplay.getRequest().getParameter(getLabel()); 104 logger.debug("reading value for "+getLabel()+": "+paramValue); 105 readValue(paramValue); 106 if (isEmbedded) 107 commit(); 108 } 109 Utils.unregisterField(substance,field,this); 110 context.removeEditor(this); 111 } 112 113 public void onSetFocus(Object param) { 114 } 115 116 public boolean readValue(Object parameter) { 117 if (disabled) 118 return false; 119 else 120 return doReadValue(parameter); 121 } 122 123 protected abstract boolean doReadValue(Object parameter); 124 125 /** 126 * Commit editing by calling the setter method. 127 */ 128 public void commit() { 129 if (setter!=null && valueHasChanged()) { 130 logger.debug(this+": "+field.getName()+ 131 "'s value changed: "+getValue()); 132 try { 133 field.setThroughWriter(substance,getValue()); 134 } catch (IllegalAccessException e) { 135 logger.error("Failed to commit value "+getValue()+ 136 " for field "+substance+"."+field,e); 137 } 138 oldValue = this.value; 139 } 140 } 141 142 /** 143 * Tells wether the value in the editor was changed 144 */ 145 boolean valueHasChanged() { 146 boolean ret; 147 if( oldValue == null && value != null ) { 148 ret = true; 149 } else if( oldValue == null ) { 150 ret = false; 151 } else { 152 ret = ! oldValue.equals(value); 153 } 154 logger.debug("valueHasChanged("+field.getName()+") "+ 155 oldValue+" / "+value+" -> "+ret); 156 return ret; 157 } 158 159 public void fieldUpdated(Object substance, FieldItem field, 160 Object value, Object param) { 161 setValue(value); 162 } 163 164 // When disabled == true, readValue() does nothing 165 boolean disabled = false; 166 public boolean isEnabled() { 167 return !disabled; 168 } 169 public void setEnabled(boolean enabled) { 170 logger.debug((enabled?"enable ":"disable ")+this); 171 this.disabled = !enabled; 172 } 173 }