blob: fef3a392a2c5c036992714e5057ab9f5956a340e [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.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Text;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.internal.ui.refactoring.contentassist.JavaSourcePackageFragmentRootCompletionProcessor;
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;
import org.eclipse.jdt.internal.ui.wizards.dialogfields.StringButtonDialogField;
class SourceFolderSelectionDialogButtonField extends StringButtonDialogField implements IDialogFieldListener {
private IPackageFragmentRoot fRoot;
private SourceChangeListener fListener;
private IDialogFieldListener fUpdateListener;
public SourceFolderSelectionDialogButtonField(String descriptionLabel, String browseLabel, IStringButtonAdapter adapter) {
super(adapter);
setContentAssistProcessor(new JavaSourcePackageFragmentRootCompletionProcessor());
setLabelText(descriptionLabel);
setButtonLabel(browseLabel);
setDialogFieldListener(this);
}
/* (non-Javadoc)
* @see org.eclipse.jdt.internal.ui.wizards.dialogfields.IDialogFieldListener#dialogFieldChanged(org.eclipse.jdt.internal.ui.wizards.dialogfields.DialogField)
*/
public void dialogFieldChanged(DialogField field) {
// propagate a textchange to the fragment root of this
setRoot(getRootFromString(getText()));
}
public void setUpdateListener(IDialogFieldListener updateListener) {
fUpdateListener= updateListener;
}
public Control[] doFillIntoGrid(Composite parent, int nColumns, int textWidth) {
Control[] res= super.doFillIntoGrid(parent, nColumns);
final Text text= getTextControl(null);
LayoutUtil.setWidthHint(text, textWidth);
LayoutUtil.setHorizontalGrabbing(text);
return res;
}
public void setSourceChangeListener(SourceChangeListener listener) {
fListener= listener;
}
/**
* tries to build a packagefragmentroot out of a string and sets the string into this
* packagefragmentroot.
*
* @param rootString
*/
private IPackageFragmentRoot getRootFromString(String rootString) {
if (rootString.length() == 0) {
return null;
}
IPath path= new Path(rootString);
IWorkspaceRoot workspaceRoot= ResourcesPlugin.getWorkspace().getRoot();
IResource res= workspaceRoot.findMember(path);
if (res == null) {
return null;
}
int resType= res.getType();
if (resType == IResource.PROJECT || resType == IResource.FOLDER) {
IProject proj= res.getProject();
if (!proj.isOpen()) {
return null;
}
IJavaProject jproject= JavaCore.create(proj);
IPackageFragmentRoot root= jproject.getPackageFragmentRoot(res);
if (root.exists()) {
return root;
}
}
return null;
}
public void setRoot(IPackageFragmentRoot root) {
fRoot= root;
if (fRoot != null) {
String str= getRootString();
if (!getText().equals(str)) {
setText(str);
}
} else {
// dont ripple if the root is not a real root
}
fListener.sourceRootChanged(fRoot);
if (fUpdateListener != null) {
fUpdateListener.dialogFieldChanged(this);
}
}
public IPackageFragmentRoot getRoot() {
return fRoot;
}
private String getRootString() {
return (fRoot == null) ? "" : fRoot.getPath().makeRelative().toString(); //$NON-NLS-1$
}
}