KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > netbeans > modules > refactoring > java > ui > WhereUsedPanel


1 /*
2  * The contents of this file are subject to the terms of the Common Development
3  * and Distribution License (the License). You may not use this file except in
4  * compliance with the License.
5  *
6  * You can obtain a copy of the License at http://www.netbeans.org/cddl.html
7  * or http://www.netbeans.org/cddl.txt.
8  *
9  * When distributing Covered Code, include this CDDL Header Notice in each file
10  * and include the License file at http://www.netbeans.org/cddl.txt.
11  * If applicable, add the following below the CDDL Header, with the fields
12  * enclosed by brackets [] replaced by your own identifying information:
13  * "Portions Copyrighted [year] [name of copyright owner]"
14  *
15  * The Original Software is NetBeans. The Initial Developer of the Original
16  * Software is Sun Microsystems, Inc. Portions Copyright 1997-2006 Sun
17  * Microsystems, Inc. All Rights Reserved.
18  */

19 package org.netbeans.modules.refactoring.java.ui;
20
21 import com.sun.source.util.TreePath;
22 import java.awt.BorderLayout JavaDoc;
23 import java.awt.Component JavaDoc;
24 import java.awt.Dimension JavaDoc;
25 import java.awt.event.ItemEvent JavaDoc;
26 import java.beans.PropertyChangeListener JavaDoc;
27 import java.io.IOException JavaDoc;
28 import java.text.MessageFormat JavaDoc;
29 import java.util.Collection JavaDoc;
30 import java.util.Collections JavaDoc;
31 import java.util.HashSet JavaDoc;
32 import java.util.Set JavaDoc;
33 import javax.lang.model.element.Element;
34 import javax.lang.model.element.ElementKind;
35 import javax.lang.model.element.ExecutableElement;
36 import javax.swing.SwingUtilities JavaDoc;
37 import javax.swing.event.ChangeListener JavaDoc;
38 import org.netbeans.api.java.source.CompilationInfo;
39 import org.netbeans.api.java.source.ElementHandle;
40 import org.netbeans.api.java.source.TreePathHandle;
41 import org.netbeans.api.java.source.UiUtils;
42 import org.netbeans.modules.refactoring.java.RetoucheUtils;
43 import org.netbeans.modules.refactoring.spi.ui.CustomRefactoringPanel;
44 import org.openide.awt.Mnemonics;
45 import org.openide.util.NbBundle;
46 import org.netbeans.modules.refactoring.java.RefactoringModule;
47 import javax.lang.model.element.Modifier;
48 import javax.swing.JPanel JavaDoc;
49 import org.netbeans.api.java.source.CancellableTask;
50 import org.netbeans.api.java.source.CompilationController;
51 import org.netbeans.api.java.source.JavaSource;
52 import org.netbeans.api.java.source.JavaSource.Phase;
53 import org.netbeans.api.java.source.SourceUtils;
54
55
56 /**
57  * @author Jan Becicka
58  */

