blob: f57012bd2d91651533ab7992cb9da9a103757681 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2005 IBM Corporation 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jdt.internal.ui.refactoring.nls;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IPath;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Shell;
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.ui.dialogs.ElementTreeSelectionDialog;
import org.eclipse.jdt.core.ICompilationUnit;
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.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.ui.JavaElementLabelProvider;
import org.eclipse.jdt.ui.JavaElementSorter;
import org.eclipse.jdt.ui.StandardJavaElementContentProvider;
import org.eclipse.jdt.internal.ui.JavaPlugin;
import org.eclipse.jdt.internal.ui.util.PixelConverter;
import org.eclipse.jdt.internal.ui.wizards.TypedElementSelectionValidator;
import org.eclipse.jdt.internal.ui.wizards.TypedViewerFilter;
import org.eclipse.jdt.internal.ui.wizards.dialogfields.DialogField;
import org.eclipse.jdt.internal.ui.wizards.dialogfields.IDialogFieldListener;
import org.eclipse.jdt.internal.ui.wizards.dialogfields.IStringButtonAdapter;
import org.eclipse.jdt.internal.ui.wizards.dialogfields.LayoutUtil;
class SourceFirstPackageSelectionDialogField {
private SourceFolderSelectionDialogButtonField fSourceFolderSelection;
private PackageFragmentSelection fPackageSelection;
private Shell fShell;
public SourceFirstPackageSelectionDialogField(String sourceLabel, String packageLabel, String browseLabel1,
String browseLabel2, String statusHint, String dialogTitle, String dialogMessage, String dialogEmptyMessage,
ICompilationUnit cu, IDialogFieldListener updateListener, IPackageFragment fragment) {
fSourceFolderSelection= new SourceFolderSelectionDialogButtonField(sourceLabel, browseLabel1, new SFStringButtonAdapter());
fPackageSelection= new PackageFragmentSelection(this, packageLabel, browseLabel2, statusHint,
new PackageSelectionStringButtonAdapter(this, dialogTitle, dialogMessage, dialogEmptyMessage));
fPackageSelection.setDialogFieldListener(new PackageSelectionDialogFieldListener());
fSourceFolderSelection.setSourceChangeListener(fPackageSelection);
setDefaults(fragment, cu);
fPackageSelection.setUpdateListener(updateListener);
fSourceFolderSelection.setUpdateListener(updateListener);
}
private void setDefaults(IPackageFragment fragment, ICompilationUnit cu) {
IJavaElement element= fragment;
if (element == null) {
element= cu;
}
fSourceFolderSelection.setRoot(searchSourcePackageFragmentRoot(element));
fPackageSelection.setPackageFragment(searchPackageFragment(element));
}
private IPackageFragment searchPackageFragment(IJavaElement jElement) {
return (IPackageFragment)jElement.getAncestor(IJavaElement.PACKAGE_FRAGMENT);
}
private IPackageFragmentRoot searchSourcePackageFragmentRoot(IJavaElement jElement) {
IJavaElement parent= jElement.getAncestor(IJavaElement.PACKAGE_FRAGMENT_ROOT);
if (parent == null) {
return null;
}
IPackageFragmentRoot res= (IPackageFragmentRoot)parent;
try {
if (res.getKind() == IPackageFragmentRoot.K_SOURCE) {
return res;
}
} catch (JavaModelException e) {
// nothing to do
}
return null;
}
class PackageSelectionDialogFieldListener implements IDialogFieldListener {
public void dialogFieldChanged(DialogField field) {
String packName= fPackageSelection.getText();
if (packName.length() == 0)
fPackageSelection.setStatus(NLSUIMessages.NLSAccessorConfigurationDialog_default);
else
fPackageSelection.setStatus(""); //$NON-NLS-1$
}
}
class SFStringButtonAdapter implements IStringButtonAdapter {
public void changeControlPressed(DialogField field) {
IPackageFragmentRoot newSourceContainer= chooseSourceContainer(fSourceFolderSelection.getRoot());
if (newSourceContainer != null) {
fSourceFolderSelection.setRoot(newSourceContainer);
}
}
}
private IPackageFragmentRoot chooseSourceContainer(IJavaElement initElement) {
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(fShell, labelProvider, provider);
dialog.setValidator(validator);
dialog.setSorter(new JavaElementSorter());
dialog.setTitle(NLSUIMessages.SourceFirstPackageSelectionDialogField_ChooseSourceContainerDialog_title);
dialog.setMessage(NLSUIMessages.SourceFirstPackageSelectionDialogField_ChooseSourceContainerDialog_description);
dialog.addFilter(filter);
dialog.setInput(JavaCore.create(ResourcesPlugin.getWorkspace().getRoot()));
dialog.setInitialSelection(initElement);
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 null;
}
public IPackageFragment getSelected() {
IPackageFragment res= fPackageSelection.getPackageFragment();
return res;
}
public IPackageFragmentRoot getSelectedFragmentRoot() {
return fSourceFolderSelection.getRoot();
}
public void setSelected(IPackageFragment newSelection) {
fPackageSelection.setPackageFragment(newSelection);
fSourceFolderSelection.setRoot(searchSourcePackageFragmentRoot(newSelection));
}
public void createControl(Composite parent, int nOfColumns, int textWidth) {
fShell= parent.getShell();
PixelConverter converter= new PixelConverter(parent);
fSourceFolderSelection.doFillIntoGrid(parent, nOfColumns, textWidth);
LayoutUtil.setWidthHint(fSourceFolderSelection.getTextControl(null), converter.convertWidthInCharsToPixels(60));
fPackageSelection.doFillIntoGrid(parent, nOfColumns, textWidth);
LayoutUtil.setWidthHint(fPackageSelection.getTextControl(null), converter.convertWidthInCharsToPixels(60));
}
}