/*******************************************************************************
* Copyright (C) 2003-2007, 2013, Guillaume Brocker
*
* 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:
* Guillaume Brocker - Initial API and implementation
*
******************************************************************************/
package eclox.ui.editor.advanced;
import java.util.Iterator;
import java.util.List;
import java.util.Stack;
import java.util.Vector;
import org.eclipse.jface.viewers.IStructuredSelection;
/**
* Implements a selection that provides the history of all selected
* items as well as the navigation among those items.
*
* @author gbrocker
*/
public class NavigableSelection implements IStructuredSelection {
private Stack<Object> previousElements = new Stack<Object>(); ///< Contains all previously selected elements.
private Stack<Object> nextElements = new Stack<Object>(); ///< Contains all next selected elements.
private Vector<Object> elements = new Vector<Object>(); ///< References the current element of the selection.
/**
* @brief Builds a new selection that holds the given object.
*
* @param object the new object to select
*
* @return the new selection
*/
public NavigableSelection select(Object object) {
NavigableSelection result;
if( getFirstElement() != object ) {
result = new NavigableSelection();
if( isEmpty() == false ) {
result.previousElements.addAll(previousElements);
result.previousElements.push(elements.firstElement());
}
result.elements.add(object);
}
else {
result = this;
}
return result;
}
/**
* @brief Retrieves the collection of items that follow the current item
* in the history.
*
* @return a stack of items
*/
public Stack<Object> getNextElements() {
return nextElements;
}
/**
* @brief Builds the selection that follows in the history.
*
* @return a selection or null if none
*/
public NavigableSelection getNextSelection() {
NavigableSelection result = null;
if( nextElements.empty() == false ) {
result = new NavigableSelection();
result.previousElements.addAll(previousElements);
result.previousElements.push(elements.firstElement());
result.elements.add(nextElements.peek());
result.nextElements.addAll(nextElements);
result.nextElements.pop();
}
return result;
}
/**
* @brief Retrieves the collection of items that preceed the current item
* in the history.
*
* @return a stack of items
*/
public Stack<Object> getPreviousElements() {
return previousElements;
}
/**
* @brief Builds the selection that preceeds in the history.
*
* @return a selection or null if none
*/
public NavigableSelection getPreviousSelection() {
NavigableSelection result = null;
if( previousElements.empty() == false ) {
result = new NavigableSelection();
result.previousElements.addAll(previousElements);
result.previousElements.pop();
result.elements.add(previousElements.peek());
result.nextElements.addAll(nextElements);
result.nextElements.push(elements.firstElement());
}
return result;
}
/**
* @see org.eclipse.jface.viewers.ISelection#isEmpty()
*/
public boolean isEmpty() {
return elements.isEmpty();
}
/**
* Retrieves the selected element.
*
* @see org.eclipse.jface.viewers.IStructuredSelection#getFirstElement()
*/
public Object getFirstElement() {
return elements.isEmpty() ? null : elements.firstElement();
}
/**
* @see org.eclipse.jface.viewers.IStructuredSelection#iterator()
*/
public Iterator<Object> iterator() {
return elements.iterator();
}
/**
* @see org.eclipse.jface.viewers.IStructuredSelection#size()
*/
public int size() {
return elements.size();
}
/**
* @see org.eclipse.jface.viewers.IStructuredSelection#toArray()
*/
public Object[] toArray() {
return elements.toArray();
}
/**
* @see org.eclipse.jface.viewers.IStructuredSelection#toList()
*/
public List<Object> toList() {
return new Vector<Object>(elements);
}
}