package org.yamcs.ui.archivebrowser;
import org.yamcs.ui.archivebrowser.ArchivePanel.IndexChunkSpec;
import org.yamcs.utils.TaiUtcConverter.DateTimeComponents;
import org.yamcs.utils.TimeEncoding;
import org.yamcs.ui.archivebrowser.IndexBox.IndexLineSpec;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import java.util.TreeSet;
class Timeline extends JPanel implements MouseListener {
private static final long serialVersionUID = 1L;
private final IndexBox tmBox;
TreeSet<IndexChunkSpec> tmspec;
IndexLineSpec pkt;
Color color;
ZoomSpec zoom;
int leftDelta; //we have to move everything to the left with this amount (because this component is in a bordered parent)
BufferedImage image=null;
Timeline(IndexBox tmBox, IndexLineSpec pkt, TreeSet<IndexChunkSpec> tmspec, ZoomSpec zoom, int leftDelta) {
super();
setBorder(BorderFactory.createEmptyBorder());
this.tmBox = tmBox;
this.pkt = pkt;
this.color=pkt.color;
this.zoom=zoom;
this.leftDelta=leftDelta;
addMouseListener(this);
setOpaque(false);
this.tmspec = tmspec;
}
@Override
public Point getToolTipLocation(MouseEvent e) {
return tmBox.getToolTipLocation(e);
}
private MouseEvent translateEvent(MouseEvent e, Component dest) {
// workaround for this bug
//http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7181403
MouseEvent me=SwingUtilities.convertMouseEvent(e.getComponent(), e, dest);
return new MouseEvent(me.getComponent(), me.getID(), me.getWhen(), me.getModifiers(), me.getX(), me.getY(), me.getXOnScreen(), me.getYOnScreen(), me.getClickCount(), me.isPopupTrigger(), e.getButton());
}
@Override public void mousePressed(MouseEvent e) {
if(e.isPopupTrigger()) {
tmBox.selectedPacket = pkt;
tmBox.showPopup(translateEvent(e, tmBox));
}
}
@Override public void mouseReleased(MouseEvent e) {
if(e.isPopupTrigger()) {
tmBox.selectedPacket = pkt;
tmBox.showPopup(translateEvent(e, tmBox));
}
}
@Override public void mouseClicked(MouseEvent e) {}
@Override
public void mouseEntered(MouseEvent e) {
MouseEvent transEvent = translateEvent(e, tmBox);
setToolTipText(TimeEncoding.toCombinedFormat(tmBox.dataView.getMouseInstant(transEvent)));
}
@Override
public void mouseExited(MouseEvent e) {}
@Override
public String getToolTipText(MouseEvent e) {
String tt=TimeEncoding.toCombinedFormat(tmBox.dataView.getMouseInstant(translateEvent(e, tmBox)));
IndexChunkSpec c1=zoom.convertPixelToChunk(translateEvent(e, tmBox).getX());
IndexChunkSpec chunk=tmspec.floor(c1);
if((chunk==null)||chunk.stopInstant<c1.startInstant) {
chunk=tmspec.ceiling(c1);
if((chunk==null) || (chunk.startInstant>c1.stopInstant)) return tt;
}
DateTimeComponents dtcStart=TimeEncoding.toUtc(chunk.startInstant);
DateTimeComponents dtcStop=TimeEncoding.toUtc(chunk.stopInstant);
String timestring = (dtcStart.year == dtcStop.year) &&
(dtcStart.doy == dtcStop.doy) ?
String.format("%s - %s", TimeEncoding.toCombinedFormat(chunk.startInstant), dtcStop.toIso8860String()) :
String.format("%s - %s", TimeEncoding.toCombinedFormat(chunk.startInstant), TimeEncoding.toCombinedFormat(chunk.stopInstant));
StringBuilder sb=new StringBuilder();
sb.append("<html>").append(tt).append("<hr>Index Record: ").append(chunk.tmcount).append(" Packets");
if(chunk.tmcount>1) sb.append(" @ ").append(chunk.getFrequency()).append("Hz");
sb.append("<br>").append(timestring);
if(chunk.info!=null) sb.append("<br>").append(chunk.info);
sb.append("</html>");
return sb.toString();
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
if(image==null) {
image=new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_ARGB);
Graphics2D big=image.createGraphics();
big.setComposite(AlphaComposite.getInstance(AlphaComposite.CLEAR));
big.fillRect(0,0,getWidth(),getHeight());
big.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));
//big.clearRect(0, 0, getWidth(),getHeight());
big.setColor(color);
for(IndexChunkSpec pkt:tmspec) {
int x1 = zoom.convertInstantToPixel(pkt.startInstant);
int x2 = zoom.convertInstantToPixel(pkt.stopInstant);
int width=(x2 - x1 <= 1) ? 1 : x2 - x1 - 1;
big.fillRect(x1-leftDelta, 0, width, getHeight());
}
}
g.drawImage(image,0,0,this);
}
}