blob: debc2f9960a6d260dd64dd1539f1ec615228b076 [file] [log] [blame]
/*******************************************************************************
* 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.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin;
import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
import org.eclipse.jst.jsf.common.ui.internal.utils.WebrootUtil;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.model.WorkbenchLabelProvider;
import org.eclipse.ui.views.navigator.ResourceComparator;
/**
* This dialog shows IFile type resources within a IProject domain for
* selection. The client can prvide the suffixs of files to filter when
* candidates are shown on the tree.
*
* The usage: Shell shell = new Shell(); IProject project = getProject();
* CommonResourceDialog dlg = new CommonResourceDialog(shell, project);
* dlg.setResourceDescription("image"); dlg.setSuffixs(new
* String[]{"bmp","jpg","gif"}); if(dlg.open() == Window.OK) { IFile
* selectedFile = (IFile)dlg.getResult()[0]; }
*
* Note: In code above, what you get is an absolute resource path. You can use
* <code>org.eclipse.wst.sse.core.util.PathHelper.convertToRelative(String input, String base)</code>
* to convert a absolute resource path to a relative path based on one path.
*
* @author mengbo
*/
public class CommonResourceDialog extends TreeViewerSelectionDialog {
private static Logger _log = JSFUICommonPlugin
.getLogger(CommonResourceDialog.class);
// private static final String STATUS_MESSAGE_0 = CommonPlugin
// .getResourceString("Dialog.CommonResourceDialog.StatusMessage0");
// //$NON-NLS-1$
private IProject _project = null;
private String _suffixs[] = null;
private CommonResourceFilter _filter = null;
// The resource type resourceDescription, such as "image", "jsp", "java
// class" etc.
private String _resourceDescription = null;
private IFolder _folder;
// The content provider
class ProjectFileDialogContentProvider implements ITreeContentProvider {
/**
* The visual part that is using this content provider is about to be
* disposed. Deallocate all allocated SWT resources.
*/
public void dispose() {
// nothing to dispose
}
/**
* @see ITreeContentProvider#getChildren
*/
public Object[] getChildren(Object element) {
if (element instanceof Object[]) {
return (Object[]) element;
} else if (element instanceof IContainer) {
IContainer container = (IContainer) element;
if (container.isAccessible()) {
try {
return container.members();
} catch (CoreException e) {
_log.error(
"Error.ProjectFileDialogContentProvider.0", e); //$NON-NLS-1$
}
}
}
return new Object[0];
}
/**
* @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(Object)
*/
public Object[] getElements(Object element) {
return getChildren(element);
}
/**
* @see ITreeContentProvider#getParent
*/
public Object getParent(Object element) {
if (element instanceof IResource) {
return ((IResource) element).getParent();
}
return null;
}
/**
* @see ITreeContentProvider#hasChildren
*/
public boolean hasChildren(Object element) {
return getChildren(element).length > 0;
}
/**
* @see org.eclipse.jface.viewers.IContentProvider#inputChanged(Viewer, Object, Object)
*/
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
// no viewer change support required
}
}
// The default resource filter
class CommonResourceFilter extends ViewerFilter {
private String _filterSuffixs[] = null;
/**
* @return Returns the _suffixs.
*/
public String[] getSuffixs() {
return _filterSuffixs;
}
/**
* @param _suffixs
* The _suffixs to set.
*/
public void setSuffixs(String[] _suffixs) {
this._filterSuffixs = _suffixs;
}
/*
* (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) {
if (element instanceof IFile) {
IFile file = (IFile) element;
if (!WebrootUtil.isUnderWebContentFolder(file)) {
return false;
}
if (isSuffixBlank()) {
return true;
}
if (file.getFileExtension() != null) {
if (Arrays.asList(_filterSuffixs).contains(
file.getFileExtension().toLowerCase())) {
return true;
}
}
} else if (element instanceof IContainer) {
if (!((IContainer) element).isAccessible()) {
return false;
}
if (element instanceof IProject) {
return true;
} else if (element instanceof IFolder) {
IContainer container = (IContainer) element;
try {
IResource[] members = container.members();
for (int i = 0; i < members.length; i++) {
if (select(viewer, members[i].getParent(),
members[i])) {
return true;
}
}
} catch (CoreException e) {
_log.error(
"Error.ProjectFileDialogContentProvider.0", e); //$NON-NLS-1$
return false;
}
}
}
return false;
}
}
/**
* This is a dialog for common resource selection, the resouce supported
* include IFolder, IProject, IFile, user can provide
*
* @param parentShell
* @param project
* @param style
*/
public CommonResourceDialog(Shell parentShell, IProject project, int style) {
super(parentShell, "", style); //$NON-NLS-1$
if (project == null) {
throw new IllegalArgumentException(
"Argument(project) cannot be null"); //$NON-NLS-1$
}
_project = project;
setContentProvider(new ProjectFileDialogContentProvider());
setLabelProvider(WorkbenchLabelProvider
.getDecoratingWorkbenchLabelProvider());
_filter = new CommonResourceFilter();
setFilter(_filter);
setViewerComparator(new ResourceComparator(ResourceComparator.TYPE));
_project = project;
setStatusMessage(getStatusMessage());
}
/**
* Same as CommonResourceDialog(parentShell, project, SWT.NONE)
*
* @param parentShell
* @param project
*/
public CommonResourceDialog(Shell parentShell, IProject project) {
this(parentShell, project, SWT.NONE);
}
private String getStatusMessage() {
if (_resourceDescription == null) {
return ""; //$NON-NLS-1$
}
return _resourceDescription;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jst.pagedesigner.ui.common.SelectionTreeViewerDialog#findInputElement()
*/
protected Object findInputElement() {
if (_folder != null) {
return new Object[] { _folder, };
}
return new Object[] { _project, };
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jst.pagedesigner.ui.common.SelectionTreeViewerDialog#isValidSelection(java.lang.Object)
*/
protected boolean isValidSelection(Object selection) {
if (selection instanceof Object[]) {
for (int i = 0, n = ((Object[]) selection).length; i < n; i++) {
if (isValidElement(((Object[]) selection)[i]) == true) {
return true;
}
}
return false;
}
return isValidElement(selection);
}
private boolean isValidElement(Object selection) {
if ((selection instanceof IFile)) {
// Null means no filter is set
if (isSuffixBlank()) {
return true;
}
// The extension is supported?
else if (_suffixs != null
&& Arrays.asList(_suffixs).contains(
((IFile) selection).getFileExtension()
.toLowerCase())) {
return true;
}
}
// None of above conditions, invalid.
return false;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.dialogs.SelectionDialog#getResult()
*/
public Object[] getResult() {
Object[] objects = super.getResult();
if (objects == null || objects.length == 0) {
return null;
}
List list = new ArrayList();
for (int i = 0; i < objects.length; i++) {
if (objects[i] instanceof IFile) {
list.add(objects[i]);
}
}
return list.toArray();
}
/**
* @param suffixs
* The suffixs to set.
*/
public void setSuffixs(String[] suffixs) {
this._suffixs = convertTolowercase(suffixs);
_filter.setSuffixs(_suffixs);
setStatusMessage(getStatusMessage());
}
private String[] convertTolowercase(String[] suffixs) {
if (suffixs != null) {
String[] newSuffixs = new String[suffixs.length];
for (int i = 0; i < suffixs.length; i++) {
newSuffixs[i] = suffixs[i].toLowerCase();
}
return newSuffixs;
}
return null;
}
/**
* @return Returns the sourceDescription.
*/
public String getResourceDescription() {
return _resourceDescription;
}
/**
* @param sourceDescription
* The sourceDescription to set.
*/
public void setResourceDescription(String sourceDescription) {
this._resourceDescription = sourceDescription;
setStatusMessage(getStatusMessage());
}
private boolean isSuffixBlank() {
boolean isSuffixBlank = false;
if (_suffixs == null) {
isSuffixBlank = true;
} else {
int count = 0;
for (int i = 0, size = _suffixs.length; i < size; i++) {
if (_suffixs[i] != null && !"".equals(_suffixs[i])) { //$NON-NLS-1$
count++;
break;
}
}
if (count == 0) {
isSuffixBlank = true;
}
}
return isSuffixBlank;
}
}