]> git.uio.no Git - ifi-stolz-refaktor.git/blob - case-study/jdt-before/ui/org/eclipse/jdt/internal/ui/preferences/ImportOrganizeInputDialog.java
Case Study: adding data and statistics
[ifi-stolz-refaktor.git] / case-study / jdt-before / ui / org / eclipse / jdt / internal / ui / preferences / ImportOrganizeInputDialog.java
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
7  *
8  * Contributors:
9  *     IBM Corporation - initial API and implementation
10  *******************************************************************************/
11 package org.eclipse.jdt.internal.ui.preferences;
12
13 import java.util.List;
14
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;
21
22 import org.eclipse.core.runtime.Assert;
23 import org.eclipse.core.runtime.IStatus;
24
25 import org.eclipse.jface.dialogs.StatusDialog;
26 import org.eclipse.jface.operation.IRunnableContext;
27 import org.eclipse.jface.window.Window;
28
29 import org.eclipse.ui.PlatformUI;
30 import org.eclipse.ui.dialogs.SelectionDialog;
31
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;
39
40 import org.eclipse.jdt.ui.IJavaElementSearchConstants;
41 import org.eclipse.jdt.ui.JavaUI;
42
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;
56
57 /**
58  * Dialog to enter a new package entry in the organize import preference page.
59  */
60 public class ImportOrganizeInputDialog extends StatusDialog {
61
62         private class ImportOrganizeInputAdapter implements IDialogFieldListener, IStringButtonAdapter {
63                 /**
64                  * @see IDialogFieldListener#dialogFieldChanged(DialogField)
65                  */
66                 public void dialogFieldChanged(DialogField field) {
67                         doDialogFieldChanged(field);
68                 }
69
70                 /**
71                  * @see IStringButtonAdapter#changeControlPressed(DialogField)
72                  */
73                 public void changeControlPressed(DialogField field) {
74                         doBrowsePackages();
75                 }
76         }
77
78         private StringButtonDialogField fNameDialogField;
79         private SelectionButtonDialogField fBrowseTypeButton;
80         private List<ImportOrderEntry> fExistingEntries;
81         private final boolean fIsStatic;
82
83         public ImportOrganizeInputDialog(Shell parent, List<ImportOrderEntry> existingEntries, boolean isStatic) {
84                 super(parent);
85                 fIsStatic= isStatic;
86                 fExistingEntries= existingEntries;
87
88                 String label, title;
89                 if (isStatic) {
90                         title= PreferencesMessages.ImportOrganizeInputDialog_title_static;
91                         label= PreferencesMessages.ImportOrganizeInputDialog_name_group_static_label;
92                 } else {
93                         title= PreferencesMessages.ImportOrganizeInputDialog_title;
94                         label= PreferencesMessages.ImportOrganizeInputDialog_name_group_label;
95                 }
96                 setTitle(title);
97
98                 ImportOrganizeInputAdapter adapter= new ImportOrganizeInputAdapter();
99
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$
105
106                 fBrowseTypeButton= new SelectionButtonDialogField(SWT.PUSH);
107                 fBrowseTypeButton.setLabelText(PreferencesMessages.ImportOrganizeInputDialog_browse_types_label);
108                 fBrowseTypeButton.setDialogFieldListener(adapter);
109         }
110
111         /*
112          * @see org.eclipse.jface.dialogs.Dialog#isResizable()
113          * @since 3.4
114          */
115         @Override
116         protected boolean isResizable() {
117                 return true;
118         }
119
120         public void setInitialSelection(ImportOrderEntry editedEntry) {
121                 Assert.isNotNull(editedEntry);
122                 if (editedEntry.name.length() == 0) {
123                         fNameDialogField.setText(""); //$NON-NLS-1$
124                 } else {
125                         fNameDialogField.setText(editedEntry.name);
126                 }
127         }
128
129         public ImportOrderEntry getResult() {
130                 String val= fNameDialogField.getText();
131                 if ("*".equals(val)) { //$NON-NLS-1$
132                         return new ImportOrderEntry("", fIsStatic); //$NON-NLS-1$
133                 } else {
134                         return new ImportOrderEntry(val, fIsStatic);
135                 }
136         }
137
138         @Override
139         protected Control createDialogArea(Composite parent) {
140                 Composite composite= (Composite) super.createDialogArea(parent);
141                 initializeDialogUnits(parent);
142
143                 GridLayout layout= (GridLayout) composite.getLayout();
144                 layout.numColumns= 2;
145
146                 fNameDialogField.doFillIntoGrid(composite, 3);
147
148                 LayoutUtil.setHorizontalSpan(fNameDialogField.getLabelControl(null), 2);
149
150                 int fieldWidthHint= convertWidthInCharsToPixels(60);
151                 Text text= fNameDialogField.getTextControl(null);
152                 LayoutUtil.setWidthHint(text, fieldWidthHint);
153                 LayoutUtil.setHorizontalGrabbing(text);
154                 TextFieldNavigationHandler.install(text);
155
156                 DialogField.createEmptySpace(composite, 1);
157                 fBrowseTypeButton.doFillIntoGrid(composite, 1);
158
159                 fNameDialogField.postSetFocusOnDialogField(parent.getDisplay());
160
161                 applyDialogFont(composite);
162                 return composite;
163         }
164
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());
178                 }
179         }
180
181         private void doBrowseTypes() {
182                 IRunnableContext context= new BusyIndicatorRunnableContext();
183                 IJavaSearchScope scope= SearchEngine.createWorkspaceScope();
184                 int style= IJavaElementSearchConstants.CONSIDER_ALL_TYPES;
185                 try {
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('.'));
192                         }
193                 } catch (JavaModelException e) {
194                         ExceptionHandler.handle(e, getShell(), PreferencesMessages.ImportOrganizeInputDialog_ChooseTypeDialog_title, PreferencesMessages.ImportOrganizeInputDialog_ChooseTypeDialog_error_message);
195                 }
196         }
197
198         final void doDialogFieldChanged(DialogField field) {
199                 if (field == fBrowseTypeButton) {
200                         doBrowseTypes();
201                 } else {
202                         doValidation();
203                 }
204         }
205
206
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$
212                 } else {
213                         if (newText.equals("*")) { //$NON-NLS-1$
214                                 if (doesExist("", fIsStatic)) { //$NON-NLS-1$
215                                         status.setError(PreferencesMessages.ImportOrganizeInputDialog_error_entryExists);
216                                 }
217                         } else {
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);
221                                 } else {
222                                         if (doesExist(newText, fIsStatic)) {
223                                                 status.setError(PreferencesMessages.ImportOrganizeInputDialog_error_entryExists);
224                                         }
225                                 }
226                         }
227                 }
228                 updateStatus(status);
229         }
230
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) {
235                                 return true;
236                         }
237                 }
238                 return false;
239         }
240
241
242         /*
243          * @see org.eclipse.jface.window.Window#configureShell(Shell)
244          */
245         @Override
246         protected void configureShell(Shell newShell) {
247                 super.configureShell(newShell);
248                 PlatformUI.getWorkbench().getHelpSystem().setHelp(newShell, IJavaHelpContextIds.IMPORT_ORGANIZE_INPUT_DIALOG);
249         }
250
251
252 }