001: /*******************************************************************************
002: * Copyright (c) 2000, 2005 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 org.eclipse.core.resources.IProject;
013: import org.eclipse.core.resources.IResource;
014: import org.eclipse.core.resources.IWorkspaceRoot;
015: import org.eclipse.core.resources.ResourcesPlugin;
016: import org.eclipse.core.runtime.IPath;
017: import org.eclipse.core.runtime.Path;
018:
019: import org.eclipse.swt.widgets.Composite;
020: import org.eclipse.swt.widgets.Control;
021: import org.eclipse.swt.widgets.Text;
022:
023: import org.eclipse.jdt.core.IJavaProject;
024: import org.eclipse.jdt.core.IPackageFragmentRoot;
025: import org.eclipse.jdt.core.JavaCore;
026:
027: import org.eclipse.jdt.internal.ui.refactoring.contentassist.JavaSourcePackageFragmentRootCompletionProcessor;
028: import org.eclipse.jdt.internal.ui.wizards.dialogfields.DialogField;
029: import org.eclipse.jdt.internal.ui.wizards.dialogfields.IDialogFieldListener;
030: import org.eclipse.jdt.internal.ui.wizards.dialogfields.IStringButtonAdapter;
031: import org.eclipse.jdt.internal.ui.wizards.dialogfields.LayoutUtil;
032: import org.eclipse.jdt.internal.ui.wizards.dialogfields.StringButtonDialogField;
033:
034: class SourceFolderSelectionDialogButtonField extends
035: StringButtonDialogField implements IDialogFieldListener {
036:
037: private IPackageFragmentRoot fRoot;
038: private SourceChangeListener fListener;
039: private IDialogFieldListener fUpdateListener;
040:
041: public SourceFolderSelectionDialogButtonField(
042: String descriptionLabel, String browseLabel,
043: IStringButtonAdapter adapter) {
044: super (adapter);
045: setContentAssistProcessor(new JavaSourcePackageFragmentRootCompletionProcessor());
046: setLabelText(descriptionLabel);
047: setButtonLabel(browseLabel);
048: setDialogFieldListener(this );
049: }
050:
051: /* (non-Javadoc)
052: * @see org.eclipse.jdt.internal.ui.wizards.dialogfields.IDialogFieldListener#dialogFieldChanged(org.eclipse.jdt.internal.ui.wizards.dialogfields.DialogField)
053: */
054: public void dialogFieldChanged(DialogField field) {
055: // propagate a textchange to the fragment root of this
056: setRoot(getRootFromString(getText()));
057: }
058:
059: public void setUpdateListener(IDialogFieldListener updateListener) {
060: fUpdateListener = updateListener;
061: }
062:
063: public Control[] doFillIntoGrid(Composite parent, int nColumns,
064: int textWidth) {
065: Control[] res = super .doFillIntoGrid(parent, nColumns);
066:
067: final Text text = getTextControl(null);
068: LayoutUtil.setWidthHint(text, textWidth);
069: LayoutUtil.setHorizontalGrabbing(text);
070:
071: return res;
072: }
073:
074: public void setSourceChangeListener(SourceChangeListener listener) {
075: fListener = listener;
076: }
077:
078: /**
079: * tries to build a packagefragmentroot out of a string and sets the string into this
080: * packagefragmentroot.
081: *
082: * @param rootString
083: */
084: private IPackageFragmentRoot getRootFromString(String rootString) {
085: if (rootString.length() == 0) {
086: return null;
087: }
088: IPath path = new Path(rootString);
089: IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace()
090: .getRoot();
091: IResource res = workspaceRoot.findMember(path);
092: if (res == null) {
093: return null;
094: }
095: int resType = res.getType();
096: if (resType == IResource.PROJECT || resType == IResource.FOLDER) {
097: IProject proj = res.getProject();
098: if (!proj.isOpen()) {
099: return null;
100: }
101: IJavaProject jproject = JavaCore.create(proj);
102: IPackageFragmentRoot root = jproject
103: .getPackageFragmentRoot(res);
104: if (root.exists()) {
105: return root;
106: }
107: }
108: return null;
109: }
110:
111: public void setRoot(IPackageFragmentRoot root) {
112: fRoot = root;
113:
114: if (fRoot != null) {
115: String str = getRootString();
116: if (!getText().equals(str)) {
117: setText(str);
118: }
119: } else {
120: // dont ripple if the root is not a real root
121: }
122:
123: fListener.sourceRootChanged(fRoot);
124: if (fUpdateListener != null) {
125: fUpdateListener.dialogFieldChanged(this );
126: }
127: }
128:
129: public IPackageFragmentRoot getRoot() {
130: return fRoot;
131: }
132:
133: private String getRootString() {
134: return (fRoot == null) ? "" : fRoot.getPath().makeRelative().toString(); //$NON-NLS-1$
135: }
136:
137: }
|