/**
* <copyright>
*
* Copyright (c) 2005, 2010 IBM Corporation 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:
* IBM - Initial API and implementation
*
* </copyright>
*
* $Id: ViewerFilterAction.java,v 1.2 2006/12/28 06:42:02 marcelop Exp $
*/
package net.enilink.komma.common.ui.action;
import java.util.LinkedHashSet;
import java.util.Set;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.viewers.StructuredViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
/**
* Action wrapper for a {@link ViewerFilter} that can be used in multiple
* viewers.
*
* @since 2.2.0
*/
public abstract class ViewerFilterAction extends Action {
protected Set<Viewer> viewers;
protected ViewerFilter viewerFilter;
public ViewerFilterAction(String text, int style) {
super(text, style);
setId(Integer.toString(hashCode()));
}
public void addViewer(Viewer viewer) {
if (viewer instanceof StructuredViewer) {
if (viewers == null) {
viewers = new LinkedHashSet<Viewer>();
}
if (viewers.add(viewer)) {
if (viewerFilter == null) {
viewerFilter = new ViewerFilter() {
@Override
public boolean select(Viewer viewer,
Object parentElement, Object element) {
return ViewerFilterAction.this.select(viewer,
parentElement, element);
}
};
}
((StructuredViewer) viewer).addFilter(viewerFilter);
}
}
}
public void removeViewer(Viewer viewer) {
if (viewers != null) {
if (viewers.remove(viewer)) {
if (!viewer.getControl().isDisposed()) {
((StructuredViewer) viewer).removeFilter(viewerFilter);
}
}
}
}
public void dispose() {
if (viewers != null) {
for (Viewer viewer : viewers) {
if (!viewer.getControl().isDisposed()) {
((StructuredViewer) viewer).removeFilter(viewerFilter);
}
}
viewers.clear();
viewers = null;
}
viewerFilter = null;
}
@Override
public void setChecked(boolean checked) {
boolean wasChecked = isChecked();
super.setChecked(checked);
if (wasChecked != checked) {
refreshViewers();
}
}
protected void refreshViewers() {
if (viewers != null) {
for (Viewer viewer : viewers) {
if (!viewer.getControl().isDisposed()) {
viewer.refresh();
}
}
}
}
public abstract boolean select(Viewer viewer, Object parentElement,
Object element);
}