blob: 18a8601df1929a64d0f0446871bf062e85dd0613 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006, 2010 Soyatec (http://www.soyatec.com) and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Soyatec - initial API and implementation
*******************************************************************************/
package org.eclipse.xwt.tools.ui.designer.dialogs;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Status;
import org.eclipse.xwt.internal.utils.LoggerManager;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IJavaModel;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.core.search.IJavaSearchConstants;
import org.eclipse.jdt.core.search.IJavaSearchScope;
import org.eclipse.jdt.core.search.SearchEngine;
import org.eclipse.jdt.internal.ui.JavaPlugin;
import org.eclipse.jdt.internal.ui.dialogs.FilteredTypesSelectionDialog;
import org.eclipse.jdt.internal.ui.wizards.TypedElementSelectionValidator;
import org.eclipse.jdt.internal.ui.wizards.TypedViewerFilter;
import org.eclipse.jdt.ui.JavaElementComparator;
import org.eclipse.jdt.ui.JavaElementLabelProvider;
import org.eclipse.jdt.ui.StandardJavaElementContentProvider;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.dialogs.StatusDialog;
import org.eclipse.jface.util.Policy;
import org.eclipse.jface.util.Util;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Widget;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.ElementListSelectionDialog;
import org.eclipse.ui.dialogs.ElementTreeSelectionDialog;
import org.eclipse.ui.progress.IProgressService;
import org.eclipse.xwt.tools.ui.designer.wizards.AccessorConfigureInfo;
import org.eclipse.xwt.tools.ui.designer.wizards.ExternalizeStringsCommon;
/**
* @author chenxiaoru (xiaoru.chen@soyatec.com)
*/
@SuppressWarnings("restriction")
public class AccessorConfigurationDialog extends StatusDialog {
private String sourceFolder;
private String sourcePackage;
private String className;
private String propertyFolder;
private String propertyPackage;
private String propertyName;
private Text classNameText;
private Text sourcePackageText;
private Text sourceFolderText;
private Text propertyNameText;
private Text propertyPackageText;
private Text propertyFolderText;
private Button sourcePackagButton;
private Button chooseClassTypeButton;
private Button propertyPackagButton;
private Button choosePropertyTypeButton;
private Button propertyFolderButton;
private Label classDefaultLabel;
private Label propertyDefaultLabel;
private Label propertyLabel;
private boolean isError = false;
private IPackageFragmentRoot classRoot;
private IPackageFragmentRoot propertyRoot;
private IStatus fLastStatus;
private IPackageFragment propertyFragment;
private IPackageFragment classFragment;
private AccessorConfigureInfo info;
Object[] propertyFileNames;
Object[] classFileNames;
public AccessorConfigurationDialog(Shell parent, AccessorConfigureInfo info) {
super(parent);
this.info = info;
}
protected Control createDialogArea(Composite ancestor) {
if (info.getClassRoot() != null) {
classRoot = info.getClassRoot();
classFragment = classRoot.getPackageFragment(info.getSourcePackage());
classFileNames = createFileListInput(".java", classFragment);
}
if (info.getPropertyRoot() != null) {
propertyRoot = info.getPropertyRoot();
propertyFragment = propertyRoot.getPackageFragment(info.getPropertyPackage());
propertyFileNames = createFileListInput(".properties", propertyFragment);
}
Composite parent = (Composite) super.createDialogArea(ancestor);
Composite container = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout();
layout.numColumns = 3;
container.setLayout(layout);
String resourceLabelContens = "Resource bundle accessor class(will be created if it does not exist):";
createClassLabel(container, resourceLabelContens);
createClassFolderField(container);
createClassPackageField(container);
createClassNameField(container);
drawLine(container);
String propertyLabelContens = "Property file location and name:";
createPropertyLabel(container, propertyLabelContens);
createPropertyFolderField(container);
createPropertyPackageField(container);
createPropertyNameField(container);
getExistPropertyFile();
return parent;
}
/**
* draw a line on container.
*
* @param container
*/
private void drawLine(Composite container) {
Label hLabel = new Label(container, SWT.SEPARATOR | SWT.HORIZONTAL);
GridData gridData = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
gridData.horizontalSpan = 3;
gridData.heightHint = 20;
hLabel.setLayoutData(gridData);
}
private void createClassLabel(Composite container, String labelContents) {
Label classLabel = new Label(container, SWT.NONE);
GridData gridData = new GridData();
gridData.horizontalSpan = 3;
gridData.heightHint = 20;
classLabel.setText(labelContents);
classLabel.setLayoutData(gridData);
}
private void createPropertyLabel(Composite container, String labelContents) {
propertyLabel = new Label(container, SWT.NONE);
GridData gridData = new GridData();
gridData.horizontalSpan = 3;
gridData.heightHint = 20;
gridData.widthHint = 350;
propertyLabel.setText(labelContents);
propertyLabel.setLayoutData(gridData);
}
private void createClassFolderField(Composite container) {
Label sourceFolderLabel = new Label(container, SWT.NONE);
GridData gridData = new GridData();
sourceFolderLabel.setText("Source folder:");
sourceFolderLabel.setLayoutData(gridData);
sourceFolderText = new Text(container, SWT.BORDER);
gridData = new GridData(GridData.FILL_HORIZONTAL);
sourceFolderText.setLayoutData(gridData);
sourceFolderText.setText(info.getSourceFolder());
sourceFolder = sourceFolderText.getText();
sourceFolderText.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
sourceFolder = sourceFolderText.getText();
setNewRoot("/" + sourceFolder, true);
checkFomat();
}
});
Button sourceFolderButton = new Button(container, SWT.PUSH);
sourceFolderButton.setText("Browse...");
sourceFolderButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
classRoot = chooseSourceContainer(classRoot);
IPath path = classRoot.getPath();
sourceFolderText.setText(path.toString().substring(1));
}
});
}
private void createClassPackageField(Composite container) {
Label sourcePackageLabel = new Label(container, SWT.NONE);
GridData gridData = new GridData();
sourcePackageLabel.setText("Package:");
sourcePackageLabel.setLayoutData(gridData);
Composite classPackageField = new Composite(container, SWT.NONE);
GridLayout layout = new GridLayout();
layout.numColumns = 4;
layout.marginHeight = 0;
layout.marginWidth = 0;
classPackageField.setLayout(layout);
gridData = new GridData(GridData.FILL_HORIZONTAL);
classPackageField.setLayoutData(gridData);
sourcePackageText = new Text(classPackageField, SWT.BORDER);
gridData = new GridData(GridData.FILL_HORIZONTAL);
sourcePackageText.setLayoutData(gridData);
sourcePackageText.setText(info.getSourcePackage());
sourcePackage = sourcePackageText.getText();
sourcePackageText.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
sourcePackage = sourcePackageText.getText();
checkFomat();
if (getSourcePackage() == null || ("").equals(getSourcePackage())) {
classDefaultLabel.setText("(default)");
}
}
});
classDefaultLabel = new Label(classPackageField, SWT.NONE);
gridData = new GridData();
gridData.widthHint = 100;
classDefaultLabel.setLayoutData(gridData);
sourcePackagButton = new Button(container, SWT.PUSH);
sourcePackagButton.setText("Browse...");
sourcePackagButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
Widget widget = e.widget;
choosePackage(widget, classRoot);
}
});
}
private void createClassNameField(Composite container) {
Label classNameLabel = new Label(container, SWT.NONE);
GridData gridData = new GridData();
classNameLabel.setText("Class name:");
classNameLabel.setLayoutData(gridData);
classNameText = new Text(container, SWT.BORDER);
gridData = new GridData(GridData.FILL_HORIZONTAL);
classNameText.setLayoutData(gridData);
classNameText.setText(info.getClassName());
className = classNameText.getText();
classNameText.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
className = classNameText.getText();
checkFomat();
}
});
chooseClassTypeButton = new Button(container, SWT.PUSH);
chooseClassTypeButton.setText("Browse...");
chooseClassTypeButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
browseForAccessorClass(classRoot);
}
});
}
private void createPropertyFolderField(Composite container) {
Label propertyFolderLabel = new Label(container, SWT.NONE);
GridData gridData = new GridData();
propertyFolderLabel.setText("Source folder:");
propertyFolderLabel.setLayoutData(gridData);
propertyFolderText = new Text(container, SWT.BORDER);
gridData = new GridData(GridData.FILL_HORIZONTAL);
propertyFolderText.setLayoutData(gridData);
propertyFolderText.setText(info.getPropertyFolder());
propertyFolder = propertyFolderText.getText();
propertyFolderText.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
propertyFolder = propertyFolderText.getText();
setNewRoot("/" + propertyFolder, false);
checkFomat();
}
});
propertyFolderButton = new Button(container, SWT.PUSH);
propertyFolderButton.setText("Browse...");
propertyFolderButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
propertyRoot = chooseSourceContainer(propertyRoot);
IPath path = propertyRoot.getPath();
propertyFolderText.setText(path.toString().substring(1));
}
});
}
private void createPropertyPackageField(Composite container) {
Label propertyPackageLabel = new Label(container, SWT.NONE);
GridData gridData = new GridData();
propertyPackageLabel.setText("Package:");
propertyPackageLabel.setLayoutData(gridData);
Composite propertyPackageField = new Composite(container, SWT.NONE);
GridLayout layout = new GridLayout();
layout.numColumns = 4;
layout.marginHeight = 0;
layout.marginWidth = 0;
propertyPackageField.setLayout(layout);
gridData = new GridData(GridData.FILL_HORIZONTAL);
propertyPackageField.setLayoutData(gridData);
propertyPackageText = new Text(propertyPackageField, SWT.BORDER);
gridData = new GridData(GridData.FILL_HORIZONTAL);
propertyPackageText.setLayoutData(gridData);
propertyPackageText.setText(info.getPropertyPackage());
propertyPackage = propertyPackageText.getText();
propertyPackageText.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
propertyPackage = propertyPackageText.getText();
checkFomat();
if (getPropertyPackage() == null || ("").equals(getPropertyPackage())) {
propertyDefaultLabel.setText("(default)");
}
}
});
propertyDefaultLabel = new Label(propertyPackageField, SWT.NONE);
gridData = new GridData();
gridData.widthHint = 100;
propertyDefaultLabel.setLayoutData(gridData);
propertyPackagButton = new Button(container, SWT.PUSH);
propertyPackagButton.setText("Browse...");
propertyPackagButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
Widget widget = e.widget;
choosePackage(widget, propertyRoot);
}
});
}
private void createPropertyNameField(Composite container) {
Label propertyNameLabel = new Label(container, SWT.NONE);
GridData gridData = new GridData();
propertyNameLabel.setText("Porperty File name:");
propertyNameLabel.setLayoutData(gridData);
propertyNameText = new Text(container, SWT.BORDER);
gridData = new GridData(GridData.FILL_HORIZONTAL);
propertyNameText.setLayoutData(gridData);
propertyNameText.setText(info.getPropertyName());
propertyName = propertyNameText.getText();
propertyNameText.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
propertyName = propertyNameText.getText();
checkFomat();
}
});
choosePropertyTypeButton = new Button(container, SWT.PUSH);
choosePropertyTypeButton.setText("Browse...");
choosePropertyTypeButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
browseForPropertyFile();
}
});
}
protected void browseForAccessorClass(IPackageFragmentRoot root) {
IProgressService service = PlatformUI.getWorkbench().getProgressService();
IJavaSearchScope scope = root != null ? SearchEngine.createJavaSearchScope(new IJavaElement[] { root }) : SearchEngine.createWorkspaceScope();
FilteredTypesSelectionDialog dialog = new FilteredTypesSelectionDialog(getShell(), false, service, scope, IJavaSearchConstants.CLASS);
dialog.setTitle("Choose a Type");
dialog.setInitialPattern("*Messages");
classFileNames = createFileListInput(".java", classFragment);
if (dialog.open() == Window.OK) {
IType selectedType = (IType) dialog.getFirstResult();
if (selectedType != null) {
classNameText.setText(selectedType.getElementName());
}
}
}
private void browseForPropertyFile() {
ElementListSelectionDialog dialog = new ElementListSelectionDialog(getShell(), new JavaElementLabelProvider());
dialog.setIgnoreCase(false);
dialog.setTitle("Choose the property file:");
dialog.setMessage("Choose the property file:");
dialog.setElements(createFileListInput(".properties", propertyFragment));
propertyFileNames = createFileListInput(".properties", propertyFragment);
dialog.setFilter('*' + "properties");
if (dialog.open() == Window.OK) {
IFile selectedFile = (IFile) dialog.getFirstResult();
if (selectedFile != null)
propertyNameText.setText(selectedFile.getName().substring(0, selectedFile.getName().lastIndexOf(".properties")));
}
}
private Object[] createFileListInput(String extension, IPackageFragment fragment) {
try {
if (fragment == null)
return new Object[0];
List result = new ArrayList(1);
if (".java".equals(extension)) {
Object[] java = fragment.getChildren();
return java;
}
Object[] nonjava = fragment.getNonJavaResources();
for (int i = 0; i < nonjava.length; i++) {
if (isAlrightFile(nonjava[i], extension))
result.add(nonjava[i]);
}
return result.toArray();
} catch (JavaModelException e) {
return new Object[0];
}
}
private static boolean isAlrightFile(Object o, String extension) {
if (!(o instanceof IFile))
return false;
IFile file = (IFile) o;
return (extension.equals('.' + file.getFileExtension()));
}
/**
* Set the root null.
*
* @param isClass
*/
private void setRootNull(boolean isClass) {
if (isClass) {
classRoot = null;
} else {
propertyRoot = null;
}
}
/**
* While user change the sourceFolderText or propertyFolderText's nameMap,refresh the root.
*
* @param path
*/
private void setNewRoot(String path, boolean isClass) {
int start = path.indexOf("/");
IResource container = ResourcesPlugin.getWorkspace().getRoot().findMember(new Path(path));
if (path.length() == 0 || container == null || (container.getType() & (IResource.PROJECT | IResource.FOLDER)) == 0) {
setRootNull(isClass);
} else if ((path.indexOf("/", path.indexOf("/", start + 1) + 1) != -1) || (path.indexOf("\\") != -1)) {
setRootNull(isClass);
} else {
try {
final IFile file = ExternalizeStringsCommon.getIFile(path, "");
IJavaProject javaProject = JavaCore.create(file.getProject());
IPackageFragmentRoot fragmentRoot[] = javaProject.getAllPackageFragmentRoots();
for (int i = 0; i < fragmentRoot.length; i++) {
if (fragmentRoot[i].getResource() != null) {
if (isClass) {
classRoot = fragmentRoot[i];
} else {
propertyRoot = fragmentRoot[i];
}
break;
}
}
} catch (CoreException e) {
LoggerManager.log(e);
}
}
}
protected void choosePackage(Widget widget, IPackageFragmentRoot root) {
IJavaElement[] packages = null;
try {
if (root != null && root.exists()) {
packages = root.getChildren();
}
} catch (JavaModelException e) {
// no need to react
}
if (packages == null) {
packages = new IJavaElement[0];
}
ElementListSelectionDialog dialog = new ElementListSelectionDialog(getShell(), new JavaElementLabelProvider(JavaElementLabelProvider.SHOW_DEFAULT));
dialog.setIgnoreCase(true);
dialog.setTitle("Package Selection");
dialog.setMessage("Choose the destination package:");
dialog.setElements(packages);
if (dialog.open() == Window.OK) {
IPackageFragment fragment = (IPackageFragment) dialog.getFirstResult();
if (widget.equals(sourcePackagButton)) {
sourcePackageText.setText(fragment.getElementName());
// classFilePath = fragment.getPath().toString();
classFragment = fragment;
} else if (widget.equals(propertyPackagButton)) {
propertyPackageText.setText(fragment.getElementName());
// propertyFilePath = fragment.getPath().toString();
propertyFragment = fragment;
}
}
}
/**
* Uses the standard container selection dialog to choose the new value for the container field.
*/
private IPackageFragmentRoot chooseSourceContainer(IPackageFragmentRoot root) {
Class[] acceptedClasses = new Class[] { IPackageFragmentRoot.class, IJavaProject.class };
TypedElementSelectionValidator validator = new TypedElementSelectionValidator(acceptedClasses, false) {
public boolean isSelectedValid(Object element) {
try {
if (element instanceof IJavaProject) {
IJavaProject jproject = (IJavaProject) element;
IPath path = jproject.getProject().getFullPath();
return (jproject.findPackageFragmentRoot(path) != null);
} else if (element instanceof IPackageFragmentRoot) {
return (((IPackageFragmentRoot) element).getKind() == IPackageFragmentRoot.K_SOURCE);
}
return true;
} catch (JavaModelException e) {
JavaPlugin.log(e.getStatus()); // just log, no ui in validation
}
return false;
}
};
acceptedClasses = new Class[] { IJavaModel.class, IPackageFragmentRoot.class, IJavaProject.class };
ViewerFilter filter = new TypedViewerFilter(acceptedClasses) {
public boolean select(Viewer viewer, Object parent, Object element) {
if (element instanceof IPackageFragmentRoot) {
try {
return (((IPackageFragmentRoot) element).getKind() == IPackageFragmentRoot.K_SOURCE);
} catch (JavaModelException e) {
JavaPlugin.log(e.getStatus()); // just log, no ui in validation
return false;
}
}
return super.select(viewer, parent, element);
}
};
StandardJavaElementContentProvider provider = new StandardJavaElementContentProvider();
ILabelProvider labelProvider = new JavaElementLabelProvider(JavaElementLabelProvider.SHOW_DEFAULT);
ElementTreeSelectionDialog dialog = new ElementTreeSelectionDialog(getShell(), labelProvider, provider);
dialog.setValidator(validator);
dialog.setComparator(new JavaElementComparator());
dialog.setTitle("Source Folder Selection");
dialog.setMessage("Choose a source folder:");
dialog.addFilter(filter);
dialog.setInput(JavaCore.create(ResourcesPlugin.getWorkspace().getRoot()));
if (dialog.open() == Window.OK) {
Object element = dialog.getFirstResult();
if (element instanceof IJavaProject) {
IJavaProject jproject = (IJavaProject) element;
return jproject.getPackageFragmentRoot(jproject.getProject());
} else if (element instanceof IPackageFragmentRoot) {
return (IPackageFragmentRoot) element;
}
return null;
}
return root;
}
/**
* Ensures that both file path are set.
*/
private void checkFilePath(String path, boolean isPackage, boolean isClass) {
IResource container = ResourcesPlugin.getWorkspace().getRoot().findMember(new Path(path));
if (path.length() == 0 && !isPackage) {
updateStatus("Both sources folder must be specified");
return;
}
if (container == null || (container.getType() & (IResource.PROJECT | IResource.FOLDER)) == 0) {
if (isPackage && !("").equals(path)) {
updateStatus("The apecified package for the resource bundle is invalid.");
return;
} else if (!isPackage) {
updateStatus("Both source folders must exist");
return;
}
}
if (!container.isAccessible()) {
updateStatus("Both projects must be writable");
return;
}
if (!isPackage) {
int start = path.indexOf("/");
if ((path.indexOf("/", path.indexOf("/", start + 1) + 1) != -1) || (path.indexOf("\\") != -1)) {
updateStatus("Both source folders must exist");
setRootNull(isClass);
return;
}
}
updateStatus("");
}
/**
* Ensures that both file path are set.
*/
private void checkPackage(String path, String packageName, boolean isProperty) {
if (packageName == null || packageName.length() == 0) {
if (isProperty) {
updateStatus("Incorret package.");
return;
}
}
if ((packageName.indexOf("/") != -1) || (packageName.indexOf("\\") != -1)) {
updateStatus("The apecified package for the resource bundle is invalid.");
return;
}
checkFilePath(path, true, !isProperty);
}
/**
* check the name of the file.
*/
private void checkFileName() {
String regex = "^([_|a-zA-Z])[_\\w]*$";
if ("".equals(getClassName())) {
updateStatus("The class name must be specified.");
} else {
Matcher matcher = Pattern.compile(regex).matcher(className);
if (!(matcher.find())) {
updateStatus("The type name\"" + className + "\"is not a valid indentifier.");
} else {
updateStatus("");
}
}
}
/**
* Check all the text value fomat.
*
* @param message
*/
private void checkFomat() {
checkFilePath("/" + sourceFolder, false, true);
if (isError)
return;
checkFilePath("/" + propertyFolder, false, false);
if (isError)
return;
checkPackage(getClassFilePath(), getSourcePackage(), false);
if (isError)
return;
checkFileName();
if (isError)
return;
checkPackage(getPropertyFilePath(), getPropertyPackage(), true);
if (isError)
return;
if ("".equals(getPropertyName())) {
updateStatus("The Property File Name must be specified. ");
} else {
updateStatus("");
getExistPropertyFile();
}
}
private void updateStatus(String message) {
if (message != null && !"".equals(message)) {
isError = true;
fLastStatus = new Status(IStatus.ERROR, JavaCore.PLUGIN_ID, -1, message, null);
setPropertyFieldEnable(true);
} else {
isError = false;
fLastStatus = new Status(IStatus.OK, Policy.JFACE, IStatus.OK, Util.ZERO_LENGTH_STRING, null);
}
updateStatus(fLastStatus);
}
private void getExistPropertyFile() {
try {
final IFile file = ExternalizeStringsCommon.getIFile(getClassFilePath(), className + ".java");
int keyBegin = getClassFilePath().indexOf("/", 1) + 1;
int keyEnd = getClassFilePath().indexOf("/", keyBegin + 1);
String sourceKey = getClassFilePath().substring(keyBegin, keyEnd);
if (file.exists()) {
// Get the property file's folder.
IJavaProject javaProject = JavaCore.create(file.getProject());
String propertyFolder = javaProject.getElementName() + "/" + sourceKey;
// Get the property file's package and name.
StringBuffer contents = ExternalizeStringsCommon.getHistoryContents(file);
String findKey = "BUNDLE_NAME";
int index = contents.toString().indexOf(findKey);
int start = contents.indexOf("\"", index);
int end = contents.indexOf("\"", start + 1);
String path = contents.substring(start + 1, end);
String propertyPackage = path.substring(0, path.lastIndexOf("."));
String propertyName = path.substring(path.lastIndexOf(".") + 1);
if (!propertyFolder.equals(propertyFolderText.getText())) {
propertyFolderText.setText(propertyFolder);
}
if (!propertyPackage.equals(propertyPackageText.getText())) {
propertyPackageText.setText(propertyPackage);
}
if (!propertyName.equals(propertyNameText.getText())) {
propertyNameText.setText(propertyName);
}
setPropertyFieldEnable(false);
} else {
setPropertyFieldEnable(true);
}
} catch (CoreException e) {
LoggerManager.log(e);
} catch (IOException e) {
LoggerManager.log(e);
}
}
/**
* Notifies that the ok button of this dialog has been pressed.
* <p>
* The <code>Dialog</code> implementation of this framework method sets this dialog's return code to <code>Window.OK</code> and closes the dialog. Subclasses may override.
* </p>
*/
protected void okPressed() {
if (checkFileExist(getClassName(), ".java", classFileNames, getClassFilePath())) {
return;
}
if (checkFileExist(getPropertyName(), ".properties", propertyFileNames, getPropertyFilePath())) {
return;
}
setReturnCode(OK);
close();
}
/**
* Check the file whether already exist with different case.
*/
private boolean checkFileExist(String name, String extension, Object[] names, String path) {
Object[] fileNames = names;
String fileExist;
for (int i = 0; i < fileNames.length; i++) {
if (".java".equals(extension)) {
fileExist = ((IJavaElement) fileNames[i]).getElementName();
} else {
fileExist = ((IFile) fileNames[i]).getName();
}
String fileExistName = fileExist.substring(0, fileExist.lastIndexOf(extension));
if ((!name.equals(fileExistName)) && name.toLowerCase().equals(fileExistName.toLowerCase())) {
showFileExistDialog(name, extension, path);
return true;
}
}
return false;
}
/**
* If file already exist but with different case,show the dialog.
*/
private void showFileExistDialog(String name, String extension, String path) {
String dialogMessage = "File '" + path.replace(".", "/") + "/" + name + extension + "' already exist with different case.";
String[] dialogButtonLabels = { "Ok" };
MessageDialog messageDialog = new MessageDialog(getShell(), "Configure Accessor Class", null, dialogMessage, MessageDialog.ERROR, dialogButtonLabels, 1);
messageDialog.open();
}
/**
* Set the property file configure field disabled or enabled.
*
* @param b
*/
private void setPropertyFieldEnable(boolean b) {
String propertyLabelContens;
if (b) {
propertyLabelContens = "Property file location and name:";
} else {
propertyLabelContens = "Property file location and name(Default exist file):";
}
if (!(propertyLabelContens).equals(propertyLabel.getText())) {
propertyLabel.setText(propertyLabelContens);
}
propertyFolderButton.setEnabled(b);
propertyPackagButton.setEnabled(b);
choosePropertyTypeButton.setEnabled(b);
propertyFolderText.setEnabled(b);
propertyPackageText.setEnabled(b);
propertyNameText.setEnabled(b);
}
public IPackageFragmentRoot getclassRoot() {
return classRoot;
}
public String getClassFilePath() {
return "/" + sourceFolder + "/" + getSourcePackage().replace(".", "/");
}
public String getSourceFolder() {
return sourceFolder;
}
public String getSourcePackage() {
return sourcePackage;
}
public String getClassName() {
return className;
}
public IPackageFragmentRoot getPropertyRoot() {
return propertyRoot;
}
public String getPropertyFolder() {
return propertyFolder;
}
public String getPropertyFilePath() {
return "/" + propertyFolder + "/" + getPropertyPackage().replace(".", "/");
}
public String getPropertyPackage() {
return propertyPackage;
}
public String getPropertyName() {
return propertyName;
}
}