/******************************************************************************* * Copyright (c) 2007 Exadel, Inc. and Red Hat, Inc. * Distributed under license by Red Hat, Inc. All rights reserved. * This program is 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: * Exadel, Inc. and Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.common.model.ui.wizards.query.list; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.swt.events.KeyAdapter; import org.eclipse.swt.events.KeyEvent; import org.eclipse.swt.events.MouseAdapter; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.events.MouseMoveListener; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.events.TreeEvent; import org.eclipse.swt.events.TreeListener; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.widgets.TreeItem; public class TreeItemSelectionManager { public interface Listener { public void flip(TreeItem item); public boolean isSelected(Object data); } TreeViewer treeViewer = null; Listener listener = null; public TreeItemSelectionManager(TreeViewer treeViewer, Listener listener) { this.listener = listener; this.treeViewer = treeViewer; update(); treeViewer.getTree().addKeyListener(new KL()); treeViewer.getTree().addSelectionListener(new SL()); treeViewer.getTree().addTreeListener(new EL()); } int lock = 0; class EL implements TreeListener { public void treeCollapsed(TreeEvent e) { } public void treeExpanded(TreeEvent e) { if(e.item instanceof TreeItem) { TreeItem item = (TreeItem)e.item; TreeItem[] is = item.getItems(); update(is); } } } public void update() { update(treeViewer.getTree().getItems()); } void update(TreeItem[] is) { lock++; try { for (int i = 0; i < is.length; i++) { Object d = is[i].getData(); is[i].setChecked(listener.isSelected(is[i].getData())); update(is[i].getItems()); } } finally { lock--; } } class SL implements SelectionListener { public void widgetDefaultSelected(SelectionEvent e) { widgetSelected(e); } public void widgetSelected(SelectionEvent e) { if(e.item instanceof TreeItem) { if(lock > 0) return; lock++; try { TreeItem item = (TreeItem)e.item; if(listener.isSelected(item.getData()) != item.getChecked()) { listener.flip(item); } if(listener.isSelected(item.getData()) != item.getChecked()) { item.setChecked(listener.isSelected(item.getData())); } } finally { lock--; } } } } class KL extends KeyAdapter { public void keyPressed(KeyEvent e) { boolean flip = e.keyCode == (int)' '; if(flip) { TreeItem[] items = treeViewer.getTree().getSelection(); TreeItem item = (items == null || items.length == 0) ? null : items[0]; listener.flip(item); } } } }