/***************************************************
*
* cismet GmbH, Saarbruecken, Germany
*
* ... and it just works.
*
****************************************************/
package de.cismet.tools.gui.historybutton;
import java.util.Iterator;
import java.util.Stack;
import java.util.Vector;
/**
* An implementation of the HistoryModel for the JHistoryButton. See a short <a
* href="http://flexo.cismet.de/gadgets/JHistory/">description and demo</a> on the website.
*
* <p>License: <a href="http://www.gnu.org/copyleft/lesser.html#TOC1">GNU LESSER GENERAL PUBLIC LICENSE</a><br>
* <img src="http://opensource.org/trademarks/osi-certified/web/osi-certified-60x50.gif"> <img
* src="http://opensource.org/trademarks/opensource/web/opensource-55x48.gif"></p>
*
* @author thorsten.hell@cismet.de
* @version $Revision$, $Date$
*/
public class DefaultHistoryModel implements HistoryModel {
//~ Instance fields --------------------------------------------------------
Vector modelListeners = new Vector();
Stack backHistory = new Stack();
Stack forwardHistory = new Stack();
Object currentElement = null;
int maximumPossibilities = -1;
//~ Constructors -----------------------------------------------------------
/**
* Creates a new instance of DefaultHistoryModel.
*/
public DefaultHistoryModel() {
}
//~ Methods ----------------------------------------------------------------
@Override
public void addToHistory(final Object o) {
final boolean tmpFw = isForwardPossible();
if (o != null) {
if (currentElement != null) {
if (currentElement.equals(o)) {
return;
}
backHistory.push(currentElement);
}
currentElement = o;
if (tmpFw != isForwardPossible()) {
fireForwardStatusChanged();
}
forwardHistory.removeAllElements();
fireBackStatusChanged();
fireHistoryChanged();
fireForwardStatusChanged();
}
}
@Override
public void setMaximumPossibilities(final int max) {
maximumPossibilities = max;
}
@Override
public boolean isForwardPossible() {
return !(forwardHistory.empty());
}
@Override
public boolean isBackPossible() {
return !(backHistory.empty());
}
@Override
public java.util.Vector getForwardPossibilities() {
return forwardHistory;
}
@Override
public java.util.Vector getBackPossibilities() {
return backHistory;
}
@Override
public Object forward(final boolean external) {
if (isForwardPossible()) {
backHistory.push(currentElement);
currentElement = forwardHistory.pop();
fireForwardStatusChanged();
fireBackStatusChanged();
if (external) {
fireHistoryChanged();
}
return currentElement;
}
return null;
}
@Override
public Object back(final boolean external) {
if (isBackPossible()) {
forwardHistory.push(currentElement);
currentElement = backHistory.pop();
fireBackStatusChanged();
fireForwardStatusChanged();
if (external) {
fireHistoryChanged();
}
return currentElement;
}
return null;
}
@Override
public Object getCurrentElement() {
return currentElement;
}
@Override
public void addHistoryModelListener(final HistoryModelListener hml) {
modelListeners.add(hml);
hml.historyChanged();
}
@Override
public void removeHistoryModelListener(final HistoryModelListener hml) {
modelListeners.remove(hml);
}
/**
* DOCUMENT ME!
*/
private void fireForwardStatusChanged() {
final Iterator it = modelListeners.iterator();
while (it.hasNext()) {
final Object o = it.next();
if (o instanceof HistoryModelListener) {
((HistoryModelListener)o).forwardStatusChanged();
}
}
}
/**
* DOCUMENT ME!
*/
private void fireBackStatusChanged() {
final Iterator it = modelListeners.iterator();
while (it.hasNext()) {
final Object o = it.next();
if (o instanceof HistoryModelListener) {
((HistoryModelListener)o).backStatusChanged();
}
}
}
/**
* DOCUMENT ME!
*/
private void fireHistoryChanged() {
final Iterator it = modelListeners.iterator();
while (it.hasNext()) {
final Object o = it.next();
if (o instanceof HistoryModelListener) {
((HistoryModelListener)o).historyChanged();
}
}
}
/**
* DOCUMENT ME!
*/
private void fireHistoryActionPerformed() {
}
}