/*******************************************************************************
* Copyright (c) 2012, 2013 Ericsson
*
* 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:
* Patrick Tasse - Initial API and implementation
* Geneviève Bastien - Added the fValue parameter to avoid subclassing
*******************************************************************************/
package fr.inria.linuxtools.tmf.ui.widgets.timegraph.model;
import fr.inria.linuxtools.tmf.core.util.Pair;
/**
* Generic TimeEvent implementation
*
* @version 1.0
* @author Patrick Tasse
*/
public class TimeEvent implements ITimeEvent2 {
/** TimeGraphEntry matching this time event */
protected ITimeGraphEntry fEntry;
/** Beginning timestamp of this time event */
protected long fTime;
/** Duration of this time event */
protected long fDuration;
private final int fValue;
/**
* Default value when no other value present
*/
private static final int NOVALUE = Integer.MIN_VALUE;
/**
* Standard constructor
*
* @param entry
* The entry matching this event
* @param time
* The timestamp of this event
* @param duration
* The duration of the event
*/
public TimeEvent(ITimeGraphEntry entry, long time, long duration) {
this(entry, time, duration, NOVALUE);
}
/**
* Constructor
*
* @param entry
* The entry to which this time event is assigned
* @param time
* The timestamp of this event
* @param duration
* The duration of this event
* @param value
* The status assigned to the event
* @since 2.1
*/
public TimeEvent(ITimeGraphEntry entry, long time, long duration,
int value) {
fEntry = entry;
fTime = time;
fDuration = duration;
fValue = value;
}
/**
* Get this event's status
*
* @return The integer matching this status
* @since 2.1
*/
public int getValue() {
return fValue;
}
/**
* Return whether an event has a value
*
* @return true if the event has a value
* @since 2.1
*/
public boolean hasValue() {
return (fValue != NOVALUE);
}
@Override
public ITimeGraphEntry getEntry() {
return fEntry;
}
@Override
public long getTime() {
return fTime;
}
@Override
public long getDuration() {
return fDuration;
}
/**
* Split an event in two at the specified time. If the time is smaller or
* equal to the event's start, the first split event is null. If the time is
* greater or equal to the event's end, the second split event is null.
* <p>
* Subclasses should re-implement this method
*
* @since 2.1
*/
@Override
public Pair<ITimeEvent, ITimeEvent> split(long time) {
Pair<ITimeEvent, ITimeEvent> pair = new Pair<>();
if (time > fTime) {
pair.setFirst(new TimeEvent(fEntry, fTime, Math.min(fDuration, time - fTime), fValue));
}
if (time < fTime + fDuration) {
pair.setSecond(new TimeEvent(fEntry, Math.max(fTime, time), fDuration - Math.max(0, time - fTime), fValue));
}
return pair;
}
@Override
public String toString() {
return getClass().getSimpleName() + " start=" + fTime + " end=" + (fTime + fDuration) + " duration=" + fDuration + (hasValue() ? (" value=" + fValue) : ""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
}
}