Skip to main content
summaryrefslogtreecommitdiffstats
blob: 934957d96b82d0af95d76b034eab54ebaa8d6b5d (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
/*******************************************************************************
 * Copyright (c) 2006 Sybase, Inc. 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:
 *     Sybase, Inc. - initial API and implementation
 *******************************************************************************/
package org.eclipse.jst.jsf.common.ui.internal.dialogs;

import java.io.File;
import java.util.Arrays;

import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IPath;
import org.eclipse.jdt.core.IJarEntryResource;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.ui.JavaElementLabelProvider;
import org.eclipse.jdt.ui.StandardJavaElementContentProvider;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.jst.jsf.common.ui.IFileFolderConstants;
import org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin;
import org.eclipse.jst.jsf.common.ui.internal.utils.PathUtil;
import org.eclipse.swt.widgets.Shell;

/**
 * This dialog will let client to select resources that located on a
 * IJavaProject classpath, the client can provide a list of files suffixs to
 * filter.
 * 
 * @author mengbo
 */
// TODO: Since many jar files might do nothing to do with client's selection, we
// may need to provides more filter choice
// to clients to exclude unnecessary jar files, such as that are located in JDK
// dir.
public class ResourceOnClasspathDialog extends TreeViewerSelectionDialog {
	// ResourcesOnClasspathDialog.statusMessage = Please select a property file
	private static final String STATUS_MESSAGE = JSFUICommonPlugin
			.getResourceString("Dialog.ResourceOnClasspathDialog.StatusMessage"); //$NON-NLS-1$

	private IJavaProject _javaProject;

	// the suffixs of files that can be selected
	private String _suffixs[];

	// IJMTConstants.DEFAULT_SUFFIX;

	private ResourceOnClasspathFilter _filter;

	// Client doesn't need to know it.
	class ResourceOnClasspathFilter extends ViewerFilter {
		StandardJavaElementContentProvider _javaContentProvider;

		/**
		 * @param contentProvider
		 */
		public ResourceOnClasspathFilter(
				StandardJavaElementContentProvider contentProvider) {
			_javaContentProvider = contentProvider;
		}

		/**
		 * Set the suffixs of files need to be selected.
		 * 
		 * @param suffixs
		 */
		public void setSuffixs(String suffixs[]) {
			_suffixs = suffixs;
		}

		/**
		 * @param contentProvider
		 *            The _javaContentProvider to set.
		 */
		public void setJavaContentProvider(
				StandardJavaElementContentProvider contentProvider) {
			_javaContentProvider = contentProvider;
		}

		/**
		 * @param project
		 *            The _javaProject to set.
		 */
		public void setJavaProject(IJavaProject project) {
			_javaProject = project;
		}

		/*
		 * (non-Javadoc)
		 * 
		 * @see org.eclipse.jface.viewers.ViewerFilter#select(org.eclipse.jface.viewers.Viewer,
		 *      java.lang.Object, java.lang.Object)
		 */
		public boolean select(Viewer viewer, Object parentElement,
				Object element) {
			// TODO: This logic can be improved by add caching mechanism
			if (element instanceof IJavaProject) {
				String currentProjectName = ((IJavaProject) element)
						.getProject().getFullPath().toString().trim();
				String projectName = _javaProject.getProject().getFullPath()
						.toString().trim();
				if (projectName.equalsIgnoreCase(currentProjectName)) {
					return true;
				}
                return false;
			} else if (element instanceof IResource) {
				if (((_javaProject != null) && !_javaProject
						.isOnClasspath((IResource) element))) {
					return false;
				}
				if (element instanceof IFile) {
					if (Arrays.asList(_suffixs).contains(
							((IFile) element).getFileExtension())) {
						return true;
					}
				}
				return false;
			}

			if (element instanceof IJarEntryResource) {
				String ext = ((IJarEntryResource) element).getFullPath()
						.getFileExtension();
				if (ext != null && Arrays.asList(_suffixs).contains(ext)) {
					return true;
				}
                return false;
			}
			if (!(element instanceof IJavaElement)) {
				return false;
			}
			if (((_javaProject != null) && !_javaProject
					.isOnClasspath((IJavaElement) element))) {
				return false;
			}
			IJavaElement javaElement = (IJavaElement) element;
			Object[] children = null;
			switch (javaElement.getElementType()) {
			case IJavaElement.PACKAGE_FRAGMENT_ROOT:
				children = _javaContentProvider.getChildren(javaElement);
				break;
			case IJavaElement.IMPORT_CONTAINER:
				return true;
			case IJavaElement.PACKAGE_FRAGMENT:
				children = _javaContentProvider.getChildren(javaElement);
				break;
			case IJavaElement.CLASS_FILE:
				if (Arrays.asList(_suffixs).contains(
						IFileFolderConstants.EXT_CLASS)) {
					return true;
				} 
                return false;
			case IJavaElement.COMPILATION_UNIT:
				String ext = javaElement.getPath().getFileExtension();
				if (ext != null && Arrays.asList(_suffixs).contains(ext)) {
					return true;
				} 
                return false;
			default:
				return false;
			}

			for (int i = 0; i < children.length; i++) {
				if (select(viewer, javaElement, children[i])) {
					return true;
				}
			}
			// Either the resouce or its children are not for displaying.
			return false;
		}
	}

	/**
	 * Set the suffixs of files need to be selected.
	 * 
	 * @param suffixs
	 */
	public void setSuffixs(String suffixs[]) {
		_suffixs = suffixs;
		_filter.setSuffixs(suffixs);
	}

	/**
	 * @param parentShell
	 * @param project
	 */
	public ResourceOnClasspathDialog(Shell parentShell, IJavaProject project) {
		super(parentShell, STATUS_MESSAGE);
		// set provider and filter
		StandardJavaElementContentProvider contentProvider = new StandardJavaElementContentProvider();
		setContentProvider(contentProvider);
		setLabelProvider(new JavaElementLabelProvider());
		_filter = new ResourceOnClasspathFilter(contentProvider);
		setFilter(_filter);
		// store the project
		_javaProject = project;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.ui.dialogs.SelectionDialog#getResult()
	 */
	public Object[] getResult() {
		Object[] objects = super.getResult();
		if (objects == null || objects.length == 0) {
			return null;
		}
		IPath path = PathUtil.getPathOnClasspath(_javaProject, objects[0]);
		String result = null;
		if (path.segmentCount() == 0) {
			return new Object[] { "" }; //$NON-NLS-1$
		}
		path = path.removeFileExtension();
		result = path.toOSString();
		result = result.replace(File.separatorChar, '.');
		return new Object[] { result };
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jst.pagedesigner.ui.common.SelectionTreeViewerDialog#isValidSelection()
	 */
	protected boolean isValidSelection(Object selection) {
		String extension = PathUtil.getPathOnClasspath(_javaProject, selection)
				.getFileExtension();
		return (extension != null && Arrays.asList(_suffixs).contains(extension));
	}

	protected Object findInputElement() {
		Object input = ResourcesPlugin.getWorkspace();
		if (input instanceof IWorkspace) {
			return JavaCore.create(((IWorkspace) input).getRoot());
		} else if (input instanceof IContainer) {
			IJavaElement element = JavaCore.create((IContainer) input);
			if (element != null && element.exists()) {
				return element;
			}
			return input;
		}
        return JavaCore.create(ResourcesPlugin.getWorkspace().getRoot());
	}
}

Back to the top