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