/*
* Copyright (c) 2012, 2016 Eike Stepper (Berlin, Germany) and others.
* 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:
* Eike Stepper - initial API and implementation
*/
package org.eclipse.emf.cdo.internal.ui.history;
/**
* @author Eike Stepper
*/
public abstract class SegmentList
{
private final Net net;
private Segment firstSegment;
private Segment lastSegment;
public SegmentList(Net net)
{
this.net = net;
}
public final Net getNet()
{
return net;
}
public final Segment getFirstSegment()
{
return firstSegment;
}
public final Segment getLastSegment()
{
return lastSegment;
}
public final Segment getSegment(long time)
{
Segment segment = lastSegment;
while (segment != null)
{
if (segment.containsVisualTime(time))
{
return segment;
}
segment = getPreviousSegment(segment);
}
return null;
}
void addSegment(Segment segment, boolean afterLast)
{
if (lastSegment == null)
{
lastSegment = segment;
firstSegment = segment;
}
else if (afterLast)
{
setPreviousSegment(segment, lastSegment);
setNextSegment(lastSegment, segment);
lastSegment = segment;
}
else
{
setNextSegment(segment, firstSegment);
setPreviousSegment(firstSegment, segment);
firstSegment = segment;
}
}
void removeSegment(Segment segment)
{
Segment nextSegment = getNextSegment(segment);
Segment previousSegment = getPreviousSegment(segment);
if (nextSegment != null)
{
setPreviousSegment(nextSegment, previousSegment);
}
else
{
lastSegment = previousSegment;
}
if (previousSegment != null)
{
setNextSegment(previousSegment, nextSegment);
}
else
{
firstSegment = nextSegment;
}
}
protected abstract Segment getNextSegment(Segment segment);
protected abstract void setNextSegment(Segment segment, Segment nextSegment);
protected abstract Segment getPreviousSegment(Segment segment);
protected abstract void setPreviousSegment(Segment segment, Segment previousSegment);
}