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
9 * IBM Corporation - initial API and implementation
10 *******************************************************************************/
11 package org.eclipse.jdt.internal.ui.refactoring;
13 import java.util.ArrayList;
14 import java.util.List;
16 import org.eclipse.swt.SWT;
17 import org.eclipse.swt.events.ModifyEvent;
18 import org.eclipse.swt.events.ModifyListener;
19 import org.eclipse.swt.events.SelectionAdapter;
20 import org.eclipse.swt.events.SelectionEvent;
21 import org.eclipse.swt.layout.GridData;
22 import org.eclipse.swt.layout.GridLayout;
23 import org.eclipse.swt.widgets.Button;
24 import org.eclipse.swt.widgets.Combo;
25 import org.eclipse.swt.widgets.Composite;
26 import org.eclipse.swt.widgets.Label;
27 import org.eclipse.swt.widgets.Text;
29 import org.eclipse.jface.wizard.IWizardPage;
31 import org.eclipse.ui.PlatformUI;
33 import org.eclipse.ltk.core.refactoring.RefactoringStatus;
34 import org.eclipse.ltk.ui.refactoring.UserInputWizardPage;
36 import org.eclipse.jdt.core.IJavaElement;
37 import org.eclipse.jdt.core.IJavaProject;
38 import org.eclipse.jdt.core.IType;
39 import org.eclipse.jdt.core.search.IJavaSearchConstants;
40 import org.eclipse.jdt.core.search.IJavaSearchScope;
41 import org.eclipse.jdt.core.search.SearchEngine;
43 import org.eclipse.jdt.internal.corext.refactoring.code.IntroduceIndirectionRefactoring;
45 import org.eclipse.jdt.internal.ui.IJavaHelpContextIds;
46 import org.eclipse.jdt.internal.ui.dialogs.FilteredTypesSelectionDialog;
47 import org.eclipse.jdt.internal.ui.dialogs.TextFieldNavigationHandler;
48 import org.eclipse.jdt.internal.ui.refactoring.contentassist.JavaTypeCompletionProcessor;
49 import org.eclipse.jdt.internal.ui.util.SWTUtil;
54 public class IntroduceIndirectionInputPage extends UserInputWizardPage {
57 * The name of the intermediary method to be created.
59 private Text fIntermediaryMethodName;
61 private Combo fIntermediaryTypeName;
62 private static final int INTERMEDIARY_TYPE_COUNT= 10;
63 private static List<String> fgIntermediaryTypes= new ArrayList<String>(INTERMEDIARY_TYPE_COUNT);
66 * Constructor for IntroduceIndirectionInputPage.
67 * @param name the name of the page
69 public IntroduceIndirectionInputPage(String name) {
73 private Text createIntermediaryNameCombo(Composite result) {
74 final Text textField= new Text(result, SWT.SINGLE | SWT.LEFT | SWT.BORDER);
75 textField.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
76 TextFieldNavigationHandler.install(textField);
80 private Combo createIntermediaryTypeCombo(Composite composite) {
81 final Combo textCombo= new Combo(composite, SWT.SINGLE | SWT.BORDER);
82 textCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
83 textCombo.setItems(fgIntermediaryTypes.toArray(new String[fgIntermediaryTypes.size()]));
84 textCombo.setVisibleItemCount(INTERMEDIARY_TYPE_COUNT);
86 JavaTypeCompletionProcessor processor= new JavaTypeCompletionProcessor(false, false, true);
87 processor.generated_4678007740975691192(textCombo, this);
92 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
94 public void createControl(Composite parent) {
95 Composite result= new Composite(parent, SWT.NONE);
99 GridLayout layout= new GridLayout();
100 layout.numColumns= 2;
101 result.setLayout(layout);
103 Label methNameLabel= new Label(result, SWT.NONE);
104 methNameLabel.setText(RefactoringMessages.IntroduceIndirectionInputPage_new_method_name);
106 fIntermediaryMethodName= createIntermediaryNameCombo(result);
108 final Label intermediaryTypeLabel= new Label(result, SWT.NONE);
109 intermediaryTypeLabel.setText(RefactoringMessages.IntroduceIndirectionInputPage_declaring_class);
111 Composite inner= new Composite(result, SWT.NONE);
112 GridLayout innerLayout= new GridLayout();
113 innerLayout.marginHeight= 0;
114 innerLayout.marginWidth= 0;
115 innerLayout.numColumns= 2;
116 inner.setLayout(innerLayout);
117 inner.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
119 fIntermediaryTypeName= createIntermediaryTypeCombo(inner);
120 fIntermediaryTypeName.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
122 final Button browseTypes= new Button(inner, SWT.PUSH);
123 browseTypes.setText(RefactoringMessages.IntroduceIndirectionInputPage_browse);
124 GridData gd= new GridData();
125 gd.horizontalAlignment= GridData.END;
126 gd.widthHint= SWTUtil.getButtonWidthHint(browseTypes);
127 browseTypes.setLayoutData(gd);
129 final Button enableReferencesCheckBox= new Button(result, SWT.CHECK);
130 enableReferencesCheckBox.setText(RefactoringMessages.IntroduceIndirectionInputPage_update_references);
131 gd= new GridData(GridData.FILL_HORIZONTAL);
132 gd.horizontalSpan= 2;
133 gd.verticalIndent= 2;
134 enableReferencesCheckBox.setLayoutData(gd);
136 fIntermediaryMethodName.setText(getIntroduceIndirectionRefactoring().getIntermediaryMethodName());
137 fIntermediaryTypeName.setText(getIntroduceIndirectionRefactoring().getIntermediaryClassName());
139 fIntermediaryMethodName.addModifyListener(new ModifyListener() {
140 public void modifyText(ModifyEvent e) {
145 enableReferencesCheckBox.addSelectionListener(new SelectionAdapter() {
147 public void widgetSelected(SelectionEvent e) {
148 getIntroduceIndirectionRefactoring().setEnableUpdateReferences(enableReferencesCheckBox.getSelection());
152 fIntermediaryTypeName.addModifyListener(new ModifyListener() {
153 public void modifyText(ModifyEvent e) {
158 browseTypes.addSelectionListener(new SelectionAdapter() {
160 public void widgetSelected(SelectionEvent e) {
161 IType intermediaryType= chooseIntermediaryClass();
163 if (intermediaryType == null)
166 fIntermediaryTypeName.setText(intermediaryType.getFullyQualifiedName('.'));
170 if (getIntroduceIndirectionRefactoring().canEnableUpdateReferences())
171 enableReferencesCheckBox.setSelection(true);
173 enableReferencesCheckBox.setSelection(false);
174 enableReferencesCheckBox.setEnabled(false);
175 getIntroduceIndirectionRefactoring().setEnableUpdateReferences(false);
178 fIntermediaryMethodName.setFocus();
179 fIntermediaryMethodName.selectAll();
182 PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(), IJavaHelpContextIds.INTRODUCE_INDIRECTION_WIZARD_PAGE);
185 private IType chooseIntermediaryClass() {
186 IJavaProject proj= getIntroduceIndirectionRefactoring().getProject();
191 IJavaElement[] elements= new IJavaElement[] { proj };
192 IJavaSearchScope scope= SearchEngine.createJavaSearchScope(elements);
194 FilteredTypesSelectionDialog dialog= new FilteredTypesSelectionDialog(getShell(), false, getWizard().getContainer(), scope, IJavaSearchConstants.CLASS);
196 return dialog.generated_1810288139041559918();
199 public IntroduceIndirectionRefactoring getIntroduceIndirectionRefactoring() {
200 return (IntroduceIndirectionRefactoring) getRefactoring();
203 private void validateInput() {
204 RefactoringStatus merged= new RefactoringStatus();
205 merged.merge(getIntroduceIndirectionRefactoring().setIntermediaryClassName(fIntermediaryTypeName.getText()));
206 merged.merge(getIntroduceIndirectionRefactoring().setIntermediaryMethodName(fIntermediaryMethodName.getText()));
208 setPageComplete(!merged.hasError());
209 int severity= merged.getSeverity();
210 String message= merged.getMessageMatchingSeverity(severity);
211 if (severity >= RefactoringStatus.INFO) {
212 setMessage(message, severity);
214 setMessage("", NONE); //$NON-NLS-1$
219 protected boolean performFinish() {
220 storeIntermediaryTypeName();
221 return super.performFinish();
225 public IWizardPage getNextPage() {
226 storeIntermediaryTypeName();
227 return super.getNextPage();
230 private void storeIntermediaryTypeName() {
231 String destination= fIntermediaryTypeName.getText();
232 if (!fgIntermediaryTypes.remove(destination) && fgIntermediaryTypes.size() >= INTERMEDIARY_TYPE_COUNT)
233 fgIntermediaryTypes.remove(fgIntermediaryTypes.size() - 1);
234 fgIntermediaryTypes.add(0, destination);