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()); } }