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.refactoring.nls;
13 import java.util.ArrayList;
14 import java.util.List;
16 import org.eclipse.swt.SWT;
17 import org.eclipse.swt.layout.GridLayout;
18 import org.eclipse.swt.widgets.Composite;
19 import org.eclipse.swt.widgets.Control;
20 import org.eclipse.swt.widgets.Shell;
21 import org.eclipse.swt.widgets.Text;
23 import org.eclipse.core.runtime.IPath;
24 import org.eclipse.core.runtime.IStatus;
25 import org.eclipse.core.runtime.Path;
27 import org.eclipse.core.resources.IFile;
29 import org.eclipse.jface.dialogs.Dialog;
30 import org.eclipse.jface.dialogs.StatusDialog;
31 import org.eclipse.jface.window.Window;
33 import org.eclipse.ui.PlatformUI;
34 import org.eclipse.ui.dialogs.ElementListSelectionDialog;
35 import org.eclipse.ui.progress.IProgressService;
37 import org.eclipse.jdt.core.ICompilationUnit;
38 import org.eclipse.jdt.core.IJavaElement;
39 import org.eclipse.jdt.core.IJavaProject;
40 import org.eclipse.jdt.core.IPackageFragment;
41 import org.eclipse.jdt.core.IPackageFragmentRoot;
42 import org.eclipse.jdt.core.JavaModelException;
43 import org.eclipse.jdt.core.search.IJavaSearchConstants;
44 import org.eclipse.jdt.core.search.IJavaSearchScope;
45 import org.eclipse.jdt.core.search.SearchEngine;
47 import org.eclipse.jdt.internal.corext.refactoring.nls.NLSRefactoring;
48 import org.eclipse.jdt.internal.corext.util.JavaConventionsUtil;
49 import org.eclipse.jdt.internal.corext.util.Messages;
51 import org.eclipse.jdt.ui.JavaElementLabelProvider;
53 import org.eclipse.jdt.internal.ui.IJavaHelpContextIds;
54 import org.eclipse.jdt.internal.ui.dialogs.FilteredTypesSelectionDialog;
55 import org.eclipse.jdt.internal.ui.dialogs.StatusInfo;
56 import org.eclipse.jdt.internal.ui.dialogs.StatusUtil;
57 import org.eclipse.jdt.internal.ui.dialogs.TextFieldNavigationHandler;
58 import org.eclipse.jdt.internal.ui.util.ExceptionHandler;
59 import org.eclipse.jdt.internal.ui.wizards.dialogfields.DialogField;
60 import org.eclipse.jdt.internal.ui.wizards.dialogfields.IDialogFieldListener;
61 import org.eclipse.jdt.internal.ui.wizards.dialogfields.IStringButtonAdapter;
62 import org.eclipse.jdt.internal.ui.wizards.dialogfields.LayoutUtil;
63 import org.eclipse.jdt.internal.ui.wizards.dialogfields.Separator;
64 import org.eclipse.jdt.internal.ui.wizards.dialogfields.StringButtonDialogField;
65 import org.eclipse.jdt.internal.ui.wizards.dialogfields.StringDialogField;
67 public class NLSAccessorConfigurationDialog extends StatusDialog {
70 public SourceFirstPackageSelectionDialogField fResourceBundlePackage;
71 public StringButtonDialogField fResourceBundleFile;
72 public SourceFirstPackageSelectionDialogField fAccessorPackage;
73 public StringDialogField fAccessorClassName;
74 public StringDialogField fSubstitutionPattern;
76 public NLSRefactoring fRefactoring;
78 private IStatus[] fStati;
80 private static final int IDX_ACCESSOR_CLASS= 0;
81 static final int IDX_ACCESSOR_PACKAGE= 1;
82 public static final int IDX_SUBST_PATTERN= 2;
83 private static final int IDX_BUNDLE_NAME= 3;
84 private static final int IDX_BUNDLE_PACKAGE= 4;
86 public class AccessorAdapter implements IDialogFieldListener, IStringButtonAdapter {
87 public void dialogFieldChanged(DialogField field) {
91 public void changeControlPressed(DialogField field) {
92 if (field == fResourceBundleFile) {
93 browseForPropertyFile();
94 } else if (field == fAccessorClassName) {
95 browseForAccessorClass();
99 public void generated_5739290750974121258(NLSRefactoring refactoring, NLSAccessorConfigurationDialog nlsaccessorconfigurationdialog, ICompilationUnit cu) {
100 nlsaccessorconfigurationdialog.fAccessorPackage= new SourceFirstPackageSelectionDialogField(NLSUIMessages.NLSAccessorConfigurationDialog_accessor_path,
101 NLSUIMessages.NLSAccessorConfigurationDialog_accessor_package,
102 NLSUIMessages.NLSAccessorConfigurationDialog_browse1,
103 NLSUIMessages.NLSAccessorConfigurationDialog_browse2,
104 NLSUIMessages.NLSAccessorConfigurationDialog_default_package,
105 NLSUIMessages.NLSAccessorConfigurationDialog_accessor_dialog_title,
106 NLSUIMessages.NLSAccessorConfigurationDialog_accessor_dialog_message,
107 NLSUIMessages.NLSAccessorConfigurationDialog_accessor_dialog_emtpyMessage,
108 cu, this, refactoring.getAccessorClassPackage());
110 nlsaccessorconfigurationdialog.fAccessorClassName= nlsaccessorconfigurationdialog.createStringButtonField(NLSUIMessages.NLSAccessorConfigurationDialog_className,
111 NLSUIMessages.NLSAccessorConfigurationDialog_browse6, this);
112 nlsaccessorconfigurationdialog.fSubstitutionPattern= nlsaccessorconfigurationdialog.createStringField(NLSUIMessages.NLSAccessorConfigurationDialog_substitutionPattern, this);
114 nlsaccessorconfigurationdialog.fResourceBundlePackage= new SourceFirstPackageSelectionDialogField(NLSUIMessages.NLSAccessorConfigurationDialog_property_path,
115 NLSUIMessages.NLSAccessorConfigurationDialog_property_package,
116 NLSUIMessages.NLSAccessorConfigurationDialog_browse3,
117 NLSUIMessages.NLSAccessorConfigurationDialog_browse4,
118 NLSUIMessages.NLSAccessorConfigurationDialog_default_package,
119 NLSUIMessages.NLSAccessorConfigurationDialog_property_dialog_title,
120 NLSUIMessages.NLSAccessorConfigurationDialog_property_dialog_message,
121 NLSUIMessages.NLSAccessorConfigurationDialog_property_dialog_emptyMessage,
122 cu, this, nlsaccessorconfigurationdialog.fRefactoring.getResourceBundlePackage());
124 nlsaccessorconfigurationdialog.fResourceBundleFile= nlsaccessorconfigurationdialog.createStringButtonField(NLSUIMessages.NLSAccessorConfigurationDialog_property_file_name,
125 NLSUIMessages.NLSAccessorConfigurationDialog_browse5, this);
127 nlsaccessorconfigurationdialog.initFields();
132 public NLSAccessorConfigurationDialog(Shell parent, NLSRefactoring refactoring) {
134 fRefactoring= refactoring;
135 fStati= new IStatus[] { StatusInfo.OK_STATUS, StatusInfo.OK_STATUS, StatusInfo.OK_STATUS, StatusInfo.OK_STATUS, StatusInfo.OK_STATUS };
137 setTitle(NLSUIMessages.NLSAccessorConfigurationDialog_title);
139 AccessorAdapter updateListener= new AccessorAdapter();
141 ICompilationUnit cu= refactoring.getCu();
143 updateListener.generated_5739290750974121258(refactoring, this, cu);
147 * @see org.eclipse.jface.dialogs.Dialog#isResizable()
151 protected boolean isResizable() {
155 private void initFields() {
156 initAccessorClassFields();
157 String resourceBundleName= fRefactoring.getResourceBundleName();
158 fResourceBundleFile.setText(resourceBundleName != null ? resourceBundleName : (NLSRefactoring.DEFAULT_PROPERTY_FILENAME + NLSRefactoring.PROPERTY_FILE_EXT));
161 private void initAccessorClassFields() {
162 fRefactoring.generated_9166475369688586640(this);
166 protected Control createDialogArea(Composite ancestor) {
167 Composite parent= (Composite) super.createDialogArea(ancestor);
169 final int nOfColumns= 4;
171 initializeDialogUnits(ancestor);
173 GridLayout layout= (GridLayout) parent.getLayout();
174 layout.numColumns= nOfColumns;
175 parent.setLayout(layout);
177 createAccessorPart(parent, nOfColumns, convertWidthInCharsToPixels(40));
179 Separator s= new Separator(SWT.SEPARATOR | SWT.HORIZONTAL);
180 s.doFillIntoGrid(parent, nOfColumns);
182 createPropertyPart(parent, nOfColumns, convertWidthInCharsToPixels(40));
184 Dialog.applyDialogFont(parent);
185 PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, IJavaHelpContextIds.EXTERNALIZE_WIZARD_PROPERTIES_FILE_PAGE);
191 private void createAccessorPart(Composite parent, final int nOfColumns, int textWidth) {
192 createLabel(parent, NLSUIMessages.NLSAccessorConfigurationDialog_resourceBundle_title, nOfColumns);
193 fAccessorPackage.createControl(parent, nOfColumns, textWidth);
195 fAccessorClassName.doFillIntoGrid(parent, nOfColumns);
196 Text accessorClassText= fAccessorClassName.getTextControl(null);
197 LayoutUtil.setWidthHint(accessorClassText, convertWidthInCharsToPixels(60));
198 Text substitutionPatternText= fSubstitutionPattern.generated_8817070770227069187(parent, nOfColumns, accessorClassText);
199 LayoutUtil.setWidthHint(substitutionPatternText, convertWidthInCharsToPixels(60));
200 TextFieldNavigationHandler.install(substitutionPatternText);
202 fSubstitutionPattern.setEnabled(!fRefactoring.isEclipseNLS());
205 private void createPropertyPart(Composite parent, final int nOfColumns, final int textWidth) {
206 createLabel(parent, NLSUIMessages.NLSAccessorConfigurationDialog_property_location, nOfColumns);
207 fResourceBundlePackage.createControl(parent, nOfColumns, textWidth);
209 fResourceBundleFile.doFillIntoGrid(parent, nOfColumns);
210 LayoutUtil.setWidthHint(fResourceBundleFile.getTextControl(null), convertWidthInCharsToPixels(60));
213 private void createLabel(Composite parent, final String text, final int N_OF_COLUMNS) {
214 Separator label= new Separator(SWT.NONE);
215 label.generated_661964316458443499(parent, text, N_OF_COLUMNS, this);
218 private void browseForPropertyFile() {
219 ElementListSelectionDialog dialog= new ElementListSelectionDialog(getShell(), new JavaElementLabelProvider());
220 dialog.setIgnoreCase(false);
221 dialog.setTitle(NLSUIMessages.NLSAccessorConfigurationDialog_Property_File_Selection);
222 dialog.setMessage(NLSUIMessages.NLSAccessorConfigurationDialog_Choose_the_property_file);
223 dialog.setElements(createFileListInput());
224 dialog.setFilter('*' + NLSRefactoring.PROPERTY_FILE_EXT);
225 if (dialog.open() == Window.OK) {
226 IFile selectedFile= (IFile) dialog.getFirstResult();
227 if (selectedFile != null)
228 fResourceBundleFile.setText(selectedFile.getName());
232 protected void browseForAccessorClass() {
233 IProgressService service= PlatformUI.getWorkbench().getProgressService();
234 IPackageFragmentRoot root= fAccessorPackage.getSelectedFragmentRoot();
236 IJavaSearchScope scope= root != null ? SearchEngine.createJavaSearchScope(new IJavaElement[] { root }) : SearchEngine.createWorkspaceScope();
238 FilteredTypesSelectionDialog dialog= new FilteredTypesSelectionDialog (getShell(), false,
239 service, scope, IJavaSearchConstants.CLASS);
240 dialog.generated_6914054201347997029(this);
245 private Object[] createFileListInput() {
248 IPackageFragment fPkgFragment= fResourceBundlePackage.getSelected();
249 if (fPkgFragment == null)
250 return new Object[0];
251 List<Object> result= new ArrayList<Object>(1);
252 Object[] nonjava= fPkgFragment.getNonJavaResources();
253 for (int i= 0; i < nonjava.length; i++) {
254 if (isPropertyFile(nonjava[i]))
255 result.add(nonjava[i]);
257 return result.toArray();
259 } catch (JavaModelException e) {
260 ExceptionHandler.handle(e, NLSUIMessages.NLSAccessorConfigurationDialog_externalizing, NLSUIMessages .NLSAccessorConfigurationDialog_exception);
261 return new Object[0];
265 private static boolean isPropertyFile(Object o) {
266 if (!(o instanceof IFile))
268 IFile file= (IFile) o;
269 return (NLSRefactoring.PROPERTY_FILE_EXT.equals('.' + file.getFileExtension()));
273 * checks all entered values delegates to the specific validate methods these methods
274 * update the refactoring
276 private void validateAll() {
277 validateSubstitutionPattern();
279 validateAccessorClassName();
280 checkPackageFragment();
282 validatePropertyFilename();
283 validatePropertyPackage();
285 updateStatus(StatusUtil.getMostSevere(fStati));
288 private void validateAccessorClassName() {
289 String className= fAccessorClassName.getText();
291 IStatus status= JavaConventionsUtil.validateJavaTypeName(className, fAccessorPackage.getSelectedFragmentRoot());
292 if (status.getSeverity() == IStatus.ERROR) {
293 setInvalid(IDX_ACCESSOR_CLASS, status.getMessage());
297 if (className.indexOf('.') != -1) {
298 setInvalid(IDX_ACCESSOR_CLASS, NLSUIMessages.NLSAccessorConfigurationDialog_no_dot);
302 setValid(IDX_ACCESSOR_CLASS);
305 private void validatePropertyFilename() {
306 String fileName= fResourceBundleFile.getText();
307 if ((fileName == null) || (fileName.length() == 0)) {
308 setInvalid(IDX_BUNDLE_NAME, NLSUIMessages.NLSAccessorConfigurationDialog_enter_name);
312 if (!fileName.endsWith(NLSRefactoring.PROPERTY_FILE_EXT)) {
313 setInvalid(IDX_BUNDLE_NAME, Messages.format(NLSUIMessages.NLSAccessorConfigurationDialog_file_name_must_end, NLSRefactoring.PROPERTY_FILE_EXT));
317 setValid(IDX_BUNDLE_NAME);
320 private void validatePropertyPackage() {
322 IPackageFragmentRoot root= fResourceBundlePackage.getSelectedFragmentRoot();
323 if ((root == null) || !root.exists()) {
324 setInvalid(IDX_BUNDLE_PACKAGE, NLSUIMessages.NLSAccessorConfigurationDialog_property_package_root_invalid);
328 IPackageFragment fragment= fResourceBundlePackage.getSelected();
329 if ((fragment == null) || !fragment.exists()) {
330 setInvalid(IDX_BUNDLE_PACKAGE, NLSUIMessages.NLSAccessorConfigurationDialog_property_package_invalid);
334 String pkgName= fragment.getElementName();
336 IStatus status= JavaConventionsUtil.validatePackageName(pkgName, root);
337 if ((pkgName.length() > 0) && (status.getSeverity() == IStatus.ERROR)) {
338 setInvalid(IDX_BUNDLE_PACKAGE, status.getMessage());
342 IPath pkgPath= new Path(pkgName.replace('.', IPath.SEPARATOR)).makeRelative();
344 IJavaProject project= fRefactoring.getCu().getJavaProject();
346 IJavaElement element= project.findElement(pkgPath);
347 if (element == null || !element.exists()) {
348 setInvalid(IDX_BUNDLE_PACKAGE, NLSUIMessages.NLSAccessorConfigurationDialog_must_exist);
351 IPackageFragment fPkgFragment= (IPackageFragment) element;
352 if (!PackageBrowseAdapter.canAddPackage(fPkgFragment)) {
353 setInvalid(IDX_BUNDLE_PACKAGE, NLSUIMessages.NLSAccessorConfigurationDialog_incorrect_package);
356 if (!PackageBrowseAdapter.canAddPackageRoot((IPackageFragmentRoot) fPkgFragment.getParent())) {
357 setInvalid(IDX_BUNDLE_PACKAGE, NLSUIMessages.NLSAccessorConfigurationDialog_incorrect_package);
360 } catch (JavaModelException e) {
361 setInvalid(IDX_BUNDLE_PACKAGE, e.getStatus().getMessage());
365 setValid(IDX_BUNDLE_PACKAGE);
368 private void checkPackageFragment() {
369 fAccessorPackage.generated_4519525910731984718(this);
372 private void validateSubstitutionPattern() {
373 fSubstitutionPattern.generated_3001064280044801264(this);
376 public void setInvalid(int idx, String msg) {
377 fStati[idx]= new StatusInfo(IStatus.ERROR, msg);
380 public void setValid(int idx) {
381 fStati[idx]= StatusInfo.OK_STATUS;
385 * @see org.eclipse.jface.dialogs.Dialog#okPressed()
388 protected void okPressed() {
394 void updateRefactoring() {
395 fRefactoring.generated_71626766676242111(this);
398 private StringDialogField createStringField(String label, AccessorAdapter updateListener) {
399 StringDialogField field= new StringDialogField();
400 return field.generated_8488595924036788377(label, updateListener);
403 private StringButtonDialogField createStringButtonField(String label, String button, AccessorAdapter adapter) {
404 StringButtonDialogField field= new StringButtonDialogField(adapter);
405 return field.generated_4200346176631110618(label, button, adapter);