KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > eclipse > jdt > internal > ui > refactoring > reorg > RenameTypeWizardSimilarElementsPage


1 /*******************************************************************************
2  * Copyright (c) 2000, 2006 IBM Corporation and others.
3  * All rights reserved. This program and the accompanying materials
4  * are made available under the terms of the Eclipse Public License v1.0
5  * which accompanies this distribution, and is available at
6  * http://www.eclipse.org/legal/epl-v10.html
7  *
8  * Contributors:
9  * IBM Corporation - initial API and implementation
10  *******************************************************************************/

11 package org.eclipse.jdt.internal.ui.refactoring.reorg;
12
13 import java.util.ArrayList JavaDoc;
14 import java.util.HashMap JavaDoc;
15 import java.util.HashSet JavaDoc;
16 import java.util.Iterator JavaDoc;
17 import java.util.List JavaDoc;
18 import java.util.Map JavaDoc;
19 import java.util.Set JavaDoc;
20
21 import org.eclipse.core.runtime.Assert;
22 import org.eclipse.core.runtime.IStatus;
23
24 import org.eclipse.swt.SWT;
25 import org.eclipse.swt.custom.CLabel;
26 import org.eclipse.swt.custom.SashForm;
27 import org.eclipse.swt.custom.ViewForm;
28 import org.eclipse.swt.events.SelectionAdapter;
29 import org.eclipse.swt.events.SelectionEvent;
30 import org.eclipse.swt.graphics.Image;
31 import org.eclipse.swt.layout.GridData;
32 import org.eclipse.swt.layout.GridLayout;
33 import org.eclipse.swt.widgets.Button;
34 import org.eclipse.swt.widgets.Composite;
35 import org.eclipse.swt.widgets.Control;
36 import org.eclipse.swt.widgets.Label;
37 import org.eclipse.swt.widgets.Shell;
38 import org.eclipse.swt.widgets.Text;
39 import org.eclipse.swt.widgets.Tree;
40 import org.eclipse.swt.widgets.TreeItem;
41
42 import org.eclipse.jface.dialogs.Dialog;
43 import org.eclipse.jface.dialogs.IDialogConstants;
44 import org.eclipse.jface.dialogs.StatusDialog;
45 import org.eclipse.jface.preference.IPreferenceStore;
46 import org.eclipse.jface.resource.ImageDescriptor;
47 import org.eclipse.jface.resource.JFaceResources;
48 import org.eclipse.jface.viewers.DoubleClickEvent;
49 import org.eclipse.jface.viewers.IDoubleClickListener;
50 import org.eclipse.jface.viewers.ISelection;
51 import org.eclipse.jface.viewers.ISelectionChangedListener;
52 import org.eclipse.jface.viewers.IStructuredSelection;
53 import org.eclipse.jface.viewers.ITreeContentProvider;
54 import org.eclipse.jface.viewers.SelectionChangedEvent;
55 import org.eclipse.jface.viewers.StructuredSelection;
56 import org.eclipse.jface.viewers.Viewer;
57 import org.eclipse.jface.window.Window;
58 import org.eclipse.jface.wizard.IWizardPage;
59
60 import org.eclipse.jface.text.Document;
61 import org.eclipse.jface.text.source.SourceViewer;
62
63 import org.eclipse.ui.PlatformUI;
64 import org.eclipse.ui.dialogs.ContainerCheckedTreeViewer;
65
66 import org.eclipse.ltk.core.refactoring.participants.RefactoringProcessor;
67 import org.eclipse.ltk.core.refactoring.participants.RenameRefactoring;
68 import org.eclipse.ltk.ui.refactoring.UserInputWizardPage;
69
70 import org.eclipse.jdt.core.ICompilationUnit;
71 import org.eclipse.jdt.core.IField;
72 import org.eclipse.jdt.core.IJavaElement;
73 import org.eclipse.jdt.core.ILocalVariable;
74 import org.eclipse.jdt.core.IMember;
75 import org.eclipse.jdt.core.IMethod;
76 import org.eclipse.jdt.core.ISourceRange;
77 import org.eclipse.jdt.core.IType;
78 import org.eclipse.jdt.core.JavaConventions;
79 import org.eclipse.jdt.core.JavaModelException;
80
81 import org.eclipse.jdt.internal.corext.refactoring.Checks;
82 import org.eclipse.jdt.internal.corext.refactoring.rename.RenameCompilationUnitProcessor;
83 import org.eclipse.jdt.internal.corext.refactoring.rename.RenameTypeProcessor;
84 import org.eclipse.jdt.internal.corext.util.Messages;
85
86 import org.eclipse.jdt.ui.JavaElementComparator;
87 import org.eclipse.jdt.ui.JavaElementLabelProvider;
88 import org.eclipse.jdt.ui.JavaElementLabels;
89 import org.eclipse.jdt.ui.PreferenceConstants;
90 import org.eclipse.jdt.ui.text.JavaSourceViewerConfiguration;
91 import org.eclipse.jdt.ui.text.JavaTextTools;
92
93 import org.eclipse.jdt.internal.ui.IJavaHelpContextIds;
94 import org.eclipse.jdt.internal.ui.JavaPlugin;
95 import org.eclipse.jdt.internal.ui.JavaPluginImages;
96 import org.eclipse.jdt.internal.ui.dialogs.StatusInfo;
97 import org.eclipse.jdt.internal.ui.dialogs.TextFieldNavigationHandler;
98 import org.eclipse.jdt.internal.ui.javaeditor.JavaSourceViewer;
99 import org.eclipse.jdt.internal.ui.refactoring.RefactoringMessages;
100 import org.eclipse.jdt.internal.ui.util.ExceptionHandler;
101 import org.eclipse.jdt.internal.ui.util.SWTUtil;
102 import org.eclipse.jdt.internal.ui.viewsupport.JavaElementImageProvider;
103 import org.eclipse.jdt.internal.ui.wizards.dialogfields.DialogField;
104 import org.eclipse.jdt.internal.ui.wizards.dialogfields.IDialogFieldListener;
105 import org.eclipse.jdt.internal.ui.wizards.dialogfields.LayoutUtil;
106 import org.eclipse.jdt.internal.ui.wizards.dialogfields.StringDialogField;
107
108 /**
109  *
110  * Wizard page for displaying a tree of similarly named elements renamed along with a
111  * type.
112  *
113  * @since 3.2
114  *
115  */

