/*
* JBoss, Home of Professional Open Source.
*
* See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing.
*
* See the AUTHORS.txt file distributed with this work for a full listing of individual contributors.
*/
package org.teiid.designer.ui.common.widget;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TreeExpansionEvent;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.widgets.TreeItem;
import org.teiid.designer.ui.common.InternalUiConstants;
import org.teiid.designer.ui.common.util.WidgetUtil;
/**
* @since 8.0
*/
public class DefaultTreeViewerController implements
InternalUiConstants.Widgets,
ITreeViewerController {
// ============================================================================================================================
// Implemented Methods
/**
* Does nothing.
*
* @see org.teiid.designer.ui.common.widget.ITreeViewerController#checkedStateToggled(org.eclipse.swt.widgets.TreeItem)
* @since 4.0
*/
@Override
public void checkedStateToggled(final TreeItem item) {
}
/**
* @return True
* @see org.teiid.designer.ui.common.widget.ITreeViewerController#isItemCheckable(org.eclipse.swt.widgets.TreeItem)
* @since 4.0
*/
@Override
public boolean isItemCheckable(final TreeItem item) {
return true;
}
/**
* Does nothing.
*
* @see org.teiid.designer.ui.common.widget.ITreeViewerController#itemCollapsed(org.eclipse.jface.viewers.TreeExpansionEvent)
* @since 4.0
*/
@Override
public void itemCollapsed(final TreeExpansionEvent event) {
}
/**
* Does nothing.
*
* @see org.teiid.designer.ui.common.widget.ITreeViewerController#itemDoubleClicked(org.eclipse.jface.viewers.DoubleClickEvent)
* @since 4.0
*/
@Override
public void itemDoubleClicked(final DoubleClickEvent event) {
}
/**
* Updates checked state of item's children based upon item's checked state.
*
* @see org.teiid.designer.ui.common.widget.ITreeViewerController#itemExpanded(org.eclipse.jface.viewers.TreeExpansionEvent)
* @since 4.0
*/
@Override
public void itemExpanded(final TreeExpansionEvent event) {
if(((TreeViewer)event.getTreeViewer()).getTree().getSelection().length > 0) {
final TreeItem item = ((TreeViewer)event.getTreeViewer()).getTree().getSelection()[0];
if (WidgetUtil.isChecked(item)) {
updateChildren(item, true);
}
}
}
/**
* Does nothing.
*
* @see org.teiid.designer.ui.common.widget.ITreeViewerController#itemSelected(org.eclipse.jface.viewers.SelectionChangedEvent)
* @since 4.0
*/
@Override
public void itemSelected(final SelectionChangedEvent event) {
}
/**
* Updates checked state of item and its children (based upon parent item's checked state).
*
* @see org.teiid.designer.ui.common.widget.ITreeViewerController#update(org.eclipse.swt.widgets.TreeItem, boolean)
* @since 4.0
*/
@Override
public void update(final TreeItem item,
final boolean selected) {
final boolean checked = !WidgetUtil.isUnchecked(item);
item.setChecked(checked);
item.setGrayed(WidgetUtil.isPartiallyChecked(item));
if (selected) {
updateChildren(item, checked);
for (TreeItem parent = item.getParentItem(); parent != null; parent = parent.getParentItem()) {
int state = PARTIALLY_CHECKED;
final TreeItem[] children = parent.getItems();
for (int ndx = children.length; --ndx >= 0;) {
final TreeItem child = children[ndx];
if (WidgetUtil.isPartiallyChecked(child)) {
state = PARTIALLY_CHECKED;
break;
}
final int childState = WidgetUtil.getCheckedState(child);
if (state == PARTIALLY_CHECKED) {
state = childState;
} else if (state != childState) {
state = PARTIALLY_CHECKED;
break;
}
}
if (state != WidgetUtil.getCheckedState(parent)) {
WidgetUtil.setCheckedState(parent, state, false, this);
}
}
}
}
// ============================================================================================================================
// Utility Methods
/**
* <p>
* </p>
*
* @since 4.0
*/
private void updateChildren(final TreeItem item,
final boolean checked) {
final TreeItem[] children = item.getItems();
for (int ndx = children.length; --ndx >= 0;) {
final TreeItem child = children[ndx];
updateChildren(child, checked);
WidgetUtil.setChecked(child, checked, false, this);
}
}
}