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.preferences;
011:
012: import java.util.List;
013:
014: import org.eclipse.core.runtime.Assert;
015: import org.eclipse.core.runtime.IStatus;
016:
017: import org.eclipse.swt.SWT;
018: import org.eclipse.swt.widgets.Composite;
019: import org.eclipse.swt.widgets.Control;
020: import org.eclipse.swt.widgets.Shell;
021: import org.eclipse.swt.widgets.Text;
022:
023: import org.eclipse.jface.dialogs.IDialogConstants;
024: import org.eclipse.jface.dialogs.StatusDialog;
025:
026: import org.eclipse.ui.PlatformUI;
027:
028: import org.eclipse.jdt.core.IPackageFragment;
029: import org.eclipse.jdt.core.JavaConventions;
030: import org.eclipse.jdt.core.JavaCore;
031: import org.eclipse.jdt.core.search.IJavaSearchScope;
032: import org.eclipse.jdt.core.search.SearchEngine;
033:
034: import org.eclipse.jdt.internal.corext.util.Messages;
035:
036: import org.eclipse.jdt.internal.ui.IJavaHelpContextIds;
037: import org.eclipse.jdt.internal.ui.dialogs.PackageSelectionDialog;
038: import org.eclipse.jdt.internal.ui.dialogs.StatusInfo;
039: import org.eclipse.jdt.internal.ui.dialogs.TextFieldNavigationHandler;
040: import org.eclipse.jdt.internal.ui.util.BusyIndicatorRunnableContext;
041: import org.eclipse.jdt.internal.ui.wizards.dialogfields.DialogField;
042: import org.eclipse.jdt.internal.ui.wizards.dialogfields.IDialogFieldListener;
043: import org.eclipse.jdt.internal.ui.wizards.dialogfields.IStringButtonAdapter;
044: import org.eclipse.jdt.internal.ui.wizards.dialogfields.LayoutUtil;
045: import org.eclipse.jdt.internal.ui.wizards.dialogfields.StringButtonDialogField;
046:
047: /**
048: * Dialog to enter a new entry in the type filter preference page.
049: */
050: public class TypeFilterInputDialog extends StatusDialog {
051:
052: private class TypeFilterInputAdapter implements
053: IDialogFieldListener, IStringButtonAdapter {
054: /*
055: * @see IDialogFieldListener#dialogFieldChanged(DialogField)
056: */
057: public void dialogFieldChanged(DialogField field) {
058: doValidation();
059: }
060:
061: /*
062: * @see IStringButtonAdapter#changeControlPressed(DialogField)
063: */
064: public void changeControlPressed(DialogField field) {
065: doButtonPressed();
066: }
067: }
068:
069: private StringButtonDialogField fNameDialogField;
070: private List fExistingEntries;
071:
072: public TypeFilterInputDialog(Shell parent, List existingEntries) {
073: super (parent);
074:
075: fExistingEntries = existingEntries;
076:
077: setTitle(PreferencesMessages.TypeFilterInputDialog_title);
078:
079: TypeFilterInputAdapter adapter = new TypeFilterInputAdapter();
080:
081: fNameDialogField = new StringButtonDialogField(adapter);
082: fNameDialogField
083: .setLabelText(PreferencesMessages.TypeFilterInputDialog_message);
084: fNameDialogField
085: .setButtonLabel(PreferencesMessages.TypeFilterInputDialog_browse_button);
086: fNameDialogField.setDialogFieldListener(adapter);
087:
088: fNameDialogField.setText(""); //$NON-NLS-1$
089: }
090:
091: public void setInitialString(String input) {
092: Assert.isNotNull(input);
093: fNameDialogField.setText(input);
094: }
095:
096: public Object getResult() {
097: return fNameDialogField.getText();
098: }
099:
100: protected Control createDialogArea(Composite parent) {
101: Composite composite = (Composite) super
102: .createDialogArea(parent);
103:
104: Composite inner = new Composite(composite, SWT.NONE);
105: LayoutUtil.doDefaultLayout(inner,
106: new DialogField[] { fNameDialogField }, true, 0, 0);
107:
108: int fieldWidthHint = convertWidthInCharsToPixels(60);
109: Text text = fNameDialogField.getTextControl(null);
110: LayoutUtil.setWidthHint(text, fieldWidthHint);
111: LayoutUtil.setHorizontalGrabbing(text);
112: TextFieldNavigationHandler.install(text);
113:
114: fNameDialogField.postSetFocusOnDialogField(parent.getDisplay());
115:
116: applyDialogFont(composite);
117: return composite;
118: }
119:
120: private void doButtonPressed() {
121: IJavaSearchScope scope = SearchEngine.createWorkspaceScope();
122: BusyIndicatorRunnableContext context = new BusyIndicatorRunnableContext();
123: int flags = PackageSelectionDialog.F_SHOW_PARENTS
124: | PackageSelectionDialog.F_HIDE_DEFAULT_PACKAGE
125: | PackageSelectionDialog.F_REMOVE_DUPLICATES;
126: PackageSelectionDialog dialog = new PackageSelectionDialog(
127: getShell(), context, flags, scope);
128: dialog
129: .setTitle(PreferencesMessages.TypeFilterInputDialog_choosepackage_label);
130: dialog
131: .setMessage(PreferencesMessages.TypeFilterInputDialog_choosepackage_description);
132: dialog.setMultipleSelection(false);
133: dialog.setFilter(fNameDialogField.getText());
134: if (dialog.open() == IDialogConstants.OK_ID) {
135: IPackageFragment res = (IPackageFragment) dialog
136: .getFirstResult();
137: fNameDialogField.setText(res.getElementName() + "*"); //$NON-NLS-1$
138: }
139: }
140:
141: private void doValidation() {
142: StatusInfo status = new StatusInfo();
143: String newText = fNameDialogField.getText();
144: if (newText.length() == 0) {
145: status
146: .setError(PreferencesMessages.TypeFilterInputDialog_error_enterName);
147: } else {
148: newText = newText.replace('*', 'X').replace('?', 'Y');
149: IStatus val = JavaConventions.validatePackageName(newText,
150: JavaCore.VERSION_1_3, JavaCore.VERSION_1_3);
151: if (val.matches(IStatus.ERROR)) {
152: status
153: .setError(Messages
154: .format(
155: PreferencesMessages.TypeFilterInputDialog_error_invalidName,
156: val.getMessage()));
157: } else {
158: if (fExistingEntries.contains(newText)) {
159: status
160: .setError(PreferencesMessages.TypeFilterInputDialog_error_entryExists);
161: }
162: }
163: }
164: updateStatus(status);
165: }
166:
167: /*
168: * @see org.eclipse.jface.window.Window#configureShell(Shell)
169: */
170: protected void configureShell(Shell newShell) {
171: super.configureShell(newShell);
172: PlatformUI.getWorkbench().getHelpSystem().setHelp(newShell,
173: IJavaHelpContextIds.IMPORT_ORGANIZE_INPUT_DIALOG);
174: }
175: }
|