From 3f8b7b6ffcb86966be6f254352d4d6ad54cfdebc Mon Sep 17 00:00:00 2001
From: tjc <tjc@ee4ac58c-ac51-4696-9907-e4b3aa274f04>
Date: Thu, 1 Jul 2004 12:43:21 +0000
Subject: [PATCH] fix mouse drag
git-svn-id: svn+ssh://svn.internal.sanger.ac.uk/repos/svn/pathsoft/artemis/trunk@1691 ee4ac58c-ac51-4696-9907-e4b3aa274f04
---
uk/ac/sanger/artemis/components/Plot.java | 454 ++++++++++++----------
1 file changed, 257 insertions(+), 197 deletions(-)
diff --git a/uk/ac/sanger/artemis/components/Plot.java b/uk/ac/sanger/artemis/components/Plot.java
index 8ee213ebe..b2d177b15 100644
--- a/uk/ac/sanger/artemis/components/Plot.java
+++ b/uk/ac/sanger/artemis/components/Plot.java
@@ -20,27 +20,89 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
- * $Header: //tmp/pathsoft/artemis/uk/ac/sanger/artemis/components/Plot.java,v 1.1 2004-06-09 09:47:11 tjc Exp $
+ * $Header: //tmp/pathsoft/artemis/uk/ac/sanger/artemis/components/Plot.java,v 1.2 2004-07-01 12:43:21 tjc Exp $
**/
package uk.ac.sanger.artemis.components;
-import uk.ac.sanger.artemis.*;
+import uk.ac.sanger.artemis.Options;
import uk.ac.sanger.artemis.plot.*;
import java.awt.*;
import java.awt.event.*;
-import javax.swing.*;
+import javax.swing.JPanel;
+import javax.swing.JComponent;
+import javax.swing.JScrollPane;
+import javax.swing.JCheckBoxMenuItem;
+import javax.swing.JMenuItem;
+import javax.swing.JScrollBar;
+import javax.swing.JPopupMenu;
/**
* This class implements a simple plot component.
*
* @author Kim Rutherford
- * @version $Id: Plot.java,v 1.1 2004-06-09 09:47:11 tjc Exp $
+ * @version $Id: Plot.java,v 1.2 2004-07-01 12:43:21 tjc Exp $
**/
-public abstract class Plot extends JPanel {
+public abstract class Plot extends JPanel
+{
+
+ /**
+ * The drawing area for this component.
+ **/
+ private JComponent canvas = null;
+
+ /**
+ * A scroll bar for changing the window size.
+ **/
+ private JScrollBar window_changer = null;
+
+ /**
+ * The height of the font used in this component.
+ **/
+ private int font_height;
+
+ /**
+ * Off screen image used for double buffering when drawing the canvas.
+ **/
+ private Image offscreen;
+
+ /**
+ * The object that will generate the value we plot in this component.
+ **/
+ private Algorithm algorithm;
+
+ /**
+ * If true then a scale line will be drawn at the bottom of the graph when
+ * drawScaleLine () is called.
+ **/
+ private boolean draw_scale;
+
+ /**
+ * Set to true if drawMultiValueGraph () should call recalculateValues ().
+ * It is reset to false by recalculateValues ().
+ **/
+ protected boolean recalculate_flag = true;
+
+ /**
+ * The x position of the last click or -1 if the user hasn't clicked
+ * anywhere yet or the user clicked outside the graph.
+ **/
+ private int cross_hair_position = -1;
+
+ /**
+ * The x position of the start of the last mouse drag or -1 if the user
+ * hasn't clicked anywhere yet or the user clicked outside the graph.
+ **/
+ private int drag_start_position = -1;
+
+ /**
+ * A vector of those objects listening for PlotMouse events.
+ **/
+ final private java.util.Vector listener_list = new java.util.Vector ();
+
/**
* Create a new plot component.
* @param algorithm The object that will generate the values we plot in
@@ -48,7 +110,8 @@ public abstract class Plot extends JPanel {
* @param draw_scale If true then a scale line will be drawn at the bottom
* of the graph.
**/
- public Plot (Algorithm algorithm, boolean draw_scale) {
+ public Plot (Algorithm algorithm, boolean draw_scale)
+ {
this.algorithm = algorithm;
this.draw_scale = draw_scale;
@@ -56,62 +119,62 @@ public abstract class Plot extends JPanel {
setFont (font);
FontMetrics fm = getFontMetrics (font);
- font_height = fm.getHeight ();
+ font_height = fm.getHeight();
- setLayout(new BorderLayout ());
+ setLayout(new BorderLayout());
final int MAX_WINDOW;
- if (getAlgorithm ().getDefaultMaxWindowSize () != null) {
- MAX_WINDOW = getAlgorithm ().getDefaultMaxWindowSize ().intValue ();
- } else {
+ if(getAlgorithm().getDefaultMaxWindowSize () != null)
+ MAX_WINDOW = getAlgorithm().getDefaultMaxWindowSize().intValue();
+ else
MAX_WINDOW = 500;
- }
final int MIN_WINDOW;
- if (getAlgorithm ().getDefaultMinWindowSize () != null) {
+ if(getAlgorithm ().getDefaultMinWindowSize () != null)
MIN_WINDOW = getAlgorithm ().getDefaultMinWindowSize ().intValue ();
- } else {
+ else
MIN_WINDOW = 5;
- }
final int START_WINDOW;
- if (getAlgorithm ().getDefaultWindowSize () == null) {
+ if(getAlgorithm().getDefaultWindowSize() == null)
START_WINDOW = 10;
- } else {
- START_WINDOW = getAlgorithm ().getDefaultWindowSize ().intValue ();
- }
+ else
+ START_WINDOW = getAlgorithm().getDefaultWindowSize().intValue();
window_changer = new JScrollBar (Scrollbar.VERTICAL);
window_changer.setValues (START_WINDOW, SCROLL_NOB_SIZE,
MIN_WINDOW, MAX_WINDOW + SCROLL_NOB_SIZE);
- if (MAX_WINDOW >= 50) {
+ if (MAX_WINDOW >= 50)
window_changer.setBlockIncrement (MAX_WINDOW/50);
- } else {
+ else
window_changer.setBlockIncrement (1);
- }
- window_changer.addAdjustmentListener (new AdjustmentListener () {
- public void adjustmentValueChanged(AdjustmentEvent e) {
+ window_changer.addAdjustmentListener(new AdjustmentListener()
+ {
+ public void adjustmentValueChanged(AdjustmentEvent e)
+ {
recalculate_flag = true;
repaintCanvas ();
}
});
- addComponentListener (new ComponentAdapter () {
- public void componentShown(ComponentEvent e) {
+ addComponentListener(new ComponentAdapter()
+ {
+ public void componentShown(ComponentEvent e)
+ {
recalculate_flag = true;
repaintCanvas ();
}
});
- add (window_changer, "East");
+ add(window_changer, "East");
- createCanvas ();
+ createCanvas();
- getCanvas ().setBackground (Color.white);
+ getCanvas().setBackground (Color.white);
}
final int SCROLL_NOB_SIZE = 10;
@@ -119,7 +182,8 @@ public abstract class Plot extends JPanel {
/**
* Return the algorithm that was passed to the constructor.
**/
- public Algorithm getAlgorithm () {
+ public Algorithm getAlgorithm()
+ {
return algorithm;
}
@@ -127,19 +191,23 @@ public abstract class Plot extends JPanel {
* Return the current value of the window size, as set by the
* window_changer scrollbar.
**/
- public int getWindowSize () {
+ public int getWindowSize()
+ {
return window_changer.getValue ();
}
/**
* Create the canvas object for this BasePlot and add it to the component.
**/
- private void createCanvas () {
- canvas = new JComponent () {
+ private void createCanvas()
+ {
+ canvas = new JComponent()
+ {
/**
* Set the offscreen buffer to null as part of invalidation.
**/
- public void invalidate() {
+ public void invalidate()
+ {
super.invalidate();
offscreen = null;
}
@@ -147,66 +215,75 @@ public abstract class Plot extends JPanel {
/**
* Override update to *not* erase the background before painting
*/
- public void update(Graphics g) {
+ public void update(Graphics g)
+ {
paint(g);
}
/**
* Paint the canvas.
*/
- public void paint(Graphics g) {
+ public void paint(Graphics g)
+ {
paintCanvas (g);
}
};
- final MouseListener mouse_listener =
- new MouseAdapter () {
+ final MouseListener mouse_listener = new MouseAdapter()
+ {
/**
* Listen for mouse press events so that we can do a popup menu and a
* crosshair.
**/
- public void mousePressed (MouseEvent event) {
- if (event.isPopupTrigger () || event.isMetaDown ()) {
- final JComponent parent = (JComponent) event.getSource ();
-
- final JPopupMenu popup = new JPopupMenu ("Plot Options");
+ public void mousePressed(MouseEvent event)
+ {
+ if(event.isPopupTrigger() || event.isMetaDown())
+ {
+ final JComponent parent = (JComponent)event.getSource();
+ final JPopupMenu popup = new JPopupMenu("Plot Options");
final JCheckBoxMenuItem scaling_toggle =
new JCheckBoxMenuItem ("Scaling");
- scaling_toggle.setState (getAlgorithm ().scalingFlag ());
- scaling_toggle.addItemListener (new ItemListener () {
- public void itemStateChanged (ItemEvent _) {
+ scaling_toggle.setState(getAlgorithm ().scalingFlag ());
+ scaling_toggle.addItemListener(new ItemListener ()
+ {
+ public void itemStateChanged (ItemEvent _)
+ {
getAlgorithm ().setScalingFlag (scaling_toggle.getState ());
recalculate_flag = true;
- repaintCanvas ();
+ repaintCanvas();
}
});
- popup.add (scaling_toggle);
-
- popup.addSeparator ();
+ popup.add(scaling_toggle);
+ popup.addSeparator();
final JMenuItem max_window_size =
new JMenuItem ("Maximum Window Size:");
popup.add (max_window_size);
- final int [] window_sizes = {
+ final int [] window_sizes =
+ {
100, 200, 500, 1000, 2000, 5000, 10000, 20000, 50000, 100000,
200000, 500000, 1000000
};
- for (int i = 0 ; i < window_sizes.length ; ++i) {
+ for(int i = 0 ; i < window_sizes.length ; ++i)
+ {
final int size = i;
- JMenuItem window_size_item = new JMenuItem (" " + window_sizes[i]);
+ JMenuItem window_size_item = new JMenuItem(" " + window_sizes[i]);
- window_size_item.addActionListener (new ActionListener () {
- public void actionPerformed (ActionEvent _) {
+ window_size_item.addActionListener(new ActionListener()
+ {
+ public void actionPerformed (ActionEvent _)
+ {
final int new_maximum = window_sizes[size];
- if (new_maximum > window_changer.getMinimum ()) {
- window_changer.setMaximum (new_maximum + SCROLL_NOB_SIZE);
+ if(new_maximum > window_changer.getMinimum ())
+ {
+ window_changer.setMaximum(new_maximum + SCROLL_NOB_SIZE);
recalculate_flag = true;
repaintCanvas ();
}
@@ -217,26 +294,27 @@ public abstract class Plot extends JPanel {
}
parent.add (popup);
-
popup.show (parent, event.getX (), event.getY ());
- } else {
+ }
+ else
+ {
final int point_x = event.getPoint ().x;
final int point_y = event.getPoint ().y;
- if (point_y > getLabelHeight ()) {
+ if(point_y > getLabelHeight ())
+ {
cross_hair_position = point_x;
drag_start_position = point_x;
- } else {
+ }
+ else
cancelCrossHairs ();
- }
- if (event.getClickCount () == 2) {
- fireDoubleClickEvent ();
- } else {
- fireClickEvent ();
- }
+ if(event.getClickCount() == 2)
+ fireDoubleClickEvent();
+ else
+ fireClickEvent();
- repaintCanvas ();
+ repaintCanvas();
}
}
};
@@ -244,21 +322,23 @@ public abstract class Plot extends JPanel {
canvas.addMouseListener (mouse_listener);
final MouseMotionListener mouse_motion_listener =
- new MouseMotionAdapter () {
+ new MouseMotionAdapter()
+ {
+ public void mouseDragged (MouseEvent event)
+ {
+ if(isMenuTrigger(event))
+ return;
- public void mouseDragged (MouseEvent event) {
- final int point_x = event.getPoint ().x;
- final int point_y = event.getPoint ().y;
+ final int point_x = event.getPoint().x;
+ final int point_y = event.getPoint().y;
- if (point_y > getLabelHeight ()) {
+ if(point_y > getLabelHeight())
cross_hair_position = point_x;
- } else {
- cancelCrossHairs ();
- }
-
- fireDragEvent ();
+ else
+ cancelCrossHairs();
- repaintCanvas ();
+ fireDragEvent();
+ repaintCanvas();
}
};
@@ -267,15 +347,30 @@ public abstract class Plot extends JPanel {
add (canvas, "Center");
}
+ /**
+ * Return true if and only if the given MouseEvent (a mouse press) should
+ * pop up a JPopupMenu.
+ **/
+ private boolean isMenuTrigger(final MouseEvent event)
+ {
+ if(event.isPopupTrigger() ||
+ (event.getModifiers() & InputEvent.BUTTON3_MASK) != 0)
+ return true;
+ else
+ return false;
+ }
+
/**
* Call mouseClick () on each of the PlotMouseListener objects in the
* listener list.
**/
- private void fireClickEvent () {
- for (int i = 0 ; i < listener_list.size () ; ++i) {
+ private void fireClickEvent()
+ {
+ for (int i = 0 ; i < listener_list.size() ; ++i)
+ {
final PlotMouseListener listener =
- (PlotMouseListener) listener_list.elementAt (i);
- listener.mouseClick (getPointPosition (cross_hair_position));
+ (PlotMouseListener)listener_list.elementAt(i);
+ listener.mouseClick(getPointPosition(cross_hair_position));
}
}
@@ -283,12 +378,14 @@ public abstract class Plot extends JPanel {
* Call mouseDragged () on each of the PlotMouseListener objects in the
* listener list.
**/
- private void fireDragEvent () {
- for (int i = 0 ; i < listener_list.size () ; ++i) {
+ private void fireDragEvent()
+ {
+ for(int i = 0; i < listener_list.size(); ++i)
+ {
final PlotMouseListener listener =
- (PlotMouseListener) listener_list.elementAt (i);
- listener.mouseDrag (getPointPosition (drag_start_position),
- getPointPosition (cross_hair_position));
+ (PlotMouseListener)listener_list.elementAt(i);
+ listener.mouseDrag(getPointPosition(drag_start_position),
+ getPointPosition(cross_hair_position));
}
}
@@ -296,11 +393,13 @@ public abstract class Plot extends JPanel {
* Call mouseDoubleClick () on each of the PlotMouseListener objects in the
* listener list.
**/
- private void fireDoubleClickEvent () {
- for (int i = 0 ; i < listener_list.size () ; ++i) {
+ private void fireDoubleClickEvent()
+ {
+ for(int i = 0; i < listener_list.size(); ++i)
+ {
final PlotMouseListener listener =
- (PlotMouseListener) listener_list.elementAt (i);
- listener.mouseDoubleClick (getPointPosition (cross_hair_position));
+ (PlotMouseListener)listener_list.elementAt (i);
+ listener.mouseDoubleClick(getPointPosition(cross_hair_position));
}
}
@@ -308,8 +407,9 @@ public abstract class Plot extends JPanel {
* Adds the given listener to receive mouse events from this object.
* @param l the listener.
**/
- public void addPlotMouseListener (final PlotMouseListener listener) {
- listener_list.addElement (listener);
+ public void addPlotMouseListener(final PlotMouseListener listener)
+ {
+ listener_list.addElement(listener);
}
/**
@@ -317,8 +417,9 @@ public abstract class Plot extends JPanel {
* mouse events from this object.
* @param l the listener.
**/
- public void removePlotMouseListener (final PlotMouseListener listener) {
- listener_list.removeElement (listener);
+ public void removePlotMouseListener(final PlotMouseListener listener)
+ {
+ listener_list.removeElement(listener);
}
/**
@@ -326,57 +427,58 @@ public abstract class Plot extends JPanel {
* double buffering when drawing the canvas.
* @param g The Graphics object of the canvas.
**/
- private void paintCanvas (final Graphics g) {
- if (!isVisible ()) {
+ private void paintCanvas(final Graphics g)
+ {
+ if(!isVisible())
return;
- }
- final int canvas_width = canvas.getSize ().width;
- final int canvas_height = canvas.getSize ().height;
+ final int canvas_width = canvas.getSize().width;
+ final int canvas_height = canvas.getSize().height;
- if (canvas_height <= 0 || canvas_width <= 0) {
+ if(canvas_height <= 0 || canvas_width <= 0)
+ {
// there is no point painting a zero width canvas
return;
}
- if (offscreen == null) {
- offscreen = createImage (canvas_width,
- canvas_height);
- }
+ if(offscreen == null)
+ offscreen = createImage(canvas_width,
+ canvas_height);
Graphics og = offscreen.getGraphics ();
- og.setClip (0, 0, canvas_width, canvas_height);
+ og.setClip(0, 0, canvas_width, canvas_height);
- og.setColor (new Color (240, 240, 240));
+ og.setColor(new Color (240, 240, 240));
- og.fillRect (0, 0, canvas.getSize ().width, canvas.getSize ().height);
+ og.fillRect(0, 0, canvas.getSize().width, canvas.getSize().height);
// Redraw the graph on the canvas using the algorithm from the
// constructor.
- drawMultiValueGraph (og);
+ drawMultiValueGraph(og);
- drawLabels (og);
+ drawLabels(og);
- g.drawImage (offscreen, 0, 0, null);
- og.dispose ();
+ g.drawImage(offscreen, 0, 0, null);
+ og.dispose();
}
/**
* Return the canvas x position of the last click or -1 if the user hasn't
* clicked anywhere yet.
**/
- protected int getCrossHairPosition () {
- if (cross_hair_position >= getCanvas ().getSize ().width) {
+ protected int getCrossHairPosition()
+ {
+ if(cross_hair_position >= getCanvas().getSize().width)
return -1;
- } else {
+ else
return cross_hair_position;
- }
}
/**
* Force this component to stop drawing crosshairs.
**/
- protected void cancelCrossHairs () {
+ protected void cancelCrossHairs()
+ {
cross_hair_position = -1;
drag_start_position = -1;
}
@@ -389,9 +491,9 @@ public abstract class Plot extends JPanel {
* @param start The base on the left
* @param end The base on the right
**/
- protected void drawScaleLine (final Graphics g,
- final int start, final int end) {
-
+ protected void drawScaleLine(final Graphics g,
+ final int start, final int end)
+ {
final int canvas_width = canvas.getSize ().width;
final int canvas_height = canvas.getSize ().height;
@@ -408,17 +510,17 @@ public abstract class Plot extends JPanel {
final int index_of_first_label;
- if (possible_index_of_first_label == 0) {
+ if (possible_index_of_first_label == 0)
index_of_first_label = 1;
- } else {
+ else
index_of_first_label = possible_index_of_first_label;
- }
final int index_of_last_label = end / base_label_spacing;
for (int i = index_of_first_label ;
i <= index_of_last_label ;
- ++i) {
+ ++i)
+ {
final String label_string =
String.valueOf ((int)(i * base_label_spacing));
@@ -453,7 +555,8 @@ public abstract class Plot extends JPanel {
final int step_size, final int window_size,
final int total_unit_count,
final int start_position,
- final float [] plot_values) {
+ final float [] plot_values)
+ {
final float residues_per_pixel =
(float) total_unit_count / canvas.getSize ().width;
@@ -471,7 +574,8 @@ public abstract class Plot extends JPanel {
final int number_of_values = plot_values.length;
- for (int i = 0 ; i < number_of_values - 1 ; ++i) {
+ for(int i = 0; i<number_of_values - 1; ++i)
+ {
final int start_residue =
window_size / 2 + i * step_size + start_position;
final int end_residue =
@@ -513,7 +617,8 @@ public abstract class Plot extends JPanel {
**/
protected void drawGlobalAverage (final Graphics g,
final float min_value,
- final float max_value) {
+ final float max_value)
+ {
final Float average = getAlgorithm ().getAverage ();
if (average != null) {
@@ -554,7 +659,8 @@ public abstract class Plot extends JPanel {
* window size in the bottom left.
* @param g The object to draw into.
**/
- private void drawLabels (final Graphics g) {
+ private void drawLabels (final Graphics g)
+ {
g.setColor (Color.black);
g.drawString (getAlgorithm ().getAlgorithmName () +
" Window size: " +
@@ -568,8 +674,9 @@ public abstract class Plot extends JPanel {
* then draws them onto the canvas. The min_value is drawn at the bottom
* right, max_value at the top right.
**/
- protected void drawMinMax (final Graphics g,
- final float min_value, final float max_value) {
+ protected void drawMinMax(final Graphics g,
+ final float min_value, final float max_value)
+ {
g.setColor (Color.black);
final int canvas_width = canvas.getSize ().width;
@@ -604,9 +711,11 @@ public abstract class Plot extends JPanel {
* @param label_pos The position on the line at which the label should be
* drawn (0 is nearest the top).
**/
- protected void drawCrossHair (final Graphics g, final int x_position,
- final String label, final int label_pos) {
- if (x_position >= 0) {
+ protected void drawCrossHair(final Graphics g, final int x_position,
+ final String label, final int label_pos)
+ {
+ if (x_position >= 0)
+ {
g.drawLine (x_position, getLabelHeight (),
x_position, canvas.getSize ().height);
@@ -618,14 +727,16 @@ public abstract class Plot extends JPanel {
/**
* Return the JComponent of this Plot.
**/
- protected JComponent getCanvas () {
+ protected JComponent getCanvas()
+ {
return canvas;
}
/**
* Call repaint () on the canvas object.
**/
- protected void repaintCanvas () {
+ protected void repaintCanvas()
+ {
canvas.repaint ();
}
@@ -644,80 +755,29 @@ public abstract class Plot extends JPanel {
/**
* Return the amount of vertical space (in pixels) to use for the scale.
**/
- private int getScaleHeight () {
- if (draw_scale) {
- return getFontHeight () + 2;
- } else {
+ private int getScaleHeight()
+ {
+ if (draw_scale)
+ return getFontHeight() + 2;
+ else
return 0;
- }
}
/**
* Return the height in algorithm name and label line (returns the font
* height plus a small amount).
**/
- private int getLabelHeight () {
- return getFontHeight () + 2;
+ private int getLabelHeight()
+ {
+ return getFontHeight() + 2;
}
/**
* Return the height in pixels of the current font.
**/
- private int getFontHeight () {
+ private int getFontHeight()
+ {
return font_height;
}
- /**
- * The drawing area for this component.
- **/
- private JComponent canvas = null;
-
- /**
- * A scroll bar for changing the window size.
- **/
- private JScrollBar window_changer = null;
-
- /**
- * The height of the font used in this component.
- **/
- private int font_height;
-
- /**
- * Off screen image used for double buffering when drawing the canvas.
- **/
- private Image offscreen;
-
- /**
- * The object that will generate the value we plot in this component.
- **/
- private Algorithm algorithm;
-
- /**
- * If true then a scale line will be drawn at the bottom of the graph when
- * drawScaleLine () is called.
- **/
- private boolean draw_scale;
-
- /**
- * Set to true if drawMultiValueGraph () should call recalculateValues ().
- * It is reset to false by recalculateValues ().
- **/
- protected boolean recalculate_flag = true;
-
- /**
- * The x position of the last click or -1 if the user hasn't clicked
- * anywhere yet or the user clicked outside the graph.
- **/
- private int cross_hair_position = -1;
-
- /**
- * The x position of the start of the last mouse drag or -1 if the user
- * hasn't clicked anywhere yet or the user clicked outside the graph.
- **/
- private int drag_start_position = -1;
-
- /**
- * A vector of those objects listening for PlotMouse events.
- **/
- final private java.util.Vector listener_list = new java.util.Vector ();
}
--
GitLab