/* AWE - Amanzi Wireless Explorer
* http://awe.amanzi.org
* (C) 2008-2009, AmanziTel AB
*
* This library is provided under the terms of the Eclipse Public License
* as described at http://www.eclipse.org/legal/epl-v10.html. Any use,
* reproduction or distribution of the library constitutes recipient's
* acceptance of this agreement.
*
* This library is distributed WITHOUT ANY WARRANTY; without even the
* implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*/
package org.amanzi.awe.statistics.ui.table.filters.dialog;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import org.amanzi.awe.statistics.ui.table.filters.dialog.KpiComboViewerWidget.IKpiTreeListener;
import org.amanzi.awe.ui.view.widgets.internal.AbstractAWEWidget;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.CheckboxTreeViewer;
import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
/**
* tree view for group filtering
* <p>
* </p>
*
* @author Vladislav_Kondratenko
* @since 1.0.0
*/
public class KpiComboViewerWidget extends AbstractAWEWidget<Composite, IKpiTreeListener> implements ICheckStateListener {
public interface IKpiTreeListener extends AbstractAWEWidget.IAWEWidgetListener {
}
public static final String SELECT_ALL_ITEM = "Select All";
private static final GridLayout ONE_COLUM_LAYOUT = new GridLayout(1, false);
private static final ViewerFilter[] EMPTY_FILTERS_LIST = new ViewerFilter[0];;
private final KpiTreeContentProvider contentProvider = new KpiTreeContentProvider();
private final LabelProvider labelProvider = new LabelProvider();
private CheckboxTreeViewer treeViewer;
private List<String> selection = new ArrayList<String>();
private HashSet<String> groups;
private boolean isAllSelected;
/**
* @param parent
* @param style
* @param listener
*/
public KpiComboViewerWidget(final Composite parent, final IKpiTreeListener listener) {
super(parent, SWT.V_SCROLL | SWT.H_SCROLL, listener);
}
@Override
protected Composite createWidget(Composite parent, int style) {
Composite composite = new Composite(parent, SWT.FILL);
composite.setLayout(ONE_COLUM_LAYOUT);
composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
treeViewer = new CheckboxTreeViewer(composite, SWT.FILL | SWT.BORDER);
treeViewer.setContentProvider(contentProvider);
treeViewer.getControl().setLayoutData((new GridData(SWT.FILL, SWT.FILL, true, true)));
treeViewer.setLabelProvider(labelProvider);
treeViewer.getTree().setVisible(true);
treeViewer.addCheckStateListener(this);
return composite;
}
protected void setItems(Iterable<String> items, List<String> selected) {
groups = (HashSet<String>)items;
if (selected != null) {
selection = selected;
}
groups.add(SELECT_ALL_ITEM);
treeViewer.setInput(groups.toArray(new String[groups.size()]));
groups.remove(SELECT_ALL_ITEM);
if (!selection.isEmpty()) {
treeViewer.setCheckedElements(selection.toArray());
if (selection.size() == groups.size()) {
treeViewer.setChecked(SELECT_ALL_ITEM, true);
}
} else {
selectAll();
}
}
@Override
public void checkStateChanged(CheckStateChangedEvent event) {
final boolean checked = event.getChecked();
String element = event.getElement().toString();
if (checked) {
if (element.equals(SELECT_ALL_ITEM)) {
selectAll();
return;
}
selection.add(element);
} else if (!checked) {
deselectItem(element);
}
}
/**
* @param element
*/
private void deselectItem(String element) {
if (element.equals(SELECT_ALL_ITEM)) {
deselectAll();
return;
}
treeViewer.setChecked(SELECT_ALL_ITEM, false);
selection.remove(element);
isAllSelected = false;
}
/**
* deselection action
*/
private void deselectAll() {
for (Object selected : treeViewer.getCheckedElements()) {
treeViewer.setChecked(selected, false);
}
treeViewer.setChecked(SELECT_ALL_ITEM, false);
selection.clear();
}
/**
* selection action
*/
private void selectAll() {
isAllSelected = true;
selection.clear();
treeViewer.setCheckedElements(groups.toArray());
selection.addAll(groups);
treeViewer.setChecked(SELECT_ALL_ITEM, true);
}
/**
* get all selected items;
*
* @return
*/
protected List<String> getSelected() {
return this.selection;
}
/**
* set filters for tree view
*
* @param filters
*/
protected void setFilters(ViewerFilter... filters) {
treeViewer.setFilters(filters);
treeViewer.refresh();
treeViewer.setCheckedElements(selection.toArray());
if (isAllSelected) {
treeViewer.setChecked(SELECT_ALL_ITEM, true);
}
}
/**
* reset tree viewer.
*/
protected void reset() {
treeViewer.setFilters(EMPTY_FILTERS_LIST);
selectAll();
}
}