KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > netbeans > modules > xml > refactoring > ui > j > ui > RefactoringPanel


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-2007 Sun
17  * Microsystems, Inc. All Rights Reserved.
18  */

19 package org.netbeans.modules.xml.refactoring.ui.j.ui;
20
21 import java.awt.*;
22 import java.awt.event.ActionEvent JavaDoc;
23 import java.awt.event.ActionListener JavaDoc;
24 import java.beans.PropertyChangeEvent JavaDoc;
25 import java.beans.PropertyChangeListener JavaDoc;
26 import java.io.IOException JavaDoc;
27 import java.lang.ref.WeakReference JavaDoc;
28 import java.text.MessageFormat JavaDoc;
29 import java.util.*;
30 import java.util.concurrent.ExecutionException JavaDoc;
31 //import javax.jmi.reflect.RefObject;
32
import javax.swing.*;
33 import javax.swing.border.EmptyBorder JavaDoc;
34 import javax.swing.event.TreeSelectionEvent JavaDoc;
35 import javax.swing.event.TreeSelectionListener JavaDoc;
36 import javax.swing.text.Position JavaDoc;
37 import javax.swing.tree.DefaultTreeModel JavaDoc;
38 import javax.swing.tree.TreePath JavaDoc;
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 /**
88  * Panel for showing proposed changes (refactoring elements) of any refactoring.
89  *
90  * @author Pavel Flaska, Martin Matula
91  * @author Jeri Lockhart
92  */

93 //public class RefactoringPanel extends JPanel implements InvalidationListener {
94
public class RefactoringPanel extends JPanel implements TreeSelectionListener JavaDoc,
95         PropertyChangeListener JavaDoc, NodeListener, ComponentListener {
96     public static final long serialVersionUID = 1L;
97     
98     // PRIVATE FIELDS
99
/* tree contains elements which will be changed by refactoring action */
100     private transient JTree tree = null;
101     
102     private transient DefaultTreeModel JavaDoc treeModel = null;
103     /* toolbar button causing refresh of the data */
104     private transient JButton refreshButton = null;
105     /* button lying in the toolbar allows expansion of all nodes in a tree */
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 RefactoringSession session = null;
119
private transient ParametersPanel parametersPanel = null;
120     private javax.swing.JSplitPane JavaDoc 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 JavaDoc refCallerTC;
134     
135     private AnalysisViewer analysisViewer;
136     
137     public static final String JavaDoc
138             NODE_SELECTION_CHANGE = "node-selection-change"; // NOI18N fire
139

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 JavaDoc("unchecked")
152     public RefactoringPanel(RefactoringUI ui, TopComponent caller, Action callback) {
153         if (caller!=null)
154             refCallerTC = new WeakReference JavaDoc(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 JavaDoc 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 JavaDoc(
197                     "This must happen in event thread!")); //NOI18N
198
}
199     }
200     
201     /* initializes all the ui */
202     private void initialize() {
203         checkEventThread();
204         setFocusCycleRoot(true);
205         setLayout(new BorderLayout());
206         // add panel with buttons
207
JButton[] buttons = getButtons();
208         //if (buttons.length != 0) {
209
// there will be at least one button on panel
210
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         //}
229
// put the toolbar to the panel. If the getToolBar() returns null,
230
// suppose the toolbar does not exist.
231
JToolBar toolBar = getToolBar();
232         if (toolBar != null)
233             add(toolBar, BorderLayout.WEST);
234         
235 // if (isQuery){
236
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 JavaDoc();
242         //displayPanel = new javax.swing.JPanel(); - get from View
243
add(splitPane, BorderLayout.CENTER);
244         splitPane.setRightComponent(analysisViewer.getPanel());
245         splitPane.setLeftComponent(new JLabel(""));// NOI18N
246
splitPane.setResizeWeight(0.5); // halfway
247
// }
248

249         validate();
250     }
251     
252     /**
253      * Returns the toolbar. In this default implementation, toolbar is
254      * oriented vertically in the west and contains 'expand tree' toggle
255      * button and refresh button.
256      * Override this method and return null if you do not want toolbar
257      * in your panel.
258      *
259      * @return toolBar with actions for refactoring panel
260      */

