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    }