package scriptbuilder.gui.panels; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.event.MouseEvent; import javax.swing.JPanel; import javax.swing.event.MouseInputAdapter; import scriptbuilder.gui.ScriptBuilderFrame; import scriptbuilder.gui.ScriptBuilderGuiConstants; import scriptbuilder.gui.drawers.EventIconDrawer; import scriptbuilder.structures.ScriptIncident; import scriptbuilder.structures.SimulationScript; /** * * @author Greg Eddington */ public class TimelineTickPanel extends JPanel { private int longestLength = ScriptBuilderGuiConstants.TICK_TIMELINE_SMALLEST_LENGTH; private int x, y; private boolean focused = false; public void setZoom(float zoom) { repaint(); } public class TimelineTickMouseListener extends MouseInputAdapter { @Override public void mouseEntered(MouseEvent e) { focused = true; } @Override public void mouseExited(MouseEvent e) { focused = false; repaint(); } @Override public void mouseMoved(MouseEvent e) { x = e.getX(); y = e.getY(); repaint(); } } public TimelineTickPanel() { super(); TimelineTickMouseListener mouseListener = new TimelineTickMouseListener(); addMouseMotionListener(mouseListener); addMouseListener(mouseListener); } public void update(SimulationScript script) { longestLength = ScriptBuilderGuiConstants.TICK_TIMELINE_SMALLEST_LENGTH; // Get the stats on the incidents int height = ScriptBuilderGuiConstants.TICK_TOP_MARGIN * 4; for (ScriptIncident incident : script.incidents) { if (incident != null) { height += incident.collapsed ? ScriptBuilderGuiConstants.TIMELINE_OPENED_HEIGHT : ScriptBuilderGuiConstants.TIMELINE_OPENED_HEIGHT; if (incident.length > longestLength) longestLength = incident.length; } } Dimension newSize = new Dimension(longestLength / ScriptBuilderGuiConstants.HORIZONTAL_TICK_RESOLUTION * ScriptBuilderGuiConstants.PIXEL_WIDTH_PER_HORIZONTAL_TICK + ScriptBuilderGuiConstants.TICK_TIMELINE_LEFT_MARGIN + 50, height); this.setPreferredSize(newSize); this.setSize(newSize); this.invalidate(); } @Override public void paint(Graphics g) { super.paint(g); Graphics2D g2d = (Graphics2D)g; // Draw the horizontal line g2d.setFont(ScriptBuilderGuiConstants.TIMELINE_TICK_TIME_FONT); g2d.setColor(ScriptBuilderGuiConstants.TIMELINE_TICK_COLOR); g2d.fillRect(0, ScriptBuilderGuiConstants.TICK_TIMELINE_TOP_MARGIN, longestLength, ScriptBuilderGuiConstants.TICK_TIMELINE_HEIGHT); // Draw the ticks int longestLengthPlusMargin = longestLength / ScriptBuilderGuiConstants.HORIZONTAL_TICK_RESOLUTION * ScriptBuilderGuiConstants.PIXEL_WIDTH_PER_HORIZONTAL_TICK + ScriptBuilderGuiConstants.TICK_TIMELINE_LEFT_MARGIN; // Minutes g2d.setColor(ScriptBuilderGuiConstants.MINOR_TICK_COLOR); int seconds = 0; for (int i = ScriptBuilderGuiConstants.TICK_TIMELINE_LEFT_MARGIN; i <= longestLengthPlusMargin; i += ScriptBuilderGuiConstants.PIXEL_WIDTH_PER_HORIZONTAL_TICK, seconds += ScriptBuilderGuiConstants.HORIZONTAL_TICK_RESOLUTION) { g2d.drawLine(i, ScriptBuilderGuiConstants.TICK_TOP_MARGIN, i, ScriptBuilderGuiConstants.TICK_HEIGHT); } // Major Ticks g2d.setColor(ScriptBuilderGuiConstants.TIMELINE_TICK_COLOR); seconds = 0; for (int i = ScriptBuilderGuiConstants.TICK_TIMELINE_LEFT_MARGIN; i <= longestLengthPlusMargin; i += ScriptBuilderGuiConstants.PIXEL_WIDTH_PER_HORIZONTAL_TICK * ScriptBuilderGuiConstants.TICKS_PER_MAJOR_TICK, seconds += ScriptBuilderGuiConstants.HORIZONTAL_TICK_RESOLUTION * ScriptBuilderGuiConstants.TICKS_PER_MAJOR_TICK) { g2d.drawLine(i, ScriptBuilderGuiConstants.TICK_TOP_MARGIN, i, ScriptBuilderGuiConstants.TICK_HEIGHT); } paintChildren(g); if (focused && ((ScriptBuilderFrame)this.getTopLevelAncestor()).currentEventType != null) EventIconDrawer.DrawEventIcon(g2d, ((ScriptBuilderFrame)this.getTopLevelAncestor()).currentEventType, x+5, y+10); } }