blob: 7a094bc776ece254e636aca1b88fe06bd07cde18 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004 - 2005 University Of British Columbia 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:
* University Of British Columbia - initial API and implementation
*******************************************************************************/
package org.eclipse.mylar.ui.internal;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredViewer;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.mylar.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.Table;
import org.eclipse.swt.widgets.Tree;
/**
* @author Mik Kersten
*/
public class BrowseFilteredListener implements MouseListener, KeyListener {
private StructuredViewer viewer;
public BrowseFilteredListener(StructuredViewer viewer) {
this.viewer = viewer;
}
public void keyPressed(KeyEvent event) {
final InterestFilter filter = getFilter(viewer);
if (filter == null) return;
if (keyboardInteractionAccepted(event)) {
if (viewer instanceof TreeViewer) {
final TreeViewer treeViewer = (TreeViewer)viewer;
ISelection selection = treeViewer.getSelection();
if (selection instanceof IStructuredSelection) {
Object targetObject = ((IStructuredSelection)selection).getFirstElement();
unfilter(filter, treeViewer, targetObject);
}
}
} else {
filter.resetTemporarilyUnfiltered();
}
}
private void unfilter(final InterestFilter filter, final TreeViewer treeViewer, Object targetObject) {
if (targetObject != null) {
filter.setTemporarilyUnfiltered(targetObject);
treeViewer.refresh(targetObject, true);
treeViewer.expandToLevel(targetObject, 2);
}
}
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
}
public void mouseDown(MouseEvent event) {
final InterestFilter filter = getFilter(viewer);
if (filter == null) return;
if (mouseInteractionAccepted(event)) {
if (viewer instanceof TreeViewer) {
final TreeViewer treeViewer = (TreeViewer)viewer;
ISelection selection = treeViewer.getSelection();
if (selection instanceof IStructuredSelection) {
Object targetObject = null;
if (getClickedItem(event) != null) {
targetObject = ((IStructuredSelection)selection).getFirstElement();
} else if (treeViewer.getTree().getTopItem() != null) {
targetObject = treeViewer.getTree().getTopItem().getData();
}
unfilter(filter, treeViewer, targetObject);
}
}
} else {
filter.resetTemporarilyUnfiltered();
}
}
private Object getClickedItem(MouseEvent event) {
if (event.getSource() instanceof Table) {
return ((Table)event.getSource()).getItem(new Point(event.x, event.y));
} else if (event.getSource() instanceof Tree) {
return ((Tree)event.getSource()).getItem(new Point(event.x, event.y));
}
return null;
}
private boolean mouseInteractionAccepted(MouseEvent event) {
return (event.stateMask & SWT.ALT) != 0;
}
private boolean keyboardInteractionAccepted(KeyEvent event) {
return event.keyCode == SWT.ARROW_RIGHT;
}
private InterestFilter getFilter(StructuredViewer structuredViewer) {
ViewerFilter[] filters = structuredViewer.getFilters();
for (int i = 0; i < filters.length; i++) {
if (filters[i] instanceof InterestFilter) return (InterestFilter)filters[i];
}
return null;
}
public void mouseUp(MouseEvent e) { }
public void mouseDoubleClick(MouseEvent e) { }
}