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
51
52
53 public JComponent getView() {
54 return _view;
55 }
56
57
58
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
82
83
84 /***
85 Not implemented yet.
86 */
87 public void memberViewUpdated(VisibleMember member) {
88
89 }
90
91
92
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
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