1 19 package org.netbeans.modules.xml.refactoring.ui.j.ui; 20 21 import java.awt.*; 22 import java.awt.event.ActionEvent ; 23 import java.awt.event.ActionListener ; 24 import java.beans.PropertyChangeEvent ; 25 import java.beans.PropertyChangeListener ; 26 import java.io.IOException ; 27 import java.lang.ref.WeakReference ; 28 import java.text.MessageFormat ; 29 import java.util.*; 30 import java.util.concurrent.ExecutionException ; 31 import javax.swing.*; 33 import javax.swing.border.EmptyBorder ; 34 import javax.swing.event.TreeSelectionEvent ; 35 import javax.swing.event.TreeSelectionListener ; 36 import javax.swing.text.Position ; 37 import javax.swing.tree.DefaultTreeModel ; 38 import javax.swing.tree.TreePath ; 39 import org.netbeans.api.progress.ProgressHandle; 40 import org.netbeans.api.progress.ProgressHandleFactory; 41 import org.netbeans.modules.xml.nbprefuse.View; 42 import org.netbeans.modules.xml.refactoring.DeleteRequest; 43 import org.netbeans.modules.xml.refactoring.FindUsageResult; 44 import org.netbeans.modules.xml.refactoring.RefactoringManager; 45 import org.netbeans.modules.xml.refactoring.RenameRequest; 46 import org.netbeans.modules.xml.refactoring.Usage; 47 import org.netbeans.modules.xml.xam.ComponentEvent; 48 import org.netbeans.modules.xml.xam.Model; 49 import org.netbeans.modules.xml.xam.Referenceable; 50 import org.openide.DialogDescriptor; 51 import org.openide.DialogDisplayer; 52 import org.openide.ErrorManager; 53 import org.openide.awt.Mnemonics; 54 import org.openide.awt.StatusDisplayer; 55 import org.openide.nodes.Node; 56 import org.openide.nodes.NodeEvent; 57 import org.openide.nodes.NodeMemberEvent; 58 import org.openide.nodes.NodeReorderEvent; 59 import org.openide.util.Cancellable; 60 import org.openide.util.Lookup; 61 import org.openide.util.NbBundle; 62 import org.openide.util.RequestProcessor; 63 import org.openide.util.Utilities; 64 import org.openide.util.WeakListeners; 65 import org.openide.windows.TopComponent; 66 import org.netbeans.modules.xml.refactoring.RefactorRequest; 67 import org.netbeans.modules.xml.refactoring.UsageSet; 68 import org.netbeans.modules.xml.nbprefuse.AnalysisViewer; 69 import org.netbeans.modules.xml.refactoring.FileRenameRequest; 70 import org.netbeans.modules.xml.refactoring.ui.j.api.ProgressEvent; 71 import org.netbeans.modules.xml.refactoring.ui.j.api.ProgressListener; 72 import org.netbeans.modules.xml.refactoring.ui.j.spi.ui.ParametersPanel; 73 import org.netbeans.modules.xml.refactoring.ui.j.spi.ui.RefactoringUI; 74 import org.netbeans.modules.xml.refactoring.ui.j.spi.ui.WhereUsedQueryUI; 75 import org.netbeans.modules.xml.refactoring.ui.readers.WhereUsedReader; 76 import org.netbeans.modules.xml.refactoring.ui.util.AnalysisUtilities; 77 import org.netbeans.modules.xml.refactoring.ui.views.WhereUsedView; 78 import org.netbeans.modules.xml.xam.ComponentListener; 79 import org.netbeans.modules.xml.xam.NamedReferenceable; 80 import org.netbeans.modules.xml.xam.dom.DocumentComponent; 81 import org.openide.NotifyDescriptor; 82 import org.openide.loaders.DataObject; 83 import org.openide.nodes.NodeListener; 84 import prefuse.data.Graph; 85 86 87 93 public class RefactoringPanel extends JPanel implements TreeSelectionListener , 95 PropertyChangeListener , NodeListener, ComponentListener { 96 public static final long serialVersionUID = 1L; 97 98 100 private transient JTree tree = null; 101 102 private transient DefaultTreeModel treeModel = null; 103 104 private transient JButton refreshButton = null; 105 106 private transient JToggleButton expandButton = null; 107 private JToolBar toolBar = null; 108 109 private transient JButton refactorButton = null; 110 private transient JButton cancelButton = null; 111 private transient ButtonL buttonListener = null; 112 private transient JButton rerunButton = null; 113 114 private final RefactoringUI ui; 115 private final boolean isQuery; 116 117 private transient boolean isVisible = false; 118 private transient ParametersPanel parametersPanel = null; 120 private javax.swing.JSplitPane splitPane; 121 private transient JScrollPane treeScrollPane = null; 122 private transient JPanel southPanel; 123 private Action callback = null; 124 125 private static final int MAX_ROWS = 50; 126 127 private transient JToggleButton logicalViewButton = null; 128 private transient JToggleButton physicalViewButton = null; 129 private transient ProgressListener progressListener; 130 131 private transient JButton prevMatch = null; 132 private transient JButton nextMatch = null; 133 private WeakReference refCallerTC; 134 135 private AnalysisViewer analysisViewer; 136 137 public static final String 138 NODE_SELECTION_CHANGE = "node-selection-change"; 140 private transient Cancellable cancellableFindUsagesTask; 141 ParametersPanel.Results results; 142 143 public RefactoringPanel(RefactoringUI ui) { 144 this(ui, (TopComponent) null); 145 } 146 147 public RefactoringPanel(RefactoringUI ui, TopComponent caller) { 148 this(ui, caller, null); 149 } 150 151 @SuppressWarnings ("unchecked") 152 public RefactoringPanel(RefactoringUI ui, TopComponent caller, Action callback) { 153 if (caller!=null) 154 refCallerTC = new WeakReference (caller); 155 this.ui = ui; 156 this.isQuery = ui.isQuery(); 157 this.callback = callback; 158 initialize(); 159 addListeners(); 160 boolean skipsParameters = (ui instanceof WhereUsedQueryUI) || 161 ui.getRefactorRequest() != null && ui.getRefactorRequest().getUsages() != null; 162 refresh(! skipsParameters); 163 } 164 165 public RefactoringPanel(RefactoringUI ui, Action callback) { 166 this(ui, null, callback); 167 } 168 169 private void addListeners() { 170 addDataOjectNodeListener(); 171 addComponentListener(); 172 } 173 174 private void addComponentListener() { 175 if (ui.getTarget() instanceof DocumentComponent) { 176 DocumentComponent target = (DocumentComponent) ui.getTarget(); 177 if (target.getParent() != null) { 178 target.getModel().addComponentListener( (ComponentListener) 179 WeakListeners.create(ComponentListener.class, this, target.getModel())); 180 } 181 } 182 } 183 184 private void addDataOjectNodeListener() { 185 Model targetModel = RefactorRequest.getModel(ui.getTarget()); 186 assert targetModel != null : "null target model"; 187 DataObject dobj = (DataObject) targetModel.getModelSource().getLookup().lookup(DataObject.class); 188 assert dobj != null : "model source lookup has no data object"; 189 Node node = dobj.getNodeDelegate(); 190 node.addNodeListener((NodeListener)WeakListeners.create(NodeListener.class, this, node)); 191 } 192 193 public static void checkEventThread() { 194 if (!SwingUtilities.isEventDispatchThread()) { 195 ErrorManager.getDefault().notify(ErrorManager.INFORMATIONAL, 196 new IllegalStateException ( 197 "This must happen in event thread!")); } 199 } 200 201 202 private void initialize() { 203 checkEventThread(); 204 setFocusCycleRoot(true); 205 setLayout(new BorderLayout()); 206 JButton[] buttons = getButtons(); 208 southPanel = new JPanel(new GridBagLayout()); 211 for (int i = 0; i < buttons.length; i++) { 212 GridBagConstraints c = new GridBagConstraints(); 213 c.gridy = 0; 214 c.insets = new Insets(5, 5, 5, 0); 215 southPanel.add(buttons[i], c); 216 } 217 JPanel pp = new JPanel(new BorderLayout()); 218 GridBagConstraints c = new GridBagConstraints(); 219 c.gridy = 0; 220 c.insets = new Insets(5, 5, 5, 5); 221 c.weightx = 1; 222 c.fill = c.HORIZONTAL; 223 southPanel.add(pp, c); 224 225 if (!isQuery|| callback != null) { 226 add(southPanel, BorderLayout.SOUTH); 227 } 228 JToolBar toolBar = getToolBar(); 232 if (toolBar != null) 233 add(toolBar, BorderLayout.WEST); 234 235 analysisViewer = new AnalysisViewer(); 237 analysisViewer.addPropertyChangeListener( 238 AnalysisViewer.PROP_GRAPH_NODE_SELECTION_CHANGED_RELAY,this); 239 analysisViewer.getPanel().setMinimumSize(new Dimension(10,10)); 240 analysisViewer.getPanel().setPreferredSize(new Dimension(10,10)); 241 splitPane = new javax.swing.JSplitPane (); 242 add(splitPane, BorderLayout.CENTER); 244 splitPane.setRightComponent(analysisViewer.getPanel()); 245 splitPane.setLeftComponent(new JLabel("")); splitPane.setResizeWeight(0.5); 249 validate(); 250 } 251 252 261 private JToolBar getToolBar() { 262 checkEventThread(); 263 refreshButton = new JButton( 264 new ImageIcon(Utilities.loadImage( 265 "org/netbeans/modules/refactoring/api/resources/refresh.png")) ); 267 Dimension dim = new Dimension(24, 24); 268 refreshButton.setMaximumSize(dim); 269 refreshButton.setMinimumSize(dim); 270 refreshButton.setPreferredSize(dim); 271 refreshButton.setToolTipText(NbBundle.getMessage(RefactoringPanel.class, "HINT_refresh") ); 273 refreshButton.setMnemonic( 274 NbBundle.getMessage(RefactoringPanel.class, "MNEM_refresh").charAt(0) 275 ); 276 refreshButton.addActionListener(getButtonListener()); 277 expandButton = new JToggleButton( 279 new ImageIcon(Utilities.loadImage( 280 "org/netbeans/modules/refactoring/api/resources/expandTree.png")) ); 282 expandButton.setSelectedIcon( 283 new ImageIcon(Utilities.loadImage( 284 "org/netbeans/modules/refactoring/api/resources/colapseTree.png")) ); 286 expandButton.setMaximumSize(dim); 287 expandButton.setMinimumSize(dim); 288 expandButton.setPreferredSize(dim); 289 expandButton.setSelected(true); 290 expandButton.setToolTipText( 291 NbBundle.getMessage(RefactoringPanel.class, "HINT_expandAll") ); 293 expandButton.setMnemonic( 294 NbBundle.getMessage(RefactoringPanel.class, "MNEM_expandAll").charAt(0) ); 296 expandButton.addActionListener(getButtonListener()); 297 toolBar = new JToolBar(JToolBar.VERTICAL); 299 toolBar.setFloatable(false); 300 301 logicalViewButton = new JToggleButton( 302 new ImageIcon(Utilities.loadImage( 303 "org/netbeans/modules/refactoring/api/resources/logical_view.png")) ); 305 306 logicalViewButton.setMaximumSize(dim); 307 logicalViewButton.setMinimumSize(dim); 308 logicalViewButton.setPreferredSize(dim); 309 logicalViewButton.setSelected(true); 310 logicalViewButton.setToolTipText( 311 NbBundle.getMessage(RefactoringPanel.class, "HINT_logicalView") ); 313 314 logicalViewButton.setMnemonic( 315 NbBundle.getMessage(RefactoringPanel.class, "MNEM_logicalView").charAt(0) ); 317 logicalViewButton.addActionListener(getButtonListener()); 318 319 physicalViewButton = new JToggleButton( 320 new ImageIcon(Utilities.loadImage( 321 "org/netbeans/modules/refactoring/api/resources/file_view.png")) ); 323 324 physicalViewButton.setMaximumSize(dim); 325 physicalViewButton.setMinimumSize(dim); 326 physicalViewButton.setPreferredSize(dim); 327 physicalViewButton.setToolTipText( 328 NbBundle.getMessage(RefactoringPanel.class, "HINT_physicalView") ); 330 physicalViewButton.setMnemonic( 331 NbBundle.getMessage(RefactoringPanel.class, "MNEM_physicalView").charAt(0) ); 333 physicalViewButton.addActionListener(getButtonListener()); 334 335 physicalViewButton.setEnabled(false); 337 338 nextMatch = new JButton( 339 new ImageIcon(Utilities.loadImage( 340 "org/netbeans/modules/refactoring/api/resources/nextmatch.png")) ); 342 343 nextMatch.setMaximumSize(dim); 344 nextMatch.setMinimumSize(dim); 345 nextMatch.setPreferredSize(dim); 346 nextMatch.setToolTipText( 347 NbBundle.getMessage(RefactoringPanel.class, "HINT_nextMatch") ); 349 nextMatch.addActionListener(getButtonListener()); 350 351 prevMatch = new JButton( 352 new ImageIcon(Utilities.loadImage( 353 "org/netbeans/modules/refactoring/api/resources/prevmatch.png")) ); 355 356 prevMatch.setMaximumSize(dim); 357 prevMatch.setMinimumSize(dim); 358 prevMatch.setPreferredSize(dim); 359 prevMatch.setToolTipText( 360 NbBundle.getMessage(RefactoringPanel.class, "HINT_prevMatch") ); 362 prevMatch.addActionListener(getButtonListener()); 363 364 toolBar.add(refreshButton); 365 toolBar.add(expandButton); 366 toolBar.add(logicalViewButton); 367 toolBar.add(physicalViewButton); 368 toolBar.add(prevMatch); 369 toolBar.add(nextMatch); 370 371 return toolBar; 372 } 373 374 382 private JButton[] getButtons() { 383 checkEventThread(); 384 if (isQuery) { 385 refactorButton = null; 386 if (callback==null) { 387 return new JButton[] {}; 388 } else { 389 rerunButton = new JButton((String ) callback.getValue( 390 callback.NAME)); rerunButton.addActionListener(getButtonListener()); 392 return new JButton[] {rerunButton}; 393 } 394 } else { 395 refactorButton = new JButton(NbBundle.getMessage( 396 RefactoringPanel.class, "LBL_DoRefactor")); refactorButton.setToolTipText(NbBundle.getMessage( 398 RefactoringPanel.class, "HINT_DoRefactor")); Mnemonics.setLocalizedText(refactorButton, NbBundle.getMessage( 400 RefactoringPanel.class, "LBL_DoRefactor")); 401 refactorButton.addActionListener(getButtonListener()); 402 cancelButton = new JButton(NbBundle.getMessage( 403 RefactoringPanel.class, "LBL_CancelRefactor")); Mnemonics.setLocalizedText(cancelButton,NbBundle.getMessage( 405 RefactoringPanel.class, "LBL_CancelRefactor")); 406 cancelButton.setToolTipText(NbBundle.getMessage( 407 RefactoringPanel.class, "HINT_CancelRefactor")); cancelButton.addActionListener(getButtonListener()); 409 return new JButton[] {refactorButton, cancelButton}; 410 } 411 } 412 413 private static final byte LOGICAL = 0; 414 private static final byte PHYSICAL = 1; 415 416 private byte currentView = LOGICAL; 417 418 void switchToLogicalView() { 419 logicalViewButton.setSelected(true); 420 if (currentView == LOGICAL) 421 return ; 422 currentView = LOGICAL; 423 physicalViewButton.setSelected(false); 424 refresh(false); 425 } 426 427 void switchToPhysicalView() { 428 physicalViewButton.setSelected(true); 429 if (currentView == PHYSICAL) 430 return ; 431 currentView = PHYSICAL; 432 logicalViewButton.setSelected(false); 433 refresh(false); 434 } 435 436 439 protected void updateTitle() { 440 } 441 442 445 private void refactor() { 446 checkEventThread(); 447 disableComponents(RefactoringPanel.this); 448 progressListener = new ProgressL(); 449 final ProgressEvent progressEvent = new ProgressEvent(this,0, 0, -1); 450 RequestProcessor.getDefault().post(new Runnable () { 451 public void run() { 452 try { 453 progressListener.start(progressEvent); 455 RefactoringManager.getInstance().process(results.getRefactorRequest()); 456 } catch (IOException ioe) { 457 String msg = ioe.getMessage(); 458 NotifyDescriptor nd = new NotifyDescriptor.Message( 459 msg, NotifyDescriptor.ERROR_MESSAGE); 460 DialogDisplayer.getDefault().notify(nd); 461 } finally { 462 progressListener.stop(progressEvent); 463 progressListener = null; 464 SwingUtilities.invokeLater(new Runnable () { 465 public void run() { 466 RefactoringPanel.this.close(); 467 } 468 }); 469 } 470 } 471 }); 472 } 473 474 481 private int cancel() { 482 checkEventThread(); 483 this.close(); 484 return 0; 485 } 486 487 void close() { 488 if (isQuery) { 489 RefactoringPanelContainer.getUsagesComponent().removePanel(this); 490 } else { 491 RefactoringPanelContainer.getRefactoringComponent().removePanel(this); 492 } 493 closeNotify(); 494 } 495 496 497 501 private ButtonL getButtonListener() { 502 if (buttonListener == null) 503 buttonListener = new ButtonL(); 504 505 return buttonListener; 506 } 507 508 509 public void expandAll() { 510 checkEventThread(); 511 final Cursor old = getCursor(); 512 expandButton.setEnabled(false); 513 treeScrollPane.getViewport().remove(tree); 514 setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); 515 SwingUtilities.invokeLater(new Runnable () { 516 public void run() { 517 int row = 0; 518 while (row < tree.getRowCount()) { 519 tree.expandRow(row); 520 row++; 521 } 522 SwingUtilities.invokeLater(new Runnable () { 523 public void run() { 524 treeScrollPane.setViewportView(tree); 525 setCursor(old); 526 expandButton.setEnabled(true); 527 expandButton.setToolTipText( 528 NbBundle.getMessage(RefactoringPanel.class, 529 "HINT_collapseAll") ); 531 requestFocus(); 532 } 533 }); 534 }}); 535 } 536 537 538 public void collapseAll() { 539 checkEventThread(); 540 expandButton.setEnabled(false); 541 final Cursor old = getCursor(); 542 treeScrollPane.getViewport().remove(tree); 543 setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); 544 SwingUtilities.invokeLater(new Runnable () { 545 public void run() { 546 int row = tree.getRowCount() - 1; 547 while (row > 0) { 548 tree.collapseRow(row); 549 row--; 550 } 551 SwingUtilities.invokeLater(new Runnable () { 552 public void run() { 553 treeScrollPane.setViewportView(tree); 554 setCursor(old); 555 expandButton.setEnabled(true); 556 expandButton.setToolTipText( 557 NbBundle.getMessage(RefactoringPanel.class, 558 "HINT_expandAll") ); 560 requestFocus(); 561 } 562 }); 563 }}); 564 } 565 566 public void invalidateObject() { 567 if (isQuery) { 568 return; 569 } 570 Runnable invalidate = new Runnable () { 571 public void run() { 572 setRefactoringEnabled(false, false); 573 } 574 }; 575 if (SwingUtilities.isEventDispatchThread()) { 576 invalidate.run(); 577 } else { 578 SwingUtilities.invokeLater(invalidate); 579 } 580 } 581 582 private void refresh(final boolean showParametersPanel) { 583 checkEventThread(); 584 585 586 if (showParametersPanel) { 587 if (parametersPanel == null) { 589 parametersPanel = new ParametersPanel(ui); 590 } 591 ParametersPanel.Results oldResults = results; 593 results = parametersPanel.showDialog(); 594 595 if (results == null) { 597 results = oldResults; 598 return; 599 } else if (results.getResult() == ParametersPanel.Results.Result.SKIP_PREVIEW){ 600 602 progressListener = new ProgressL(); 604 final ProgressEvent progressEvent = new ProgressEvent(this,0, 0, -1); 605 try { 606 progressListener.start(progressEvent); 607 RefactoringManager.getInstance().process(results.getRefactorRequest()); 608 StatusDisplayer.getDefault().setStatusText( 609 NbBundle.getMessage(RefactoringPanel.class, 610 "LBL_Refactoring_Completed")); 611 } catch (IOException ioe) { 612 String msg = ioe.getMessage(); 613 NotifyDescriptor nd = new NotifyDescriptor.Message( 614 msg, NotifyDescriptor.ERROR_MESSAGE); 615 DialogDisplayer.getDefault().notify(nd); 616 } finally { 617 progressListener.stop(progressEvent); 618 progressListener = null; 619 SwingUtilities.invokeLater(new Runnable () { 620 public void run() { 621 RefactoringPanel.this.close(); 622 } 623 }); 624 } 625 return; 626 } 627 628 } else if (! isQuery && results == null) { 630 results = new ParametersPanel.Results(); 631 RefactorRequest rr = ui.getRefactorRequest(); 632 assert rr != null : "Unexpected null refactor request for non-query"; 633 results.setRefactorRequest(ui.getRefactorRequest()); 634 } 635 636 final String description = ui.getDescription(); 637 setToolTipText("<html>" + description + "</html>"); setName(ui.getName()); 639 640 if (isQuery){ 641 showQuery(showParametersPanel); 642 } else { 643 showPreview(showParametersPanel, description); 644 } 645 } 646 647 private void showPreview(final boolean showParametersPanel, String description) 648 throws MissingResourceException { 649 650 final View view = ui.getView(); 651 final FindUsageResult fuResult = results.getUsagesResult(); 652 final RefactorRequest refactorRequest = results.getRefactorRequest(); 653 try { 654 fuResult.get().addPropertyChangeListener( 655 WeakListeners.propertyChange(this, refactorRequest.getUsages())); 656 } catch (InterruptedException ex) { 657 ErrorManager.getDefault().notify(ex); 658 } catch (ExecutionException ex) { 659 ErrorManager.getDefault().notify(ex); 660 } 661 final Referenceable ref = ((WhereUsedView)view).getQueryComponent(); 662 final String name = refactorRequest.getTargetName(); 663 RequestProcessor.getDefault().post(new Runnable (){ 664 public void run() { 665 addPropertyChangeListener(NODE_SELECTION_CHANGE, view); 666 Object [] models = null; 668 String rootLabel = null; 669 if (refactorRequest instanceof DeleteRequest){ 671 assert ref instanceof NamedReferenceable; 672 models = WhereUsedReader.createDeletePreviewModels((NamedReferenceable) ref); 673 rootLabel = MessageFormat.format( 674 NbBundle.getMessage( 675 RefactoringPanel.class, "LBL_Delete_Preview_TreeRoot_Label"), 676 new Object [] {name}); 677 } 678 else if (refactorRequest instanceof RenameRequest || 679 refactorRequest instanceof FileRenameRequest) { 680 models = ((WhereUsedView)view).createModels(fuResult); 681 models = WhereUsedReader.insertTargetComponent(ref, models, refactorRequest.getDescription()); 682 rootLabel = MessageFormat.format( 683 NbBundle.getMessage(RefactoringPanel.class, 684 "LBL_Rename_Preview_TreeRoot_Label"), 685 AnalysisUtilities.getChangeValues(refactorRequest)); 686 } 687 for (Object obj:models){ 689 if (obj instanceof DefaultTreeModel ){ 690 Object root = ((DefaultTreeModel )obj).getRoot(); 691 if (root instanceof CheckNode){ 692 ((CheckNode)root).setLabel(rootLabel); 693 } 694 } 695 } 696 697 if (fuResult.isCancelled()) { 698 return; 699 } 700 701 if (models != null){ 702 for (Object o:models){ 703 if (o instanceof DefaultTreeModel ){ 704 treeModel = DefaultTreeModel .class.cast(o); 705 break; 706 } 707 else if (refactorRequest instanceof DeleteRequest && o instanceof Graph){ 708 ((WhereUsedView)view).setGraph((prefuse.data.Graph)o); 709 } 710 } 711 } 712 assert treeModel != null:"Tree Model should not be null"; 713 SwingUtilities.invokeLater(new Runnable (){ 714 public void run() { 715 716 if (!isVisible) { 717 RefactoringPanelContainer cont = isQuery ? 719 RefactoringPanelContainer.getUsagesComponent() : 720 RefactoringPanelContainer.getRefactoringComponent(); 721 if (cont == null){ 722 ErrorManager.getDefault().log( 723 ErrorManager.ERROR, 724 "XML Find Failed to open RefactoringPanelContainer. The problem could be that the XML settings and wstcref files in userdir Windows2Local are obsolete. Try removing xml-find-usages.* and xml-find-usages.* and restart the IDE."); 725 return; 726 } 727 cont.open(); 728 cont.requestActive(); 729 cont.addPanel(RefactoringPanel.this); 730 isVisible = true; 731 } 732 setRefactoringEnabled(false, true); 733 734 if (view != null){ 735 if (tree == null) { 736 tree = new JTree(treeModel) { 738 739 public static final long serialVersionUID = 1L; 740 public TreePath getNextMatch( 741 String prefix, 742 int startingRow, 743 Position.Bias bias) { 744 try { 745 return super.getNextMatch( 746 prefix, 747 startingRow, 748 bias); 749 } catch (NullPointerException e) { 750 } 752 return null; 753 } 754 }; 755 ToolTipManager.sharedInstance(). 756 registerComponent(tree); 757 tree.setCellRenderer( 758 new CheckRenderer(isQuery)); 759 String s = NbBundle.getMessage( 760 RefactoringPanel.class, 761 "ACSD_usagesTree"); tree.getAccessibleContext(). 763 setAccessibleDescription(s); 764 tree.getAccessibleContext(). 765 setAccessibleName(s); 766 CheckNodeListener l = 767 new CheckNodeListener(isQuery); 768 l.addFindInSchemaViewListener(analysisViewer); 769 tree.addMouseListener(l); 770 tree.addKeyListener(l); 771 772 tree.addTreeSelectionListener( 773 RefactoringPanel.this); 774 775 tree.setToggleClickCount(0); 776 treeScrollPane = new JScrollPane(tree); 777 778 splitPane.setLeftComponent( 779 treeScrollPane); 780 RefactoringPanel.this.validate(); 781 } else { 782 tree.setModel(treeModel); 783 } 784 tree.setRowHeight((int) 785 ((CheckRenderer) 786 tree.getCellRenderer()). 787 getPreferredSize().getHeight()); 788 789 if (showParametersPanel) { 790 if (tree.getRowCount() < MAX_ROWS) 791 expandAll(); 792 else 793 expandButton.setSelected(false); 794 } else { 795 if (expandButton.isSelected()) 796 expandAll(); 797 else 798 expandButton.setSelected(false); 799 } 800 801 tree.setSelectionRow(0); 802 requestFocus(); 803 setRefactoringEnabled(true, true); 804 analysisViewer.showView(view); 805 splitPane.setDividerLocation(0.50); 806 } 807 } 808 }); 809 }}); 810 811 } 812 813 private void showQuery(final boolean showParametersPanel) throws MissingResourceException { 814 final View view = ((WhereUsedQueryUI)ui).getView(); 815 Referenceable ref = ((WhereUsedView)view).getQueryComponent(); 816 final FindUsageResult fuResult = 817 RefactoringManager.getInstance().findUsages(ref); 818 RequestProcessor.getDefault().post(new Runnable (){ 819 public void run() { 820 ProgressHandle ph = ProgressHandleFactory.createHandle( 821 NbBundle.getMessage(RefactoringPanel.class, 822 "LBL_Finding_Usages"), 823 fuResult 824 ); 825 ph.start(); 826 ph.switchToIndeterminate(); 827 addPropertyChangeListener(NODE_SELECTION_CHANGE, view); 828 Object [] models = ((WhereUsedView)view).createModels(fuResult); 829 830 if (fuResult.isCancelled()) { 831 StatusDisplayer.getDefault().setStatusText(NbBundle.getMessage(WhereUsedReader.class, 832 "LBL_Query_Cancelled")); 833 ph.finish(); 834 return; 835 836 } 837 838 if (models != null){ 839 for (Object o:models){ 840 if (o instanceof DefaultTreeModel ){ 841 treeModel = DefaultTreeModel .class.cast(o); 842 break; 843 } 844 } 845 } 846 assert treeModel != null:"Tree Model should not be null"; 847 ph.finish(); 848 SwingUtilities.invokeLater(new Runnable (){ 849 public void run() { 850 851 if (!isVisible) { 852 RefactoringPanelContainer cont = isQuery ? 854 RefactoringPanelContainer.getUsagesComponent() : 855 RefactoringPanelContainer.getRefactoringComponent(); 856 if (cont == null){ 857 ErrorManager.getDefault().log( 858 ErrorManager.ERROR, 859 "XML Find Failed to open RefactoringPanelContainer. The problem could be that the XML settings and wstcref files in userdir Windows2Local are obsolete. Try removing xml-find-usages.* and xml-find-usages.* and restart the IDE."); 860 return; 861 } 862 cont.open(); 863 cont.requestActive(); 864 cont.addPanel(RefactoringPanel.this); 865 isVisible = true; 866 } 867 setRefactoringEnabled(false, true); 868 869 if (view != null){ 870 if (tree == null) { 871 tree = new JTree(treeModel) { 873 874 public static final long serialVersionUID = 1L; 875 public TreePath getNextMatch( 876 String prefix, 877 int startingRow, 878 Position.Bias bias) { 879 try { 880 return super.getNextMatch( 881 prefix, 882 startingRow, 883 bias); 884 } catch (NullPointerException e) { 885 } 887 return null; 888 } 889 }; 890 ToolTipManager.sharedInstance(). 891 registerComponent(tree); 892 tree.setCellRenderer( 893 new CheckRenderer(isQuery)); 894 String s = NbBundle.getMessage( 895 RefactoringPanel.class, 896 "ACSD_usagesTree"); tree.getAccessibleContext(). 898 setAccessibleDescription(s); 899 tree.getAccessibleContext(). 900 setAccessibleName(s); 901 CheckNodeListener l = 902 new CheckNodeListener(isQuery); 903 l.addFindInSchemaViewListener(analysisViewer); 904 tree.addMouseListener(l); 905 tree.addKeyListener(l); 906 907 tree.addTreeSelectionListener( 908 RefactoringPanel.this); 909 910 tree.setToggleClickCount(0); 911 treeScrollPane = new JScrollPane(tree); 912 913 splitPane.setLeftComponent( 914 treeScrollPane); 915 RefactoringPanel.this.validate(); 916 } else { 917 tree.setModel(treeModel); 918 } 919 tree.setRowHeight((int) 920 ((CheckRenderer) 921 tree.getCellRenderer()). 922 getPreferredSize().getHeight()); 923 924 if (showParametersPanel) { 925 if (tree.getRowCount() < MAX_ROWS) 926 expandAll(); 927 else 928 expandButton.setSelected(false); 929 } else { 930 if (expandButton.isSelected()) 931 expandAll(); 932 else 933 expandButton.setSelected(false); 934 } 935 936 tree.setSelectionRow(0); 937 requestFocus(); 938 setRefactoringEnabled(true, true); 939 analysisViewer.showView(view); 940 splitPane.setDividerLocation(0.50); 941 } 942 } 943 }); 944 }}); 945 } 946 947 public void requestFocus() { 948 super.requestFocus(); 949 if (refactorButton != null) { 950 refactorButton.requestFocus(); 951 } else { 952 if (tree!=null) 953 tree.requestFocus(); 954 } 955 } 956 957 void setRefactoringEnabled(boolean enabled, boolean isRefreshing) { 958 checkEventThread(); 959 if (tree != null) { 960 if (!enabled) { 961 CheckNode c = (CheckNode) tree.getModel().getRoot(); 962 if (!isRefreshing) { 963 c.setNeedsRefresh(); 964 } else { 965 c.setDisabled(); 966 } 967 tree.setModel(new DefaultTreeModel (c, false)); 968 } 969 tree.setEnabled(enabled); 971 if (refactorButton != null) { 972 refactorButton.setEnabled(enabled); 973 } 974 } 975 } 976 977 private static void disableComponents(Container c) { 979 checkEventThread(); 980 Component children[] = c.getComponents(); 981 for (int i = 0; i < children.length; i++) { 982 if (children[i].isEnabled()) { 983 children[i].setEnabled(false); 984 } 985 if (children[i] instanceof Container) { 986 disableComponents((Container) children[i]); 987 } 988 } 989 } 990 991 void selectNextUsage() { 992 selectNextPrev(true); 993 } 994 995 void selectPrevUsage() { 996 selectNextPrev(false); 997 } 998 999 private void selectNextPrev(final boolean next) { 1000 int newRow = getSelectedRow(); 1001 int maxcount = tree.getRowCount(); 1002 CheckNode node; 1003 do { 1004 if (next) { 1005 newRow++; 1006 if (newRow>=maxcount) 1007 newRow = 0; 1008 } else { 1009 newRow--; 1010 if (newRow<0) 1011 newRow = maxcount-1; 1012 } 1013 TreePath path = tree.getPathForRow(newRow); 1014 node = (CheckNode) path.getLastPathComponent(); 1015 if (!node.isLeaf()) { 1016 tree.expandRow(newRow); 1017 maxcount = tree.getRowCount(); 1018 } 1019 } 1020 while (!node.isLeaf()); 1021 tree.setSelectionRow(newRow); 1022 } 1023 1024 private int getSelectedRow() { 1025 int[] rows = tree.getSelectionRows(); 1026 if (rows == null || rows.length == 0) 1027 return 0; 1028 return rows[0]; 1029 } 1030 1031 1035 private class ButtonL implements ActionListener { 1036 public void actionPerformed(ActionEvent event) { 1037 Object o = event.getSource(); 1038 if (o == cancelButton) { 1040 cancel(); 1041 } else if (o == refactorButton) { 1042 refactor(); 1043 } else if (o == rerunButton) { 1044 close(); 1045 callback.actionPerformed(event); 1046 } 1047 else if (o == expandButton && tree != null) { 1049 if (expandButton.isSelected()) 1050 expandAll(); 1051 else 1052 collapseAll(); 1053 } else if (o == refreshButton) { 1054 refresh((ui instanceof WhereUsedQueryUI)?false:true); 1055 } else if (o == physicalViewButton) { 1056 switchToPhysicalView(); 1057 } else if (o == logicalViewButton) { 1058 switchToLogicalView(); 1059 } else if (o == nextMatch) { 1060 selectNextUsage(); 1061 } else if (o == prevMatch) { 1062 selectPrevUsage(); 1063 } 1064 } 1065 } 1068 protected void closeNotify() { 1069 if (tree!=null) 1070 ToolTipManager.sharedInstance().unregisterComponent(tree); 1071 if (refCallerTC != null) { 1072 TopComponent tc = (TopComponent) refCallerTC.get(); 1073 if (tc != null && tc.isShowing()) { 1074 tc.requestActive(); 1075 } 1076 } 1077 } 1078 1079 1080 1084 1085 public void valueChanged(TreeSelectionEvent e) { 1086 1087 CheckNode node = (CheckNode) 1088 tree.getLastSelectedPathComponent(); 1089 1090 if (node == null) { 1091 firePropertyChange(NODE_SELECTION_CHANGE, new Object (), null); 1093 setActivatedNodes(null); 1094 return; 1095 } 1096 1097 Object userObject = node.getUserObject(); 1098 if (userObject == null){ 1099 firePropertyChange(NODE_SELECTION_CHANGE, null, new Object ()); 1102 } else { 1103 firePropertyChange(NODE_SELECTION_CHANGE, null, userObject); 1104 } 1105 Node usageNode = node.getOrigNode(); 1106 setActivatedNodes(usageNode); 1107 1108 } 1109 1110 private void setActivatedNodes(Node tmpUsageNode) { 1111 1112 TopComponent usagesTopComponent = isQuery ? 1114 RefactoringPanelContainer.getUsagesComponent() : 1115 RefactoringPanelContainer.getRefactoringComponent(); 1116 if (usagesTopComponent != null) { 1117 if (tmpUsageNode != null) { 1118 usagesTopComponent.setActivatedNodes(new Node[] {tmpUsageNode}); 1119 } else { 1120 usagesTopComponent.setActivatedNodes(new Node[0]); 1121 } 1122 } 1123 } 1124 1125 1134 public void propertyChange(PropertyChangeEvent evt) { 1135 if (evt.getPropertyName().equals( 1136 AnalysisViewer.PROP_GRAPH_NODE_SELECTION_CHANGED_RELAY)){ 1137 Object newVal = evt.getNewValue(); 1142 if (newVal == null){ 1143 tree.getSelectionModel().clearSelection(); 1145 setActivatedNodes(null); 1146 } else { 1147 if(newVal==((WhereUsedView)ui.getView()).getQueryComponent()) { 1148 tree.getSelectionModel().clearSelection(); 1151 setActivatedNodes(AnalysisUtilities.getDisplayNode((Referenceable)newVal)); 1152 } else { 1153 int index = findTreeRowForUserObject(newVal); 1155 tree.setSelectionRow(index); 1157 } 1158 } 1159 } else if (evt.getPropertyName().equals(UsageSet.VALID_PROPERTY)){ 1160 Boolean valid = (Boolean )evt.getNewValue(); 1161 if (!valid){ 1162 invalidateObject(); 1163 } 1164 } 1165 } 1166 1167 1174 private int findTreeRowForUserObject(Object userObject){ 1175 CheckNode root = (CheckNode)treeModel.getRoot(); 1176 int currentRow = -1; 1177 if (root != null) { 1178 currentRow = inspectTreeNodes(root, userObject); 1179 } 1180 return currentRow; 1181 } 1182 1183 private boolean matchesUsage(Object targetObject, CheckNode treeNode) { 1184 return treeNode.getUserObject() instanceof Usage && 1185 ((Usage) treeNode.getUserObject()).getComponent() == targetObject; 1186 } 1187 1188 private int inspectTreeNodes(CheckNode node, Object userObject){ 1189 Enumeration children = node.children(); 1190 int foundRow = -1; 1191 while(children.hasMoreElements() && foundRow == -1){ 1192 CheckNode child = (CheckNode)children.nextElement(); 1193 if (child.getUserObject() == userObject || 1194 matchesUsage(userObject, child)) { 1195 foundRow = tree.getRowForPath(new TreePath (child.getPath())); 1196 } else { 1197 foundRow = inspectTreeNodes(child, userObject); 1198 } 1199 } 1200 return foundRow; 1201 } 1202 1203 1208 public void setCancellable(Cancellable cancellable) { 1209 this.cancellableFindUsagesTask = cancellable; 1210 } 1211 1212 public void nodeDestroyed(NodeEvent ev) { 1214 SwingUtilities.invokeLater(new Runnable () { 1215 public void run() { 1216 close(); 1217 } 1218 }); 1219 } 1220 1221 public void childrenReordered(NodeReorderEvent ev) { 1222 } 1223 1224 public void childrenRemoved(NodeMemberEvent ev) { 1225 } 1226 1227 public void childrenAdded(NodeMemberEvent ev) { 1228 } 1229 1230 public void valueChanged(ComponentEvent evt) { 1231 } 1232 1233 public void childrenDeleted(ComponentEvent evt) { 1234 if (ui.getTarget() instanceof DocumentComponent) { 1235 DocumentComponent component = (DocumentComponent) ui.getTarget(); 1236 if (component.getParent() == null || component.getModel() == null) { 1237 SwingUtilities.invokeLater(new Runnable () { 1238 public void run() { 1239 close(); 1240 } 1241 }); 1242 } 1243 } 1244 } 1245 1246 public void childrenAdded(ComponentEvent evt) { 1247 } 1248 1250 private static class ProgressL implements ProgressListener { 1251 1252 private ProgressHandle handle; 1253 private Dialog d; 1254 private int counter; 1255 1256 public void start(final ProgressEvent event) { 1257 SwingUtilities.invokeLater(new Runnable () { 1258 public void run() { 1259 counter = 0; 1260 final String lab = NbBundle.getMessage(RefactoringPanel.class, "LBL_RefactorProgressLabel"); 1261 handle = ProgressHandleFactory.createHandle(lab); 1262 JComponent progress = ProgressHandleFactory.createProgressComponent(handle); 1263 JPanel component = new JPanel(); 1264 component.setLayout(new BorderLayout()); 1265 component.setBorder(new EmptyBorder (12,12,11,11)); 1266 JLabel label = new JLabel(lab); 1267 label.setBorder(new EmptyBorder (0, 0, 6, 0)); 1268 component.add(label, BorderLayout.NORTH); 1269 component.add(progress, BorderLayout.CENTER); 1270 DialogDescriptor desc = new DialogDescriptor(component, NbBundle.getMessage(RefactoringPanel.class, "LBL_RefactoringInProgress"), true, new Object []{}, null, 0, null, null); 1271 desc.setLeaf(true); 1272 d = DialogDisplayer.getDefault().createDialog(desc); 1273 ((JDialog) d).setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); 1274 1275 1276 if (event.getCount()==-1) { 1277 handle.start(); 1278 handle.switchToIndeterminate(); 1279 } else { 1280 handle.start(event.getCount()); 1281 } 1282 1283 d.setVisible(true); 1284 } 1285 }); 1286 } 1287 1288 public void step(ProgressEvent event) { 1289 SwingUtilities.invokeLater(new Runnable () { 1290 public void run() { 1291 handle.progress(++counter); 1292 } 1293 }); 1294 } 1295 1296 public void stop(ProgressEvent event) { 1297 SwingUtilities.invokeLater(new Runnable () { 1298 public void run() { 1299 handle.finish(); 1300 d.setVisible(false); 1301 } 1302 }); 1303 } 1304 } 1305} | Popular Tags |