package org.chartsy.main.history;
import java.io.Serializable;
import java.util.Stack;
import java.util.logging.Logger;
import org.chartsy.main.utils.SerialVersion;
/**
*
* @author viorel.gheba
*/
public class History implements Serializable
{
private static final long serialVersionUID = SerialVersion.APPVERSION;
protected static final Logger LOG = Logger.getLogger(History.class.getPackage().getName());
private HistoryItem current;
transient private Stack<HistoryItem> backStack;
transient private Stack<HistoryItem> fwdStack;
public History()
{
bk();
fw();
}
private Stack<HistoryItem> bk()
{
if (backStack == null)
{
backStack = new Stack<HistoryItem>();
}
return backStack;
}
private Stack<HistoryItem> fw()
{
if (fwdStack == null)
{
fwdStack = new Stack<HistoryItem>();
}
return fwdStack;
}
public void initialize()
{
bk();
fw();
}
public void addHistoryItem(HistoryItem hi)
{
bk().push(hi);
}
public boolean hasBackHistory()
{
return !bk().empty();
}
public boolean hasFwdHistory()
{
return !fw().empty();
}
public HistoryItem[] getBackHistoryList()
{
return bk().toArray(new HistoryItem[bk().size()]);
}
public void setBackHistoryList(HistoryItem[] items)
{
bk().clear();
for (HistoryItem item : items)
{
bk().push(item);
}
}
public HistoryItem[] getFwdHistoryList()
{
return fw().toArray(new HistoryItem[fw().size()]);
}
public void setFwdHistoryList(HistoryItem[] items)
{
fw().clear();
for (HistoryItem item : items)
{
fw().push(item);
}
}
public HistoryItem getCurrent()
{
return current;
}
public void setCurrent(HistoryItem hi)
{
this.current = hi;
}
public void clearBackHistory()
{
bk().clear();
}
public void clearForwardHistory()
{
fw().clear();
}
public HistoryItem go(int steps)
{
HistoryItem result = null;
if (steps > 0)
{
// forward
int size = fw().size();
if (size == 0)
{
return null;
}
if (size < steps)
{
return null;
}
if (current != null)
{
bk().push(current);
}
for (int i = 0; i < steps - 1; i++)
{
bk().push(fw().pop());
}
result = fw().pop();
} else if (steps < 0)
{
// back
steps = Math.abs(steps);
int size = bk().size();
if (size == 0)
{
return null;
}
if (size < steps)
{
return null;
}
if (current != null)
{
fw().push(current);
}
for (int i = 0; i < steps - 1; i++)
{
fw().push(bk().pop());
}
result = bk().pop();
}
return result;
}
}