Source code: fzi/injectj/config/panel/NamespacePanel.java
1 // This file is part of the Inject/J project
2 // (C) 1999-2001 Forschungszentrum Informatik (FZI) Karlsruhe
3 // Please visit our website at http://injectj.fzi.de
4
5 package fzi.injectj.config.panel;
6
7 import java.awt.*;
8 import java.awt.event.*;
9 import javax.swing.*;
10 import java.util.*;
11 import fzi.injectj.config.*;
12 import fzi.injectj.*;
13 import fzi.injectj.language.*;
14 import fzi.injectj.util.StringUtil;
15
16 /** panel to choose Inject/J's namespace. Namespace are all classes which are
17 * visible to Inject/J.
18 *
19 * @author Volker Kuttruff
20 */
21 public class NamespacePanel extends JPanel implements InjectJPanel
22 {
23 protected MainWindow mainWindow;
24
25 JButton nextButton = new JButton();
26 JButton helpButton = new JButton();
27 JButton prevButton = new JButton();
28 JButton quitButton = new JButton();
29 JTextField classnameField = new JTextField();
30 JButton chooseClassnameButton = new JButton();
31 JButton addClassnameButton = new JButton();
32 JScrollPane namespaceListScrollPane = new JScrollPane();
33 JList namespaceList = new JList();
34 JLabel classnameFieldLabel = new JLabel();
35 JLabel namespaceListLabel = new JLabel();
36 JButton removeButton = new JButton();
37 JButton allClassesButton = new JButton();
38
39 Vector currentNamespace = new Vector();
40
41 public NamespacePanel()
42 {
43 try
44 {
45 jbInit();
46 }
47 catch(Exception ex)
48 {
49 ex.printStackTrace();
50 }
51 }
52
53 private void jbInit() throws Exception
54 {
55 this.setLayout(null);
56 this.setPreferredSize(new Dimension(600, 400));
57
58 prevButton.setText("<<Previous");
59 prevButton.setBounds(new Rectangle(270 ,360, 100, 30));
60 prevButton.addActionListener(new java.awt.event.ActionListener()
61 {
62
63 public void actionPerformed(ActionEvent e)
64 {
65 prevButton_actionPerformed(e);
66 }
67 });
68
69 nextButton.setText("Next >>");
70 nextButton.setBounds(new Rectangle(385, 360, 100, 30));
71 nextButton.addActionListener(new java.awt.event.ActionListener()
72 {
73
74 public void actionPerformed(ActionEvent e)
75 {
76 nextButton_actionPerformed(e);
77 }
78 });
79
80 helpButton.setText("Help");
81 helpButton.setBounds(new Rectangle(500, 360, 75, 30));
82 helpButton.addActionListener(new java.awt.event.ActionListener()
83 {
84
85 public void actionPerformed(ActionEvent e)
86 {
87 helpButton_actionPerformed(e);
88 }
89 });
90
91 classnameFieldLabel.setText("Please enter next namespace item");
92 classnameFieldLabel.setBounds(new Rectangle(25, 285, 450, 25));
93 classnameField.setBounds(new Rectangle(25, 310, 400, 25));
94 classnameField.addKeyListener(new java.awt.event.KeyListener() {
95 public void keyPressed(KeyEvent e) {}
96 public void keyTyped(KeyEvent e) {}
97 public void keyReleased(KeyEvent e) {
98 if (e.getKeyCode()==KeyEvent.VK_ENTER) {
99 addClassnameButton_actionPerformed(null);
100 }
101 }
102 });
103
104 chooseClassnameButton.setText("...");
105 chooseClassnameButton.setBounds(new Rectangle(425, 310, 25, 25));
106 chooseClassnameButton.addActionListener(new java.awt.event.ActionListener()
107 {
108
109 public void actionPerformed(ActionEvent e)
110 {
111 chooseClassnameButton_actionPerformed(e);
112 }
113 });
114
115 addClassnameButton.setText("Add");
116 addClassnameButton.setBounds(new Rectangle(475, 310, 100, 25));
117 addClassnameButton.addActionListener(new java.awt.event.ActionListener()
118 {
119
120 public void actionPerformed(ActionEvent e)
121 {
122 addClassnameButton_actionPerformed(e);
123 }
124 });
125
126 allClassesButton.setText("All");
127 allClassesButton.setBounds(new Rectangle(475, 40, 100, 25));
128 allClassesButton.addActionListener(new java.awt.event.ActionListener()
129 {
130
131 public void actionPerformed(ActionEvent e)
132 {
133 allClassesButton_actionPerformed(e);
134 }
135 });
136
137 namespaceListLabel.setText("Current namespace");
138 namespaceListLabel.setBounds(new Rectangle(25, 15, 450, 25));
139 namespaceListScrollPane.setBounds(new Rectangle(25, 40, 425, 230));
140
141 removeButton.setText("Remove");
142 removeButton.setBounds(new Rectangle(475, 245, 100, 25));
143 removeButton.addActionListener(new java.awt.event.ActionListener()
144 {
145
146 public void actionPerformed(ActionEvent e)
147 {
148 removeButton_actionPerformed(e);
149 }
150 });
151
152 quitButton.setText("Quit");
153 quitButton.setBounds(new Rectangle(25, 360, 150, 30));
154 quitButton.addActionListener(new java.awt.event.ActionListener()
155 {
156
157 public void actionPerformed(ActionEvent e)
158 {
159 quitButton_actionPerformed(e);
160 }
161 });
162
163 this.add(prevButton, null);
164 this.add(nextButton, null);
165 this.add(helpButton, null);
166 this.add(quitButton, null);
167 this.add(classnameField, null);
168 this.add(chooseClassnameButton, null);
169 this.add(namespaceListScrollPane, null);
170 this.add(addClassnameButton, null);
171 this.add(classnameFieldLabel, null);
172 this.add(namespaceListLabel, null);
173 this.add(removeButton, null);
174 this.add(allClassesButton,null);
175 namespaceListScrollPane.getViewport().add(namespaceList, null);
176
177 }
178
179 void prevButton_actionPerformed(ActionEvent e)
180 {
181 mainWindow.switchToPrevious();
182 }
183
184 void nextButton_actionPerformed(ActionEvent e)
185 {
186 mainWindow.switchToNext();
187 }
188
189 /** Updates the look&feel of the given component. Subcomponents are
190 * recursively updated.
191 *
192 * @param component the component to update its look&feel
193 */
194 protected void updateComponentUI(JComponent component) {
195 component.updateUI();
196 Component[] components = component.getComponents();
197 for (int i=0; i<components.length; i++) {
198 if(components[i] instanceof JComponent) {
199 updateComponentUI((JComponent) components[i]);
200 }
201 }
202 }
203
204 /** Updates labels of all buttons */
205 protected void updateLabels() {
206 quitButton.setText(CodeMapper.getText(LabelCode.QUIT_BUTTON));
207 helpButton.setText(CodeMapper.getText(LabelCode.HELP_BUTTON));
208 prevButton.setText(CodeMapper.getText(LabelCode.PREVIOUS_BUTTON));
209 nextButton.setText(CodeMapper.getText(LabelCode.NEXT_BUTTON));
210 removeButton.setText(CodeMapper.getText(LabelCode.REMOVE_BUTTON));
211 addClassnameButton.setText(CodeMapper.getText(LabelCode.ADD_BUTTON));
212 allClassesButton.setText(CodeMapper.getText(LabelCode.ALL_BUTTON));
213 namespaceListLabel.setText(CodeMapper.getText(LabelCode.CURNAMESPACE_LABEL));
214 classnameFieldLabel.setText(CodeMapper.getText(LabelCode.NEXTNAMESPACEITEM_LABEL));
215 }
216
217 public void updateAll() {
218 updateLabels();
219 updateComponentUI(this);
220 }
221
222 public void setMainWindow(MainWindow mainWindow)
223 {
224 this.mainWindow = mainWindow;
225 }
226
227 public void newProjectCreated()
228 {
229
230 }
231
232 public boolean panelActivated(boolean fromPreviousPanel)
233 {
234 if (fromPreviousPanel) {
235 if (mainWindow.getCurrentProject().getNamespaceNames()!=null) {
236 currentNamespace = mainWindow.getCurrentProject().getNamespaceNames();
237 classnameField.setText("");
238 namespaceList.setListData(currentNamespace);
239 }
240 }
241 setWindowTitle();
242 return false;
243 }
244
245 public boolean panelDeactivated(boolean toNextPanel)
246 {
247 if (!toNextPanel) return false;
248
249 if (!currentNamespace.isEmpty()) mainWindow.getCurrentProject().setNamespaceNames(currentNamespace);
250 else {
251 MessageDialog dlg = new MessageDialog(mainWindow,CodeMapper.getText(LabelCode.ERROR_LABEL), true);
252 dlg.setMessage(CodeMapper.getText(ErrorCode.EMPTYNAMESPACE_TEXT));
253 dlg.show();
254 return true;
255 }
256 return false;
257 }
258
259 public void setWindowTitle()
260 {
261 if(mainWindow!=null) mainWindow.setTitle(CodeMapper.getText(LabelCode.NAMESPACE_TITLE));
262 }
263
264 void chooseClassnameButton_actionPerformed(ActionEvent e)
265 {
266 mainWindow.setWaitCursor();
267 ClassChooser classChooser = new ClassChooser(mainWindow);
268 mainWindow.setDefaultCursor();
269 classChooser.show();
270
271 Vector selectedPackages = classChooser.getSelectedPackages();
272 Enumeration packageEnum = selectedPackages.elements();
273 while (packageEnum.hasMoreElements()) {
274 String temp = (String) packageEnum.nextElement();
275 String packageName = "package "+temp;
276 if (temp.trim().equals("root package")) packageName = temp;
277 if (!currentNamespace.contains(packageName)) currentNamespace.add(packageName);
278 }
279
280 Vector selectedClasses = classChooser.getSelectedClasses();
281 Enumeration classEnum = selectedClasses.elements();
282 while (classEnum.hasMoreElements()) {
283 String className = (String) classEnum.nextElement();
284 if (!currentNamespace.contains(className)) {
285 currentNamespace.add(className);
286 mainWindow.getCurrentProject().setChanged();
287 }
288 }
289 removeRedundancies();
290 namespaceList.setListData(currentNamespace);
291
292 }
293
294 void removeButton_actionPerformed(ActionEvent e)
295 {
296 Object selectedValues[] = namespaceList.getSelectedValues();
297 for (int i=0; i<selectedValues.length; i++) {
298 currentNamespace.removeElement(selectedValues[i]);
299 mainWindow.getCurrentProject().setChanged();
300 }
301 removeRedundancies();
302 namespaceList.setListData(currentNamespace);
303 }
304
305 void addClassnameButton_actionPerformed(ActionEvent e)
306 {
307 String text = classnameField.getText();
308 if (text==null) return;
309 text = text.trim();
310 if (text.toLowerCase().startsWith("package ")) {
311 StringTokenizer tokenizer = new StringTokenizer(text," \t");
312 if (tokenizer.countTokens()!=2) return;
313 tokenizer.nextToken();
314 String packageName = "package "+tokenizer.nextToken();
315 if (!currentNamespace.contains(packageName)) {
316 currentNamespace.addElement(packageName);
317 }
318 }
319 else {
320 boolean classFound = false;
321 Enumeration enum = GlobalSettings.mopAccess.allClassNames();
322 while (enum.hasMoreElements()) {
323 if (enum.nextElement().equals(text)) {
324 classFound = true;
325 break;
326 }
327 }
328 if (!classFound) {
329 Main.err.println("Unknown class '"+text+"'");
330 classnameField.selectAll();
331 return;
332 }
333 currentNamespace.addElement(text);
334 }
335
336 classnameField.setText("");
337 namespaceList.setListData(currentNamespace);
338 mainWindow.getCurrentProject().setChanged();
339 }
340
341 void allClassesButton_actionPerformed(ActionEvent e)
342 {
343 currentNamespace.removeAllElements();
344 Enumeration classEnum = GlobalSettings.mopAccess.allClassNames();
345 while (classEnum.hasMoreElements()) {
346 String name = (String) classEnum.nextElement();
347 if (name.equals("root package") || name.startsWith("package ")) {
348 if (!currentNamespace.contains(name)) {
349 currentNamespace.addElement(name);
350 }
351 continue;
352 }
353 String packageName = StringUtil.getPackageName(name);
354 if (packageName==null) continue;
355 if (packageName.equals("")) {
356 if (!currentNamespace.contains("root package")) {
357 currentNamespace.addElement("root package");
358 }
359 continue;
360 }
361 if (!currentNamespace.contains("package "+packageName)) {
362 currentNamespace.addElement("package "+packageName);
363 }
364 }
365 namespaceList.setListData(currentNamespace);
366 mainWindow.getCurrentProject().setChanged();
367 classnameField.setText("");
368 }
369
370 void removeRedundancies() {
371 Vector currentPackages = new Vector();
372 Vector resultingNamespace = new Vector();
373 boolean rootPackageIncluded = false;
374 Enumeration enum = currentNamespace.elements();
375 while (enum.hasMoreElements()) {
376 String name = (String) enum.nextElement();
377 if (name.startsWith("package")) {
378 currentPackages.addElement(name);
379 resultingNamespace.addElement(name);
380 }
381 if (name.equals("root package")) {
382 resultingNamespace.addElement(name);
383 rootPackageIncluded = true;
384 }
385 }
386 enum = currentNamespace.elements();
387 while (enum.hasMoreElements()) {
388 String name = (String) enum.nextElement();
389 if (name.equals("root package") || name.startsWith("package")) continue;
390 // insert class to namespace (if package isn't already in it)
391 String packageName = StringUtil.getPackageName(name);
392 if (packageName==null) continue;
393 if (packageName.equals("") && !rootPackageIncluded) {
394 resultingNamespace.addElement(name);
395 continue;
396 }
397 if (!currentPackages.contains("package "+packageName)) {
398 resultingNamespace.addElement(name);
399 }
400 }
401 currentNamespace = resultingNamespace;
402 }
403
404 void helpButton_actionPerformed(ActionEvent e)
405 {
406 mainWindow.showHelp();
407 }
408
409 void quitButton_actionPerformed(ActionEvent e)
410 {
411 if(mainWindow!=null) mainWindow.dispose();
412 mainWindow.exit();
413 }
414
415 public String helpFilename() {
416 return "namespace.html";
417 }
418
419 }