1 11 package org.eclipse.jdt.internal.ui.refactoring; 12 13 import java.lang.reflect.InvocationTargetException ; 14 import java.util.Arrays ; 15 import java.util.HashSet ; 16 import java.util.Iterator ; 17 import java.util.LinkedList ; 18 import java.util.Set ; 19 20 import org.eclipse.core.runtime.Assert; 21 import org.eclipse.core.runtime.IProgressMonitor; 22 import org.eclipse.core.runtime.OperationCanceledException; 23 24 import org.eclipse.swt.SWT; 25 import org.eclipse.swt.events.ModifyEvent; 26 import org.eclipse.swt.events.ModifyListener; 27 import org.eclipse.swt.events.SelectionAdapter; 28 import org.eclipse.swt.events.SelectionEvent; 29 import org.eclipse.swt.graphics.Image; 30 import org.eclipse.swt.layout.GridData; 31 import org.eclipse.swt.layout.GridLayout; 32 import org.eclipse.swt.widgets.Button; 33 import org.eclipse.swt.widgets.Composite; 34 import org.eclipse.swt.widgets.Control; 35 import org.eclipse.swt.widgets.Label; 36 import org.eclipse.swt.widgets.Shell; 37 import org.eclipse.swt.widgets.Text; 38 39 import org.eclipse.jface.dialogs.Dialog; 40 import org.eclipse.jface.operation.IRunnableWithProgress; 41 import org.eclipse.jface.viewers.ArrayContentProvider; 42 import org.eclipse.jface.viewers.DoubleClickEvent; 43 import org.eclipse.jface.viewers.IDoubleClickListener; 44 import org.eclipse.jface.viewers.ILabelProvider; 45 import org.eclipse.jface.viewers.ISelectionChangedListener; 46 import org.eclipse.jface.viewers.IStructuredSelection; 47 import org.eclipse.jface.viewers.ITableLabelProvider; 48 import org.eclipse.jface.viewers.SelectionChangedEvent; 49 import org.eclipse.jface.viewers.TableViewer; 50 import org.eclipse.jface.viewers.Viewer; 51 import org.eclipse.jface.viewers.ViewerComparator; 52 import org.eclipse.jface.window.Window; 53 54 import org.eclipse.ui.PlatformUI; 55 import org.eclipse.ui.dialogs.SelectionDialog; 56 57 import org.eclipse.ltk.core.refactoring.RefactoringStatus; 58 59 import org.eclipse.jdt.core.IType; 60 import org.eclipse.jdt.core.JavaModelException; 61 62 import org.eclipse.jdt.internal.corext.refactoring.structure.ExtractSupertypeProcessor; 63 import org.eclipse.jdt.internal.corext.refactoring.structure.ExtractSupertypeRefactoring; 64 65 import org.eclipse.jdt.ui.JavaElementComparator; 66 import org.eclipse.jdt.ui.JavaElementLabels; 67 68 import org.eclipse.jdt.internal.ui.IJavaHelpContextIds; 69 import org.eclipse.jdt.internal.ui.dialogs.TextFieldNavigationHandler; 70 import org.eclipse.jdt.internal.ui.util.ExceptionHandler; 71 import org.eclipse.jdt.internal.ui.util.SWTUtil; 72 import org.eclipse.jdt.internal.ui.viewsupport.AppearanceAwareLabelProvider; 73 import org.eclipse.jdt.internal.ui.viewsupport.JavaElementImageProvider; 74 75 81 public final class ExtractSupertypeMemberPage extends PullUpMemberPage { 82 83 84 private static class SupertypeSelectionDialog extends SelectionDialog { 85 86 87 private TableViewer fViewer; 88 89 95 public SupertypeSelectionDialog(final Shell shell) { 96 super(shell); 97 } 98 99 102 public void create() { 103 setShellStyle(SWT.DIALOG_TRIM | SWT.RESIZE); 104 super.create(); 105 getShell().setText(RefactoringMessages.ExtractSupertypeMemberPage_choose_type_caption); 106 } 107 108 111 protected Control createDialogArea(final Composite composite) { 112 Assert.isNotNull(composite); 113 setMessage(RefactoringMessages.ExtractSupertypeMemberPage_choose_type_message); 114 final Composite control= (Composite) super.createDialogArea(composite); 115 createMessageArea(control); 116 fViewer= new TableViewer(control, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER); 117 fViewer.setLabelProvider(createLabelProvider()); 118 fViewer.setContentProvider(new ArrayContentProvider()); 119 fViewer.setComparator(new SupertypeSelectionViewerSorter()); 120 fViewer.addSelectionChangedListener(new ISelectionChangedListener() { 121 122 public void selectionChanged(final SelectionChangedEvent event) { 123 setSelectionResult(((IStructuredSelection) fViewer.getSelection()).toArray()); 124 } 125 }); 126 fViewer.addDoubleClickListener(new IDoubleClickListener() { 127 128 public void doubleClick(final DoubleClickEvent event) { 129 setSelectionResult(((IStructuredSelection) fViewer.getSelection()).toArray()); 130 close(); 131 } 132 }); 133 final GridData data= new GridData(GridData.FILL_BOTH); 134 data.heightHint= convertHeightInCharsToPixels(15); 135 data.widthHint= convertWidthInCharsToPixels(55); 136 fViewer.getTable().setLayoutData(data); 137 applyDialogFont(control); 138 return control; 139 } 140 141 147 public void setInput(final Object object) { 148 fViewer.setInput(object); 149 } 150 } 151 152 153 private static class SupertypeSelectionLabelProvider extends AppearanceAwareLabelProvider implements ITableLabelProvider { 154 155 163 public SupertypeSelectionLabelProvider(final long textFlags, final int imageFlags) { 164 super(textFlags, imageFlags); 165 } 166 167 170 public Image getColumnImage(final Object element, final int index) { 171 return getImage(element); 172 } 173 174 177 public String getColumnText(final Object element, final int index) { 178 return getText(element); 179 } 180 } 181 182 183 private static class SupertypeSelectionViewerSorter extends ViewerComparator { 184 185 188 public int compare(final Viewer viewer, final Object first, final Object second) { 189 final IType predecessor= (IType) first; 190 final IType successor= (IType) second; 191 return getComparator().compare(predecessor.getElementName(), successor.getElementName()); 192 } 193 } 194 195 200 private static ILabelProvider createLabelProvider() { 201 return new SupertypeSelectionLabelProvider(JavaElementLabels.T_TYPE_PARAMETERS | JavaElementLabels.T_POST_QUALIFIED, JavaElementImageProvider.OVERLAY_ICONS); 202 } 203 204 205 private Text fNameField; 206 207 208 private TableViewer fTableViewer; 209 210 211 private final Set fTypesToExtract= new HashSet (2); 212 213 221 public ExtractSupertypeMemberPage(final String name, final ExtractSupertypeMethodPage page) { 222 super(name, page); 223 setDescription(RefactoringMessages.ExtractSupertypeMemberPage_page_title); 224 METHOD_LABELS[PULL_UP_ACTION]= RefactoringMessages.ExtractSupertypeMemberPage_extract; 225 METHOD_LABELS[DECLARE_ABSTRACT_ACTION]= RefactoringMessages.ExtractSupertypeMemberPage_declare_abstract; 226 TYPE_LABELS[PULL_UP_ACTION]= RefactoringMessages.ExtractSupertypeMemberPage_extract; 227 } 228 229 232 protected void checkPageCompletionStatus(final boolean display) { 233 final RefactoringStatus status= getProcessor().checkExtractedCompilationUnit(); 234 setMessage(null); 235 if (display) 236 setPageComplete(status); 237 else 238 setPageComplete(!status.hasFatalError()); 239 fSuccessorPage.fireSettingsChanged(); 240 } 241 242 248 protected void computeCandidateTypes() throws InterruptedException { 249 if (fCandidateTypes != null && fCandidateTypes.length > 0) 250 return; 251 try { 252 getWizard().getContainer().run(true, true, new IRunnableWithProgress() { 253 254 public void run(final IProgressMonitor monitor) throws InvocationTargetException { 255 try { 256 fCandidateTypes= getProcessor().getCandidateTypes(new RefactoringStatus(), monitor); 257 } finally { 258 monitor.done(); 259 } 260 } 261 }); 262 } catch (InvocationTargetException exception) { 263 ExceptionHandler.handle(exception, getShell(), RefactoringMessages.ExtractSupertypeMemberPage_extract_supertype, RefactoringMessages.PullUpInputPage_exception); 264 } catch (InterruptedException exception) { 265 fCandidateTypes= new IType[0]; 266 throw new InterruptedException (); 267 } catch (OperationCanceledException exception) { 268 fCandidateTypes= new IType[0]; 269 } 270 } 271 272 278 protected void createButtonComposite(final Composite parent) { 279 final Composite buttons= new Composite(parent, SWT.NONE); 280 final GridLayout layout= new GridLayout(); 281 layout.marginHeight= 0; 282 layout.marginWidth= 0; 283 buttons.setLayout(layout); 284 buttons.setLayoutData(new GridData(GridData.FILL_VERTICAL)); 285 286 final Button addButton= new Button(buttons, SWT.PUSH); 287 addButton.setText(RefactoringMessages.ExtractSupertypeMemberPage_add_button_label); 288 addButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); 289 SWTUtil.setButtonDimensionHint(addButton); 290 addButton.addSelectionListener(new SelectionAdapter() { 291 292 public void widgetSelected(final SelectionEvent event) { 293 try { 294 computeCandidateTypes(); 295 } catch (InterruptedException exception) { 296 return; 297 } 298 final LinkedList list= new LinkedList (Arrays.asList(fCandidateTypes)); 299 for (final Iterator outer= list.iterator(); outer.hasNext();) { 300 final IType first= (IType) outer.next(); 301 for (final Iterator inner= fTypesToExtract.iterator(); inner.hasNext();) { 302 final IType second= (IType) inner.next(); 303 if (second.getFullyQualifiedName().equals(first.getFullyQualifiedName())) 304 outer.remove(); 305 } 306 } 307 final SupertypeSelectionDialog dialog= new SupertypeSelectionDialog(getShell()); 308 dialog.create(); 309 dialog.setInput(list.toArray()); 310 final int result= dialog.open(); 311 if (result == Window.OK) { 312 final Object [] objects= dialog.getResult(); 313 if (objects != null && objects.length > 0) { 314 for (int index= 0; index < objects.length; index++) { 315 fTypesToExtract.add(objects[index]); 316 } 317 fTableViewer.setInput(fTypesToExtract.toArray()); 318 handleTypesChanged(); 319 } 320 } 321 } 322 }); 323 324 final Button removeButton= new Button(buttons, SWT.PUSH); 325 removeButton.setText(RefactoringMessages.ExtractSupertypeMemberPage_remove_button_label); 326 removeButton.setEnabled(fCandidateTypes.length > 0 && !fTableViewer.getSelection().isEmpty()); 327 removeButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); 328 SWTUtil.setButtonDimensionHint(removeButton); 329 removeButton.addSelectionListener(new SelectionAdapter() { 330 331 public void widgetSelected(final SelectionEvent event) { 332 final IStructuredSelection selection= (IStructuredSelection) fTableViewer.getSelection(); 333 if (!selection.isEmpty()) { 334 final IType declaring= getDeclaringType(); 335 for (final Iterator iterator= selection.iterator(); iterator.hasNext();) { 336 final Object element= iterator.next(); 337 if (!declaring.equals(element)) 338 fTypesToExtract.remove(element); 339 } 340 fTableViewer.setInput(fTypesToExtract.toArray()); 341 handleTypesChanged(); 342 } 343 } 344 }); 345 fTableViewer.addSelectionChangedListener(new ISelectionChangedListener() { 346 347 public void selectionChanged(final SelectionChangedEvent event) { 348 final IStructuredSelection selection= (IStructuredSelection) fTableViewer.getSelection(); 349 if (selection.isEmpty()) { 350 removeButton.setEnabled(false); 351 return; 352 } else { 353 final Object [] elements= selection.toArray(); 354 if (elements.length == 1 && elements[0].equals(getDeclaringType())) { 355 removeButton.setEnabled(false); 356 return; 357 } 358 } 359 removeButton.setEnabled(true); 360 } 361 }); 362 } 363 364 367 public void createControl(final Composite parent) { 368 final Composite composite= new Composite(parent, SWT.NONE); 369 final GridLayout layout= new GridLayout(); 370 layout.numColumns= 2; 371 composite.setLayout(layout); 372 createSuperTypeField(composite); 373 createSpacer(composite); 374 createSuperTypeCheckbox(composite); 375 createInstanceOfCheckbox(composite, layout.marginWidth); 376 createStubCheckbox(composite); 377 createSuperTypeControl(composite); 378 createSpacer(composite); 379 createMemberTableLabel(composite); 380 createMemberTableComposite(composite); 381 createStatusLine(composite); 382 383 setControl(composite); 384 Dialog.applyDialogFont(composite); 385 initializeEnablement(); 386 initializeCheckboxes(); 387 PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(), IJavaHelpContextIds.EXTRACT_SUPERTYPE_WIZARD_PAGE); 388 } 389 390 393 protected void createSuperTypeControl(final Composite parent) { 394 try { 395 createSuperTypeList(parent); 396 } catch (JavaModelException exception) { 397 ExceptionHandler.handle(exception, getShell(), RefactoringMessages.ExtractSupertypeMemberPage_extract_supertype, RefactoringMessages.PullUpInputPage_exception); 398 } 399 } 400 401 407 protected void createSuperTypeField(final Composite parent) { 408 final Label label= new Label(parent, SWT.NONE); 409 label.setText(RefactoringMessages.ExtractSupertypeMemberPage_name_label); 410 label.setLayoutData(new GridData()); 411 412 fNameField= new Text(parent, SWT.BORDER); 413 fNameField.addModifyListener(new ModifyListener() { 414 415 public void modifyText(ModifyEvent e) { 416 handleNameChanged(fNameField.getText()); 417 } 418 }); 419 fNameField.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false)); 420 TextFieldNavigationHandler.install(fNameField); 421 } 422 423 429 protected void createSuperTypeList(final Composite parent) throws JavaModelException { 430 createSpacer(parent); 431 432 final Label label= new Label(parent, SWT.NONE); 433 label.setText(RefactoringMessages.ExtractSupertypeMemberPage_types_list_caption); 434 GridData data= new GridData(); 435 data.horizontalSpan= 2; 436 label.setLayoutData(data); 437 438 final Composite composite= new Composite(parent, SWT.NONE); 439 final GridLayout layout= new GridLayout(); 440 layout.numColumns= 2; 441 layout.marginWidth= 0; 442 layout.marginHeight= 0; 443 composite.setLayout(layout); 444 data= new GridData(GridData.FILL_BOTH); 445 data.horizontalSpan= 2; 446 composite.setLayoutData(data); 447 448 fTableViewer= new TableViewer(composite, SWT.MULTI | SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL); 449 data= new GridData(GridData.FILL_BOTH); 450 data.heightHint= SWTUtil.getTableHeightHint(fTableViewer.getTable(), 3); 451 fTableViewer.getTable().setLayoutData(data); 452 fTableViewer.setLabelProvider(createLabelProvider()); 453 fTableViewer.setContentProvider(new ArrayContentProvider()); 454 fTableViewer.setComparator(new JavaElementComparator()); 455 fTypesToExtract.add(getDeclaringType()); 456 fTableViewer.setInput(fTypesToExtract.toArray()); 457 458 createButtonComposite(composite); 459 } 460 461 464 protected String getCreateStubsButtonLabel() { 465 return RefactoringMessages.ExtractSupertypeMemberPage_create_stubs_label; 466 } 467 468 471 protected String getDeclareAbstractActionLabel() { 472 return RefactoringMessages.ExtractSupertypeMemberPage_declare_abstract; 473 } 474 475 480 public IType getDeclaringType() { 481 return getProcessor().getDeclaringType(); 482 } 483 484 487 public IType getDestinationType() { 488 return getProcessor().computeExtractedType(fNameField.getText()); 489 } 490 491 494 public ExtractSupertypeRefactoring getExtractSuperTypeRefactoring() { 495 return (ExtractSupertypeRefactoring) getRefactoring(); 496 } 497 498 501 protected String getInstanceofButtonLabel() { 502 return RefactoringMessages.ExtractSupertypeMemberPage_use_supertype_label; 503 } 504 505 508 protected String getNoMembersMessage() { 509 return RefactoringMessages.ExtractSupertypeMemberPage_no_members_selected; 510 } 511 512 517 protected ExtractSupertypeProcessor getProcessor() { 518 return getExtractSuperTypeRefactoring().getExtractSupertypeProcessor(); 519 } 520 521 524 protected String getPullUpActionLabel() { 525 return RefactoringMessages.ExtractSupertypeMemberPage_extract; 526 } 527 528 531 protected String getReplaceButtonLabel() { 532 return RefactoringMessages.ExtractSupertypeMemberPage_use_instanceof_label; 533 } 534 535 538 protected int getTableRowCount() { 539 return 6; 540 } 541 542 548 protected void handleNameChanged(final String name) { 549 if (name != null) 550 getProcessor().setTypeName(name); 551 checkPageCompletionStatus(true); 552 } 553 554 557 protected void handleTypesChanged() { 558 getProcessor().setTypesToExtract((IType[]) fTypesToExtract.toArray(new IType[fTypesToExtract.size()])); 559 } 560 561 564 public void setVisible(final boolean visible) { 565 super.setVisible(visible); 566 if (visible) { 567 fNameField.setFocus(); 568 getProcessor().resetChanges(); 569 } 570 } 571 } | Popular Tags |