diff -r ed1c9f64298a -r 5b9d4d8641ce trace/traceviewer/com.nokia.traceviewer/src/com/nokia/traceviewer/dialog/treeitem/TreeCheckboxStateListener.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/trace/traceviewer/com.nokia.traceviewer/src/com/nokia/traceviewer/dialog/treeitem/TreeCheckboxStateListener.java Wed Jun 23 14:49:59 2010 +0300 @@ -0,0 +1,173 @@ +/* + * Copyright (c) 2007-2010 Nokia Corporation and/or its subsidiary(-ies). + * All rights reserved. + * This component and the accompanying materials are made available + * under the terms of "Eclipse Public License v1.0" + * which accompanies this distribution, and is available + * at the URL "http://www.eclipse.org/legal/epl-v10.html". + * + * Initial Contributors: + * Nokia Corporation - initial contribution. + * + * Contributors: + * + * Description: + * + * Tree Checkbox State Listener class + * + */ +package com.nokia.traceviewer.dialog.treeitem; + +import org.eclipse.jface.viewers.CheckStateChangedEvent; +import org.eclipse.jface.viewers.CheckboxTreeViewer; +import org.eclipse.jface.viewers.ICheckStateListener; + +import com.nokia.traceviewer.engine.TraceViewerGlobals; + +/** + * Tree Checkbox State Listener class + */ +public class TreeCheckboxStateListener implements ICheckStateListener { + + /** + * CheckboxTreeViewer + */ + private final CheckboxTreeViewer viewer; + + /** + * Constructor + * + * @param viewer + * checkboxviewer + */ + public TreeCheckboxStateListener(CheckboxTreeViewer viewer) { + this.viewer = viewer; + } + + public void checkStateChanged(CheckStateChangedEvent event) { + // Check and uncheck children + if (event.getChecked()) { + viewer.setSubtreeChecked(event.getElement(), true); + } else { + viewer.setSubtreeChecked(event.getElement(), false); + } + viewer.setGrayed(event.getElement(), false); + + // Set something changed variable to color dialog + if (event.getElement() instanceof ColorTreeItem) { + TraceViewerGlobals.getTraceViewer().getDataProcessorAccess() + .getColorer().getColorDialog().setSomethingChanged(true); + + // Set something changed variable to filter dialog + } else if (event.getElement() instanceof FilterTreeItem) { + TraceViewerGlobals.getTraceViewer().getDataProcessorAccess() + .getFilterProcessor().getFilterDialog() + .setSomethingChanged(true); + + // Set something changed variable to linecount dialog + } else if (event.getElement() instanceof LineCountTreeItem) { + TraceViewerGlobals.getTraceViewer().getDataProcessorAccess() + .getLineCountProcessor().getLineCountDialog() + .setSomethingChanged(true); + + // Set something changed variable to variableTracing dialog + } else if (event.getElement() instanceof VariableTracingTreeItem) { + TraceViewerGlobals.getTraceViewer().getDataProcessorAccess() + .getVariableTracingProcessor().getVariableTracingDialog() + .setSomethingChanged(true); + + // Set something changed variable to trigger dialog + } else if (event.getElement() instanceof TriggerTreeItem) { + TraceViewerGlobals.getTraceViewer().getDataProcessorAccess() + .getTriggerProcessor().getTriggerDialog() + .setSomethingChanged(true); + } + + // Check parents if needed + checkStateChanged((TreeItem) event.getElement()); + } + + /** + * Makes needed changes to viewer if checked state was changed manually + * + * @param item + * item which has checked state changed + */ + public void checkStateChanged(TreeItem item) { + TreeItem parent = (TreeItem) item.getParent(); + // Item checked + if (viewer.getChecked(item) && !viewer.getGrayed(item) + && parent != null) { + + // If all children checked, check parent also + if (allChildrenChecked(parent)) { + viewer.setChecked(parent, true); + viewer.setGrayed(parent, false); + // Only grey check + } else { + viewer.setGrayChecked(parent, true); + } + + checkStateChanged(parent); + + // Item unchecked + } else if (!viewer.getChecked(item) && parent != null) { + + // If any children still checked + if (anyChildrenChecked(parent)) { + viewer.setGrayChecked(parent, true); + } else { + viewer.setGrayChecked(parent, false); + } + checkStateChanged(parent); + } else if (viewer.getChecked(item) && viewer.getGrayed(item) + && parent != null) { + + viewer.setGrayChecked(parent, true); + checkStateChanged(parent); + } + } + + /** + * Tells if given item has any children checked + * + * @param item + * item to investigate + * @return true if this item has any children checked + */ + public boolean anyChildrenChecked(TreeItem item) { + boolean isAnyChecked = false; + + Object[] children = item.getChildren(); + + for (int i = 0; i < children.length; i++) { + if (viewer.getChecked(children[i])) { + isAnyChecked = true; + break; + } + } + return isAnyChecked; + } + + /** + * Tells if given item has all children checked + * + * @param item + * item to investigate + * @return true if this item has all children checked + */ + public boolean allChildrenChecked(TreeItem item) { + boolean isAllChecked = true; + + Object[] children = item.getChildren(); + + for (int i = 0; i < children.length; i++) { + if (!viewer.getChecked(children[i]) + && !viewer.getGrayed(children[i])) { + isAllChecked = false; + break; + } + } + return isAllChecked; + } +}