/** * Copyright (c) 2005-2006 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 */ package org.eclipse.emf.common.ui.action; import java.util.List; import org.eclipse.jface.action.Action; import org.eclipse.jface.viewers.StructuredViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.emf.common.util.UniqueEList; /** * Action wrapper for a {@link ViewerFilter} that can be used in multiple viewers. * @since 2.2.0 */ public abstract class ViewerFilterAction extends Action { protected List<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 UniqueEList.FastCompare<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); }