/*******************************************************************************
* Copyright (c) 2004, 2010 BREDEX GmbH.
* 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:
* BREDEX GmbH - initial API and implementation and/or initial documentation
*******************************************************************************/
package org.eclipse.jubula.client.ui.utils;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.jface.viewers.ViewerSorter;
/**
* Iterator over the elements contained in a tree viewer.
*
* @author BREDEX GmbH
* @created Jun 2, 2010
*/
public class TreeViewerIterator {
/** Linear List of tree elements */
private List<Object> m_elements =
new ArrayList<Object>(25);
/** Iterator to iterate over the element list */
private Iterator<Object> m_iter;
/** tree viewer */
private TreeViewer m_viewer;
/**
* Constructor
*
* @param viewer The viewer containing the contents to iterate over.
* Note that the contents of the iterator are queried at
* construction time, so changes to the contents after
* creation of this iterator do not effect the
* results/contents of this iterator.
*/
public TreeViewerIterator(TreeViewer viewer) {
this(viewer, null, true);
}
/**
* Constructor
*
* @param viewer The viewer containing the contents to iterate over.
* Note that the contents of the iterator are queried at
* construction time, so changes to the contents after
* creation of this iterator do not effect the
* results/contents of this iterator.
* @param startNode The node <b>after</b> which to start iteration. If
* <code>null</code> or not contained within the viewer,
* iteration will start from the root node.
* @param iterateForward Flag indicating whether iteration should be
* forward, rather than backward.
*/
public TreeViewerIterator(TreeViewer viewer, Object startNode,
boolean iterateForward) {
m_viewer = viewer;
// We explicitly do *not* want to add the viewer input to the list of
// elements to search, as it will definitely not be displayed. See the
// "NOTE" in the javadoc for
// IStructuredContentProvider.getElements(Object), which should refer
// to Eclipse bug 9262.
Object[] elements = ((ITreeContentProvider)m_viewer
.getContentProvider()).getElements(viewer.getInput());
for (Object element : elements) {
setElements(element);
}
if (startNode != null && m_elements.contains(startNode)) {
Collections.rotate(m_elements,
m_elements.size() - m_elements.indexOf(startNode));
// We don't want to include the starting node in our iteration
m_elements.remove(0);
}
if (!iterateForward) {
Collections.reverse(m_elements);
}
m_iter = m_elements.iterator();
}
/**
* @return The next element in the iteration.
*/
public Object next() {
return m_iter.next();
}
/**
* Returns <tt>true</tt> if the iteration has more elements.
* @return <tt>true</tt> if the iterator has more elements.
*/
public boolean hasNext() {
return m_iter.hasNext();
}
/**
* Creates the linear list of tree elements, including the root.
*
* @param root The root of the tree or sub-tree.
*/
private void setElements(Object root) {
if (root == null) {
return;
}
Object[] children = ((ITreeContentProvider)m_viewer
.getContentProvider()).getChildren(root);
// Filter the same elements as in GUI
for (ViewerFilter vf : m_viewer.getFilters()) {
children = vf.filter(m_viewer, root, children);
}
// Sort elements like sorted in GUI to obtain correct traversal order
ViewerSorter sorter = m_viewer.getSorter();
if (sorter != null) {
sorter.sort(m_viewer, children);
}
for (Object node : children) {
if (node != null) {
m_elements.add(node);
}
setElements(node);
}
}
/** returns a flatten List of all elements
* @return List
* */
public List<Object> getElements() {
return m_elements;
}
}