261     private JToolBar getToolBar() {
262         checkEventThread();
263         refreshButton = new JButton(
264                 new ImageIcon(Utilities.loadImage(
265                 "org/netbeans/modules/refactoring/api/resources/refresh.png")) // NOI18N
266
);
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") // NOI18N
272
);
273         refreshButton.setMnemonic(
274             NbBundle.getMessage(RefactoringPanel.class, "MNEM_refresh").charAt(0)
275         );
276         refreshButton.addActionListener(getButtonListener());
277         // expand button settings
278
expandButton = new JToggleButton(
279                 new ImageIcon(Utilities.loadImage(
280                 "org/netbeans/modules/refactoring/api/resources/expandTree.png")) // NOI18N
281
);
282         expandButton.setSelectedIcon(
283                 new ImageIcon(Utilities.loadImage(
284                 "org/netbeans/modules/refactoring/api/resources/colapseTree.png")) // NOI18N
285
);
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") // NOI18N
292
);
293         expandButton.setMnemonic(
294             NbBundle.getMessage(RefactoringPanel.class, "MNEM_expandAll").charAt(0) // NOI18N
295
);
296         expandButton.addActionListener(getButtonListener());
297         // create toolbar
298
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")) // NOI18N
304
);
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") // NOI18N
312
);
313         
314         logicalViewButton.setMnemonic(
315             NbBundle.getMessage(RefactoringPanel.class, "MNEM_logicalView").charAt(0) // NOI18N
316
);
317         logicalViewButton.addActionListener(getButtonListener());
318         
319         physicalViewButton = new JToggleButton(
320                 new ImageIcon(Utilities.loadImage(
321                 "org/netbeans/modules/refactoring/api/resources/file_view.png")) // NOI18N
322
);
323         
324         physicalViewButton.setMaximumSize(dim);
325         physicalViewButton.setMinimumSize(dim);
326         physicalViewButton.setPreferredSize(dim);
327         physicalViewButton.setToolTipText(
328                 NbBundle.getMessage(RefactoringPanel.class, "HINT_physicalView") // NOI18N
329
);
330         physicalViewButton.setMnemonic(
331             NbBundle.getMessage(RefactoringPanel.class, "MNEM_physicalView").charAt(0) // NOI18N
332
);
333         physicalViewButton.addActionListener(getButtonListener());
334         
335         // TODO enable physical view button
336
physicalViewButton.setEnabled(false);
337         
338         nextMatch = new JButton(
339                 new ImageIcon(Utilities.loadImage(
340                 "org/netbeans/modules/refactoring/api/resources/nextmatch.png")) // NOI18N
341
);
342         
343         nextMatch.setMaximumSize(dim);
344         nextMatch.setMinimumSize(dim);
345         nextMatch.setPreferredSize(dim);
346         nextMatch.setToolTipText(
347                 NbBundle.getMessage(RefactoringPanel.class, "HINT_nextMatch") // NOI18N
348
);
349         nextMatch.addActionListener(getButtonListener());
350         
351         prevMatch = new JButton(
352                 new ImageIcon(Utilities.loadImage(
353                 "org/netbeans/modules/refactoring/api/resources/prevmatch.png")) // NOI18N
354
);
355         
356         prevMatch.setMaximumSize(dim);
357         prevMatch.setMinimumSize(dim);
358         prevMatch.setPreferredSize(dim);
359         prevMatch.setToolTipText(
360                 NbBundle.getMessage(RefactoringPanel.class, "HINT_prevMatch") // NOI18N
361
);
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     /**
375      * Returns array of available buttons. Initially, it returns only
376      * basic "do refactoring/cancel refactoring" button. Override this method,
377      * if you want to provide any other buttons with different action to be
378      * performed.
379      *
380      * @return array of avasilable buttons.
381      */

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 JavaDoc) callback.getValue(
390                         callback.NAME)); // NOI18N
391
rerunButton.addActionListener(getButtonListener());
392                 return new JButton[] {rerunButton};
393             }
394         } else {
395             refactorButton = new JButton(NbBundle.getMessage(
396                     RefactoringPanel.class, "LBL_DoRefactor")); // NOI18N
397
refactorButton.setToolTipText(NbBundle.getMessage(
398                     RefactoringPanel.class, "HINT_DoRefactor")); // NOI18N
399
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")); // NOI18N
404
Mnemonics.setLocalizedText(cancelButton,NbBundle.getMessage(
405                     RefactoringPanel.class, "LBL_CancelRefactor"));
406             cancelButton.setToolTipText(NbBundle.getMessage(
407                     RefactoringPanel.class, "HINT_CancelRefactor")); // NOI18N
408
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     /**
437      * Overrides default ExplorerPanel behaviour. Does nothing now.
438      */

439     protected void updateTitle() {
440     }
441     
442     /**
443      * Method is responsible for making changes in sources.
444      */

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 JavaDoc() {
451             public void run() {
452                 try {
453                     // TODO need progress component
454
progressListener.start(progressEvent);
455                     RefactoringManager.getInstance().process(results.getRefactorRequest());
456                 } catch (IOException JavaDoc ioe) {
457                     String JavaDoc 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 JavaDoc() {
465                         public void run() {
466                             RefactoringPanel.this.close();
467                         }
468                     });
469                 }
470             }
471         });
472     }
473     
474     /**
475      * Cancel refactor action. This default implementation is closing window
476      * only. It can return result state. In this implementation it returns
477      * everytime 0.
478      *
479      * @return result of cancel operation. Zero represent successful cancel.
480      */

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     /*
498      * Initializes button listener. The subclasses must not need this listener.
499      * This is the reason of lazy initialization.
500      */

