blob: b85827f6e5241d17dd80102c2b0f4fcda13d8194 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2011 Tasktop Technologies 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:
* Tasktop Technologies - initial API and implementation
*******************************************************************************/
package org.eclipse.mylyn.internal.context.ui;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.StructuredViewer;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.mylyn.context.ui.InterestFilter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.KeyListener;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseListener;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.ui.navigator.CommonViewer;
import org.eclipse.ui.progress.UIJob;
/**
* @author Mik Kersten
*/
public class BrowseFilteredListener implements MouseListener, KeyListener {
private final StructuredViewer viewer;
private boolean wasExternalClick = false;
public BrowseFilteredListener(StructuredViewer viewer) {
this.viewer = viewer;
}
/**
* @param treeViewer
* cannot be null
* @param targetSelection
* cannot be null
*/
public void unfilterSelection(TreeViewer treeViewer, IStructuredSelection targetSelection) {
InterestFilter filter = getInterestFilter(treeViewer);
Object targetObject = targetSelection.getFirstElement();
if (filter != null && targetObject != null) {
filter.addTemporarilyUnfiltered(targetObject);
if (targetObject instanceof Tree) {
treeViewer.refresh();
} else {
treeViewer.refresh(targetObject, true);
treeViewer.expandToLevel(targetObject, 1);
}
}
}
private void unfilter(final InterestFilter filter, final TreeViewer treeViewer, Object targetObject) {
if (targetObject != null) {
filter.addTemporarilyUnfiltered(targetObject);
if (targetObject instanceof Tree) {
treeViewer.refresh();
} else {
treeViewer.refresh(targetObject, true);
treeViewer.expandToLevel(targetObject, 1);
}
}
}
public void setWasExternalClick(boolean wasExternalClick) {
this.wasExternalClick = wasExternalClick;
}
public void keyPressed(KeyEvent event) {
// ignore
}
public void keyReleased(KeyEvent event) {
InterestFilter filter = getInterestFilter(viewer);
if (event.keyCode == SWT.ARROW_RIGHT) {
if (filter == null || !(viewer instanceof TreeViewer)) {
return;
}
final TreeViewer treeViewer = (TreeViewer) viewer;
ISelection selection = treeViewer.getSelection();
if (selection instanceof IStructuredSelection) {
Object targetObject = ((IStructuredSelection) selection).getFirstElement();
unfilter(filter, treeViewer, targetObject);
}
}
}
public void mouseDown(MouseEvent event) {
// ignore
}
public void mouseDoubleClick(MouseEvent e) {
// ignore
}
public void mouseUp(MouseEvent event) {
final InterestFilter filter = getInterestFilter(viewer);
if (filter == null || !(viewer instanceof TreeViewer)) {
return;
}
TreeViewer treeViewer = (TreeViewer) viewer;
Object selectedObject = null;
Object clickedObject = getClickedItem(event);
if (clickedObject != null) {
selectedObject = clickedObject;
} else {
selectedObject = treeViewer.getTree();
}
if (isUnfilterEvent(event)) {
if (treeViewer instanceof CommonViewer) {
CommonViewer commonViewer = (CommonViewer) treeViewer;
commonViewer.setSelection(new StructuredSelection(selectedObject), true);
}
unfilter(filter, treeViewer, selectedObject);
} else {
if (event.button == 1) {
if ((event.stateMask & SWT.MOD1) != 0 || wasExternalClick) {
viewer.refresh(selectedObject);
wasExternalClick = false;
} else {
final Object unfiltered = filter.getLastTemporarilyUnfiltered();
if (unfiltered != null) {
// NOTE: delaying refresh to ensure double click is handled, see bug 208702
resetUnfiltered();
}
}
}
}
}
public void resetUnfiltered() {
new UIJob("") { //$NON-NLS-1$
@Override
public IStatus runInUIThread(IProgressMonitor monitor) {
final InterestFilter filter = getInterestFilter(viewer);
filter.resetTemporarilyUnfiltered();
viewer.refresh();
return Status.OK_STATUS;
}
}.schedule(Display.getDefault().getDoubleClickTime() + 50);
}
private Object getClickedItem(MouseEvent event) {
if (event.getSource() instanceof Table) {
TableItem item = ((Table) event.getSource()).getItem(new Point(event.x, event.y));
if (item != null) {
return item.getData();
} else {
return null;
}
} else if (event.getSource() instanceof Tree) {
TreeItem item = ((Tree) event.getSource()).getItem(new Point(event.x, event.y));
if (item != null) {
return item.getData();
} else {
return null;
}
}
return null;
}
public static boolean isUnfilterEvent(MouseEvent event) {
return (event.stateMask & SWT.ALT) != 0;
}
private InterestFilter getInterestFilter(StructuredViewer structuredViewer) {
ViewerFilter[] filters = structuredViewer.getFilters();
for (ViewerFilter filter : filters) {
if (filter instanceof InterestFilter) {
return (InterestFilter) filter;
}
}
return null;
}
public boolean isUnfiltered(Object object) {
InterestFilter interestFilter = getInterestFilter(viewer);
if (interestFilter != null) {
return interestFilter.isTemporarilyUnfiltered(object);
}
return false;
}
}