59 public class WhereUsedPanel extends JPanel JavaDoc implements CustomRefactoringPanel {
60
61     private final transient TreePathHandle element;
62     private TreePathHandle newElement;
63     private final transient ChangeListener JavaDoc parent;
64     private static final int MAX_NAME = 50;
65     
66     /** Creates new form WhereUsedPanel */
67     public WhereUsedPanel(String JavaDoc name, TreePathHandle e, ChangeListener JavaDoc parent) {
68         setName(NbBundle.getMessage(WhereUsedPanel.class,"LBL_WhereUsed")); // NOI18N
69
this.element = e;
70         this.parent = parent;
71         initComponents();
72         //parent.setPreviewEnabled(false);
73
}
74
75     private boolean initialized = false;
76     private String JavaDoc methodDeclaringSuperClass = null;
77     private String JavaDoc methodDeclaringClass = null;
78     
79     String JavaDoc getMethodDeclaringClass() {
80         return isMethodFromBaseClass() ? methodDeclaringSuperClass : methodDeclaringClass;
81     }
82     
83     private Collection JavaDoc getOverriddenMethods(ExecutableElement m, CompilationInfo info) {
84         return RetoucheUtils.getOverridenMethods(m, info);
85     }
86     
87     public void initialize() {
88         if (initialized) return;
89         JavaSource source = JavaSource.forFileObject(element.getFileObject());
90         CancellableTask<CompilationController> task =new CancellableTask<CompilationController>() {
91             public void cancel() {
92                 throw new UnsupportedOperationException JavaDoc("Not supported yet.");
93             }
94             
95             public void run(CompilationController info) throws Exception JavaDoc {
96                 info.toPhase(Phase.RESOLVED);
97                 String JavaDoc m_isBaseClassText = null;
98                 final String JavaDoc labelText;
99                 Set JavaDoc<Modifier> modif = new HashSet JavaDoc<Modifier>();
100                 
101                 final Element element = WhereUsedPanel.this.element.resolveElement(info);
102                 if (element.getKind() == ElementKind.METHOD) {
103                     ExecutableElement method = (ExecutableElement) element;
104                     modif = method.getModifiers();
105                     labelText = NbBundle.getMessage(WhereUsedPanel.class, "DSC_MethodUsages", getHeader(method, info), getSimpleName(method.getEnclosingElement())); // NOI18N
106

107                     methodDeclaringClass = getSimpleName(method.getEnclosingElement());
108                     Collection JavaDoc overridens = getOverriddenMethods(method, info);
109                     if (!overridens.isEmpty()) {
110                         ExecutableElement el = (ExecutableElement) overridens.iterator().next();
111                         m_isBaseClassText =
112                                 new MessageFormat JavaDoc(NbBundle.getMessage(WhereUsedPanel.class, "LBL_UsagesOfBaseClass")).format(
113                                 new Object JavaDoc[] {
114                             methodDeclaringSuperClass = getSimpleName(((ExecutableElement) overridens.iterator().next()).getEnclosingElement())
115                         }
116                         );
117                          final ElementHandle eh = ElementHandle.create(el);
118                         TreePath tp = SourceUtils.pathFor(info, eh.resolve(info));
119                         newElement = TreePathHandle.create(tp, info);
120
121                     }
122                 } else if (element.getKind().isClass() || element.getKind().isInterface()) {
123                     labelText = NbBundle.getMessage(WhereUsedPanel.class, "DSC_ClassUsages", element.getSimpleName()); // NOI18N
124
} else if (element.getKind() == ElementKind.CONSTRUCTOR) {
125                     labelText = NbBundle.getMessage(WhereUsedPanel.class, "DSC_ConstructorUsages", getHeader(element), getSimpleName(element.getEnclosingElement())); // NOI18N
126
} else if (element.getKind().isField()) {
127                     labelText = NbBundle.getMessage(WhereUsedPanel.class, "DSC_FieldUsages", element.getSimpleName(), getSimpleName(element.getEnclosingElement())); // NOI18N
128
} else if (element.getKind() == ElementKind.PACKAGE) {
129                     labelText = NbBundle.getMessage(WhereUsedPanel.class, "DSC_PackageUsages", element.getSimpleName()); // NOI18N
130
} else {
131                     labelText = NbBundle.getMessage(WhereUsedPanel.class, "DSC_VariableUsages", element.getSimpleName()); // NOI18N
132
}
133                 
134                 final Set JavaDoc<Modifier> modifiers = modif;
135                 final String JavaDoc isBaseClassText = m_isBaseClassText;
136                 
137                 SwingUtilities.invokeLater(new Runnable JavaDoc() {
138                     public void run() {
139                         remove(classesPanel);
140                         remove(methodsPanel);
141                         label.setText(labelText);
142                         if (element instanceof ExecutableElement) {
143                             add(methodsPanel, BorderLayout.CENTER);
144                             methodsPanel.setVisible(true);
145                             m_usages.setVisible(!modifiers.contains(Modifier.STATIC));
146                             m_overriders.setVisible(! modifiers.contains(Modifier.FINAL) || modifiers.contains(Modifier.STATIC) || modifiers.contains(Modifier.PRIVATE));
147                             if (methodDeclaringSuperClass != null ) {
148                                 m_isBaseClass.setVisible(true);
149                                 m_isBaseClass.setSelected(true);
150                                 Mnemonics.setLocalizedText(m_isBaseClass, isBaseClassText);
151                             } else {
152                                 m_isBaseClass.setVisible(false);
153                                 m_isBaseClass.setSelected(false);
154                             }
155                         } else if ((element.getKind() == ElementKind.CLASS) || (element.getKind() == ElementKind.INTERFACE)) {
156                             add(classesPanel, BorderLayout.CENTER);
157                             classesPanel.setVisible(true);
158                         } else {
159                             remove(classesPanel);
160                             remove(methodsPanel);
161                             c_subclasses.setVisible(false);
162                             m_usages.setVisible(false);
163                             c_usages.setVisible(false);
164                             c_directOnly.setVisible(false);
165                         }
166                         validate();
167                     }
168                 });
169             }};
170             try {
171                 source.runUserActionTask(task, true);
172             } catch (IOException JavaDoc ioe) {
173                 throw (RuntimeException JavaDoc) new RuntimeException JavaDoc().initCause(ioe);
174             }
175             initialized = true;
176     }
177     
178     private String JavaDoc getSimpleName(Element clazz) {
179         return clazz.getSimpleName().toString();
180         //return NbBundle.getMessage(WhereUsedPanel.class, "LBL_AnonymousClass"); // NOI18N
181
}
182     
183     private String JavaDoc getHeader(ExecutableElement call, CompilationInfo info) {
184         String JavaDoc result = UiUtils.getHeader(call,info,UiUtils.PrintPart.NAME + UiUtils.PrintPart.PARAMETERS);
185         if (result.length() > MAX_NAME) {
186             result = result.substring(0,MAX_NAME-1) + "..."; // NOI18N
187
}
188         return RetoucheUtils.htmlize(result);
189     }
190     
191     public TreePathHandle getBaseMethod() {
192         return newElement;
193     }
194     
195     public void requestFocus() {
196         super.requestFocus();
197     }
198     
199     /** This method is called from within the constructor to
200      * initialize the form.
201      * WARNING: Do NOT modify this code. The content of this method is
202      * always regenerated by the Form Editor.
203      */

204     // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
205
private void initComponents() {
206         java.awt.GridBagConstraints JavaDoc gridBagConstraints;
207
208         buttonGroup = new javax.swing.ButtonGroup JavaDoc();
209         methodsPanel = new javax.swing.JPanel JavaDoc();
210         m_isBaseClass = new javax.swing.JCheckBox JavaDoc();
211         jPanel1 = new javax.swing.JPanel JavaDoc();
212         m_overriders = new javax.swing.JCheckBox JavaDoc();
213         m_usages = new javax.swing.JCheckBox JavaDoc();
214         classesPanel = new javax.swing.JPanel JavaDoc();
215         jPanel2 = new javax.swing.JPanel JavaDoc();
216         c_subclasses = new javax.swing.JRadioButton JavaDoc();
217         c_usages = new javax.swing.JRadioButton JavaDoc();
218         c_directOnly = new javax.swing.JRadioButton JavaDoc();
219         jPanel3 = new javax.swing.JPanel JavaDoc();
220         label = new javax.swing.JLabel JavaDoc();
221         searchInComments = new javax.swing.JCheckBox JavaDoc();
222
223         setLayout(new java.awt.BorderLayout JavaDoc());
224
225         methodsPanel.setLayout(new java.awt.GridBagLayout JavaDoc());
226
227         m_isBaseClass.setSelected(true);
228         m_isBaseClass.addActionListener(new java.awt.event.ActionListener JavaDoc() {
229             public void actionPerformed(java.awt.event.ActionEvent JavaDoc evt) {
230                 m_isBaseClassActionPerformed(evt);
231             }
232         });
233
234         gridBagConstraints = new java.awt.GridBagConstraints JavaDoc();
235         gridBagConstraints.gridx = 0;
236         gridBagConstraints.gridy = 3;
237         gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
238         gridBagConstraints.insets = new java.awt.Insets JavaDoc(0, 12, 0, 0);
239         methodsPanel.add(m_isBaseClass, gridBagConstraints);
240         java.util.ResourceBundle JavaDoc bundle = java.util.ResourceBundle.getBundle("org/netbeans/modules/refactoring/java/ui/Bundle"); // NOI18N
241
m_isBaseClass.getAccessibleContext().setAccessibleDescription(bundle.getString("ACSD_isBaseClass")); // NOI18N
242

243         gridBagConstraints = new java.awt.GridBagConstraints JavaDoc();
244         gridBagConstraints.gridx = 0;
245         gridBagConstraints.gridy = 4;
246         gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
247         gridBagConstraints.weightx = 1.0;
248         gridBagConstraints.weighty = 1.0;
249         methodsPanel.add(jPanel1, gridBagConstraints);
250
251         org.openide.awt.Mnemonics.setLocalizedText(m_overriders, org.openide.util.NbBundle.getMessage(WhereUsedPanel.class, "LBL_FindOverridingMethods")); // NOI18N
252
m_overriders.addActionListener(new java.awt.event.ActionListener JavaDoc() {
253             public void actionPerformed(java.awt.event.ActionEvent JavaDoc evt) {
254                 m_overridersActionPerformed(evt);
255             }
256         });
257
258         gridBagConstraints = new java.awt.GridBagConstraints JavaDoc();
259         gridBagConstraints.gridx = 0;
260         gridBagConstraints.gridy = 2;
261         gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
262         gridBagConstraints.insets = new java.awt.Insets JavaDoc(0, 12, 0, 0);
263         methodsPanel.add(m_overriders, gridBagConstraints);
264         m_overriders.getAccessibleContext().setAccessibleDescription(bundle.getString("ACSD_overriders")); // NOI18N
265

266         org.openide.awt.Mnemonics.setLocalizedText(m_usages, org.openide.util.NbBundle.getMessage(WhereUsedPanel.class, "LBL_FindUsages")); // NOI18N
267
m_usages.setSelected(true);
268         m_usages.setMargin(new java.awt.Insets JavaDoc(10, 2, 2, 2));
269         m_usages.addActionListener(new java.awt.event.ActionListener JavaDoc() {
270             public void actionPerformed(java.awt.event.ActionEvent JavaDoc evt) {
271                 m_usagesActionPerformed(evt);
272             }
273         });
274
275         gridBagConstraints = new java.awt.GridBagConstraints JavaDoc();
276         gridBagConstraints.gridx = 0;
277         gridBagConstraints.gridy = 1;
278         gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
279         gridBagConstraints.insets = new java.awt.Insets JavaDoc(0, 12, 0, 0);
280         methodsPanel.add(m_usages, gridBagConstraints);
281         m_usages.getAccessibleContext().setAccessibleDescription(bundle.getString("ACSD_usages")); // NOI18N
282

283         add(methodsPanel, java.awt.BorderLayout.CENTER);
284
285         classesPanel.setLayout(new java.awt.GridBagLayout JavaDoc());
286
287         gridBagConstraints = new java.awt.GridBagConstraints JavaDoc();
288         gridBagConstraints.gridx = 0;
289         gridBagConstraints.gridy = 4;
290         gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
291         gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
292         gridBagConstraints.weightx = 1.0;
293         gridBagConstraints.weighty = 1.0;
294         classesPanel.add(jPanel2, gridBagConstraints);
295
296         buttonGroup.add(c_subclasses);
297         org.openide.awt.Mnemonics.setLocalizedText(c_subclasses, org.openide.util.NbBundle.getMessage(WhereUsedPanel.class, "LBL_FindAllSubtypes")); // NOI18N
298
gridBagConstraints = new java.awt.GridBagConstraints JavaDoc();
299         gridBagConstraints.gridx = 0;
300         gridBagConstraints.gridy = 2;
301         gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
302         gridBagConstraints.insets = new java.awt.Insets JavaDoc(0, 12, 0, 0);
303         classesPanel.add(c_subclasses, gridBagConstraints);
304         c_subclasses.getAccessibleContext().setAccessibleDescription(bundle.getString("ACSD_subclasses")); // NOI18N
305

306         buttonGroup.add(c_usages);
307         c_usages.setSelected(true);
308         org.openide.awt.Mnemonics.setLocalizedText(c_usages, org.openide.util.NbBundle.getMessage(WhereUsedPanel.class, "LBL_FindUsages")); // NOI18N
309
c_usages.setMargin(new java.awt.Insets JavaDoc(4, 2, 2, 2));
310         gridBagConstraints = new java.awt.GridBagConstraints JavaDoc();
311         gridBagConstraints.gridx = 0;
312         gridBagConstraints.gridy = 1;
313         gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
314         gridBagConstraints.insets = new java.awt.Insets JavaDoc(0, 12, 0, 0);
315         classesPanel.add(c_usages, gridBagConstraints);
316         c_usages.getAccessibleContext().setAccessibleDescription(bundle.getString("ACSD_usages")); // NOI18N
317

318         buttonGroup.add(c_directOnly);
319         org.openide.awt.Mnemonics.setLocalizedText(c_directOnly, org.openide.util.NbBundle.getMessage(WhereUsedPanel.class, "LBL_FindDirectSubtypesOnly")); // NOI18N
320
gridBagConstraints = new java.awt.GridBagConstraints JavaDoc();
321         gridBagConstraints.gridx = 0;
322         gridBagConstraints.gridy = 3;
323         gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
324         gridBagConstraints.insets = new java.awt.Insets JavaDoc(0, 12, 0, 0);
325         classesPanel.add(c_directOnly, gridBagConstraints);
326         c_directOnly.getAccessibleContext().setAccessibleDescription(bundle.getString("ACSD_directOnly")); // NOI18N
327

328         add(classesPanel, java.awt.BorderLayout.CENTER);
329
330         jPanel3.setLayout(new java.awt.BorderLayout JavaDoc());
331
332         jPanel3.add(label, java.awt.BorderLayout.NORTH);
333
334         searchInComments.setSelected(((Boolean JavaDoc) RefactoringModule.getOption("searchInComments.whereUsed", Boolean.FALSE)).booleanValue());
335         org.openide.awt.Mnemonics.setLocalizedText(searchInComments, org.openide.util.NbBundle.getBundle(WhereUsedPanel.class).getString("LBL_SearchInComents")); // NOI18N
336
searchInComments.setMargin(new java.awt.Insets JavaDoc(10, 14, 2, 2));
337         searchInComments.addItemListener(new java.awt.event.ItemListener JavaDoc() {
338             public void itemStateChanged(java.awt.event.ItemEvent JavaDoc evt) {
339                 searchInCommentsItemStateChanged(evt);
340             }
341         });
342
343         jPanel3.add(searchInComments, java.awt.BorderLayout.SOUTH);
344         searchInComments.getAccessibleContext().setAccessibleDescription(searchInComments.getText());
345
346         add(jPanel3, java.awt.BorderLayout.NORTH);
347
348     }// </editor-fold>//GEN-END:initComponents
349

350     private void searchInCommentsItemStateChanged(java.awt.event.ItemEvent JavaDoc evt) {//GEN-FIRST:event_searchInCommentsItemStateChanged
351
// used for change default value for searchInComments check-box.
352
// The value is persisted and then used as default in next IDE run.
353
Boolean JavaDoc b = evt.getStateChange() == ItemEvent.SELECTED ? Boolean.TRUE : Boolean.FALSE;
354         RefactoringModule.setOption("searchInComments.whereUsed", b);
355     }//GEN-LAST:event_searchInCommentsItemStateChanged
356

357     private void m_isBaseClassActionPerformed(java.awt.event.ActionEvent JavaDoc evt) {//GEN-FIRST:event_m_isBaseClassActionPerformed
358
parent.stateChanged(null);
359     }//GEN-LAST:event_m_isBaseClassActionPerformed
360

361     private void m_overridersActionPerformed(java.awt.event.ActionEvent JavaDoc evt) {//GEN-FIRST:event_m_overridersActionPerformed
362
parent.stateChanged(null);
363     }//GEN-LAST:event_m_overridersActionPerformed
364

365     private void m_usagesActionPerformed(java.awt.event.ActionEvent JavaDoc evt) {//GEN-FIRST:event_m_usagesActionPerformed
366
parent.stateChanged(null);
367     }//GEN-LAST:event_m_usagesActionPerformed
368

369     // Variables declaration - do not modify//GEN-BEGIN:variables
370
private javax.swing.ButtonGroup JavaDoc buttonGroup;
371     private javax.swing.JRadioButton JavaDoc c_directOnly;
372     private javax.swing.JRadioButton JavaDoc c_subclasses;
373     private javax.swing.JRadioButton JavaDoc c_usages;
374     private javax.swing.JPanel JavaDoc classesPanel;
375     private javax.swing.JPanel JavaDoc jPanel1;
376     private javax.swing.JPanel JavaDoc jPanel2;
377     private javax.swing.JPanel JavaDoc jPanel3;
378     private javax.swing.JLabel JavaDoc label;
379     private javax.swing.JCheckBox JavaDoc m_isBaseClass;
380     private javax.swing.JCheckBox JavaDoc m_overriders;
381     private javax.swing.JCheckBox JavaDoc m_usages;
382     private javax.swing.JPanel JavaDoc methodsPanel;
383     private javax.swing.JCheckBox JavaDoc searchInComments;
384     // End of variables declaration//GEN-END:variables
385

386     public boolean isMethodFromBaseClass() {
387         return m_isBaseClass.isSelected();
388     }
389     
390     public boolean isMethodOverriders() {
391         return m_overriders.isSelected();
392     }
393     
394     public boolean isClassSubTypes() {
395         return c_subclasses.isSelected();
396     }
397     
398     public boolean isClassSubTypesDirectOnly() {
399         return c_directOnly.isSelected();
400     }
401     
402     public boolean isMethodFindUsages() {
403         return m_usages.isSelected();
404     }
405     
406     public boolean isClassFindUsages() {
407         return c_usages.isSelected();
408     }
409     
410     public Dimension JavaDoc getPreferredSize() {
411         Dimension JavaDoc orig = super.getPreferredSize();
412         return new Dimension JavaDoc(orig.width + 30 , orig.height + 30);
413     }
414     
415     public boolean isSearchInComments() {
416         return searchInComments.isSelected();
417     }
418
419     private Object JavaDoc getHeader(javax.lang.model.element.Element element) {
420         return element.toString();
421     }
422
423     public Component JavaDoc getComponent() {
424         return this;
425     }
426 }
427
428
Popular Tags