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.preferences;
13 import java.util.List;
15 import org.eclipse.swt.SWT;
16 import org.eclipse.swt.layout.GridLayout;
17 import org.eclipse.swt.widgets.Composite;
18 import org.eclipse.swt.widgets.Control;
19 import org.eclipse.swt.widgets.Shell;
20 import org.eclipse.swt.widgets.Text;
22 import org.eclipse.core.runtime.Assert;
23 import org.eclipse.core.runtime.IStatus;
25 import org.eclipse.jface.dialogs.StatusDialog;
26 import org.eclipse.jface.operation.IRunnableContext;
27 import org.eclipse.jface.window.Window;
29 import org.eclipse.ui.PlatformUI;
30 import org.eclipse.ui.dialogs.SelectionDialog;
32 import org.eclipse.jdt.core.IPackageFragment;
33 import org.eclipse.jdt.core.IType;
34 import org.eclipse.jdt.core.JavaConventions;
35 import org.eclipse.jdt.core.JavaCore;
36 import org.eclipse.jdt.core.JavaModelException;
37 import org.eclipse.jdt.core.search.IJavaSearchScope;
38 import org.eclipse.jdt.core.search.SearchEngine;
40 import org.eclipse.jdt.ui.IJavaElementSearchConstants;
41 import org.eclipse.jdt.ui.JavaUI;
43 import org.eclipse.jdt.internal.ui.IJavaHelpContextIds;
44 import org.eclipse.jdt.internal.ui.dialogs.PackageSelectionDialog;
45 import org.eclipse.jdt.internal.ui.dialogs.StatusInfo;
46 import org.eclipse.jdt.internal.ui.dialogs.TextFieldNavigationHandler;
47 import org.eclipse.jdt.internal.ui.preferences.ImportOrganizeConfigurationBlock.ImportOrderEntry;
48 import org.eclipse.jdt.internal.ui.util.BusyIndicatorRunnableContext;
49 import org.eclipse.jdt.internal.ui.util.ExceptionHandler;
50 import org.eclipse.jdt.internal.ui.wizards.dialogfields.DialogField;
51 import org.eclipse.jdt.internal.ui.wizards.dialogfields.IDialogFieldListener;
52 import org.eclipse.jdt.internal.ui.wizards.dialogfields.IStringButtonAdapter;
53 import org.eclipse.jdt.internal.ui.wizards.dialogfields.LayoutUtil;
54 import org.eclipse.jdt.internal.ui.wizards.dialogfields.SelectionButtonDialogField;
55 import org.eclipse.jdt.internal.ui.wizards.dialogfields.StringButtonDialogField;
58 * Dialog to enter a new package entry in the organize import preference page.
60 public class ImportOrganizeInputDialog extends StatusDialog {
62 private class ImportOrganizeInputAdapter implements IDialogFieldListener, IStringButtonAdapter {
64 * @see IDialogFieldListener#dialogFieldChanged(DialogField)
66 public void dialogFieldChanged(DialogField field) {
67 doDialogFieldChanged(field);
71 * @see IStringButtonAdapter#changeControlPressed(DialogField)
73 public void changeControlPressed(DialogField field) {
78 private StringButtonDialogField fNameDialogField;
79 private SelectionButtonDialogField fBrowseTypeButton;
80 private List<ImportOrderEntry> fExistingEntries;
81 private final boolean fIsStatic;
83 public ImportOrganizeInputDialog(Shell parent, List<ImportOrderEntry> existingEntries, boolean isStatic) {
86 fExistingEntries= existingEntries;
90 title= PreferencesMessages.ImportOrganizeInputDialog_title_static;
91 label= PreferencesMessages.ImportOrganizeInputDialog_name_group_static_label;
93 title= PreferencesMessages.ImportOrganizeInputDialog_title;
94 label= PreferencesMessages.ImportOrganizeInputDialog_name_group_label;
98 ImportOrganizeInputAdapter adapter= new ImportOrganizeInputAdapter();
100 fNameDialogField= new StringButtonDialogField(adapter);
101 fNameDialogField.setLabelText(label);
102 fNameDialogField.setButtonLabel(PreferencesMessages.ImportOrganizeInputDialog_browse_packages_button);
103 fNameDialogField.setDialogFieldListener(adapter);
104 fNameDialogField.setText(""); //$NON-NLS-1$
106 fBrowseTypeButton= new SelectionButtonDialogField(SWT.PUSH);
107 fBrowseTypeButton.setLabelText(PreferencesMessages.ImportOrganizeInputDialog_browse_types_label);
108 fBrowseTypeButton.setDialogFieldListener(adapter);
112 * @see org.eclipse.jface.dialogs.Dialog#isResizable()
116 protected boolean isResizable() {
120 public void setInitialSelection(ImportOrderEntry editedEntry) {
121 Assert.isNotNull(editedEntry);
122 if (editedEntry.name.length() == 0) {
123 fNameDialogField.setText(""); //$NON-NLS-1$
125 fNameDialogField.setText(editedEntry.name);
129 public ImportOrderEntry getResult() {
130 String val= fNameDialogField.getText();
131 if ("*".equals(val)) { //$NON-NLS-1$
132 return new ImportOrderEntry("", fIsStatic); //$NON-NLS-1$
134 return new ImportOrderEntry(val, fIsStatic);
139 protected Control createDialogArea(Composite parent) {
140 Composite composite= (Composite) super.createDialogArea(parent);
141 initializeDialogUnits(parent);
143 GridLayout layout= (GridLayout) composite.getLayout();
144 layout.numColumns= 2;
146 fNameDialogField.doFillIntoGrid(composite, 3);
148 LayoutUtil.setHorizontalSpan(fNameDialogField.getLabelControl(null), 2);
150 int fieldWidthHint= convertWidthInCharsToPixels(60);
151 Text text= fNameDialogField.getTextControl(null);
152 LayoutUtil.setWidthHint(text, fieldWidthHint);
153 LayoutUtil.setHorizontalGrabbing(text);
154 TextFieldNavigationHandler.install(text);
156 DialogField.createEmptySpace(composite, 1);
157 fBrowseTypeButton.doFillIntoGrid(composite, 1);
159 fNameDialogField.postSetFocusOnDialogField(parent.getDisplay());
161 applyDialogFont(composite);
165 final void doBrowsePackages() {
166 IRunnableContext context= new BusyIndicatorRunnableContext();
167 IJavaSearchScope scope= SearchEngine.createWorkspaceScope();
168 int style= PackageSelectionDialog.F_REMOVE_DUPLICATES | PackageSelectionDialog.F_SHOW_PARENTS | PackageSelectionDialog.F_HIDE_DEFAULT_PACKAGE;
169 PackageSelectionDialog dialog= new PackageSelectionDialog(getShell(), context, style, scope);
170 dialog.setFilter(fNameDialogField.getText());
171 dialog.setIgnoreCase(false);
172 dialog.setTitle(PreferencesMessages.ImportOrganizeInputDialog_ChoosePackageDialog_title);
173 dialog.setMessage(PreferencesMessages.ImportOrganizeInputDialog_ChoosePackageDialog_description);
174 dialog.setEmptyListMessage(PreferencesMessages.ImportOrganizeInputDialog_ChoosePackageDialog_empty);
175 if (dialog.open() == Window.OK) {
176 IPackageFragment res= (IPackageFragment) dialog.getFirstResult();
177 fNameDialogField.setText(res.getElementName());
181 private void doBrowseTypes() {
182 IRunnableContext context= new BusyIndicatorRunnableContext();
183 IJavaSearchScope scope= SearchEngine.createWorkspaceScope();
184 int style= IJavaElementSearchConstants.CONSIDER_ALL_TYPES;
186 SelectionDialog dialog= JavaUI.createTypeDialog(getShell(), context, scope, style, false, fNameDialogField.getText());
187 dialog.setTitle(PreferencesMessages.ImportOrganizeInputDialog_ChooseTypeDialog_title);
188 dialog.setMessage(PreferencesMessages.ImportOrganizeInputDialog_ChooseTypeDialog_description);
189 if (dialog.open() == Window.OK) {
190 IType res= (IType) dialog.getResult()[0];
191 fNameDialogField.setText(res.getFullyQualifiedName('.'));
193 } catch (JavaModelException e) {
194 ExceptionHandler.handle(e, getShell(), PreferencesMessages.ImportOrganizeInputDialog_ChooseTypeDialog_title, PreferencesMessages.ImportOrganizeInputDialog_ChooseTypeDialog_error_message);
198 final void doDialogFieldChanged(DialogField field) {
199 if (field == fBrowseTypeButton) {
207 private void doValidation() {
208 StatusInfo status= new StatusInfo();
209 String newText= fNameDialogField.getText();
210 if (newText.length() == 0) {
211 status.setError(""); //$NON-NLS-1$
213 if (newText.equals("*")) { //$NON-NLS-1$
214 if (doesExist("", fIsStatic)) { //$NON-NLS-1$
215 status.setError(PreferencesMessages.ImportOrganizeInputDialog_error_entryExists);
218 IStatus val= JavaConventions.validateJavaTypeName(newText, JavaCore.VERSION_1_3, JavaCore.VERSION_1_3);
219 if (val.matches(IStatus.ERROR)) {
220 status.setError(PreferencesMessages.ImportOrganizeInputDialog_error_invalidName);
222 if (doesExist(newText, fIsStatic)) {
223 status.setError(PreferencesMessages.ImportOrganizeInputDialog_error_entryExists);
228 updateStatus(status);
231 private boolean doesExist(String name, boolean isStatic) {
232 for (int i= 0; i < fExistingEntries.size(); i++) {
233 ImportOrderEntry entry= fExistingEntries.get(i);
234 if (name.equals(entry.name) && isStatic == entry.isStatic) {
243 * @see org.eclipse.jface.window.Window#configureShell(Shell)
246 protected void configureShell(Shell newShell) {
247 super.configureShell(newShell);
248 PlatformUI.getWorkbench().getHelpSystem().setHelp(newShell, IJavaHelpContextIds.IMPORT_ORGANIZE_INPUT_DIALOG);