001: /*******************************************************************************
002: * Copyright (c) 2000, 2006 IBM Corporation and others.
003: * All rights reserved. This program and the accompanying materials
004: * are made available under the terms of the Eclipse Public License v1.0
005: * which accompanies this distribution, and is available at
006: * http://www.eclipse.org/legal/epl-v10.html
007: *
008: * Contributors:
009: * IBM Corporation - initial API and implementation
010: *******************************************************************************/package org.eclipse.jdt.internal.ui.refactoring;
011:
012: import org.eclipse.swt.SWT;
013: import org.eclipse.swt.events.ModifyEvent;
014: import org.eclipse.swt.events.ModifyListener;
015: import org.eclipse.swt.events.SelectionAdapter;
016: import org.eclipse.swt.events.SelectionEvent;
017: import org.eclipse.swt.layout.GridData;
018: import org.eclipse.swt.layout.GridLayout;
019: import org.eclipse.swt.widgets.Button;
020: import org.eclipse.swt.widgets.Combo;
021: import org.eclipse.swt.widgets.Composite;
022: import org.eclipse.swt.widgets.Control;
023: import org.eclipse.swt.widgets.Label;
024: import org.eclipse.swt.widgets.TabFolder;
025: import org.eclipse.swt.widgets.TabItem;
026: import org.eclipse.swt.widgets.Text;
027:
028: import org.eclipse.jface.dialogs.Dialog;
029: import org.eclipse.jface.preference.IPreferenceStore;
030: import org.eclipse.jface.resource.JFaceResources;
031:
032: import org.eclipse.jface.text.Document;
033:
034: import org.eclipse.ui.PlatformUI;
035:
036: import org.eclipse.ltk.core.refactoring.RefactoringStatus;
037: import org.eclipse.ltk.ui.refactoring.RefactoringWizard;
038: import org.eclipse.ltk.ui.refactoring.UserInputWizardPage;
039:
040: import org.eclipse.jdt.core.JavaModelException;
041: import org.eclipse.jdt.core.dom.Modifier;
042:
043: import org.eclipse.jdt.internal.corext.refactoring.ParameterInfo;
044: import org.eclipse.jdt.internal.corext.refactoring.StubTypeContext;
045: import org.eclipse.jdt.internal.corext.refactoring.structure.ChangeSignatureRefactoring;
046: import org.eclipse.jdt.internal.corext.util.JdtFlags;
047:
048: import org.eclipse.jdt.ui.PreferenceConstants;
049: import org.eclipse.jdt.ui.text.JavaSourceViewerConfiguration;
050:
051: import org.eclipse.jdt.internal.ui.IJavaHelpContextIds;
052: import org.eclipse.jdt.internal.ui.JavaPlugin;
053: import org.eclipse.jdt.internal.ui.dialogs.TextFieldNavigationHandler;
054: import org.eclipse.jdt.internal.ui.javaeditor.JavaSourceViewer;
055: import org.eclipse.jdt.internal.ui.refactoring.contentassist.ControlContentAssistHelper;
056: import org.eclipse.jdt.internal.ui.refactoring.contentassist.JavaTypeCompletionProcessor;
057: import org.eclipse.jdt.internal.ui.util.ExceptionHandler;
058: import org.eclipse.jdt.internal.ui.util.PixelConverter;
059:
060: public class ChangeSignatureWizard extends RefactoringWizard {
061:
062: public ChangeSignatureWizard(ChangeSignatureRefactoring ref) {
063: super (ref, DIALOG_BASED_USER_INTERFACE);
064: setDefaultPageTitle(RefactoringMessages.ChangeSignatureRefactoring_modify_Parameters);
065: }
066:
067: protected void addUserInputPages() {
068: addPage(new ChangeSignatureInputPage());
069: }
070:
071: private static class ChangeSignatureInputPage extends
072: UserInputWizardPage {
073:
074: public static final String PAGE_NAME = "ChangeSignatureInputPage"; //$NON-NLS-1$
075: private JavaSourceViewer fSignaturePreview;
076: private Document fSignaturePreviewDocument;
077: private Button fLeaveDelegateCheckBox;
078: private Button fDeprecateDelegateCheckBox;
079:
080: public ChangeSignatureInputPage() {
081: super (PAGE_NAME);
082: setMessage(RefactoringMessages.ChangeSignatureInputPage_change);
083: fSignaturePreviewDocument = new Document();
084: }
085:
086: /*
087: * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
088: */
089: public void createControl(Composite parent) {
090: Composite composite = new Composite(parent, SWT.NONE);
091: final GridLayout layout = new GridLayout();
092: composite.setLayout(layout);
093: initializeDialogUnits(composite);
094:
095: try {
096: createHeadControls(composite);
097:
098: createParameterExceptionsFolder(composite);
099: fLeaveDelegateCheckBox = DelegateUIHelper
100: .generateLeaveDelegateCheckbox(composite,
101: getRefactoring(), false);
102: if (fLeaveDelegateCheckBox != null) {
103: fDeprecateDelegateCheckBox = new Button(composite,
104: SWT.CHECK);
105: GridData data = new GridData();
106: data.horizontalAlignment = GridData.FILL;
107: data.horizontalIndent = (layout.marginWidth + fDeprecateDelegateCheckBox
108: .computeSize(SWT.DEFAULT, SWT.DEFAULT).x);
109: data.horizontalSpan = 2;
110: fDeprecateDelegateCheckBox.setLayoutData(data);
111: fDeprecateDelegateCheckBox.setText(DelegateUIHelper
112: .getDeprecateDelegateCheckBoxTitle());
113: final ChangeSignatureRefactoring refactoring = getChangeMethodSignatureRefactoring();
114: fDeprecateDelegateCheckBox
115: .setSelection(DelegateUIHelper
116: .loadDeprecateDelegateSetting(refactoring));
117: refactoring
118: .setDeprecateDelegates(fDeprecateDelegateCheckBox
119: .getSelection());
120: fDeprecateDelegateCheckBox
121: .addSelectionListener(new SelectionAdapter() {
122: public void widgetSelected(
123: SelectionEvent e) {
124: refactoring
125: .setDeprecateDelegates(fDeprecateDelegateCheckBox
126: .getSelection());
127: }
128: });
129: fDeprecateDelegateCheckBox
130: .setEnabled(fLeaveDelegateCheckBox
131: .getSelection());
132: fLeaveDelegateCheckBox
133: .addSelectionListener(new SelectionAdapter() {
134: public void widgetSelected(
135: SelectionEvent e) {
136: fDeprecateDelegateCheckBox
137: .setEnabled(fLeaveDelegateCheckBox
138: .getSelection());
139: }
140: });
141: }
142: Label sep = new Label(composite, SWT.SEPARATOR
143: | SWT.HORIZONTAL);
144: sep.setLayoutData((new GridData(
145: GridData.FILL_HORIZONTAL)));
146: createSignaturePreview(composite);
147:
148: update(false);
149: setControl(composite);
150: Dialog.applyDialogFont(composite);
151: } catch (JavaModelException e) {
152: ExceptionHandler
153: .handle(
154: e,
155: RefactoringMessages.ChangeSignatureInputPage_Change_Signature,
156: RefactoringMessages.ChangeSignatureInputPage_Internal_Error);
157: }
158: PlatformUI.getWorkbench().getHelpSystem().setHelp(
159: composite,
160: IJavaHelpContextIds.MODIFY_PARAMETERS_WIZARD_PAGE);
161: }
162:
163: private void createHeadControls(Composite parent)
164: throws JavaModelException {
165: //must create controls column-wise to get mnemonics working:
166: Composite composite = new Composite(parent, SWT.NONE);
167: composite.setLayoutData(new GridData(
168: GridData.FILL_HORIZONTAL));
169: GridLayout layout = new GridLayout(3, false);
170: layout.marginHeight = 0;
171: layout.marginWidth = 0;
172: composite.setLayout(layout);
173:
174: createAccessControl(composite);
175: createReturnTypeControl(composite);
176: createNameControl(composite);
177: }
178:
179: private void createAccessControl(Composite parent)
180: throws JavaModelException {
181: Composite access = new Composite(parent, SWT.NONE);
182: GridLayout layout = new GridLayout();
183: layout.marginHeight = 0;
184: layout.marginWidth = 0;
185: access.setLayout(layout);
186:
187: final int[] availableVisibilities = getChangeMethodSignatureRefactoring()
188: .getAvailableVisibilities();
189: int currentVisibility = getChangeMethodSignatureRefactoring()
190: .getVisibility();
191:
192: Label label = new Label(access, SWT.NONE);
193: label
194: .setText(RefactoringMessages.ChangeSignatureInputPage_access_modifier);
195:
196: final Combo combo = new Combo(access, SWT.DROP_DOWN
197: | SWT.READ_ONLY);
198: if (availableVisibilities.length == 0) {
199: combo.setEnabled(false);
200: } else {
201: for (int i = 0; i < availableVisibilities.length; i++) {
202: combo
203: .add(getAccessModifierString(availableVisibilities[i]));
204: }
205: combo.addSelectionListener(new SelectionAdapter() {
206: public void widgetSelected(SelectionEvent e) {
207: int newVisibility = availableVisibilities[combo
208: .getSelectionIndex()];
209: getChangeMethodSignatureRefactoring()
210: .setVisibility(newVisibility);
211: update(true);
212: }
213: });
214: }
215: combo.setText(getAccessModifierString(currentVisibility));
216: combo.setLayoutData(new GridData(
217: GridData.HORIZONTAL_ALIGN_FILL));
218:
219: // ensure that "Access modifier:" and "Return type:" Labels are not too close:
220: Dialog.applyDialogFont(access);
221: access.pack();
222: int minLabelWidth = label.getSize().x + 3
223: * layout.horizontalSpacing;
224: if (minLabelWidth > combo.getSize().x)
225: label.setLayoutData(new GridData(minLabelWidth, label
226: .getSize().y));
227: }
228:
229: private String getAccessModifierString(int modifier) {
230: switch (modifier) {
231: case Modifier.PUBLIC:
232: return JdtFlags.VISIBILITY_STRING_PUBLIC;
233: case Modifier.PROTECTED:
234: return JdtFlags.VISIBILITY_STRING_PROTECTED;
235: case Modifier.NONE:
236: return RefactoringMessages.ChangeSignatureInputPage_default;
237: case Modifier.PRIVATE:
238: return JdtFlags.VISIBILITY_STRING_PRIVATE;
239: default:
240: throw new IllegalArgumentException(
241: "\"" + modifier + "\" is not a Modifier constant"); //$NON-NLS-1$ //$NON-NLS-2$
242: }
243: }
244:
245: private void createReturnTypeControl(Composite parent) {
246: Composite returnType = new Composite(parent, SWT.NONE);
247: returnType.setLayoutData(new GridData(GridData.FILL_BOTH));
248: GridLayout layout = new GridLayout(1, false);
249: layout.marginHeight = 0;
250: layout.marginWidth = 0;
251: returnType.setLayout(layout);
252:
253: Label label = new Label(returnType, SWT.NONE);
254: label
255: .setText(RefactoringMessages.ChangeSignatureInputPage_return_type);
256:
257: final Text text = new Text(returnType, SWT.BORDER);
258: text.setText(getChangeMethodSignatureRefactoring()
259: .getReturnTypeString());
260: text
261: .setLayoutData((new GridData(
262: GridData.FILL_HORIZONTAL)));
263: TextFieldNavigationHandler.install(text);
264:
265: if (getChangeMethodSignatureRefactoring()
266: .canChangeNameAndReturnType()) {
267: text.addModifyListener(new ModifyListener() {
268: public void modifyText(ModifyEvent e) {
269: getChangeMethodSignatureRefactoring()
270: .setNewReturnTypeName(text.getText());
271: update(true);
272: }
273: });
274: } else {
275: text.setEnabled(false);
276: }
277:
278: JavaTypeCompletionProcessor processor = new JavaTypeCompletionProcessor(
279: true, true);
280: StubTypeContext stubTypeContext = getChangeMethodSignatureRefactoring()
281: .getStubTypeContext();
282: processor.setCompletionContext(stubTypeContext
283: .getCuHandle(), stubTypeContext.getBeforeString(),
284: stubTypeContext.getAfterString());
285: ControlContentAssistHelper.createTextContentAssistant(text,
286: processor);
287: }
288:
289: private void createNameControl(Composite parent) {
290: Composite name = new Composite(parent, SWT.NONE);
291: name.setLayoutData(new GridData(GridData.FILL_BOTH));
292: GridLayout layout = new GridLayout(1, false);
293: layout.marginHeight = 0;
294: layout.marginWidth = 0;
295: name.setLayout(layout);
296:
297: Label label = new Label(name, SWT.NONE);
298: label
299: .setText(RefactoringMessages.ChangeSignatureInputPage_method_name);
300:
301: final Text text = new Text(name, SWT.BORDER);
302: text.setText(getChangeMethodSignatureRefactoring()
303: .getMethodName());
304: text
305: .setLayoutData((new GridData(
306: GridData.FILL_HORIZONTAL)));
307: TextFieldNavigationHandler.install(text);
308:
309: if (getChangeMethodSignatureRefactoring()
310: .canChangeNameAndReturnType()) {
311: text.addModifyListener(new ModifyListener() {
312: public void modifyText(ModifyEvent e) {
313: getChangeMethodSignatureRefactoring()
314: .setNewMethodName(text.getText());
315: update(true);
316: }
317: });
318: } else {
319: text.setEnabled(false);
320: }
321: }
322:
323: private void createParameterExceptionsFolder(Composite composite) {
324: TabFolder folder = new TabFolder(composite, SWT.TOP);
325: folder.setLayoutData(new GridData(GridData.FILL_BOTH));
326:
327: TabItem item = new TabItem(folder, SWT.NONE);
328: item
329: .setText(RefactoringMessages.ChangeSignatureInputPage_parameters);
330: item.setControl(createParameterTableControl(folder));
331:
332: TabItem itemEx = new TabItem(folder, SWT.NONE);
333: itemEx
334: .setText(RefactoringMessages.ChangeSignatureInputPage_exceptions);
335: itemEx.setControl(createExceptionsTableControl(folder));
336:
337: folder.addSelectionListener(new SelectionAdapter() {
338: public void widgetSelected(SelectionEvent e) {
339: ((TabItem) e.item).getControl().setFocus();
340: }
341: });
342: }
343:
344: private Control createParameterTableControl(Composite composite) {
345: Composite border = new Composite(composite, SWT.NONE);
346: border.setLayout(new GridLayout());
347:
348: String labelText = null; //no label
349: ChangeParametersControl cp = new ChangeParametersControl(
350: border,
351: SWT.NONE,
352: labelText,
353: new IParameterListChangeListener() {
354: public void parameterChanged(
355: ParameterInfo parameter) {
356: update(true);
357: }
358:
359: public void parameterListChanged() {
360: update(true);
361: }
362:
363: public void parameterAdded(
364: ParameterInfo parameter) {
365: update(true);
366: }
367: },
368: ChangeParametersControl.Mode.CHANGE_METHOD_SIGNATURE,
369: getChangeMethodSignatureRefactoring()
370: .getStubTypeContext());
371: cp.setLayoutData(new GridData(GridData.FILL_BOTH));
372: cp.setInput(getChangeMethodSignatureRefactoring()
373: .getParameterInfos());
374: return border;
375: }
376:
377: private Control createExceptionsTableControl(Composite parent) {
378: Composite border = new Composite(parent, SWT.NONE);
379: border.setLayout(new GridLayout());
380:
381: ChangeExceptionsControl cp = new ChangeExceptionsControl(
382: border, SWT.NONE,
383: new IExceptionListChangeListener() {
384: public void exceptionListChanged() {
385: update(true);
386: }
387: }, getChangeMethodSignatureRefactoring()
388: .getMethod().getJavaProject());
389: cp.setLayoutData(new GridData(GridData.FILL_BOTH));
390: cp.setInput(getChangeMethodSignatureRefactoring()
391: .getExceptionInfos());
392: return border;
393: }
394:
395: public void dispose() {
396: DelegateUIHelper
397: .saveLeaveDelegateSetting(fLeaveDelegateCheckBox);
398: DelegateUIHelper
399: .saveDeprecateDelegateSetting(fDeprecateDelegateCheckBox);
400: super .dispose();
401: }
402:
403: private void createSignaturePreview(Composite composite) {
404: Label previewLabel = new Label(composite, SWT.NONE);
405: previewLabel
406: .setText(RefactoringMessages.ChangeSignatureInputPage_method_Signature_Preview);
407:
408: // //XXX: use ViewForm to draw a flat border. Beware of common problems with wrapping layouts
409: // //inside GridLayout. GridData must be constrained to force wrapping. See bug 9866 et al.
410: // ViewForm border= new ViewForm(composite, SWT.BORDER | SWT.FLAT);
411:
412: IPreferenceStore store = JavaPlugin.getDefault()
413: .getCombinedPreferenceStore();
414: fSignaturePreview = new JavaSourceViewer(composite, null,
415: null, false, SWT.READ_ONLY | SWT.V_SCROLL
416: | SWT.WRAP /*| SWT.BORDER*/, store);
417: fSignaturePreview
418: .configure(new JavaSourceViewerConfiguration(
419: JavaPlugin.getDefault().getJavaTextTools()
420: .getColorManager(), store, null,
421: null));
422: fSignaturePreview
423: .getTextWidget()
424: .setFont(
425: JFaceResources
426: .getFont(PreferenceConstants.EDITOR_TEXT_FONT));
427: fSignaturePreview.getTextWidget().setBackground(
428: composite.getBackground());
429: fSignaturePreview.setDocument(fSignaturePreviewDocument);
430: fSignaturePreview.setEditable(false);
431:
432: //Layouting problems with wrapped text: see https://bugs.eclipse.org/bugs/show_bug.cgi?id=9866
433: Control signaturePreviewControl = fSignaturePreview
434: .getControl();
435: PixelConverter pixelConverter = new PixelConverter(
436: signaturePreviewControl);
437: GridData gdata = new GridData(GridData.FILL_BOTH);
438: gdata.widthHint = pixelConverter
439: .convertWidthInCharsToPixels(50);
440: gdata.heightHint = pixelConverter
441: .convertHeightInCharsToPixels(2);
442: signaturePreviewControl.setLayoutData(gdata);
443:
444: // //XXX must force JavaSourceViewer text widget to wrap:
445: // border.setContent(signaturePreviewControl);
446: // GridData borderData= new GridData(GridData.FILL_BOTH);
447: // borderData.widthHint= gdata.widthHint;
448: // borderData.heightHint= gdata.heightHint;
449: // border.setLayoutData(borderData);
450: }
451:
452: private ChangeSignatureRefactoring getChangeMethodSignatureRefactoring() {
453: return (ChangeSignatureRefactoring) getRefactoring();
454: }
455:
456: private void update(boolean displayErrorMessage) {
457: updateStatus(displayErrorMessage);
458: updateSignaturePreview();
459: }
460:
461: private void updateStatus(boolean displayErrorMessage) {
462: try {
463: if (getChangeMethodSignatureRefactoring()
464: .isSignatureSameAsInitial()) {
465: if (displayErrorMessage)
466: setErrorMessage(RefactoringMessages.ChangeSignatureInputPage_unchanged);
467: else
468: setErrorMessage(null);
469: setPageComplete(false);
470: return;
471: }
472: RefactoringStatus nameCheck = getChangeMethodSignatureRefactoring()
473: .checkSignature();
474: if (displayErrorMessage) {
475: setPageComplete(nameCheck);
476: } else {
477: setErrorMessage(null);
478: setPageComplete(true);
479: }
480: } catch (JavaModelException e) {
481: setErrorMessage(RefactoringMessages.ChangeSignatureInputPage_Internal_Error);
482: setPageComplete(false);
483: JavaPlugin.log(e);
484: }
485: }
486:
487: private void updateSignaturePreview() {
488: try {
489: int top = fSignaturePreview.getTextWidget()
490: .getTopPixel();
491: fSignaturePreviewDocument
492: .set(getChangeMethodSignatureRefactoring()
493: .getNewMethodSignature());
494: fSignaturePreview.getTextWidget().setTopPixel(top);
495: } catch (JavaModelException e) {
496: ExceptionHandler
497: .handle(
498: e,
499: RefactoringMessages.ChangeSignatureRefactoring_modify_Parameters,
500: RefactoringMessages.ChangeSignatureInputPage_exception);
501: }
502: }
503: }
504: }
|