1 19 package org.netbeans.modules.refactoring.java.ui; 20 21 import com.sun.source.util.TreePath; 22 import java.awt.BorderLayout ; 23 import java.awt.Component ; 24 import java.awt.Dimension ; 25 import java.awt.event.ItemEvent ; 26 import java.beans.PropertyChangeListener ; 27 import java.io.IOException ; 28 import java.text.MessageFormat ; 29 import java.util.Collection ; 30 import java.util.Collections ; 31 import java.util.HashSet ; 32 import java.util.Set ; 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 ; 37 import javax.swing.event.ChangeListener ; 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 ; 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 59 public class WhereUsedPanel extends JPanel implements CustomRefactoringPanel { 60 61 private final transient TreePathHandle element; 62 private TreePathHandle newElement; 63 private final transient ChangeListener parent; 64 private static final int MAX_NAME = 50; 65 66 67 public WhereUsedPanel(String name, TreePathHandle e, ChangeListener parent) { 68 setName(NbBundle.getMessage(WhereUsedPanel.class,"LBL_WhereUsed")); this.element = e; 70 this.parent = parent; 71 initComponents(); 72 } 74 75 private boolean initialized = false; 76 private String methodDeclaringSuperClass = null; 77 private String methodDeclaringClass = null; 78 79 String getMethodDeclaringClass() { 80 return isMethodFromBaseClass() ? methodDeclaringSuperClass : methodDeclaringClass; 81 } 82 83 private Collection 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 ("Not supported yet."); 93 } 94 95 public void run(CompilationController info) throws Exception { 96 info.toPhase(Phase.RESOLVED); 97 String m_isBaseClassText = null; 98 final String labelText; 99 Set <Modifier> modif = new HashSet <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())); 107 methodDeclaringClass = getSimpleName(method.getEnclosingElement()); 108 Collection overridens = getOverriddenMethods(method, info); 109 if (!overridens.isEmpty()) { 110 ExecutableElement el = (ExecutableElement) overridens.iterator().next(); 111 m_isBaseClassText = 112 new MessageFormat (NbBundle.getMessage(WhereUsedPanel.class, "LBL_UsagesOfBaseClass")).format( 113 new Object [] { 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()); } else if (element.getKind() == ElementKind.CONSTRUCTOR) { 125 labelText = NbBundle.getMessage(WhereUsedPanel.class, "DSC_ConstructorUsages", getHeader(element), getSimpleName(element.getEnclosingElement())); } else if (element.getKind().isField()) { 127 labelText = NbBundle.getMessage(WhereUsedPanel.class, "DSC_FieldUsages", element.getSimpleName(), getSimpleName(element.getEnclosingElement())); } else if (element.getKind() == ElementKind.PACKAGE) { 129 labelText = NbBundle.getMessage(WhereUsedPanel.class, "DSC_PackageUsages", element.getSimpleName()); } else { 131 labelText = NbBundle.getMessage(WhereUsedPanel.class, "DSC_VariableUsages", element.getSimpleName()); } 133 134 final Set <Modifier> modifiers = modif; 135 final String isBaseClassText = m_isBaseClassText; 136 137 SwingUtilities.invokeLater(new Runnable () { 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 ioe) { 173 throw (RuntimeException ) new RuntimeException ().initCause(ioe); 174 } 175 initialized = true; 176 } 177 178 private String getSimpleName(Element clazz) { 179 return clazz.getSimpleName().toString(); 180 } 182 183 private String getHeader(ExecutableElement call, CompilationInfo info) { 184 String 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) + "..."; } 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 204 private void initComponents() { 206 java.awt.GridBagConstraints gridBagConstraints; 207 208 buttonGroup = new javax.swing.ButtonGroup (); 209 methodsPanel = new javax.swing.JPanel (); 210 m_isBaseClass = new javax.swing.JCheckBox (); 211 jPanel1 = new javax.swing.JPanel (); 212 m_overriders = new javax.swing.JCheckBox (); 213 m_usages = new javax.swing.JCheckBox (); 214 classesPanel = new javax.swing.JPanel (); 215 jPanel2 = new javax.swing.JPanel (); 216 c_subclasses = new javax.swing.JRadioButton (); 217 c_usages = new javax.swing.JRadioButton (); 218 c_directOnly = new javax.swing.JRadioButton (); 219 jPanel3 = new javax.swing.JPanel (); 220 label = new javax.swing.JLabel (); 221 searchInComments = new javax.swing.JCheckBox (); 222 223 setLayout(new java.awt.BorderLayout ()); 224 225 methodsPanel.setLayout(new java.awt.GridBagLayout ()); 226 227 m_isBaseClass.setSelected(true); 228 m_isBaseClass.addActionListener(new java.awt.event.ActionListener () { 229 public void actionPerformed(java.awt.event.ActionEvent evt) { 230 m_isBaseClassActionPerformed(evt); 231 } 232 }); 233 234 gridBagConstraints = new java.awt.GridBagConstraints (); 235 gridBagConstraints.gridx = 0; 236 gridBagConstraints.gridy = 3; 237 gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; 238 gridBagConstraints.insets = new java.awt.Insets (0, 12, 0, 0); 239 methodsPanel.add(m_isBaseClass, gridBagConstraints); 240 java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle("org/netbeans/modules/refactoring/java/ui/Bundle"); m_isBaseClass.getAccessibleContext().setAccessibleDescription(bundle.getString("ACSD_isBaseClass")); 243 gridBagConstraints = new java.awt.GridBagConstraints (); 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")); m_overriders.addActionListener(new java.awt.event.ActionListener () { 253 public void actionPerformed(java.awt.event.ActionEvent evt) { 254 m_overridersActionPerformed(evt); 255 } 256 }); 257 258 gridBagConstraints = new java.awt.GridBagConstraints (); 259 gridBagConstraints.gridx = 0; 260 gridBagConstraints.gridy = 2; 261 gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; 262 gridBagConstraints.insets = new java.awt.Insets (0, 12, 0, 0); 263 methodsPanel.add(m_overriders, gridBagConstraints); 264 m_overriders.getAccessibleContext().setAccessibleDescription(bundle.getString("ACSD_overriders")); 266 org.openide.awt.Mnemonics.setLocalizedText(m_usages, org.openide.util.NbBundle.getMessage(WhereUsedPanel.class, "LBL_FindUsages")); m_usages.setSelected(true); 268 m_usages.setMargin(new java.awt.Insets (10, 2, 2, 2)); 269 m_usages.addActionListener(new java.awt.event.ActionListener () { 270 public void actionPerformed(java.awt.event.ActionEvent evt) { 271 m_usagesActionPerformed(evt); 272 } 273 }); 274 275 gridBagConstraints = new java.awt.GridBagConstraints (); 276 gridBagConstraints.gridx = 0; 277 gridBagConstraints.gridy = 1; 278 gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; 279 gridBagConstraints.insets = new java.awt.Insets (0, 12, 0, 0); 280 methodsPanel.add(m_usages, gridBagConstraints); 281 m_usages.getAccessibleContext().setAccessibleDescription(bundle.getString("ACSD_usages")); 283 add(methodsPanel, java.awt.BorderLayout.CENTER); 284 285 classesPanel.setLayout(new java.awt.GridBagLayout ()); 286 287 gridBagConstraints = new java.awt.GridBagConstraints (); 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")); gridBagConstraints = new java.awt.GridBagConstraints (); 299 gridBagConstraints.gridx = 0; 300 gridBagConstraints.gridy = 2; 301 gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; 302 gridBagConstraints.insets = new java.awt.Insets (0, 12, 0, 0); 303 classesPanel.add(c_subclasses, gridBagConstraints); 304 c_subclasses.getAccessibleContext().setAccessibleDescription(bundle.getString("ACSD_subclasses")); 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")); c_usages.setMargin(new java.awt.Insets (4, 2, 2, 2)); 310 gridBagConstraints = new java.awt.GridBagConstraints (); 311 gridBagConstraints.gridx = 0; 312 gridBagConstraints.gridy = 1; 313 gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; 314 gridBagConstraints.insets = new java.awt.Insets (0, 12, 0, 0); 315 classesPanel.add(c_usages, gridBagConstraints); 316 c_usages.getAccessibleContext().setAccessibleDescription(bundle.getString("ACSD_usages")); 318 buttonGroup.add(c_directOnly); 319 org.openide.awt.Mnemonics.setLocalizedText(c_directOnly, org.openide.util.NbBundle.getMessage(WhereUsedPanel.class, "LBL_FindDirectSubtypesOnly")); gridBagConstraints = new java.awt.GridBagConstraints (); 321 gridBagConstraints.gridx = 0; 322 gridBagConstraints.gridy = 3; 323 gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; 324 gridBagConstraints.insets = new java.awt.Insets (0, 12, 0, 0); 325 classesPanel.add(c_directOnly, gridBagConstraints); 326 c_directOnly.getAccessibleContext().setAccessibleDescription(bundle.getString("ACSD_directOnly")); 328 add(classesPanel, java.awt.BorderLayout.CENTER); 329 330 jPanel3.setLayout(new java.awt.BorderLayout ()); 331 332 jPanel3.add(label, java.awt.BorderLayout.NORTH); 333 334 searchInComments.setSelected(((Boolean ) RefactoringModule.getOption("searchInComments.whereUsed", Boolean.FALSE)).booleanValue()); 335 org.openide.awt.Mnemonics.setLocalizedText(searchInComments, org.openide.util.NbBundle.getBundle(WhereUsedPanel.class).getString("LBL_SearchInComents")); searchInComments.setMargin(new java.awt.Insets (10, 14, 2, 2)); 337 searchInComments.addItemListener(new java.awt.event.ItemListener () { 338 public void itemStateChanged(java.awt.event.ItemEvent 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 } 350 private void searchInCommentsItemStateChanged(java.awt.event.ItemEvent evt) { Boolean b = evt.getStateChange() == ItemEvent.SELECTED ? Boolean.TRUE : Boolean.FALSE; 354 RefactoringModule.setOption("searchInComments.whereUsed", b); 355 } 357 private void m_isBaseClassActionPerformed(java.awt.event.ActionEvent evt) { parent.stateChanged(null); 359 } 361 private void m_overridersActionPerformed(java.awt.event.ActionEvent evt) { parent.stateChanged(null); 363 } 365 private void m_usagesActionPerformed(java.awt.event.ActionEvent evt) { parent.stateChanged(null); 367 } 369 private javax.swing.ButtonGroup buttonGroup; 371 private javax.swing.JRadioButton c_directOnly; 372 private javax.swing.JRadioButton c_subclasses; 373 private javax.swing.JRadioButton c_usages; 374 private javax.swing.JPanel classesPanel; 375 private javax.swing.JPanel jPanel1; 376 private javax.swing.JPanel jPanel2; 377 private javax.swing.JPanel jPanel3; 378 private javax.swing.JLabel label; 379 private javax.swing.JCheckBox m_isBaseClass; 380 private javax.swing.JCheckBox m_overriders; 381 private javax.swing.JCheckBox m_usages; 382 private javax.swing.JPanel methodsPanel; 383 private javax.swing.JCheckBox searchInComments; 384 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 getPreferredSize() { 411 Dimension orig = super.getPreferredSize(); 412 return new Dimension (orig.width + 30 , orig.height + 30); 413 } 414 415 public boolean isSearchInComments() { 416 return searchInComments.isSelected(); 417 } 418 419 private Object getHeader(javax.lang.model.element.Element element) { 420 return element.toString(); 421 } 422 423 public Component getComponent() { 424 return this; 425 } 426 } 427 428 | Popular Tags |