116 class RenameTypeWizardSimilarElementsPage extends UserInputWizardPage {
117
118     public static class EditElementDialog extends StatusDialog implements IDialogFieldListener {
119
120         private StringDialogField fNameField;
121         private IJavaElement fElementToEdit;
122
123         public EditElementDialog(Shell parent, IJavaElement elementToEdit, String JavaDoc newName) {
124             super(parent);
125             setTitle(RefactoringMessages.RenameTypeWizardSimilarElementsPage_change_element_name);
126             setShellStyle(getShellStyle() | SWT.RESIZE);
127
128             fElementToEdit= elementToEdit;
129
130             fNameField= new StringDialogField();
131             fNameField.setDialogFieldListener(this);
132             fNameField.setLabelText(RefactoringMessages.RenameTypeWizardSimilarElementsPage_enter_new_name);
133
134             fNameField.setText(newName);
135         }
136
137         /*
138          * (non-Javadoc)
139          *
140          * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
141          */

142         protected Control createDialogArea(Composite parent) {
143             final Composite composite= (Composite) super.createDialogArea(parent);
144             LayoutUtil.doDefaultLayout(composite, new DialogField[] { fNameField }, true, SWT.DEFAULT, SWT.DEFAULT);
145             fNameField.postSetFocusOnDialogField(parent.getDisplay());
146             
147             LayoutUtil.setWidthHint(fNameField.getLabelControl(null), convertHorizontalDLUsToPixels(IDialogConstants.MINIMUM_MESSAGE_AREA_WIDTH));
148             Text text= fNameField.getTextControl(null);
149             LayoutUtil.setHorizontalGrabbing(text);
150             TextFieldNavigationHandler.install(text);
151
152             Dialog.applyDialogFont(composite);
153             return composite;
154         }
155
156         /*
157          * (non-Javadoc)
158          *
159          * @see org.eclipse.jdt.internal.ui.wizards.dialogfields.IDialogFieldListener#dialogFieldChanged(org.eclipse.jdt.internal.ui.wizards.dialogfields.DialogField)
160          */

161         public void dialogFieldChanged(DialogField field) {
162             if (field == fNameField)
163                 updateStatus(validateSettings());
164         }
165
166         private IStatus validateSettings() {
167             final String JavaDoc name= fNameField.getText();
168             if (name.length() == 0) {
169                 return new StatusInfo(IStatus.ERROR, RefactoringMessages.RenameTypeWizardSimilarElementsPage_name_empty);
170             }
171             IStatus status= JavaConventions.validateIdentifier(name);
172             if (status.matches(IStatus.ERROR))
173                 return status;
174             if (!Checks.startsWithLowerCase(name))
175                 return new StatusInfo(IStatus.WARNING, RefactoringMessages.RenameTypeWizardSimilarElementsPage_name_should_start_lowercase);
176
177             if (fElementToEdit instanceof IMember && ((IMember) fElementToEdit).getDeclaringType() != null) {
178                 IType type= ((IMember) fElementToEdit).getDeclaringType();
179                 if (fElementToEdit instanceof IField) {
180                     final IField f= type.getField(name);
181                     if (f.exists())
182                         return new StatusInfo(IStatus.ERROR, RefactoringMessages.RenameTypeWizardSimilarElementsPage_field_exists);
183                 }
184                 if (fElementToEdit instanceof IMethod) {
185                     final IMethod m= type.getMethod(name, ((IMethod) fElementToEdit).getParameterTypes());
186                     if (m.exists())
187                         return new StatusInfo(IStatus.ERROR, RefactoringMessages.RenameTypeWizardSimilarElementsPage_method_exists);
188                 }
189             }
190             
191             // cannot check local variables; no .getLocalVariable(String) in IMember
192

193             return StatusInfo.OK_STATUS;
194         }
195
196         public String JavaDoc getNewName() {
197             return fNameField.getText();
198         }
199     }
200
201     private static class SimilarElementTreeContentProvider implements ITreeContentProvider {
202
203         private Map JavaDoc/* <IJavaElement,Set<IJavaElement>> */fTreeElementMap;
204         private Set JavaDoc/* <ICompilationUnit> */fTopLevelElements;
205
206         /*
207          * @see ITreeContentProvider#getChildren(Object)
208          */

209         public Object JavaDoc[] getChildren(Object JavaDoc parentElement) {
210             final Set JavaDoc children= (Set JavaDoc) fTreeElementMap.get(parentElement);
211             if (children != null)
212                 return children.toArray();
213             else
214                 return new Object JavaDoc[0];
215         }
216
217         /*
218          * @see ITreeContentProvider#getParent(Object)
219          */

220         public Object JavaDoc getParent(Object JavaDoc element) {
221             if (element instanceof IMember || element instanceof ILocalVariable) {
222                 return ((IJavaElement) element).getParent();
223             }
224             if (element instanceof ICompilationUnit)
225                 return null;
226             Assert.isTrue(false, "Should not get here"); //$NON-NLS-1$
227
return null;
228         }
229
230         /*
231          * @see ITreeContentProvider#hasChildren(Object)
232          */

233         public boolean hasChildren(Object JavaDoc element) {
234             return fTreeElementMap.containsKey(element);
235         }
236
237         /*
238          * @see IStructuredContentProvider#getElements(Object)
239          */

240         public Object JavaDoc[] getElements(Object JavaDoc inputElement) {
241             Assert.isTrue(inputElement == null || inputElement instanceof Map JavaDoc);
242             return fTopLevelElements.toArray();
243         }
244
245         /*
246          * @see IContentProvider#dispose()
247          */

248         public void dispose() {
249             fTreeElementMap.clear();
250             fTreeElementMap= null;
251             fTopLevelElements= null;
252         }
253
254         /*
255          * @see IContentProvider#inputChanged(Viewer, Object, Object)
256          */

257         public void inputChanged(Viewer viewer, Object JavaDoc oldInput, Object JavaDoc newInput) {
258             Assert.isTrue(newInput == null || newInput instanceof Map JavaDoc);
259             if (newInput == null)
260                 return;
261             final Map JavaDoc similarElementsMap= (Map JavaDoc) newInput;
262             final IJavaElement[] similarElements= (IJavaElement[]) similarElementsMap.keySet().toArray(new IJavaElement[0]);
263             fTreeElementMap= new HashMap JavaDoc();
264             fTopLevelElements= new HashSet JavaDoc();
265             for (int i= 0; i < similarElements.length; i++) {
266                 final IType declaring= (IType) similarElements[i].getAncestor(IJavaElement.TYPE);
267                 if (similarElements[i] instanceof IMember) {
268                     // methods, fields, initializers, inner types
269
addToMap(declaring, similarElements[i]);
270                 } else {
271                     // local variables
272
final IJavaElement parent= similarElements[i].getParent();
273                     if (parent instanceof IMember) {
274                         // parent is a method or an initializer
275
addToMap(parent, similarElements[i]);
276                         addToMap(declaring, parent);
277                     }
278                 }
279                 handleDeclaring(declaring);
280             }
281         }
282
283         private void handleDeclaring(final IJavaElement someType) {
284
285             final IJavaElement enclosing= someType.getParent();
286             if (enclosing instanceof ICompilationUnit) {
287                 fTopLevelElements.add(someType.getParent());
288                 addToMap(someType.getParent(), someType);
289             } else {
290                 addToMap(enclosing, someType);
291                 handleDeclaring(enclosing);
292             }
293         }
294
295         private void addToMap(final IJavaElement key, final IJavaElement element) {
296             Set JavaDoc elements= (Set JavaDoc) fTreeElementMap.get(key);
297             if (elements == null) {
298                 elements= new HashSet JavaDoc();
299                 fTreeElementMap.put(key, elements);
300             }
301             elements.add(element);
302         }
303
304     }
305
306     private static class SimilarLabelProvider extends JavaElementLabelProvider {
307
308         private Map JavaDoc fDescriptorImageMap= new HashMap JavaDoc();
309         private Map JavaDoc fElementToNewName;
310
311         public SimilarLabelProvider() {
312             super(JavaElementLabelProvider.SHOW_DEFAULT | JavaElementLabelProvider.SHOW_SMALL_ICONS);
313         }
314
315         public void initialize(Map JavaDoc elementToNewName) {
316             this.fElementToNewName= elementToNewName;
317         }
318
319         public void dispose() {
320             for (Iterator JavaDoc iter= fDescriptorImageMap.values().iterator(); iter.hasNext();) {
321                 Image image= (Image) iter.next();
322                 image.dispose();
323             }
324             super.dispose();
325         }
326
327         private Image manageImageDescriptor(ImageDescriptor descriptor) {
328             Image image= (Image) fDescriptorImageMap.get(descriptor);
329             if (image == null) {
330                 image= descriptor.createImage();
331                 fDescriptorImageMap.put(descriptor, image);
332             }
333             return image;
334         }
335
336         public Image getImage(Object JavaDoc element) {
337             if (isSimilarElement(element))
338                 return manageImageDescriptor(JavaPluginImages.DESC_OBJS_DEFAULT_CHANGE);
339             return super.getImage(element);
340         }
341
342         public Image getJavaImage(Object JavaDoc element) {
343             return super.getImage(element);
344         }
345
346         public String JavaDoc getText(Object JavaDoc element) {
347             if (isSimilarElement(element)) {
348                 return Messages.format(RefactoringMessages.RenameTypeWizardSimilarElementsPage_rename_to, new String JavaDoc[] { super.getText(element), (String JavaDoc)fElementToNewName.get(element) } );
349             }
350             return super.getText(element);
351         }
352         
353         private boolean isSimilarElement(Object JavaDoc element) {
354             return fElementToNewName.containsKey(element);
355         }
356         
357     }
358     
359     private static class SimilarElementComparator extends JavaElementComparator {
360
361         /*
362          * (non-Javadoc)
363          * @see org.eclipse.jdt.ui.JavaElementSorter#category(java.lang.Object)
364          */

365         public int category(Object JavaDoc element) {
366
367             /*
368              * We'd like to present the elements in the same order as they
369              * appear in the source. This can be achieved by assigning a
370              * distinct category to every element; the category being derived
371              * from the source position of the element.
372              */

373
374             ISourceRange sourceRange= null;
375             if (element instanceof IMember) {
376                 IMember member= (IMember) element;
377                 try {
378                     sourceRange= member.getNameRange();
379                 } catch (JavaModelException e) {
380                     // fall through
381
}
382             }
383             if (element instanceof ILocalVariable) {
384                 ILocalVariable var= (ILocalVariable) element;
385                 sourceRange= var.getNameRange();
386             }
387
388             if (sourceRange != null)
389                 return 100 + sourceRange.getOffset(); // +100: safe distance from all other categories.
390

391             return super.category(element);
392         }
393     }
394
395     public static final String JavaDoc PAGE_NAME= "SimilarElementSelectionPage"; //$NON-NLS-1$
396

397     private final long LABEL_FLAGS= JavaElementLabels.DEFAULT_QUALIFIED | JavaElementLabels.ROOT_POST_QUALIFIED | JavaElementLabels.APPEND_ROOT_PATH | JavaElementLabels.M_PARAMETER_TYPES
398             | JavaElementLabels.M_PARAMETER_NAMES | JavaElementLabels.M_APP_RETURNTYPE | JavaElementLabels.M_EXCEPTIONS | JavaElementLabels.F_APP_TYPE_SIGNATURE | JavaElementLabels.T_TYPE_PARAMETERS;
399
400     private Label fSimilarElementsLabel;
401     private SourceViewer fSourceViewer;
402     private ContainerCheckedTreeViewer fTreeViewer;
403     private SimilarLabelProvider fTreeViewerLabelProvider;
404     private Map JavaDoc fSimilarElementsToNewName;
405     private Button fEditElementButton;
406     private boolean fWasInitialized;
407     private CLabel fCurrentElementLabel;
408
409     public RenameTypeWizardSimilarElementsPage() {
410         super(PAGE_NAME);
411     }
412
413     // --- UI creation
414

415     public void createControl(Composite parent) {
416
417         ViewForm viewForm= new ViewForm(parent, SWT.BORDER | SWT.FLAT);
418
419         Composite inner= new Composite(viewForm, SWT.NULL);
420         GridLayout layout= new GridLayout();
421         inner.setLayout(layout);
422
423         createTreeAndSourceViewer(inner);
424         createButtonComposite(inner);
425         viewForm.setContent(inner);
426
427         setControl(viewForm);
428
429         Dialog.applyDialogFont(viewForm);
430         PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(), IJavaHelpContextIds.RENAME_TYPE_WIZARD_PAGE);
431     }
432
433     private void createTreeAndSourceViewer(Composite superComposite) {
434         SashForm composite= new SashForm(superComposite, SWT.HORIZONTAL);
435         initializeDialogUnits(superComposite);
436         GridData gd= new GridData(GridData.FILL_BOTH);
437         gd.heightHint= convertHeightInCharsToPixels(20);
438         gd.widthHint= convertWidthInCharsToPixels(10);
439         composite.setLayoutData(gd);
440         GridLayout layout= new GridLayout();
441         layout.numColumns= 2;
442         layout.marginWidth= 0;
443         layout.marginHeight= 0;
444         composite.setLayout(layout);
445
446         createSimilarElementTreeComposite(composite);
447         createSourceViewerComposite(composite);
448         composite.setWeights(new int[] { 50, 50 });
449     }
450
451     private void createSimilarElementTreeComposite(Composite parent) {
452         Composite composite= new Composite(parent, SWT.NONE);
453         composite.setLayoutData(new GridData(GridData.FILL_BOTH));
454         GridLayout layout= new GridLayout();
455         layout.marginWidth= 0;
456         layout.marginHeight= 0;
457         composite.setLayout(layout);
458
459         createTypeHierarchyLabel(composite);
460         createTreeViewer(composite);
461     }
462
463     private void createTypeHierarchyLabel(Composite composite) {
464         fSimilarElementsLabel= new Label(composite, SWT.WRAP);
465         GridData gd= new GridData(GridData.FILL_HORIZONTAL);
466         gd.heightHint= JavaElementImageProvider.SMALL_SIZE.x;
467         fSimilarElementsLabel.setLayoutData(gd);
468         fSimilarElementsLabel.setText(RefactoringMessages.RenameTypeWizardSimilarElementsPage_review_similar_elements);
469     }
470
471     private void createTreeViewer(Composite composite) {
472         Tree tree= new Tree(composite, SWT.CHECK | SWT.BORDER | SWT.SINGLE | SWT.V_SCROLL | SWT.H_SCROLL);
473         tree.setLayoutData(new GridData(GridData.FILL_BOTH));
474         fTreeViewer= new ContainerCheckedTreeViewer(tree);
475         fTreeViewer.setUseHashlookup(true);
476         fTreeViewer.setComparator(new SimilarElementComparator());
477         fTreeViewer.setContentProvider(new SimilarElementTreeContentProvider());
478         fTreeViewerLabelProvider= new SimilarLabelProvider();
479         fTreeViewer.setLabelProvider(fTreeViewerLabelProvider);
480         fTreeViewer.addSelectionChangedListener(new ISelectionChangedListener() {
481
482             public void selectionChanged(SelectionChangedEvent event) {
483                 RenameTypeWizardSimilarElementsPage.this.treeViewerSelectionChanged(event);
484             }
485         });
486         fTreeViewer.addDoubleClickListener(new IDoubleClickListener() {
487
488             public void doubleClick(DoubleClickEvent event) {
489                 RenameTypeWizardSimilarElementsPage.this.editCurrentElement();
490             }
491         });
492     }
493
494     private void createSourceViewerComposite(Composite parent) {
495         Composite c= new Composite(parent, SWT.NONE);
496         c.setLayoutData(new GridData(GridData.FILL_BOTH));
497         GridLayout layout= new GridLayout();
498         layout.marginWidth= 0;
499         layout.marginHeight= 0;
500         c.setLayout(layout);
501
502         createSourceViewerLabel(c);
503         createSourceViewer(c);
504     }
505
506     private void createSourceViewerLabel(Composite c) {
507         fCurrentElementLabel= new CLabel(c, SWT.NONE);
508         GridData gd= new GridData(GridData.FILL_HORIZONTAL);
509         gd.heightHint= JavaElementImageProvider.SMALL_SIZE.x;
510         fCurrentElementLabel.setText(RefactoringMessages.RenameTypeWizardSimilarElementsPage_select_element_to_view_source);
511         fCurrentElementLabel.setLayoutData(gd);
512     }
513
514     private void createSourceViewer(Composite c) {
515         IPreferenceStore store= JavaPlugin.getDefault().getCombinedPreferenceStore();
516         fSourceViewer= new JavaSourceViewer(c, null, null, false, SWT.V_SCROLL | SWT.H_SCROLL | SWT.MULTI | SWT.BORDER | SWT.FULL_SELECTION, store);
517         fSourceViewer.configure(new JavaSourceViewerConfiguration(getJavaTextTools().getColorManager(), store, null, null));
518         fSourceViewer.setEditable(false);
519         fSourceViewer.getControl().setLayoutData(new GridData(GridData.FILL_BOTH));
520         fSourceViewer.getControl().setFont(JFaceResources.getFont(PreferenceConstants.EDITOR_TEXT_FONT));
521         Document document= new Document();
522         getJavaTextTools().setupJavaDocumentPartitioner(document);
523         fSourceViewer.setDocument(document);
524     }
525
526     private static JavaTextTools getJavaTextTools() {
527         return JavaPlugin.getDefault().getJavaTextTools();
528     }
529
530     private void createButtonComposite(Composite superComposite) {
531         Composite buttonComposite= new Composite(superComposite, SWT.NONE);
532         buttonComposite.setLayoutData(new GridData());
533         GridLayout layout= new GridLayout(2, false);
534         layout.marginWidth= 0;
535         buttonComposite.setLayout(layout);
536
537         Button returnToDefaults= new Button(buttonComposite, SWT.PUSH);
538         returnToDefaults.setText(RefactoringMessages.RenameTypeWizardSimilarElementsPage_restore_defaults);
539         returnToDefaults.setLayoutData(new GridData());
540         SWTUtil.setButtonDimensionHint(returnToDefaults);
541         returnToDefaults.addSelectionListener(new SelectionAdapter() {
542
543             public void widgetSelected(SelectionEvent e) {
544                 RenameTypeWizardSimilarElementsPage.this.resetDataInRefAndUI();
545             }
546         });
547         fEditElementButton= new Button(buttonComposite, SWT.PUSH);
548         fEditElementButton.setText(RefactoringMessages.RenameTypeWizardSimilarElementsPage_change_name);
549         fEditElementButton.setLayoutData(new GridData());
550         fEditElementButton.setEnabled(false);
551         SWTUtil.setButtonDimensionHint(fEditElementButton);
552         fEditElementButton.addSelectionListener(new SelectionAdapter() {
553
554             public void widgetSelected(SelectionEvent e) {
555                 RenameTypeWizardSimilarElementsPage.this.editCurrentElement();
556             }
557         });
558     }
559
560
561     // ---------------------- Acting
562

