001: /*******************************************************************************
002: * Copyright (c) 2000, 2007 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.refactoring.nls;
011:
012: import java.util.ArrayList;
013: import java.util.List;
014:
015: import org.eclipse.core.runtime.IPath;
016: import org.eclipse.core.runtime.IStatus;
017: import org.eclipse.core.runtime.Path;
018:
019: import org.eclipse.core.resources.IFile;
020:
021: import org.eclipse.swt.SWT;
022: import org.eclipse.swt.graphics.GC;
023: import org.eclipse.swt.layout.GridLayout;
024: import org.eclipse.swt.widgets.Composite;
025: import org.eclipse.swt.widgets.Control;
026: import org.eclipse.swt.widgets.Label;
027: import org.eclipse.swt.widgets.Shell;
028: import org.eclipse.swt.widgets.Text;
029:
030: import org.eclipse.jface.dialogs.Dialog;
031: import org.eclipse.jface.dialogs.StatusDialog;
032: import org.eclipse.jface.window.Window;
033:
034: import org.eclipse.ui.PlatformUI;
035: import org.eclipse.ui.dialogs.ElementListSelectionDialog;
036: import org.eclipse.ui.progress.IProgressService;
037:
038: import org.eclipse.jdt.core.ICompilationUnit;
039: import org.eclipse.jdt.core.IJavaElement;
040: import org.eclipse.jdt.core.IJavaProject;
041: import org.eclipse.jdt.core.IPackageFragment;
042: import org.eclipse.jdt.core.IPackageFragmentRoot;
043: import org.eclipse.jdt.core.IType;
044: import org.eclipse.jdt.core.JavaModelException;
045: import org.eclipse.jdt.core.search.IJavaSearchConstants;
046: import org.eclipse.jdt.core.search.IJavaSearchScope;
047: import org.eclipse.jdt.core.search.SearchEngine;
048:
049: import org.eclipse.jdt.internal.corext.refactoring.nls.NLSRefactoring;
050: import org.eclipse.jdt.internal.corext.util.JavaConventionsUtil;
051: import org.eclipse.jdt.internal.corext.util.Messages;
052:
053: import org.eclipse.jdt.ui.JavaElementLabelProvider;
054:
055: import org.eclipse.jdt.internal.ui.IJavaHelpContextIds;
056: import org.eclipse.jdt.internal.ui.dialogs.FilteredTypesSelectionDialog;
057: import org.eclipse.jdt.internal.ui.dialogs.StatusInfo;
058: import org.eclipse.jdt.internal.ui.dialogs.StatusUtil;
059: import org.eclipse.jdt.internal.ui.dialogs.TextFieldNavigationHandler;
060: import org.eclipse.jdt.internal.ui.util.ExceptionHandler;
061: import org.eclipse.jdt.internal.ui.wizards.dialogfields.DialogField;
062: import org.eclipse.jdt.internal.ui.wizards.dialogfields.IDialogFieldListener;
063: import org.eclipse.jdt.internal.ui.wizards.dialogfields.IStringButtonAdapter;
064: import org.eclipse.jdt.internal.ui.wizards.dialogfields.LayoutUtil;
065: import org.eclipse.jdt.internal.ui.wizards.dialogfields.Separator;
066: import org.eclipse.jdt.internal.ui.wizards.dialogfields.StringButtonDialogField;
067: import org.eclipse.jdt.internal.ui.wizards.dialogfields.StringDialogField;
068:
069: public class NLSAccessorConfigurationDialog extends StatusDialog {
070:
071: private SourceFirstPackageSelectionDialogField fResourceBundlePackage;
072: private StringButtonDialogField fResourceBundleFile;
073: private SourceFirstPackageSelectionDialogField fAccessorPackage;
074: private StringDialogField fAccessorClassName;
075: private StringDialogField fSubstitutionPattern;
076:
077: private NLSRefactoring fRefactoring;
078:
079: private IStatus[] fStati;
080:
081: private static final int IDX_ACCESSOR_CLASS = 0;
082: private static final int IDX_ACCESSOR_PACKAGE = 1;
083: private static final int IDX_SUBST_PATTERN = 2;
084: private static final int IDX_BUNDLE_NAME = 3;
085: private static final int IDX_BUNDLE_PACKAGE = 4;
086:
087: private class AccessorAdapter implements IDialogFieldListener,
088: IStringButtonAdapter {
089: public void dialogFieldChanged(DialogField field) {
090: validateAll();
091: }
092:
093: public void changeControlPressed(DialogField field) {
094: if (field == fResourceBundleFile) {
095: browseForPropertyFile();
096: } else if (field == fAccessorClassName) {
097: browseForAccessorClass();
098: }
099: }
100: }
101:
102: public NLSAccessorConfigurationDialog(Shell parent,
103: NLSRefactoring refactoring) {
104: super (parent);
105: setShellStyle(getShellStyle() | SWT.RESIZE);
106:
107: fRefactoring = refactoring;
108: fStati = new IStatus[] { StatusInfo.OK_STATUS,
109: StatusInfo.OK_STATUS, StatusInfo.OK_STATUS,
110: StatusInfo.OK_STATUS, StatusInfo.OK_STATUS };
111:
112: setTitle(NLSUIMessages.NLSAccessorConfigurationDialog_title);
113:
114: AccessorAdapter updateListener = new AccessorAdapter();
115:
116: ICompilationUnit cu = refactoring.getCu();
117:
118: fAccessorPackage = new SourceFirstPackageSelectionDialogField(
119: NLSUIMessages.NLSAccessorConfigurationDialog_accessor_path,
120: NLSUIMessages.NLSAccessorConfigurationDialog_accessor_package,
121: NLSUIMessages.NLSAccessorConfigurationDialog_browse1,
122: NLSUIMessages.NLSAccessorConfigurationDialog_browse2,
123: NLSUIMessages.NLSAccessorConfigurationDialog_default_package,
124: NLSUIMessages.NLSAccessorConfigurationDialog_accessor_dialog_title,
125: NLSUIMessages.NLSAccessorConfigurationDialog_accessor_dialog_message,
126: NLSUIMessages.NLSAccessorConfigurationDialog_accessor_dialog_emtpyMessage,
127: cu, updateListener, refactoring
128: .getAccessorClassPackage());
129:
130: fAccessorClassName = createStringButtonField(
131: NLSUIMessages.NLSAccessorConfigurationDialog_className,
132: NLSUIMessages.NLSAccessorConfigurationDialog_browse6,
133: updateListener);
134: fSubstitutionPattern = createStringField(
135: NLSUIMessages.NLSAccessorConfigurationDialog_substitutionPattern,
136: updateListener);
137:
138: fResourceBundlePackage = new SourceFirstPackageSelectionDialogField(
139: NLSUIMessages.NLSAccessorConfigurationDialog_property_path,
140: NLSUIMessages.NLSAccessorConfigurationDialog_property_package,
141: NLSUIMessages.NLSAccessorConfigurationDialog_browse3,
142: NLSUIMessages.NLSAccessorConfigurationDialog_browse4,
143: NLSUIMessages.NLSAccessorConfigurationDialog_default_package,
144: NLSUIMessages.NLSAccessorConfigurationDialog_property_dialog_title,
145: NLSUIMessages.NLSAccessorConfigurationDialog_property_dialog_message,
146: NLSUIMessages.NLSAccessorConfigurationDialog_property_dialog_emptyMessage,
147: cu, updateListener, fRefactoring
148: .getResourceBundlePackage());
149:
150: fResourceBundleFile = createStringButtonField(
151: NLSUIMessages.NLSAccessorConfigurationDialog_property_file_name,
152: NLSUIMessages.NLSAccessorConfigurationDialog_browse5,
153: updateListener);
154:
155: initFields();
156: }
157:
158: private void initFields() {
159: initAccessorClassFields();
160: String resourceBundleName = fRefactoring
161: .getResourceBundleName();
162: fResourceBundleFile
163: .setText(resourceBundleName != null ? resourceBundleName
164: : (NLSRefactoring.DEFAULT_PROPERTY_FILENAME + NLSRefactoring.PROPERTY_FILE_EXT));
165: }
166:
167: private void initAccessorClassFields() {
168: String accessorClassName = fRefactoring.getAccessorClassName();
169:
170: if (accessorClassName == null) {
171: accessorClassName = NLSRefactoring.DEFAULT_ACCESSOR_CLASSNAME;
172: }
173: fAccessorClassName.setText(accessorClassName);
174:
175: fSubstitutionPattern.setText(fRefactoring
176: .getSubstitutionPattern());
177: }
178:
179: protected Control createDialogArea(Composite ancestor) {
180: Composite parent = (Composite) super .createDialogArea(ancestor);
181:
182: final int nOfColumns = 4;
183:
184: initializeDialogUnits(ancestor);
185:
186: GridLayout layout = (GridLayout) parent.getLayout();
187: layout.numColumns = nOfColumns;
188: parent.setLayout(layout);
189:
190: createAccessorPart(parent, nOfColumns,
191: convertWidthInCharsToPixels(40));
192:
193: Separator s = new Separator(SWT.SEPARATOR | SWT.HORIZONTAL);
194: s.doFillIntoGrid(parent, nOfColumns);
195:
196: createPropertyPart(parent, nOfColumns,
197: convertWidthInCharsToPixels(40));
198:
199: Dialog.applyDialogFont(parent);
200: PlatformUI
201: .getWorkbench()
202: .getHelpSystem()
203: .setHelp(
204: parent,
205: IJavaHelpContextIds.EXTERNALIZE_WIZARD_PROPERTIES_FILE_PAGE);
206: validateAll();
207: return parent;
208: }
209:
210: private void createAccessorPart(Composite parent,
211: final int nOfColumns, int textWidth) {
212: createLabel(
213: parent,
214: NLSUIMessages.NLSAccessorConfigurationDialog_resourceBundle_title,
215: nOfColumns);
216: fAccessorPackage.createControl(parent, nOfColumns, textWidth);
217:
218: fAccessorClassName.doFillIntoGrid(parent, nOfColumns);
219: Text accessorClassText = fAccessorClassName
220: .getTextControl(null);
221: LayoutUtil.setWidthHint(accessorClassText,
222: convertWidthInCharsToPixels(60));
223: TextFieldNavigationHandler.install(accessorClassText);
224:
225: fSubstitutionPattern.doFillIntoGrid(parent, nOfColumns);
226: Text substitutionPatternText = fSubstitutionPattern
227: .getTextControl(null);
228: LayoutUtil.setWidthHint(substitutionPatternText,
229: convertWidthInCharsToPixels(60));
230: TextFieldNavigationHandler.install(substitutionPatternText);
231:
232: fSubstitutionPattern.setEnabled(!fRefactoring.isEclipseNLS());
233: }
234:
235: private void createPropertyPart(Composite parent,
236: final int nOfColumns, final int textWidth) {
237: createLabel(
238: parent,
239: NLSUIMessages.NLSAccessorConfigurationDialog_property_location,
240: nOfColumns);
241: fResourceBundlePackage.createControl(parent, nOfColumns,
242: textWidth);
243:
244: fResourceBundleFile.doFillIntoGrid(parent, nOfColumns);
245: LayoutUtil.setWidthHint(fResourceBundleFile
246: .getTextControl(null), convertWidthInCharsToPixels(60));
247: }
248:
249: private void createLabel(Composite parent, final String text,
250: final int N_OF_COLUMNS) {
251: Separator label = new Separator(SWT.NONE);
252: ((Label) label.getSeparator(parent)).setText(text);
253: GC gc = new GC(parent);
254: int height = gc.stringExtent(text).y;
255: gc.dispose();
256: label.doFillIntoGrid(parent, N_OF_COLUMNS, height);
257: }
258:
259: private void browseForPropertyFile() {
260: ElementListSelectionDialog dialog = new ElementListSelectionDialog(
261: getShell(), new JavaElementLabelProvider());
262: dialog.setIgnoreCase(false);
263: dialog
264: .setTitle(NLSUIMessages.NLSAccessorConfigurationDialog_Property_File_Selection);
265: dialog
266: .setMessage(NLSUIMessages.NLSAccessorConfigurationDialog_Choose_the_property_file);
267: dialog.setElements(createFileListInput());
268: dialog.setFilter('*' + NLSRefactoring.PROPERTY_FILE_EXT);
269: if (dialog.open() == Window.OK) {
270: IFile selectedFile = (IFile) dialog.getFirstResult();
271: if (selectedFile != null)
272: fResourceBundleFile.setText(selectedFile.getName());
273: }
274: }
275:
276: protected void browseForAccessorClass() {
277: IProgressService service = PlatformUI.getWorkbench()
278: .getProgressService();
279: IPackageFragmentRoot root = fAccessorPackage
280: .getSelectedFragmentRoot();
281:
282: IJavaSearchScope scope = root != null ? SearchEngine
283: .createJavaSearchScope(new IJavaElement[] { root })
284: : SearchEngine.createWorkspaceScope();
285:
286: FilteredTypesSelectionDialog dialog = new FilteredTypesSelectionDialog(
287: getShell(), false, service, scope,
288: IJavaSearchConstants.CLASS);
289: dialog
290: .setTitle(NLSUIMessages.NLSAccessorConfigurationDialog_Accessor_Selection);
291: dialog
292: .setMessage(NLSUIMessages.NLSAccessorConfigurationDialog_Choose_the_accessor_file);
293: dialog.setInitialPattern("*Messages"); //$NON-NLS-1$
294: if (dialog.open() == Window.OK) {
295: IType selectedType = (IType) dialog.getFirstResult();
296: if (selectedType != null) {
297: fAccessorClassName.setText(selectedType
298: .getElementName());
299: fAccessorPackage.setSelected(selectedType
300: .getPackageFragment());
301: }
302: }
303:
304: }
305:
306: private Object[] createFileListInput() {
307: try {
308:
309: IPackageFragment fPkgFragment = fResourceBundlePackage
310: .getSelected();
311: if (fPkgFragment == null)
312: return new Object[0];
313: List result = new ArrayList(1);
314: Object[] nonjava = fPkgFragment.getNonJavaResources();
315: for (int i = 0; i < nonjava.length; i++) {
316: if (isPropertyFile(nonjava[i]))
317: result.add(nonjava[i]);
318: }
319: return result.toArray();
320:
321: } catch (JavaModelException e) {
322: ExceptionHandler
323: .handle(
324: e,
325: NLSUIMessages.NLSAccessorConfigurationDialog_externalizing,
326: NLSUIMessages.NLSAccessorConfigurationDialog_exception);
327: return new Object[0];
328: }
329: }
330:
331: private static boolean isPropertyFile(Object o) {
332: if (!(o instanceof IFile))
333: return false;
334: IFile file = (IFile) o;
335: return (NLSRefactoring.PROPERTY_FILE_EXT.equals('.' + file
336: .getFileExtension()));
337: }
338:
339: /**
340: * checks all entered values delegates to the specific validate methods these methods
341: * update the refactoring
342: */
343: private void validateAll() {
344: validateSubstitutionPattern();
345:
346: validateAccessorClassName();
347: checkPackageFragment();
348:
349: validatePropertyFilename();
350: validatePropertyPackage();
351:
352: updateStatus(StatusUtil.getMostSevere(fStati));
353: }
354:
355: private void validateAccessorClassName() {
356: String className = fAccessorClassName.getText();
357:
358: IStatus status = JavaConventionsUtil.validateJavaTypeName(
359: className, fAccessorPackage.getSelectedFragmentRoot());
360: if (status.getSeverity() == IStatus.ERROR) {
361: setInvalid(IDX_ACCESSOR_CLASS, status.getMessage());
362: return;
363: }
364:
365: if (className.indexOf('.') != -1) {
366: setInvalid(IDX_ACCESSOR_CLASS,
367: NLSUIMessages.NLSAccessorConfigurationDialog_no_dot);
368: return;
369: }
370:
371: setValid(IDX_ACCESSOR_CLASS);
372: }
373:
374: private void validatePropertyFilename() {
375: String fileName = fResourceBundleFile.getText();
376: if ((fileName == null) || (fileName.length() == 0)) {
377: setInvalid(
378: IDX_BUNDLE_NAME,
379: NLSUIMessages.NLSAccessorConfigurationDialog_enter_name);
380: return;
381: }
382:
383: if (!fileName.endsWith(NLSRefactoring.PROPERTY_FILE_EXT)) {
384: setInvalid(
385: IDX_BUNDLE_NAME,
386: Messages
387: .format(
388: NLSUIMessages.NLSAccessorConfigurationDialog_file_name_must_end,
389: NLSRefactoring.PROPERTY_FILE_EXT));
390: return;
391: }
392:
393: setValid(IDX_BUNDLE_NAME);
394: }
395:
396: private void validatePropertyPackage() {
397:
398: IPackageFragmentRoot root = fResourceBundlePackage
399: .getSelectedFragmentRoot();
400: if ((root == null) || !root.exists()) {
401: setInvalid(
402: IDX_BUNDLE_PACKAGE,
403: NLSUIMessages.NLSAccessorConfigurationDialog_property_package_root_invalid);
404: return;
405: }
406:
407: IPackageFragment fragment = fResourceBundlePackage
408: .getSelected();
409: if ((fragment == null) || !fragment.exists()) {
410: setInvalid(
411: IDX_BUNDLE_PACKAGE,
412: NLSUIMessages.NLSAccessorConfigurationDialog_property_package_invalid);
413: return;
414: }
415:
416: String pkgName = fragment.getElementName();
417:
418: IStatus status = JavaConventionsUtil.validatePackageName(
419: pkgName, root);
420: if ((pkgName.length() > 0)
421: && (status.getSeverity() == IStatus.ERROR)) {
422: setInvalid(IDX_BUNDLE_PACKAGE, status.getMessage());
423: return;
424: }
425:
426: IPath pkgPath = new Path(pkgName.replace('.', IPath.SEPARATOR))
427: .makeRelative();
428:
429: IJavaProject project = fRefactoring.getCu().getJavaProject();
430: try {
431: IJavaElement element = project.findElement(pkgPath);
432: if (element == null || !element.exists()) {
433: setInvalid(
434: IDX_BUNDLE_PACKAGE,
435: NLSUIMessages.NLSAccessorConfigurationDialog_must_exist);
436: return;
437: }
438: IPackageFragment fPkgFragment = (IPackageFragment) element;
439: if (!PackageBrowseAdapter.canAddPackage(fPkgFragment)) {
440: setInvalid(
441: IDX_BUNDLE_PACKAGE,
442: NLSUIMessages.NLSAccessorConfigurationDialog_incorrect_package);
443: return;
444: }
445: if (!PackageBrowseAdapter
446: .canAddPackageRoot((IPackageFragmentRoot) fPkgFragment
447: .getParent())) {
448: setInvalid(
449: IDX_BUNDLE_PACKAGE,
450: NLSUIMessages.NLSAccessorConfigurationDialog_incorrect_package);
451: return;
452: }
453: } catch (JavaModelException e) {
454: setInvalid(IDX_BUNDLE_PACKAGE, e.getStatus().getMessage());
455: return;
456: }
457:
458: setValid(IDX_BUNDLE_PACKAGE);
459: }
460:
461: private void checkPackageFragment() {
462: IPackageFragmentRoot root = fAccessorPackage
463: .getSelectedFragmentRoot();
464: if ((root == null) || !root.exists()) {
465: setInvalid(
466: IDX_ACCESSOR_PACKAGE,
467: NLSUIMessages.NLSAccessorConfigurationDialog_accessor_package_root_invalid);
468: return;
469: }
470:
471: IPackageFragment fragment = fAccessorPackage.getSelected();
472: if ((fragment == null) || !fragment.exists()) {
473: setInvalid(
474: IDX_ACCESSOR_PACKAGE,
475: NLSUIMessages.NLSAccessorConfigurationDialog_accessor_package_invalid);
476: return;
477: }
478: setValid(IDX_ACCESSOR_PACKAGE);
479: }
480:
481: private void validateSubstitutionPattern() {
482: if ((fSubstitutionPattern.getText() == null)
483: || (fSubstitutionPattern.getText().length() == 0)) {
484: setInvalid(
485: IDX_SUBST_PATTERN,
486: NLSUIMessages.NLSAccessorConfigurationDialog_substitution_pattern_missing);
487: } else {
488: setValid(IDX_SUBST_PATTERN);
489: }
490: }
491:
492: private void setInvalid(int idx, String msg) {
493: fStati[idx] = new StatusInfo(IStatus.ERROR, msg);
494: }
495:
496: private void setValid(int idx) {
497: fStati[idx] = StatusInfo.OK_STATUS;
498: }
499:
500: /* (non-Javadoc)
501: * @see org.eclipse.jface.dialogs.Dialog#okPressed()
502: */
503: protected void okPressed() {
504: updateRefactoring();
505: super .okPressed();
506: }
507:
508: void updateRefactoring() {
509: fRefactoring.setAccessorClassPackage(fAccessorPackage
510: .getSelected());
511: fRefactoring.setAccessorClassName(fAccessorClassName.getText());
512:
513: fRefactoring.setResourceBundleName(fResourceBundleFile
514: .getText());
515: fRefactoring.setResourceBundlePackage(fResourceBundlePackage
516: .getSelected());
517:
518: if (!fRefactoring.isEclipseNLS())
519: fRefactoring.setSubstitutionPattern(fSubstitutionPattern
520: .getText());
521:
522: fRefactoring.setIsEclipseNLS(fRefactoring.detectIsEclipseNLS());
523: }
524:
525: private StringDialogField createStringField(String label,
526: AccessorAdapter updateListener) {
527: StringDialogField field = new StringDialogField();
528: field.setDialogFieldListener(updateListener);
529: field.setLabelText(label);
530: return field;
531: }
532:
533: private StringButtonDialogField createStringButtonField(
534: String label, String button, AccessorAdapter adapter) {
535: StringButtonDialogField field = new StringButtonDialogField(
536: adapter);
537: field.setDialogFieldListener(adapter);
538: field.setLabelText(label);
539: field.setButtonLabel(button);
540: return field;
541: }
542:
543: }
|