1 package net.sourceforge.jnipp.gui;
2
3 import net.sourceforge.jnipp.project;
4 import net.sourceforge.jnipp.common;
5 import net.sourceforge.jnipp.gui.appevent;
6 import net.sourceforge.jnipp.gui.ProjectAdapter;
7 import javax.swing.JTree;
8 import javax.swing.JScrollPane;
9 import javax.swing.tree;
10 import javax.swing.event;
11 import java.awt;
12 import java.util.Iterator;
13 import javax.swing.ImageIcon;
14 import javax.swing.ToolTipManager;
15
16 public class ProjectViewer extends JScrollPane implements AppEventSubscriber
17 {
18 private JTree tree;
19 DefaultMutableTreeNode root;
20 public ProjectViewer()
21 {
22 super();
23 initTree("");
24 }
25
26 public ProjectViewer(ProjectAdapter project)
27 {
28 super();
29 initTree(project.getName());
30 buildProjectView(project, root);
31 tree.expandRow(0);
32 }
33
34 private void initTree(String rootLabel)
35 {
36 subscribeToProjectUpdates();
37 root = new DefaultMutableTreeNode(rootLabel);
38 tree = new JTree(root);
39 tree.setSize(this.getSize());
40 ToolTipManager.sharedInstance().registerComponent(tree);
41 tree.setCellRenderer(new ProjectTreeRenderer());
42
43 tree.addTreeSelectionListener(
44 new TreeSelectionListener()
45 {
46 public void valueChanged(TreeSelectionEvent evt)
47 {
48 DefaultMutableTreeNode node =
49 (DefaultMutableTreeNode)
50 (evt.getPath().getLastPathComponent());
51 process(node);
52 }
53 });
54 this.viewport.add(tree);
55 }
56
57 private void process(DefaultMutableTreeNode node)
58 {
59 UserContextUpdatedAppEvent event = new UserContextUpdatedAppEvent();
60 UserContext context = event.getContext();
61 ProjectAdapter project = context.getProject();
62
63 if ((node.isRoot()) || (node.getParent() == node.getRoot()))
64 {
65 context.setActiveContext(UserContext.ContextType_Project, project);
66 }
67 else
68 {
69 //we should be a class
70 try
71 {
72 ProjectClass projectclass = (ProjectClass) node.getUserObject();
73 context.setActiveContext(UserContext.ContextType_Class,projectclass);
74 }
75 catch(Exception e)
76 {
77 System.out.println(e);
78 }
79 }
80 }
81
82 public void setProject(ProjectAdapter project)
83 {
84 root.removeAllChildren();
85 root.setUserObject(project.getName());
86 buildProjectView(project,root);
87 tree.setModel(new DefaultTreeModel(root));
88 tree.treeDidChange();
89 }
90
91 private void buildProjectView(ProjectAdapter project, DefaultMutableTreeNode root)
92 {
93 DefaultMutableTreeNode inputClasses = new DefaultMutableTreeNode("classes");
94 root.add(inputClasses);
95
96 Iterator it = project.getClasses();
97 while(it.hasNext() == true)
98 {
99 DefaultMutableTreeNode classNode = new DefaultMutableTreeNode((ProjectClass) it.next());
100 inputClasses.add(classNode);
101 }
102 }
103
104 //AppEventSubscriber method(s)
105 public void UpdateAvailable(AppEvent e)
106 {
107 ProjectUpdatedAppEvent subject = (ProjectUpdatedAppEvent) e;
108 setProject(subject.getProject());
109 ProjectAdapter theproject = subject.getProject();
110 setProject(theproject);
111 }
112
113 private void subscribeToProjectUpdates()
114 {
115 ProjectUpdatedAppEvent.subscribe(this);
116 }
117
118 protected class ProjectTreeRenderer extends DefaultTreeCellRenderer
119 {
120 ImageIcon classesIcon;
121 ImageIcon projectIcon;
122 ImageIcon classIcon;
123
124 public ProjectTreeRenderer()
125 {
126 projectIcon = new ImageIcon(ProjectTreeRenderer.class.getResource("/net/sourceforge/jnipp/gui/resources/projectIcon.gif"));
127 classesIcon = new ImageIcon(ProjectTreeRenderer.class.getResource("/net/sourceforge/jnipp/gui/resources/classesIcon.gif"));
128 classIcon = new ImageIcon(ProjectTreeRenderer.class.getResource("/net/sourceforge/jnipp/gui/resources/classIcon.gif"));
129 }
130
131 public Component getTreeCellRendererComponent(
132 JTree tree,
133 Object value,
134 boolean sel,
135 boolean expanded,
136 boolean leaf,
137 int row,
138 boolean hasFocus)
139 {
140
141 super.getTreeCellRendererComponent(
142 tree, value, sel,
143 expanded, leaf, row,
144 hasFocus);
145
146 if (isProject(value))
147 {
148 setIcon(projectIcon);
149 setToolTipText(null);
150 expanded = true;
151 }
152 else if (isClassesCollection(value))
153 {
154 setIcon(classesIcon);
155 setToolTipText(null);
156 expanded = true;
157 hasFocus = false;
158 }
159 else
160 {
161 // it's a class
162 setIcon(classIcon);
163 DefaultMutableTreeNode node = (DefaultMutableTreeNode)value;
164 String nodeInfo = node.toString();
165 setToolTipText(nodeInfo);
166 }
167
168 return this;
169 }
170
171 protected boolean isProject(Object value)
172 {
173 DefaultMutableTreeNode node = (DefaultMutableTreeNode)value;
174 if (node.isRoot())
175 {
176 return true;
177 }
178 return false;
179 }
180
181 protected boolean isClassesCollection(Object value)
182 {
183 DefaultMutableTreeNode node = (DefaultMutableTreeNode)value;
184 String nodeInfo = node.toString();
185 if (nodeInfo.equals("classes"))
186 {
187 return true;
188 }
189 return false;
190 }
191 }
192 }