563     public void setVisible(boolean visible) {
564         if (visible) {
565             initializeUIFromRef();
566         }
567         super.setVisible(visible);
568         selectFirstElement();
569     }
570
571     private void selectFirstElement() {
572         if (fTreeViewer.getTree().getItemCount() > 0) {
573             TreeItem item= fTreeViewer.getTree().getItem(0);
574             if (item.getData() != null) {
575                 fTreeViewer.reveal(item.getData());
576                 Object JavaDoc data= getFirstSimilarElement(item);
577                 if (data != null) {
578                     fTreeViewer.setSelection(new StructuredSelection(data));
579                 }
580             }
581         }
582         fTreeViewer.getTree().setFocus();
583     }
584     
585     private Object JavaDoc getFirstSimilarElement(TreeItem item) {
586         Object JavaDoc data= item.getData();
587         if (isSimilarElement(data)) {
588             return data;
589         } else {
590             TreeItem[] children= item.getItems();
591             for (int i= 0; i < children.length; i++) {
592                 Object JavaDoc childData= getFirstSimilarElement(children[i]);
593                 if (childData != null)
594                     return childData;
595             }
596         }
597         return null;
598     }
599
600     private void initializeUIFromRef() {
601         // Get data from the refactoring
602
final Map JavaDoc elementsToNewNames= getRenameTypeProcessor().getSimilarElementsToNewNames();
603         try {
604             // To prevent flickering, stop redrawing
605
getShell().setRedraw(false);
606             if (fSimilarElementsToNewName == null || elementsToNewNames != fSimilarElementsToNewName) {
607                 fSimilarElementsToNewName= elementsToNewNames;
608                 fTreeViewerLabelProvider.initialize(fSimilarElementsToNewName);
609                 fTreeViewer.setInput(fSimilarElementsToNewName);
610             }
611             fTreeViewer.expandAll();
612             restoreSelectionAndNames(getRenameTypeProcessor().getSimilarElementsToSelection());
613         } finally {
614             getShell().setRedraw(true);
615         }
616         fWasInitialized= true;
617     }
618
619     private void initializeRefFromUI() {
620         IJavaElement[] selected= getCheckedSimilarElements();
621         Map JavaDoc selection= getRenameTypeProcessor().getSimilarElementsToSelection();
622         for (Iterator JavaDoc iter= selection.keySet().iterator(); iter.hasNext();) {
623             IJavaElement element= (IJavaElement) iter.next();
624             selection.put(element, Boolean.FALSE);
625         }
626         for (int i= 0; i < selected.length; i++)
627             selection.put(selected[i], Boolean.TRUE);
628
629     }
630
631     private void resetDataInRefAndUI() {
632         getRenameTypeProcessor().resetSelectedSimilarElements();
633         restoreSelectionAndNames(getRenameTypeProcessor().getSimilarElementsToSelection());
634     }
635
636     protected void editCurrentElement() {
637         IStructuredSelection selection= (IStructuredSelection) fTreeViewer.getSelection();
638         if ( (selection != null) && isSimilarElement(selection.getFirstElement())) {
639             IJavaElement element= (IJavaElement) selection.getFirstElement();
640             String JavaDoc newName= (String JavaDoc) fSimilarElementsToNewName.get(element);
641             if (newName == null)
642                 return;
643             EditElementDialog dialog= new EditElementDialog(getShell(), element, newName);
644             if (dialog.open() == Window.OK) {
645                 String JavaDoc changedName= dialog.getNewName();
646                 if (!changedName.equals(newName)) {
647                     fSimilarElementsToNewName.put(element, changedName);
648                     fTreeViewer.update(element, null);
649                 }
650             }
651         }
652     }
653
654     private void restoreSelectionAndNames(final Map JavaDoc selection) {
655         final Map JavaDoc selectedElements= selection;
656         for (Iterator JavaDoc iter= selectedElements.keySet().iterator(); iter.hasNext();) {
657             IJavaElement element= (IJavaElement) iter.next();
658             boolean isSelected= ((Boolean JavaDoc) selectedElements.get(element)).booleanValue();
659             fTreeViewer.setChecked(element, isSelected);
660             fTreeViewer.update(element, null);
661         }
662     }
663
664     // ------------ Navigation
665

