1 11 package org.eclipse.jdt.internal.ui.refactoring.reorg; 12 13 import java.util.ArrayList ; 14 import java.util.HashMap ; 15 import java.util.HashSet ; 16 import java.util.Iterator ; 17 import java.util.List ; 18 import java.util.Map ; 19 import java.util.Set ; 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 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 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 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 161 public void dialogFieldChanged(DialogField field) { 162 if (field == fNameField) 163 updateStatus(validateSettings()); 164 } 165 166 private IStatus validateSettings() { 167 final String 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 193 return StatusInfo.OK_STATUS; 194 } 195 196 public String getNewName() { 197 return fNameField.getText(); 198 } 199 } 200 201 private static class SimilarElementTreeContentProvider implements ITreeContentProvider { 202 203 private Map fTreeElementMap; 204 private Set fTopLevelElements; 205 206 209 public Object [] getChildren(Object parentElement) { 210 final Set children= (Set ) fTreeElementMap.get(parentElement); 211 if (children != null) 212 return children.toArray(); 213 else 214 return new Object [0]; 215 } 216 217 220 public Object getParent(Object 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"); return null; 228 } 229 230 233 public boolean hasChildren(Object element) { 234 return fTreeElementMap.containsKey(element); 235 } 236 237 240 public Object [] getElements(Object inputElement) { 241 Assert.isTrue(inputElement == null || inputElement instanceof Map ); 242 return fTopLevelElements.toArray(); 243 } 244 245 248 public void dispose() { 249 fTreeElementMap.clear(); 250 fTreeElementMap= null; 251 fTopLevelElements= null; 252 } 253 254 257 public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { 258 Assert.isTrue(newInput == null || newInput instanceof Map ); 259 if (newInput == null) 260 return; 261 final Map similarElementsMap= (Map ) newInput; 262 final IJavaElement[] similarElements= (IJavaElement[]) similarElementsMap.keySet().toArray(new IJavaElement[0]); 263 fTreeElementMap= new HashMap (); 264 fTopLevelElements= new HashSet (); 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 addToMap(declaring, similarElements[i]); 270 } else { 271 final IJavaElement parent= similarElements[i].getParent(); 273 if (parent instanceof IMember) { 274 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 elements= (Set ) fTreeElementMap.get(key); 297 if (elements == null) { 298 elements= new HashSet (); 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 fDescriptorImageMap= new HashMap (); 309 private Map fElementToNewName; 310 311 public SimilarLabelProvider() { 312 super(JavaElementLabelProvider.SHOW_DEFAULT | JavaElementLabelProvider.SHOW_SMALL_ICONS); 313 } 314 315 public void initialize(Map elementToNewName) { 316 this.fElementToNewName= elementToNewName; 317 } 318 319 public void dispose() { 320 for (Iterator 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 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 element) { 343 return super.getImage(element); 344 } 345 346 public String getText(Object element) { 347 if (isSimilarElement(element)) { 348 return Messages.format(RefactoringMessages.RenameTypeWizardSimilarElementsPage_rename_to, new String [] { super.getText(element), (String )fElementToNewName.get(element) } ); 349 } 350 return super.getText(element); 351 } 352 353 private boolean isSimilarElement(Object element) { 354 return fElementToNewName.containsKey(element); 355 } 356 357 } 358 359 private static class SimilarElementComparator extends JavaElementComparator { 360 361 365 public int category(Object element) { 366 367 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 } 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(); 391 return super.category(element); 392 } 393 } 394 395 public static final String PAGE_NAME= "SimilarElementSelectionPage"; 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 fSimilarElementsToNewName; 405 private Button fEditElementButton; 406 private boolean fWasInitialized; 407 private CLabel fCurrentElementLabel; 408 409 public RenameTypeWizardSimilarElementsPage() { 410 super(PAGE_NAME); 411 } 412 413 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 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 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 getFirstSimilarElement(TreeItem item) { 586 Object 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 childData= getFirstSimilarElement(children[i]); 593 if (childData != null) 594 return childData; 595 } 596 } 597 return null; 598 } 599 600 private void initializeUIFromRef() { 601 final Map elementsToNewNames= getRenameTypeProcessor().getSimilarElementsToNewNames(); 603 try { 604 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 selection= getRenameTypeProcessor().getSimilarElementsToSelection(); 622 for (Iterator 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 newName= (String ) 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 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 selection) { 655 final Map selectedElements= selection; 656 for (Iterator iter= selectedElements.keySet().iterator(); iter.hasNext();) { 657 IJavaElement element= (IJavaElement) iter.next(); 658 boolean isSelected= ((Boolean ) selectedElements.get(element)).booleanValue(); 659 fTreeViewer.setChecked(element, isSelected); 660 fTreeViewer.update(element, null); 661 } 662 } 663 664 666 669 public IWizardPage getNextPage() { 670 if (fWasInitialized) 671 initializeRefFromUI(); 672 IWizardPage nextPage= super.getNextPage(); 675 if (nextPage != this) nextPage.setPreviousPage(this); 677 return nextPage; 678 } 679 680 681 684 public IWizardPage getPreviousPage() { 685 if (fWasInitialized) 686 initializeRefFromUI(); 687 return super.getPreviousPage(); 688 } 689 690 693 protected boolean performFinish() { 694 initializeRefFromUI(); 695 return super.performFinish(); 696 } 697 698 700 private boolean isSimilarElement(Object 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 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 EMPTY= ""; 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 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 [] checked= fTreeViewer.getCheckedElements(); 768 List elements= new ArrayList (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); return null; 786 } 787 } 788 | Popular Tags |