View Javadoc

1   package org.glassbox.gui;
2   
3   import org.glassbox.gui.*;
4   
5   import javax.swing.*;
6   import java.util.HashMap;
7   import java.util.Iterator;
8   import java.awt.Dimension;
9   
10  /***
11     Implementation of a layered group.
12     It uses a <code>JLayeredPane</code> as view. 
13   */
14  public class JLayeredGroup extends AbstractGroup implements LayeredGroup, VisibleMember {
15      public static final String IDENTIFIER = "glassbox.JLayeredGroup";
16  
17      protected Group _parent;
18      protected JLayeredPane _view;
19      protected HashMap _layers;
20      protected HashMap _layersbyview;
21  
22      public JLayeredGroup() {
23  	_parent = null;
24  	_view = new JLayeredPane() {
25  		public Dimension getPreferredSize() {
26  		    return getSize();
27  		}
28  
29  		public Dimension getMinimumSize() {
30  		    return getSize();
31  		}
32  
33  		public Dimension getMaximumSize() {
34  		    return getSize();
35  		}
36  	    };
37  	_layers = new HashMap();
38  	_layersbyview = new HashMap();
39      }
40  
41      public void moveToBack(VisibleMember member) {
42  	_view.moveToBack(member.getView());
43      }
44  
45      public void moveToFront(VisibleMember member) {
46  	_view.moveToFront(member.getView());
47      }
48  
49      ///
50      /// Implementation of Visible
51      /// ....................................................................................................
52  
53      public JComponent getView() {
54  	return _view;
55      }
56  
57      ///
58      /// Implementation of Member 
59      /// ....................................................................................................
60  
61      public String getIdentifier() {
62  	return IDENTIFIER;
63      }
64  
65      public Group getGroup() {
66  	return _parent;
67      }
68  
69      public void setGroup(Group parent) {
70  	_parent = parent;
71      }
72  
73      /***
74         Forward all property changes to the members of this group.
75       */
76      public void groupPropertyChanged(String name, Object oldvalue, Object newvalue) {
77  	setProperty(name, newvalue);
78      }
79  
80      ///
81      /// Implementation of VisibleGroup
82      /// ....................................................................................................
83  
84      /***
85         Not implemented yet.
86       */
87      public void memberViewUpdated(VisibleMember member) {
88  	// TODO
89      }
90  
91      ///
92      /// Implemenation of LayeredGroup
93      /// ....................................................................................................
94  
95      public void addLayer(int position, LayeredGroup.Layer layer) {
96  	Integer p = new Integer(position);
97  	layer.getView().setSize(_view.getSize());
98  	_layers.put(p, layer);
99  	if (layer!=this) _view.add(layer.getView(), p);
100     }
101 
102     /***
103        Add a member to the specified layer.
104      */
105     public void addMember(VisibleMember member, int position) {
106 	Integer p = new Integer(position);
107 	LayeredGroup.Layer layer = (Layer)_layers.get(p);
108 	if (layer==null)
109 	    throw new IllegalArgumentException("Unknown layer "+position+".");
110 	layer.addVisible(member);
111 	_layersbyview.put(member.getView(), layer);
112 	super.addMember(member);
113     }
114 
115     /***
116        Add a member to the specified layer.
117      */
118     public void addMember(VisibleMember member, int position, Object constraints) {
119 	Integer p = new Integer(position);
120 	Layer layer = (Layer)_layers.get(p);
121 	if (layer==null)
122 	    throw new IllegalArgumentException("Unknown layer "+position+".");
123 	layer.addVisible(member, constraints);
124 	_layersbyview.put(member.getView(), layer);
125 	super.addMember(member);	
126     }
127 
128     ///
129     /// Overridden Methods of AbstractGroup
130     /// ....................................................................................................
131     
132     public void addMember(Member member) {
133 	super.addMember(member);
134     }
135 
136     /***
137        Overridden to remove the view of a visible member.
138      */
139     public void removeMember(String identifier) {
140 	Member member = getMember(identifier);
141 	if (member instanceof VisibleMember) {
142 	    VisibleMember visible = (VisibleMember)member;
143 	    Layer layer = (Layer)_layersbyview.remove(visible.getView());
144 	    layer.removeVisible(visible);
145 	}
146 	super.removeMember(identifier);
147     }
148 
149     /***
150        Overridden to handle certain property changes within this group.<br>
151        The following properties are interpreted by this method:
152        <table>
153        <tr><td><pre>glassbox.VisibleGroup.modal-member</pre></td><td>Disables and enables the view accordingly.</td></tr>
154        <tr><td><pre>glassbox.VisibleGroup.viewport-size</pre></td><td>Resizes the view.</td></tr>
155        </table>
156      */
157     public void setProperty(String name, Object newvalue) {
158 	if (name.equals(VisibleGroup.MODAL_MEMBER_KEY)) {
159 	    if (newvalue!=this && newvalue!=null) {
160 		_view.setEnabled(false);
161 	    } else if (newvalue==null) {
162 		_view.setEnabled(true);
163 	    }
164 	} else if (name.equals(VisibleGroup.VIEWPORT_SIZE_KEY)) {
165 	    Dimension newsize = (Dimension)newvalue;
166 	    _view.setSize(newsize);
167 	    Iterator layers = _layers.values().iterator(); while (layers.hasNext()) {
168 		Layer layer = (Layer)layers.next();
169 		layer.getView().setSize(newsize);
170 	    }
171 	} 
172 	super.setProperty(name, newvalue);
173     }
174 }
175