001    /* sillyview : a free model-view-controller system for Java
002     * Copyright (C) 2004 T.J. Willis
003     * 
004     * This program is free software; you can redistribute it and/or
005     * modify it under the terms of the GNU General Public License
006     * as published by the Free Software Foundation; either version 2
007     * of the 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 General Public License for more details.
013     *          
014     * You should have received a copy of the GNU 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, USA.
017     *  
018     * $Header: /cvsroot/sillyview/sillyview/src/net/sourceforge/sillyview/StringBufferView.java,v 1.3 2004/05/22 07:58:27 tj_willis Exp $
019     */
020    package net.sourceforge.sillyview;
021    
022    import javax.swing.*;
023    import javax.swing.event.HyperlinkListener;
024    import javax.swing.border.*;
025    import java.util.Map;
026    import java.util.Set;
027    
028    /**
029     * A StringBuffer that has a backing WidgetModel to provide its data.  Useful
030     * mostly for debugging and servlets.
031     *
032     * @author <a href="mailto:tj_willis@users.sourceforge.net">T.J. Willis</a>
033     * @version 1.0
034     */
035    public class StringBufferView implements WidgetView {
036        /**
037         * This view's data.
038         *
039         */
040        private StringBuffer buf;
041    
042        /**
043         * The model this view gets its data from.
044         *
045         */
046        private WidgetModel mod;
047    
048        /**
049         * Creates a new <code>StringBufferView</code> instance.
050         *
051         * @param model a <code>WidgetModel</code> value
052         */
053        public StringBufferView (WidgetModel model) {
054            mod = model;
055            buf = new StringBuffer (model.getCurrentModel ().toString ());
056        }
057    
058        /**
059         * Adds all the name/value pairs and then updates the model.  If
060         * the named token already exists, replace the value.  This is more
061         * efficient than many calls to setToken(), because model.getCurrentModel
062         * is only called once.
063         *
064         */
065        public void addTokens (final Map < Object, Object > props) {
066            if (props == null) {
067                return;             // FIXME: clear all tokens in model
068            }
069            Set < Object > keys = props.keySet ();
070    for (Object k:keys) {
071                String key = k.toString ();
072                mod.setToken (key, props.get (key));
073            }
074            buf = new StringBuffer (mod.getCurrentModel ().toString ());
075    
076        }
077    
078        /**
079         * Sets the named token to the given value.  Most tokens will be
080         * propegated to the backing model.  Resets the StringBuffer's
081         * contents to model.getCurrentModel().toString().
082         *
083         * @param key an <code>Object</code> value
084         * @param value an <code>Object</code> value
085         */
086        public void setToken (final Object key, Object value) {
087            if (key == null)
088                return;
089            mod.setToken (key, value);
090            buf = new StringBuffer (mod.getCurrentModel ().toString ());
091        }
092    
093        /**
094         * Gets the value of the named token.  Most values will be taken
095         * from the backing model.
096         *
097         * @param key an <code>Object</code> value
098         * @return an <code>Object</code> value
099         */
100        public Object getValue (final Object key) {
101            if (key == null)
102                return null;
103            return mod.getValue (key);
104        }
105    
106        /**
107         * Returns the backing model.
108         *
109         * @return a <code>WidgetModel</code> value
110         */
111        public WidgetModel getModel () {
112            return mod;
113        }
114    
115        /**
116         * Sets the backing model.
117         *
118         * @param newModel a <code>WidgetModel</code> value
119         */
120        public void setModel (WidgetModel newModel) {
121            mod = newModel;
122        }
123    
124        /**
125         * Uses StringBuffer.equals() to test for equality.
126         *
127         * @param o an <code>Object</code> value
128         * @return a <code>boolean</code> value
129         */
130        public boolean equals (Object o) {
131            if (buf == null && o == null)
132                return true;
133            if (buf == null)
134                return o.equals (buf);
135            return buf.equals (o);
136        }
137    
138        public String toString(){
139          return buf.toString();
140       }
141    }