package net.sourceforge.tagsea.parsed.ui.internal.filters;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import net.sourceforge.tagsea.core.IWaypoint;
import net.sourceforge.tagsea.core.ui.IWaypointFilter;
import net.sourceforge.tagsea.parsed.ParsedWaypointPlugin;
import net.sourceforge.tagsea.parsed.core.ParsedWaypointUtils;
import net.sourceforge.tagsea.parsed.ui.internal.preferences.PreferenceConstants;
import net.sourceforge.tagsea.resources.ResourceWaypointPreferences;
import net.sourceforge.tagsea.resources.ResourceWaypointUtils;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IPath;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.text.ITextSelection;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IFileEditorInput;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.PlatformUI;
public class WaypointFilter implements IWaypointFilter {
private List<IResource> resources;
private final int filterAny = 0;
private final int filterChildren = 1;
private final int filterProject = 2;
private final int filterResource = 3;
@SuppressWarnings("unchecked")
public void initialize() {
resources = Collections.EMPTY_LIST;
}
public boolean select(IWaypoint waypoint) {
String kind = ParsedWaypointUtils.getKind(waypoint);
if (kind == null) return false;
IPreferenceStore store = ParsedWaypointPlugin.getDefault().getPreferenceStore();
String filtered = store.getString(PreferenceConstants.FILTERED_KINDS);
String[] kinds = filtered.split("\\s+");
for (String filterkind : kinds) {
if (kind.equals(filterkind)) {
return false;
}
}
int type = getFilterType();
if (type == filterAny) {
return true;
}
ISelection selection = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getSelection();
if (selection instanceof IStructuredSelection) {
IStructuredSelection ss = (IStructuredSelection) selection;
LinkedList<IResource> localResources = new LinkedList<IResource>();
for (Iterator<?> i = ss.iterator(); i.hasNext();) {
Object next = i.next();
if (next instanceof IAdaptable) {
IResource resource = (IResource)((IAdaptable)next).getAdapter(IResource.class);
if (resource != null) {
localResources.add(resource);
}
}
}
if (localResources != null) {
resources = localResources;
}
} else {
IWorkbenchPart part = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActivePart();
if (part instanceof IEditorPart) {
IEditorInput input = ((IEditorPart)part).getEditorInput();
if (input instanceof IFileEditorInput) {
IResource file = ((IFileEditorInput)input).getFile();
if (file != null) {
resources = new ArrayList<IResource>();
resources.add(file);
}
}
}
}
switch(type) {
case filterProject:
return isSelectedProject(waypoint);
case filterChildren:
return isSelectedChild(waypoint);
case filterResource:
return isSelected(waypoint);
}
return true;
}
/**
* @param waypoint
* @return
*/
private boolean isSelectedProject(IWaypoint waypoint) {
IResource resource = ResourceWaypointUtils.getResource(waypoint);
if (resource != null) {
for (IResource r : resources) {
if (r.getProject().equals(resource.getProject()))
return true;
}
}
return false;
}
/**
* @param waypoint
* @return
*/
private boolean isSelectedChild(IWaypoint waypoint) {
IResource resource = ResourceWaypointUtils.getResource(waypoint);
if (resource != null) {
for (IResource r : resources) {
if (r.equals(resource)) return true;
if (r instanceof IContainer) {
IPath parent = r.getFullPath();
IPath child = resource.getFullPath();
if (parent.isPrefixOf(child)) return true;
}
}
}
return false;
}
/**
* @param waypoint
* @return
*/
private boolean isSelected(IWaypoint waypoint) {
IResource resource = ResourceWaypointUtils.getResource(waypoint);
if (resource != null) {
for (IResource r : resources) {
if (r.equals(resource))
return true;
}
}
return false;
}
/* (non-Javadoc)
* @see net.sourceforge.tagsea.core.ui.IWaypointFilter#isImportantSelection(org.eclipse.jface.viewers.ISelection)
*/
public boolean isImportantSelection(ISelection selection) {
if (selection instanceof IStructuredSelection) {
IStructuredSelection ss = (IStructuredSelection) selection;
for (Iterator<?> i = ss.iterator(); i.hasNext();) {
Object next = i.next();
if (next instanceof IAdaptable) {
IResource resource = (IResource)((IAdaptable)next).getAdapter(IResource.class);
if (resource != null) {
return true;
}
}
}
} else if (selection instanceof ITextSelection) {
return true;
}
return false;
}
private boolean isLinkedToResourceWaypoints() {
return ParsedWaypointPlugin.getDefault().getPreferenceStore().getBoolean(PreferenceConstants.LINKED_TO_RESOURCE_WAYPOINT_FILTERS);
}
private int getFilterType() {
String filter = "";
if (isLinkedToResourceWaypoints()) {
filter = ResourceWaypointPreferences.getCurrentFilterType();
} else {
filter = ParsedWaypointPlugin.getDefault().getPreferenceStore().getString(ResourceWaypointPreferences.FILTER_PREFERENCE_KEY);
}
if (ResourceWaypointPreferences.FILTER_ANY.equals(filter)) {
return filterAny;
} else if (ResourceWaypointPreferences.FILTER_SELECTED.equals(filter)) {
return filterResource;
} else if (ResourceWaypointPreferences.FILTER_CHILDREN.equals(filter)) {
return filterChildren;
} else if (ResourceWaypointPreferences.FILTER_PROJECT.equals(filter)) {
return filterProject;
}
return filterProject;
}
}