/*
* This software is Copyright 2005,2006,2007,2008 Langdale Consultants.
* Langdale Consultants can be contacted at: http://www.langdale.com.au
*/
package au.com.langdale.workspace;
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.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredViewer;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.ui.model.BaseWorkbenchContentProvider;
import org.eclipse.ui.model.WorkbenchLabelProvider;
import au.com.langdale.ui.binding.FilteredContentProvider;
import au.com.langdale.ui.binding.TableBinding;
import au.com.langdale.ui.binding.TextBinding;
import au.com.langdale.ui.binding.Validators;
import au.com.langdale.ui.binding.FilteredContentProvider.Filter;
import au.com.langdale.cimtoole.project.Info;
/**
* A set of table view bindings for workspace resources.
*/
public class ResourceUI {
public static final Filter VALIDATION_FILTER = new Filter() {
public boolean allow(Object object) {
if( object instanceof IProject ) {
IProject project = (IProject) object;
return project.isOpen();
}
if( object instanceof IFile ) {
IFile resource = (IFile) object;
IPath path = resource.getProjectRelativePath();
return path.segmentCount() == 2
&& (path.segment(0).equals("Instances") ||
path.segment(0).equals("Incremental"));
}
return false;
}
public boolean flatten(Object object) {
return object instanceof IFolder;
}
public boolean prune(Object value) {
return false;
}
};
public static void displayWorkspace(StructuredViewer viewer, Filter filter) {
viewer.setLabelProvider(new WorkbenchLabelProvider());
viewer.setComparator(new ViewerComparator());
viewer.setContentProvider(new FilteredContentProvider(filter, new BaseWorkbenchContentProvider()));
}
public static class ProjectBinding extends TableBinding implements Filter {
@Override
protected void configureViewer(StructuredViewer viewer) {
displayWorkspace(viewer, this);
}
@Override
protected Object getInput() {
return ResourcesPlugin.getWorkspace().getRoot();
}
public IProject getProject() {
return (IProject) getValue();
}
public void setSelected(IStructuredSelection selection ) {
Object item = selection.getFirstElement();
if( item instanceof IResource) {
IResource resource = (IResource)item;
setValue(resource.getProject());
}
else
setValue(null);
}
public boolean allow(Object value) {
return value instanceof IProject && ((IProject)value).isOpen();
}
public boolean flatten(Object value) {
return false;
}
public boolean prune(Object value) {
return false;
}
@Override
public String validate() {
if(! allow(getValue()))
return "A project must be selected.";
else
return null;
}
}
public static abstract class ProjectMemberBinding extends TableBinding implements Filter {
protected abstract boolean allow(IResource resource);
@Override
protected void configureViewer(StructuredViewer viewer) {
displayWorkspace(viewer, this);
}
public boolean allow(Object object) {
return object instanceof IResource && allow((IResource)object);
}
public boolean flatten(Object object) {
return object instanceof IFolder;
}
public boolean prune(Object value) {
return false;
}
@Override
protected Object getInput() {
return getParent().getValue();
}
public IProject getProject() {
return (IProject) getParent().getValue();
}
public IResource getResource() {
return (IResource) getValue();
}
public void setSelected(IStructuredSelection selection ) {
Object value = selection.getFirstElement();
if(value != null && allow(value))
setValue(value);
else
setValue(null);
}
@Override
public String validate() {
if(! allow(getValue()))
return "A member of the project must be selected.";
else
return null;
}
}
public static class DiagnosticsBinding extends ProjectMemberBinding {
@Override
public boolean allow(IResource resource) {
return Info.isDiagnostic(resource);
}
}
public static class InstanceBinding extends ProjectMemberBinding {
@Override
public boolean allow(IResource resource) {
return Info.isSplitInstance(resource);
}
}
public static class ProfileBinding extends ProjectMemberBinding {
@Override
protected boolean allow(IResource resource) {
return Info.isProfile(resource);
}
public IFile getFile() {
return (IFile)getValue();
}
}
public static class LocalFileBinding extends TextBinding {
private String ext;
public LocalFileBinding(String ext, boolean required) {
super(Validators.SimpleFile(ext, required));
this.ext = ext;
}
public LocalFileBinding(String[] exts, boolean required) {
super(Validators.SimpleFile(exts, required));
}
@Override
protected String createSuggestion() {
IPath path = Path.fromOSString(parentText());
if(ext != null)
path = path.removeFileExtension().addFileExtension(ext);
return path.lastSegment();
}
public IFile getFile(IFolder folder) {
String name = getText();
if( name.length() == 0)
return null;
if( ! name.contains(".") && ext != null)
name = name + "." + ext;
return folder.getFile(name);
}
}
}