]> git.uio.no Git - ifi-stolz-refaktor.git/blob - case-study/jdt-after/ui/org/eclipse/jdt/ui/actions/PushDownAction.java
Case Study: adding data and statistics
[ifi-stolz-refaktor.git] / case-study / jdt-after / ui / org / eclipse / jdt / ui / actions / PushDownAction.java
1 /*******************************************************************************
2  * Copyright (c) 2000, 2011 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.ui.actions;
12
13 import java.util.Arrays;
14 import java.util.HashSet;
15 import java.util.Iterator;
16 import java.util.Set;
17
18 import org.eclipse.jface.dialogs.MessageDialog;
19 import org.eclipse.jface.viewers.IStructuredSelection;
20
21 import org.eclipse.jface.text.ITextSelection;
22
23 import org.eclipse.ui.IWorkbenchSite;
24 import org.eclipse.ui.PlatformUI;
25
26 import org.eclipse.jdt.core.IMember;
27 import org.eclipse.jdt.core.IType;
28 import org.eclipse.jdt.core.JavaModelException;
29
30 import org.eclipse.jdt.internal.corext.refactoring.RefactoringAvailabilityTester;
31 import org.eclipse.jdt.internal.corext.refactoring.RefactoringExecutionStarter;
32 import org.eclipse.jdt.internal.corext.util.JavaModelUtil;
33
34 import org.eclipse.jdt.internal.ui.IJavaHelpContextIds;
35 import org.eclipse.jdt.internal.ui.JavaPlugin;
36 import org.eclipse.jdt.internal.ui.actions.ActionUtil;
37 import org.eclipse.jdt.internal.ui.actions.SelectionConverter;
38 import org.eclipse.jdt.internal.ui.javaeditor.JavaEditor;
39 import org.eclipse.jdt.internal.ui.javaeditor.JavaTextSelection;
40 import org.eclipse.jdt.internal.ui.refactoring.RefactoringMessages;
41 import org.eclipse.jdt.internal.ui.util.ExceptionHandler;
42
43 /**
44  * Action to push down methods and fields into subclasses.
45  * <p>
46  * Action is applicable to selections containing elements of type
47  * <code>IField</code> and <code>IMethod</code>.
48  *
49  * <p>
50  * This class may be instantiated; it is not intended to be subclassed.
51  * </p>
52  *
53  * @since 2.1
54  *
55  * @noextend This class is not intended to be subclassed by clients.
56  */
57 public class PushDownAction extends SelectionDispatchAction {
58
59         private static IMember[] getSelectedMembers(IStructuredSelection selection) {
60                 if (selection.isEmpty())
61                         return null;
62                 if (selection.size() == 1) {
63                         try {
64                                 final IType type= RefactoringAvailabilityTester.getSingleSelectedType(selection);
65                                 if (type != null)
66                                         return new IType[] { type};
67                         } catch (JavaModelException exception) {
68                                 JavaPlugin.log(exception);
69                         }
70                 }
71                 for (Iterator<?> iter= selection.iterator(); iter.hasNext();) {
72                         if (!(iter.next() instanceof IMember))
73                                 return null;
74                 }
75                 Set<Object> memberSet= new HashSet<Object>();
76                 memberSet.addAll(Arrays.asList(selection.toArray()));
77                 return memberSet.toArray(new IMember[memberSet.size()]);
78         }
79
80         public JavaEditor fEditor;
81
82         /**
83          * Note: This constructor is for internal use only. Clients should not call
84          * this constructor.
85          *
86          * @param editor the java editor
87          *
88          * @noreference This constructor is not intended to be referenced by clients.
89          */
90         public PushDownAction(JavaEditor editor) {
91                 this(editor.getEditorSite());
92                 fEditor= editor;
93                 setEnabled(SelectionConverter.canOperateOn(fEditor));
94         }
95
96         /**
97          * Creates a new <code>PushDownAction</code>. The action requires that
98          * the selection provided by the site's selection provider is of type <code>
99          * org.eclipse.jface.viewers.IStructuredSelection</code>.
100          *
101          * @param site
102          *            the site providing context information for this action
103          */
104         public PushDownAction(IWorkbenchSite site) {
105                 super(site);
106                 setText(RefactoringMessages.PushDownAction_Push_Down);
107                 PlatformUI.getWorkbench().getHelpSystem().setHelp(this, IJavaHelpContextIds.PUSH_DOWN_ACTION);
108         }
109
110         private IMember getSelectedMemberFromEditor() throws JavaModelException {
111                 return fEditor.generated_1379287974725836368();
112         }
113
114         /**
115          * {@inheritDoc}
116          */
117         @Override
118         public void run(IStructuredSelection selection) {
119                 try {
120                         IMember[] members= getSelectedMembers(selection);
121                         if (RefactoringAvailabilityTester.isPushDownAvailable(members) && ActionUtil.isEditable(getShell(), members[0]))
122                                 RefactoringExecutionStarter.startPushDownRefactoring(members, getShell());
123                 } catch (JavaModelException e) {
124                         ExceptionHandler.handle(e, RefactoringMessages.OpenRefactoringWizardAction_refactoring, RefactoringMessages.OpenRefactoringWizardAction_exception);
125                 }
126         }
127
128         /**
129          * {@inheritDoc}
130          */
131         @Override
132         public void run(ITextSelection selection) {
133                 try {
134                         if (!ActionUtil.isEditable(fEditor))
135                                 return;
136                         IMember member= getSelectedMemberFromEditor();
137                         IMember[] array= new IMember[] { member};
138                         if (member != null && RefactoringAvailabilityTester.isPushDownAvailable(array)) {
139                                 RefactoringExecutionStarter.startPushDownRefactoring(array, getShell());
140                         } else {
141                                 MessageDialog.openInformation(getShell(), RefactoringMessages.OpenRefactoringWizardAction_unavailable, RefactoringMessages.PushDownAction_To_activate);
142                         }
143                 } catch (JavaModelException e) {
144                         ExceptionHandler.handle(e, RefactoringMessages.OpenRefactoringWizardAction_refactoring, RefactoringMessages.OpenRefactoringWizardAction_exception);
145                 }
146         }
147
148         /**
149          * {@inheritDoc}
150          */
151         @Override
152         public void selectionChanged(IStructuredSelection selection) {
153                 try {
154                         setEnabled(RefactoringAvailabilityTester.isPushDownAvailable(selection));
155                 } catch (JavaModelException e) {
156                         // http://bugs.eclipse.org/bugs/show_bug.cgi?id=19253
157                         if (JavaModelUtil.isExceptionToBeLogged(e))
158                                 JavaPlugin.log(e);
159                         setEnabled(false);// no UI
160                 }
161         }
162
163         /**
164          * {@inheritDoc}
165          */
166         @Override
167         public void selectionChanged(ITextSelection selection) {
168                 setEnabled(true);
169         }
170
171         /**
172          * Note: This method is for internal use only. Clients should not call this method.
173          * 
174          * @param selection the Java text selection
175          * @noreference This method is not intended to be referenced by clients.
176          */
177         @Override
178         public void selectionChanged(JavaTextSelection selection) {
179                 try {
180                         setEnabled(RefactoringAvailabilityTester.isPushDownAvailable(selection));
181                 } catch (JavaModelException e) {
182                         setEnabled(false);
183                 }
184         }
185 }