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.layout.GridLayout;
019: import org.eclipse.swt.widgets.Composite;
020: import org.eclipse.swt.widgets.Control;
021: import org.eclipse.swt.widgets.Shell;
022: import org.eclipse.swt.widgets.Text;
023:
024: import org.eclipse.jface.dialogs.StatusDialog;
025: import org.eclipse.jface.operation.IRunnableContext;
026: import org.eclipse.jface.window.Window;
027:
028: import org.eclipse.ui.PlatformUI;
029: import org.eclipse.ui.dialogs.SelectionDialog;
030:
031: import org.eclipse.jdt.core.IPackageFragment;
032: import org.eclipse.jdt.core.IType;
033: import org.eclipse.jdt.core.JavaConventions;
034: import org.eclipse.jdt.core.JavaCore;
035: import org.eclipse.jdt.core.JavaModelException;
036: import org.eclipse.jdt.core.search.IJavaSearchScope;
037: import org.eclipse.jdt.core.search.SearchEngine;
038:
039: import org.eclipse.jdt.ui.IJavaElementSearchConstants;
040: import org.eclipse.jdt.ui.JavaUI;
041:
042: import org.eclipse.jdt.internal.ui.IJavaHelpContextIds;
043: import org.eclipse.jdt.internal.ui.dialogs.PackageSelectionDialog;
044: import org.eclipse.jdt.internal.ui.dialogs.StatusInfo;
045: import org.eclipse.jdt.internal.ui.dialogs.TextFieldNavigationHandler;
046: import org.eclipse.jdt.internal.ui.preferences.ImportOrganizeConfigurationBlock.ImportOrderEntry;
047: import org.eclipse.jdt.internal.ui.util.BusyIndicatorRunnableContext;
048: import org.eclipse.jdt.internal.ui.util.ExceptionHandler;
049: import org.eclipse.jdt.internal.ui.wizards.dialogfields.DialogField;
050: import org.eclipse.jdt.internal.ui.wizards.dialogfields.IDialogFieldListener;
051: import org.eclipse.jdt.internal.ui.wizards.dialogfields.IStringButtonAdapter;
052: import org.eclipse.jdt.internal.ui.wizards.dialogfields.LayoutUtil;
053: import org.eclipse.jdt.internal.ui.wizards.dialogfields.SelectionButtonDialogField;
054: import org.eclipse.jdt.internal.ui.wizards.dialogfields.StringButtonDialogField;
055:
056: /**
057: * Dialog to enter a new package entry in the organize import preference page.
058: */
059: public class ImportOrganizeInputDialog extends StatusDialog {
060:
061: private class ImportOrganizeInputAdapter implements
062: IDialogFieldListener, IStringButtonAdapter {
063: /**
064: * @see IDialogFieldListener#dialogFieldChanged(DialogField)
065: */
066: public void dialogFieldChanged(DialogField field) {
067: doDialogFieldChanged(field);
068: }
069:
070: /**
071: * @see IStringButtonAdapter#changeControlPressed(DialogField)
072: */
073: public void changeControlPressed(DialogField field) {
074: doBrowsePackages();
075: }
076: }
077:
078: private StringButtonDialogField fNameDialogField;
079: private SelectionButtonDialogField fBrowseTypeButton;
080: private List fExistingEntries;
081: private final boolean fIsStatic;
082:
083: public ImportOrganizeInputDialog(Shell parent,
084: List/*<ImportOrderEntry>*/existingEntries, boolean isStatic) {
085: super (parent);
086: fIsStatic = isStatic;
087: setShellStyle(getShellStyle() | SWT.RESIZE);
088:
089: fExistingEntries = existingEntries;
090:
091: String label, title;
092: if (isStatic) {
093: title = PreferencesMessages.ImportOrganizeInputDialog_title_static;
094: label = PreferencesMessages.ImportOrganizeInputDialog_name_group_static_label;
095: } else {
096: title = PreferencesMessages.ImportOrganizeInputDialog_title;
097: label = PreferencesMessages.ImportOrganizeInputDialog_name_group_label;
098: }
099: setTitle(title);
100:
101: ImportOrganizeInputAdapter adapter = new ImportOrganizeInputAdapter();
102:
103: fNameDialogField = new StringButtonDialogField(adapter);
104: fNameDialogField.setLabelText(label);
105: fNameDialogField
106: .setButtonLabel(PreferencesMessages.ImportOrganizeInputDialog_browse_packages_button);
107: fNameDialogField.setDialogFieldListener(adapter);
108: fNameDialogField.setText(""); //$NON-NLS-1$
109:
110: fBrowseTypeButton = new SelectionButtonDialogField(SWT.PUSH);
111: fBrowseTypeButton
112: .setLabelText(PreferencesMessages.ImportOrganizeInputDialog_browse_types_label);
113: fBrowseTypeButton.setDialogFieldListener(adapter);
114: }
115:
116: public void setInitialSelection(ImportOrderEntry editedEntry) {
117: Assert.isNotNull(editedEntry);
118: if (editedEntry.name.length() == 0) {
119: fNameDialogField.setText(""); //$NON-NLS-1$
120: } else {
121: fNameDialogField.setText(editedEntry.name);
122: }
123: }
124:
125: public ImportOrderEntry getResult() {
126: String val = fNameDialogField.getText();
127: if ("*".equals(val)) { //$NON-NLS-1$
128: return new ImportOrderEntry("", fIsStatic); //$NON-NLS-1$
129: } else {
130: return new ImportOrderEntry(val, fIsStatic);
131: }
132: }
133:
134: protected Control createDialogArea(Composite parent) {
135: Composite composite = (Composite) super
136: .createDialogArea(parent);
137: initializeDialogUnits(parent);
138:
139: GridLayout layout = (GridLayout) composite.getLayout();
140: layout.numColumns = 2;
141:
142: fNameDialogField.doFillIntoGrid(composite, 3);
143:
144: LayoutUtil.setHorizontalSpan(fNameDialogField
145: .getLabelControl(null), 2);
146:
147: int fieldWidthHint = convertWidthInCharsToPixels(60);
148: Text text = fNameDialogField.getTextControl(null);
149: LayoutUtil.setWidthHint(text, fieldWidthHint);
150: LayoutUtil.setHorizontalGrabbing(text);
151: TextFieldNavigationHandler.install(text);
152:
153: DialogField.createEmptySpace(composite, 1);
154: fBrowseTypeButton.doFillIntoGrid(composite, 1);
155:
156: fNameDialogField.postSetFocusOnDialogField(parent.getDisplay());
157:
158: applyDialogFont(composite);
159: return composite;
160: }
161:
162: final void doBrowsePackages() {
163: IRunnableContext context = new BusyIndicatorRunnableContext();
164: IJavaSearchScope scope = SearchEngine.createWorkspaceScope();
165: int style = PackageSelectionDialog.F_REMOVE_DUPLICATES
166: | PackageSelectionDialog.F_SHOW_PARENTS
167: | PackageSelectionDialog.F_HIDE_DEFAULT_PACKAGE;
168: PackageSelectionDialog dialog = new PackageSelectionDialog(
169: getShell(), context, style, scope);
170: dialog.setFilter(fNameDialogField.getText());
171: dialog.setIgnoreCase(false);
172: dialog
173: .setTitle(PreferencesMessages.ImportOrganizeInputDialog_ChoosePackageDialog_title);
174: dialog
175: .setMessage(PreferencesMessages.ImportOrganizeInputDialog_ChoosePackageDialog_description);
176: dialog
177: .setEmptyListMessage(PreferencesMessages.ImportOrganizeInputDialog_ChoosePackageDialog_empty);
178: if (dialog.open() == Window.OK) {
179: IPackageFragment res = (IPackageFragment) dialog
180: .getFirstResult();
181: fNameDialogField.setText(res.getElementName());
182: }
183: }
184:
185: private void doBrowseTypes() {
186: IRunnableContext context = new BusyIndicatorRunnableContext();
187: IJavaSearchScope scope = SearchEngine.createWorkspaceScope();
188: int style = IJavaElementSearchConstants.CONSIDER_ALL_TYPES;
189: try {
190: SelectionDialog dialog = JavaUI.createTypeDialog(
191: getShell(), context, scope, style, false,
192: fNameDialogField.getText());
193: dialog
194: .setTitle(PreferencesMessages.ImportOrganizeInputDialog_ChooseTypeDialog_title);
195: dialog
196: .setMessage(PreferencesMessages.ImportOrganizeInputDialog_ChooseTypeDialog_description);
197: if (dialog.open() == Window.OK) {
198: IType res = (IType) dialog.getResult()[0];
199: fNameDialogField
200: .setText(res.getFullyQualifiedName('.'));
201: }
202: } catch (JavaModelException e) {
203: ExceptionHandler
204: .handle(
205: e,
206: getShell(),
207: PreferencesMessages.ImportOrganizeInputDialog_ChooseTypeDialog_title,
208: PreferencesMessages.ImportOrganizeInputDialog_ChooseTypeDialog_error_message);
209: }
210: }
211:
212: /**
213: * @param field
214: */
215: final void doDialogFieldChanged(DialogField field) {
216: if (field == fBrowseTypeButton) {
217: doBrowseTypes();
218: } else {
219: doValidation();
220: }
221: }
222:
223: private void doValidation() {
224: StatusInfo status = new StatusInfo();
225: String newText = fNameDialogField.getText();
226: if (newText.length() == 0) {
227: status.setError(""); //$NON-NLS-1$
228: } else {
229: if (newText.equals("*")) { //$NON-NLS-1$
230: if (doesExist("", fIsStatic)) { //$NON-NLS-1$
231: status
232: .setError(PreferencesMessages.ImportOrganizeInputDialog_error_entryExists);
233: }
234: } else {
235: IStatus val = JavaConventions.validateJavaTypeName(
236: newText, JavaCore.VERSION_1_3,
237: JavaCore.VERSION_1_3);
238: if (val.matches(IStatus.ERROR)) {
239: status
240: .setError(PreferencesMessages.ImportOrganizeInputDialog_error_invalidName);
241: } else {
242: if (doesExist(newText, fIsStatic)) {
243: status
244: .setError(PreferencesMessages.ImportOrganizeInputDialog_error_entryExists);
245: }
246: }
247: }
248: }
249: updateStatus(status);
250: }
251:
252: private boolean doesExist(String name, boolean isStatic) {
253: for (int i = 0; i < fExistingEntries.size(); i++) {
254: ImportOrderEntry entry = (ImportOrderEntry) fExistingEntries
255: .get(i);
256: if (name.equals(entry.name) && isStatic == entry.isStatic) {
257: return true;
258: }
259: }
260: return false;
261: }
262:
263: /*
264: * @see org.eclipse.jface.window.Window#configureShell(Shell)
265: */
266: protected void configureShell(Shell newShell) {
267: super.configureShell(newShell);
268: PlatformUI.getWorkbench().getHelpSystem().setHelp(newShell,
269: IJavaHelpContextIds.IMPORT_ORGANIZE_INPUT_DIALOG);
270: }
271:
272: }
|