| /******************************************************************************* |
| * 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$ |
| } |
| |
| |
| } |