1 package com.melloware.jukes.gui.tool;
2
3 import java.net.URL;
4 import java.util.HashMap;
5 import java.util.Map;
6
7 import javax.swing.event.TreeSelectionEvent;
8 import javax.swing.event.TreeSelectionListener;
9 import javax.swing.tree.DefaultMutableTreeNode;
10 import javax.swing.tree.DefaultTreeModel;
11 import javax.swing.tree.DefaultTreeSelectionModel;
12 import javax.swing.tree.TreeModel;
13 import javax.swing.tree.TreeNode;
14 import javax.swing.tree.TreePath;
15 import javax.swing.tree.TreeSelectionModel;
16
17 import org.apache.commons.logging.Log;
18 import org.apache.commons.logging.LogFactory;
19
20 import com.melloware.jukes.gui.tool.help.HelpNode;
21 import com.melloware.jukes.gui.tool.help.HelpSets;
22
23
24
25
26
27
28
29
30
31 public final class DynamicHelpModule
32 extends com.jgoodies.binding.beans.Model {
33
34 private static final Log LOG = LogFactory.getLog(DynamicHelpModule.class);
35
36 public static final String PROPERTYNAME_HELP_TREE_MODEL = "helpTreeModel";
37 public static final String PROPERTYNAME_HELP_PAGE = "helpPage";
38 public static final String PROPERTYNAME_HELP_VISIBLE = "helpVisible";
39
40
41
42
43
44
45
46 private boolean helpVisible;
47
48
49
50
51 private final Map helpRegistry;
52
53
54
55
56
57
58
59
60 private TreeModel helpTreeModel;
61
62
63
64
65
66
67
68
69 private final TreeSelectionModel helpTreeSelectionModel;
70
71
72
73
74
75
76 private URL helpPage;
77
78
79
80
81
82 DynamicHelpModule() {
83 helpRegistry = new HashMap();
84
85 setHelpSet(HelpSets.WELCOME_HELP_SET);
86 helpTreeSelectionModel = new DefaultTreeSelectionModel();
87 helpTreeSelectionModel.setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
88 helpTreeSelectionModel.addTreeSelectionListener(new HelpTreeSelectionChangeHandler());
89 }
90
91
92
93
94
95
96
97 public URL getHelpPage() {
98 return helpPage;
99 }
100
101
102
103
104
105
106 public TreeModel getHelpTreeModel() {
107 return helpTreeModel;
108 }
109
110
111
112
113
114
115 public TreeSelectionModel getHelpTreeSelectionModel() {
116 return helpTreeSelectionModel;
117 }
118
119
120
121
122
123
124
125
126 public void setHelpVisible(boolean newVisibility) {
127 boolean oldVisibility = isHelpVisible();
128 helpVisible = newVisibility;
129 firePropertyChange(PROPERTYNAME_HELP_VISIBLE, oldVisibility, newVisibility);
130 }
131
132
133
134
135
136
137 public boolean isHelpVisible() {
138 return helpVisible;
139 }
140
141
142
143
144 @SuppressWarnings("unchecked")
145 public void registerHelp(Class domainClass, TreeNode node) {
146 Object oldValue = helpRegistry.put(domainClass, node);
147 if (oldValue != null) {
148 LOG.warn("Duplicate help registered for class " + domainClass);
149 }
150 }
151
152 void updateHelpSet(Object selection) {
153 TreeNode helpSet = lookupHelpSet(selection.getClass());
154 if (helpSet != null) {
155 setHelpSet(helpSet);
156 }
157 }
158
159
160
161
162
163
164
165
166
167
168
169
170 private void setHelpPage(URL newHelpPage) {
171 URL oldHelpPage = getHelpPage();
172 helpPage = newHelpPage;
173 if (equals(oldHelpPage, newHelpPage)) {
174 return;
175 }
176
177 firePropertyChange(PROPERTYNAME_HELP_PAGE, oldHelpPage, newHelpPage);
178 setHelpVisible(true);
179 }
180
181 private void setHelpSet(TreeNode helpSet) {
182 setHelpTreeModel(new DefaultTreeModel(helpSet));
183 }
184
185
186
187
188
189
190 private void setHelpTreeModel(TreeModel newModel) {
191 TreeModel oldModel = getHelpTreeModel();
192 helpTreeModel = newModel;
193 firePropertyChange(PROPERTYNAME_HELP_TREE_MODEL, oldModel, newModel);
194 }
195
196
197
198
199
200
201
202
203 private TreeNode lookupHelpSet(Class domainClass) {
204 return (TreeNode)helpRegistry.get(domainClass);
205 }
206
207
208
209 private class HelpTreeSelectionChangeHandler
210 implements TreeSelectionListener {
211
212
213
214
215
216
217
218
219
220 public void valueChanged(TreeSelectionEvent evt) {
221 TreePath path = evt.getPath();
222 DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode)path.getLastPathComponent();
223 HelpNode helpNode = (HelpNode)selectedNode.getUserObject();
224 if ((null == helpNode) || helpNode.isChapter()) {
225 return;
226 }
227
228 setHelpPage(helpNode.getURL());
229 }
230
231 }
232
233 }