package glug.gui;
import glug.gui.timelinecursor.TimelineCursor;
import glug.model.time.LogInstant;
import glug.model.time.LogInterval;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.JComponent;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
public abstract class TimelineComponent extends JComponent implements ChangeListener {
private static final long serialVersionUID = 1L;
protected final UITimeScale uiTimeScale;
private final TimelineCursor timelineCursor;
public TimelineComponent(UITimeScale uiTimeScale, TimelineCursor timelineCursor) {
this.uiTimeScale = uiTimeScale;
this.timelineCursor = timelineCursor;
uiTimeScale.addChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
setSize(getPreferredSize());
if (evt.getPropertyName().equals("millisecondsPerPixel")) {
repaint();
}
}
});
}
@Override
public void paintComponent(Graphics g) {
Graphics2D graphics2D = (Graphics2D) g;
//System.out.println("Clip bounds ="+clipBounds);
if (containsData()) {
paintPopulatedComponent(graphics2D);
}
}
protected abstract void paintPopulatedComponent(Graphics2D graphics2D);
@Override
public Dimension getPreferredSize() {
if (!containsData()) {
return super.getPreferredSize();
}
return new Dimension(uiTimeScale.fullModelToViewLength(), getPreferredHeight());
}
protected abstract int getPreferredHeight();
public UITimeScale getUITimeScale() {
return uiTimeScale;
}
public TimelineCursor getTimelineCursor() {
return timelineCursor;
}
public void stateChanged(ChangeEvent e) {
Object source = e.getSource();
if (source instanceof TimelineCursor.CursorPositionChanged)
{
TimelineCursor.CursorPositionChanged cursorPositionChanged = (TimelineCursor.CursorPositionChanged) source;
getTimelineCursor().processCursorPositionChangedFor(this, cursorPositionChanged);
}
}
public abstract boolean containsData();
public Rectangle getViewFor(LogInstant logInstant) {
return new Rectangle(uiTimeScale.modelToView(logInstant.getRecordedInstant()), 0, 0,
getHeight());
}
public Rectangle getViewFor(LogInterval logInterval) {
int startX = uiTimeScale.modelToView(logInterval.getStart().getRecordedInstant());
int endX = uiTimeScale.modelToView(logInterval.getEnd().getRecordedInstant());
return new Rectangle(startX, 0, endX-startX, getHeight());
}
}