/******************************************************************************* * Copyright (c) 2011, 2012 Wind River Systems, Inc. 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: * Wind River Systems - initial API and implementation *******************************************************************************/ package org.eclipse.tcf.te.ui.trees; import java.util.ArrayList; import java.util.List; import org.eclipse.core.runtime.Assert; import org.eclipse.jface.action.Action; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.window.Window; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Shell; import org.eclipse.tcf.te.ui.activator.UIPlugin; import org.eclipse.tcf.te.ui.interfaces.ImageConsts; import org.eclipse.tcf.te.ui.nls.Messages; import org.eclipse.ui.dialogs.ListSelectionDialog; /** * The action to configure the filters of a tree viewer. * */ public class ConfigFilterAction extends Action { // The tree control whose filters are to be configured. private AbstractTreeControl treeControl; /** * Create an instance for the specified tree control. * * @param treeControl The tree control to be configured. */ public ConfigFilterAction(AbstractTreeControl treeControl) { super(null, AS_PUSH_BUTTON); this.treeControl = treeControl; this.setToolTipText(Messages.ConfigFilterAction_TooltipText); ImageDescriptor image = UIPlugin.getImageDescriptor(ImageConsts.VIEWER_FILTER_CONFIG_ENABLED); setImageDescriptor(image); image = UIPlugin.getImageDescriptor(ImageConsts.VIEWER_FILTER_CONFIG_DISABLED); setDisabledImageDescriptor(image); updateEnablement(); } /* * (non-Javadoc) * @see org.eclipse.jface.action.Action#run() */ @Override public void run() { FilterDescriptor[] filterDescriptors = getVisibleFilters(); Assert.isNotNull(filterDescriptors); if (filterDescriptors.length == 0) return; ILabelProvider filterLabelProvider = createFilterLabelProvider(); Shell parent = treeControl.getViewer().getControl().getShell(); String message = Messages.ConfigFilterAction_PromptMessage; ListSelectionDialog dialog = new ListSelectionDialog(parent, filterDescriptors, ArrayContentProvider.getInstance(), filterLabelProvider, message); dialog.setTitle(Messages.ConfigFilterAction_Title); List<FilterDescriptor> initialSelection = new ArrayList<FilterDescriptor>(); for (FilterDescriptor descriptor : filterDescriptors) { if (descriptor.isEnabled()) { initialSelection.add(descriptor); } } dialog.setInitialElementSelections(initialSelection); if (dialog.open() == Window.OK) { Object[] elements = dialog.getResult(); for (FilterDescriptor descriptor : filterDescriptors) { if (descriptor.isVisible()) { descriptor.setEnabled(false); } } for (Object element : elements) { if (element instanceof FilterDescriptor) { FilterDescriptor descriptor = (FilterDescriptor) element; descriptor.setEnabled(true); } } treeControl.updateFilters(); treeControl.updateFilterState(); } } /** * Get currently visible filter descriptors. * * @return Currently visible filter descriptors. */ private FilterDescriptor[] getVisibleFilters() { FilterDescriptor[] filterDescriptors = treeControl.getFilterDescriptors(); Assert.isNotNull(filterDescriptors); if (filterDescriptors.length > 0) { List<FilterDescriptor> visibleList = new ArrayList<FilterDescriptor>(); for (FilterDescriptor filterDescriptor : filterDescriptors) { if (filterDescriptor.isVisible()) { visibleList.add(filterDescriptor); } } return visibleList.toArray(new FilterDescriptor[visibleList.size()]); } return filterDescriptors; } /** * Create a label provider for the configure dialog's tree. * * @return The label provider. */ private ILabelProvider createFilterLabelProvider() { return new LabelProvider() { @Override public String getText(Object element) { if (element instanceof FilterDescriptor) { return ((FilterDescriptor) element).getName(); } return super.getText(element); } @Override public Image getImage(Object element) { if (element instanceof FilterDescriptor) { return ((FilterDescriptor) element).getImage(); } return super.getImage(element); } }; } /** * Update the enablement of this action. If there is any visible filter in the * tree control, then enable this action. Or else disable it. */ public void updateEnablement() { FilterDescriptor[] filterDescriptors = treeControl.getFilterDescriptors(); Assert.isNotNull(filterDescriptors); boolean enabled = false; if(filterDescriptors.length > 0) { for(FilterDescriptor filterDescriptor : filterDescriptors) { if(filterDescriptor.isVisible()) { enabled = true; break; } } } setEnabled(enabled); } }