666     /*
667      * @see IWizardPage#getNextPage()
668      */

669     public IWizardPage getNextPage() {
670         if (fWasInitialized)
671             initializeRefFromUI();
672         // computes the input successor page
673
// (=create changes)
674
IWizardPage nextPage= super.getNextPage();
675         if (nextPage != this) // if user pressed cancel, then the next page is the current page
676
nextPage.setPreviousPage(this);
677         return nextPage;
678     }
679
680
681     /*
682      * @see IWizardPage#getPreviousPage()
683      */

684     public IWizardPage getPreviousPage() {
685         if (fWasInitialized)
686             initializeRefFromUI();
687         return super.getPreviousPage();
688     }
689
690     /*
691      * @see RefactoringWizardPage#performFinish()
692      */

693     protected boolean performFinish() {
694         initializeRefFromUI();
695         return super.performFinish();
696     }
697
698     // ------------ Helper
699

700     private boolean isSimilarElement(Object JavaDoc element) {
701         if (!fWasInitialized)
702             return false;
703         
704         return fSimilarElementsToNewName.containsKey(element);
705     }
706
707     private void treeViewerSelectionChanged(SelectionChangedEvent event) {
708         try {
709             final IJavaElement selection= getFirstSelectedSourceReference(event);
710             setSourceViewerContents(selection);
711             fEditElementButton.setEnabled(selection != null && (isSimilarElement(selection)));
712             fCurrentElementLabel.setText(selection != null ? JavaElementLabels.getElementLabel(selection, LABEL_FLAGS) : RefactoringMessages.RenameTypeWizardSimilarElementsPage_select_element_to_view_source);
713             fCurrentElementLabel.setImage(selection != null ? fTreeViewerLabelProvider.getJavaImage(selection) : null);
714         } catch (JavaModelException e) {
715             ExceptionHandler.handle(e, RefactoringMessages.RenameTypeWizard_defaultPageTitle, RefactoringMessages.RenameTypeWizard_unexpected_exception);
716         }
717     }
718
719     private IJavaElement getFirstSelectedSourceReference(SelectionChangedEvent event) {
720         ISelection s= event.getSelection();
721         if (! (s instanceof IStructuredSelection))
722             return null;
723         IStructuredSelection strSel= (IStructuredSelection) s;
724         if (strSel.size() != 1)
725             return null;
726         Object JavaDoc first= strSel.getFirstElement();
727         if (! (first instanceof IJavaElement))
728             return null;
729         return (IJavaElement) first;
730     }
731
732     private void setSourceViewerContents(IJavaElement el) throws JavaModelException {
733         String JavaDoc EMPTY= ""; //$NON-NLS-1$
734
if (el == null) {
735             fSourceViewer.getDocument().set(EMPTY);
736             return;
737         }
738         ICompilationUnit element= (ICompilationUnit) el.getAncestor(IJavaElement.COMPILATION_UNIT);
739         if (element == null) {
740             fSourceViewer.getDocument().set(EMPTY);
741             return;
742         }
743         
744         String JavaDoc contents= element.getSource();
745         try {
746             fSourceViewer.setRedraw(false);
747             fSourceViewer.getDocument().set(contents == null ? EMPTY : contents);
748             ISourceRange sr= getNameRange(el);
749             if (sr != null) {
750                 fSourceViewer.setSelectedRange(sr.getOffset(), sr.getLength());
751             }
752         } finally {
753             fSourceViewer.setRedraw(true);
754         }
755     }
756
757     private ISourceRange getNameRange(IJavaElement element) throws JavaModelException {
758         if (element instanceof IMember)
759             return ((IMember) element).getNameRange();
760         else if (element instanceof ILocalVariable)
761             return ((ILocalVariable) element).getNameRange();
762         else
763             return null;
764     }
765
766     private IJavaElement[] getCheckedSimilarElements() {
767         Object JavaDoc[] checked= fTreeViewer.getCheckedElements();
768         List JavaDoc elements= new ArrayList JavaDoc(checked.length);
769         for (int i= 0; i < checked.length; i++) {
770             if (isSimilarElement(checked[i]))
771                 elements.add(checked[i]);
772         }
773         return (IJavaElement[]) elements.toArray(new IJavaElement[elements.size()]);
774     }
775
776     public RenameTypeProcessor getRenameTypeProcessor() {
777         RefactoringProcessor proc= ((RenameRefactoring) getRefactoring()).getProcessor();
778         if (proc instanceof RenameTypeProcessor)
779             return (RenameTypeProcessor) proc;
780         else if (proc instanceof RenameCompilationUnitProcessor) {
781             RenameCompilationUnitProcessor rcu= (RenameCompilationUnitProcessor) proc;
782             return rcu.getRenameTypeProcessor();
783         }
784         Assert.isTrue(false); // Should never get here
785
return null;
786     }
787 }
788
Popular Tags