KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > eclipse > jdt > internal > ui > refactoring > ExtractSupertypeMemberPage


1 /*******************************************************************************
2  * Copyright (c) 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;
12
13 import java.lang.reflect.InvocationTargetException JavaDoc;
14 import java.util.Arrays JavaDoc;
15 import java.util.HashSet JavaDoc;
16 import java.util.Iterator JavaDoc;
17 import java.util.LinkedList JavaDoc;
18 import java.util.Set JavaDoc;
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 /**
76  * Wizard page for the extract supertype refactoring, which, apart from pull up
77  * facilities, also allows to specify the types where to extract the supertype.
78  *
79  * @since 3.2
80  */

81 public final class ExtractSupertypeMemberPage extends PullUpMemberPage {
82
83     /** Dialog to select supertypes */
84     private static class SupertypeSelectionDialog extends SelectionDialog {
85
86         /** The table viewer */
87         private TableViewer fViewer;
88
89         /**
90          * Creates a new supertype selection dialog.
91          *
92          * @param shell
93          * the parent shell
94          */

95         public SupertypeSelectionDialog(final Shell shell) {
96             super(shell);
97         }
98
99         /**
100          * {@inheritDoc}
101          */

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         /**
109          * {@inheritDoc}
110          */

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         /**
142          * Sets the input of this dialog.
143          *
144          * @param object
145          * the input
146          */

147         public void setInput(final Object JavaDoc object) {
148             fViewer.setInput(object);
149         }
150     }
151
152     /** The label provider */
153     private static class SupertypeSelectionLabelProvider extends AppearanceAwareLabelProvider implements ITableLabelProvider {
154
155         /**
156          * Creates a new supertype selection label provider.
157          *
158          * @param textFlags
159          * the text flags
160          * @param imageFlags
161          * the image flags
162          */

163         public SupertypeSelectionLabelProvider(final long textFlags, final int imageFlags) {
164             super(textFlags, imageFlags);
165         }
166
167         /**
168          * {@inheritDoc}
169          */

170         public Image getColumnImage(final Object JavaDoc element, final int index) {
171             return getImage(element);
172         }
173
174         /**
175          * {@inheritDoc}
176          */

177         public String JavaDoc getColumnText(final Object JavaDoc element, final int index) {
178             return getText(element);
179         }
180     }
181
182     /** The viewer sorter */
183     private static class SupertypeSelectionViewerSorter extends ViewerComparator {
184
185         /**
186          * {@inheritDoc}
187          */

188         public int compare(final Viewer viewer, final Object JavaDoc first, final Object JavaDoc 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     /**
196      * Creates a label provider for a type list.
197      *
198      * @return a label provider
199      */

200     private static ILabelProvider createLabelProvider() {
201         return new SupertypeSelectionLabelProvider(JavaElementLabels.T_TYPE_PARAMETERS | JavaElementLabels.T_POST_QUALIFIED, JavaElementImageProvider.OVERLAY_ICONS);
202     }
203
204     /** The supertype name field */
205     private Text fNameField;
206
207     /** The table viewer */
208     private TableViewer fTableViewer;
209
210     /** The types to extract */
211     private final Set JavaDoc fTypesToExtract= new HashSet JavaDoc(2);
212
213     /**
214      * Creates a new extract supertype member page.
215      *
216      * @param name
217      * the page name
218      * @param page
219      * the method page
220      */

221     public ExtractSupertypeMemberPage(final String JavaDoc 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     /**
230      * {@inheritDoc}
231      */

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     /**
243      * Computes the candidate types.
244      *
245      * @throws InterruptedException
246      * if the computation has been interrupted
247      */

248     protected void computeCandidateTypes() throws InterruptedException JavaDoc {
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 JavaDoc {
255                     try {
256                         fCandidateTypes= getProcessor().getCandidateTypes(new RefactoringStatus(), monitor);
257                     } finally {
258                         monitor.done();
259                     }
260                 }
261             });
262         } catch (InvocationTargetException JavaDoc exception) {
263             ExceptionHandler.handle(exception, getShell(), RefactoringMessages.ExtractSupertypeMemberPage_extract_supertype, RefactoringMessages.PullUpInputPage_exception);
264         } catch (InterruptedException JavaDoc exception) {
265             fCandidateTypes= new IType[0];
266             throw new InterruptedException JavaDoc();
267         } catch (OperationCanceledException exception) {
268             fCandidateTypes= new IType[0];
269         }
270     }
271
272     /**
273      * Creates the button composite.
274      *
275      * @param parent
276      * the parent control
277      */

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 JavaDoc exception) {
296                     return;
297                 }
298                 final LinkedList JavaDoc list= new LinkedList JavaDoc(Arrays.asList(fCandidateTypes));
299                 for (final Iterator JavaDoc outer= list.iterator(); outer.hasNext();) {
300                     final IType first= (IType) outer.next();
301                     for (final Iterator JavaDoc 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 JavaDoc[] 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 JavaDoc iterator= selection.iterator(); iterator.hasNext();) {
336                         final Object JavaDoc 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 JavaDoc[] 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     /**
365      * {@inheritDoc}
366      */

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     /**
391      * {@inheritDoc}
392      */

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     /**
402      * Creates the super type field.
403      *
404      * @param parent
405      * the parent control
406      */

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     /**
424      * Creates the super type list.
425      *
426      * @param parent
427      * the parent control
428      */

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     /**
462      * {@inheritDoc}
463      */

464     protected String JavaDoc getCreateStubsButtonLabel() {
465         return RefactoringMessages.ExtractSupertypeMemberPage_create_stubs_label;
466     }
467
468     /**
469      * {@inheritDoc}
470      */

471     protected String JavaDoc getDeclareAbstractActionLabel() {
472         return RefactoringMessages.ExtractSupertypeMemberPage_declare_abstract;
473     }
474
475     /**
476      * Returns the declaring type.
477      *
478      * @return the declaring type
479      */

480     public IType getDeclaringType() {
481         return getProcessor().getDeclaringType();
482     }
483
484     /**
485      * {@inheritDoc}
486      */

487     public IType getDestinationType() {
488         return getProcessor().computeExtractedType(fNameField.getText());
489     }
490
491     /**
492      * Returns the extract supertype refactoring.
493      */

494     public ExtractSupertypeRefactoring getExtractSuperTypeRefactoring() {
495         return (ExtractSupertypeRefactoring) getRefactoring();
496     }
497
498     /**
499      * {@inheritDoc}
500      */

501     protected String JavaDoc getInstanceofButtonLabel() {
502         return RefactoringMessages.ExtractSupertypeMemberPage_use_supertype_label;
503     }
504
505     /**
506      * {@inheritDoc}
507      */

508     protected String JavaDoc getNoMembersMessage() {
509         return RefactoringMessages.ExtractSupertypeMemberPage_no_members_selected;
510     }
511
512     /**
513      * Returns the refactoring processor.
514      *
515      * @return the refactoring processor
516      */

517     protected ExtractSupertypeProcessor getProcessor() {
518         return getExtractSuperTypeRefactoring().getExtractSupertypeProcessor();
519     }
520
521     /**
522      * {@inheritDoc}
523      */

524     protected String JavaDoc getPullUpActionLabel() {
525         return RefactoringMessages.ExtractSupertypeMemberPage_extract;
526     }
527
528     /**
529      * {@inheritDoc}
530      */

531     protected String JavaDoc getReplaceButtonLabel() {
532         return RefactoringMessages.ExtractSupertypeMemberPage_use_instanceof_label;
533     }
534
535     /**
536      * {@inheritDoc}
537      */

538     protected int getTableRowCount() {
539         return 6;
540     }
541
542     /**
543      * Handles the name changed event.
544      *
545      * @param name
546      * the name
547      */

548     protected void handleNameChanged(final String JavaDoc name) {
549         if (name != null)
550             getProcessor().setTypeName(name);
551         checkPageCompletionStatus(true);
552     }
553
554     /**
555      * Handles the types changed event.
556      */

557     protected void handleTypesChanged() {
558         getProcessor().setTypesToExtract((IType[]) fTypesToExtract.toArray(new IType[fTypesToExtract.size()]));
559     }
560
561     /**
562      * {@inheritDoc}
563      */

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