package timeflow.views;
import timeflow.data.db.*;
import timeflow.data.time.*;
import timeflow.model.*;
import timeflow.vis.*;
import timeflow.app.ui.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.net.URL;
import java.util.*;
import javax.swing.*;
public abstract class AbstractVisualizationView extends JPanel
{
Image buffer;
Graphics2D graphics;
Point mouse=new Point(-10000,0), firstMouse=new Point();
boolean mouseIsDown;
ArrayList<Mouseover> objectLocations=new ArrayList<Mouseover>();
TFModel model;
Act selectedAct;
RoughTime selectedTime;
Set<JMenuItem> urlItems=new HashSet<JMenuItem>();
public AbstractVisualizationView(TFModel model)
{
this.model=model;
// deal with mouseovers.
addMouseMotionListener(new MouseMotionListener(){
@Override
public void mouseDragged(MouseEvent e) {
mouse.setLocation(e.getX(), e.getY());
repaint();
}
@Override
public void mouseMoved(MouseEvent e) {
mouse.setLocation(e.getX(), e.getY());
repaint();
}});
final JPopupMenu popup = new JPopupMenu();
final JMenuItem edit = new JMenuItem("Edit");
edit.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
EditRecordPanel.edit(getModel(), selectedAct);
}});
popup.add(edit);
final JMenuItem delete = new JMenuItem("Delete");
popup.add(delete);
delete.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
getModel().getDB().delete(selectedAct);
getModel().noteDelete(this);
}});
final JMenuItem add = new JMenuItem("New...");
popup.add(add);
add.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
EditRecordPanel.add(getModel(), selectedTime);
}});
// deal with right-click.
addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
pop(e);
}
public void mouseReleased(MouseEvent e) {
pop(e);
}
private void pop(MouseEvent e) {
if (e.isPopupTrigger()) {
Point p=new Point(e.getX(), e.getY());
Mouseover o=find(p);
boolean onAct= o!=null && o.thing instanceof VisualAct;
if (onAct)
{
VisualAct v=(VisualAct)o.thing;
selectedAct=v.getAct();
String name=" '"+v.getLabel()+"'";
edit.setText("Edit"+name+"...");
delete.setText("Delete"+name);
edit.setEnabled(true);
delete.setEnabled(true);
}
else
{
edit.setEnabled(false);
edit.setText("Edit Event");
delete.setEnabled(false);
delete.setText("Delete Event");
}
selectedTime=getTime(p);
if (selectedTime!=null || onAct)
{
add.setEnabled(selectedTime!=null);
add.setText(selectedTime==null ? "Add" : "Add Event At "+selectedTime.format()+"...");
java.util.List<Field> urlFields=getModel().getDB().getFields(URL.class);
if (urlFields.size()>0)
{
// remove any old items.
for (JMenuItem m: urlItems)
popup.remove(m);
urlItems.clear();
if (onAct)
{
Act a=((VisualAct)o.thing).getAct();
for (Field f: urlFields)
{
final URL url=a.getURL(f);
JMenuItem go=new JMenuItem("Go to "+url);
go.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Display.launchBrowser(url.toString());
}});
popup.add(go);
urlItems.add(go);
}
}
}
popup.show(e.getComponent(), p.x, p.y);
}
}
}
});
}
public RoughTime getTime(Point p)
{
return null;
}
public TFModel getModel()
{
return model;
}
@Override
public void setBounds(int x, int y, int w, int h)
{
super.setBounds(x,y,w,h);
if (w>0 && h>0)
{
if (graphics!=null)
graphics.dispose();
buffer=new BufferedImage(w,h,BufferedImage.TYPE_INT_ARGB);
graphics=(Graphics2D)buffer.getGraphics();
drawVisualization();
repaint();
}
}
void drawVisualization()
{
drawVisualization(graphics);
}
protected abstract void drawVisualization(Graphics2D g);
protected boolean paintOnTop(Graphics2D g, int w, int h)
{
return false;
}
protected Mouseover find(Point p)
{
for (Mouseover o: objectLocations)
if (o.contains(mouse))
return o;
return null;
}
public final void paintComponent(Graphics g1)
{
Graphics2D g=(Graphics2D)g1;
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g.drawImage(buffer,0,0,null);
int w=getSize().width, h=getSize().height;
if (paintOnTop(g,w,h))
return;
Mouseover highlight=find(mouse);
if (highlight!=null)
highlight.draw(g, w, h, getModel().getDisplay());
}
}