501     private ButtonL getButtonListener() {
502         if (buttonListener == null)
503             buttonListener = new ButtonL();
504         
505         return buttonListener;
506     }
507     
508     /* expandAll nodes in the tree */
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 JavaDoc() {
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 JavaDoc() {
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") // NOI18N
530
);
531                         requestFocus();
532                     }
533                 });
534             }});
535     }
536     
537     /* collapseAll nodes in the tree */
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 JavaDoc() {
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 JavaDoc() {
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") // NOI18N
559
);
560                         requestFocus();
561                     }
562                 });
563             }});
564     }
565     
566     public void invalidateObject() {
567         if (isQuery) {
568             return;
569         }
570         Runnable JavaDoc invalidate = new Runnable JavaDoc() {
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             // create parameters panel for refactoring
588
if (parametersPanel == null) {
589                 parametersPanel = new ParametersPanel(ui);
590             }
591             // show parameters dialog
592
ParametersPanel.Results oldResults = results;
593             results = parametersPanel.showDialog();
594        
595             // if no elements were returned, then cancel was pressed
596
if (results == null) {
597                 results = oldResults;
598                 return;
599             } else if (results.getResult() == ParametersPanel.Results.Result.SKIP_PREVIEW){
600                 // do refactoring without showing the preview
601

602                 //TODO maybe new style async progress bar
603
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 JavaDoc ioe) {
612                     String JavaDoc 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 JavaDoc() {
620                         public void run() {
621                             RefactoringPanel.this.close();
622                         }
623                     });
624                 }
625                 return;
626             }
627             
628 // session = tempSession;
629
} 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 JavaDoc description = ui.getDescription();
637         setToolTipText("<html>" + description + "</html>"); // NOI18N
638
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 JavaDoc 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 JavaDoc ex) {
657             ErrorManager.getDefault().notify(ex);
658         } catch (ExecutionException JavaDoc ex) {
659             ErrorManager.getDefault().notify(ex);
660         }
661         final Referenceable ref = ((WhereUsedView)view).getQueryComponent();
662         final String JavaDoc name = refactorRequest.getTargetName();
663         RequestProcessor.getDefault().post(new Runnable JavaDoc(){
664             public void run() {
665                 addPropertyChangeListener(NODE_SELECTION_CHANGE, view);
666                 // The Preview for delete contains only the target, not the usages
667
Object JavaDoc[] models = null;
668                 String JavaDoc rootLabel = null;
669                 //TODO abstract out these if's with'
670
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 JavaDoc[] {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                 // replace usages label on root node of tree model with preview label
688
for (Object JavaDoc obj:models){
689                     if (obj instanceof DefaultTreeModel JavaDoc){
690                         Object JavaDoc root = ((DefaultTreeModel JavaDoc)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 JavaDoc o:models){
703                         if (o instanceof DefaultTreeModel JavaDoc){
704                             treeModel = DefaultTreeModel JavaDoc.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 JavaDoc(){
714                     public void run() {
715                         
716                         if (!isVisible) {
717                             // dock it into output window area and display
718
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                                 // add panel with appropriate content
737
tree = new JTree(treeModel) {
738                                     
739                                     public static final long serialVersionUID = 1L;
740                                     public TreePath JavaDoc getNextMatch(
741                                             String JavaDoc prefix,
742                                             int startingRow,
743                                             Position.Bias JavaDoc bias) {
744                                         try {
745                                             return super.getNextMatch(
746                                                     prefix,
747                                                     startingRow,
748                                                     bias);
749                                         } catch (NullPointerException JavaDoc e) {
750                                             //Work around for 43112
751
}
752                                         return null;
753                                     }
754                                 };
755                                 ToolTipManager.sharedInstance().
756                                         registerComponent(tree);
757                                 tree.setCellRenderer(
758                                         new CheckRenderer(isQuery));
759                                 String JavaDoc s = NbBundle.getMessage(
760                                         RefactoringPanel.class,
761                                         "ACSD_usagesTree"); // NOI18N
762
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 JavaDoc(){
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 JavaDoc[] 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 JavaDoc o:models){
840                         if (o instanceof DefaultTreeModel JavaDoc){
841                             treeModel = DefaultTreeModel JavaDoc.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 JavaDoc(){
849                     public void run() {
850                         
851                         if (!isVisible) {
852                             // dock it into output window area and display
853
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                                 // add panel with appropriate content
872
tree = new JTree(treeModel) {
873                                     
874                                     public static final long serialVersionUID = 1L;
875                                     public TreePath JavaDoc getNextMatch(
876                                             String JavaDoc prefix,
877                                             int startingRow,
878                                             Position.Bias JavaDoc bias) {
879                                         try {
880                                             return super.getNextMatch(
881                                                     prefix,
882                                                     startingRow,
883                                                     bias);
884                                         } catch (NullPointerException JavaDoc e) {
885                                             //Work around for 43112
886
}
887                                         return null;
888                                     }
889                                 };
890                                 ToolTipManager.sharedInstance().
891                                         registerComponent(tree);
892                                 tree.setCellRenderer(
893                                         new CheckRenderer(isQuery));
894                                 String JavaDoc s = NbBundle.getMessage(
895                                         RefactoringPanel.class,
896                                         "ACSD_usagesTree"); // NOI18N
897
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 JavaDoc(c, false));
968             }
969 // tree.validate();
970
tree.setEnabled(enabled);
971             if (refactorButton != null) {
972                 refactorButton.setEnabled(enabled);
973             }
974         }
975     }
976     
977     // disables all components in a given container
978
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 JavaDoc 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    ////////////////////////////////////////////////////////////////////////////
1032
// INNER CLASSES
1033
////////////////////////////////////////////////////////////////////////////
1034

1035    private class ButtonL implements ActionListener JavaDoc {
1036        public void actionPerformed(ActionEvent JavaDoc event) {
1037            Object JavaDoc o = event.getSource();
1038            // Cancel button pressed, remove refactoring panel
1039
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            // expandAll button selected/deselected
1048
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    } // end ButtonL
1066
////////////////////////////////////////////////////////////////////////////
1067

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    /**
1081     * Implement TreeSelectionListener
1082     *
1083     */

1084    
1085    public void valueChanged(TreeSelectionEvent JavaDoc e) {
1086        
1087        CheckNode node = (CheckNode)
1088        tree.getLastSelectedPathComponent();
1089        
1090        if (node == null) {
1091            // unselect
1092
firePropertyChange(NODE_SELECTION_CHANGE, new Object JavaDoc(), null);
1093            setActivatedNodes(null);
1094            return;
1095        }
1096        
1097        Object JavaDoc userObject = node.getUserObject();
1098        if (userObject == null){
1099            // this shouldn't happen because the CheckNodes should
1100
// have a user object (SchemaComponent, Project, FileObject, etc)
1101
firePropertyChange(NODE_SELECTION_CHANGE, null, new Object JavaDoc());
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        //lativ begin
1113
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    /**
1126     * Graph node selection change listener
1127     * when a graph node is selected, select the
1128     * corresponding explorer node, if there is one
1129     * This method gets called when a bound property is changed.
1130     *
1131     * @param evt A PropertyChangeEvent object describing the event source
1132     * and the property that has changed.
1133     */

1134    public void propertyChange(PropertyChangeEvent JavaDoc evt) {
1135        if (evt.getPropertyName().equals(
1136                AnalysisViewer.PROP_GRAPH_NODE_SELECTION_CHANGED_RELAY)){
1137            // originally fired from FindUsagesFocusControl
1138
// selectionFocusControl instance in WhereUsedView when the
1139
// user clicked on a graph node, then
1140
// relayed by AnalysisViewer
1141
Object JavaDoc newVal = evt.getNewValue();
1142            if (newVal == null){
1143                // unselect selected node in JTree
1144
tree.getSelectionModel().clearSelection();
1145                setActivatedNodes(null);
1146            } else {
1147                if(newVal==((WhereUsedView)ui.getView()).getQueryComponent()) {
1148                    // QueryComponent is not in tree
1149
// unselect selected node in JTree
1150
tree.getSelectionModel().clearSelection();
1151                    setActivatedNodes(AnalysisUtilities.getDisplayNode((Referenceable)newVal));
1152                } else {
1153                    // select the corresponding JTree node
1154
int index = findTreeRowForUserObject(newVal);
1155                    // set the tree selection, which will also set the activated nodes
1156
tree.setSelectionRow(index);
1157                }
1158            }
1159        } else if (evt.getPropertyName().equals(UsageSet.VALID_PROPERTY)){
1160            Boolean JavaDoc valid = (Boolean JavaDoc)evt.getNewValue();
1161            if (!valid){
1162                invalidateObject();
1163            }
1164        }
1165    }
1166    
1167    /**
1168     * Find the tree row containing the CheckNode for
1169     * the passed SchemaComponent or FileObject
1170     * @param userObject a SchemaComponent or FileObject
1171     *
1172     *
1173     */

1174    private int findTreeRowForUserObject(Object JavaDoc 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 JavaDoc targetObject, CheckNode treeNode) {
1184    return treeNode.getUserObject() instanceof Usage &&
1185           ((Usage) treeNode.getUserObject()).getComponent() == targetObject;
1186    }
1187    
1188    private int inspectTreeNodes(CheckNode node, Object JavaDoc 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 JavaDoc(child.getPath()));
1196            } else {
1197                foundRow = inspectTreeNodes(child, userObject);
1198            }
1199        }
1200    return foundRow;
1201    }
1202    
1203    /**
1204     * long-running task Find Usages task that can be cancelled
1205     *
1206     *
1207     */

1208    public void setCancellable(Cancellable cancellable) {
1209        this.cancellableFindUsagesTask = cancellable;
1210    }
1211
1212    //Begin:NodeListener
1213
public void nodeDestroyed(NodeEvent ev) {
1214        SwingUtilities.invokeLater(new Runnable JavaDoc() {
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 JavaDoc() {
1238                    public void run() {
1239                        close();
1240                    }
1241                });
1242            }
1243        }
1244    }
1245
1246    public void childrenAdded(ComponentEvent evt) {
1247    }
1248    //End:NodeListener
1249

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 JavaDoc() {
1258                public void run() {
1259                    counter = 0;
1260                    final String JavaDoc 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 JavaDoc(12,12,11,11));
1266                    JLabel label = new JLabel(lab);
1267                    label.setBorder(new EmptyBorder JavaDoc(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 JavaDoc[]{}, 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 JavaDoc() {
1290                public void run() {
1291                    handle.progress(++counter);
1292                }
1293            });
1294        }
1295        
1296        public void stop(ProgressEvent event) {
1297            SwingUtilities.invokeLater(new Runnable JavaDoc() {
1298                public void run() {
1299                    handle.finish();
1300                    d.setVisible(false);
1301                }
1302            });
1303        }
1304    }
1305} // end Refactor Panel
1306
Popular Tags