1 23 package info.monitorenter.gui.chart; 24 25 import info.monitorenter.gui.chart.rangepolicies.RangePolicyFixedViewport; 26 import info.monitorenter.util.Range; 27 28 import java.awt.Color ; 29 import java.awt.Graphics ; 30 import java.awt.Graphics2D ; 31 import java.awt.event.MouseEvent ; 32 import java.awt.event.MouseListener ; 33 import java.awt.event.MouseMotionListener ; 34 import java.awt.geom.Point2D ; 35 import java.awt.geom.Rectangle2D ; 36 37 46 public class ZoomableChart extends Chart2D implements MouseListener , MouseMotionListener { 47 48 49 private boolean m_firstTime = true; 50 51 52 private Point2D m_startPoint; 53 54 55 private Rectangle2D m_zoomArea; 56 57 61 private double m_zoomMax; 62 63 67 private double m_zoomMin; 68 69 73 public ZoomableChart() { 74 75 super(); 76 77 addMouseListener(this); 78 addMouseMotionListener(this); 79 } 80 81 84 public void mouseClicked(final MouseEvent e) { 85 } 87 88 91 public void mouseDragged(final MouseEvent e) { 92 93 if ((e.getY() < 20) || (e.getY() > this.getYChartStart())) { 94 return; 95 } 96 double startX; 97 double endX; 98 double dimX; 99 double startY = this.m_startPoint.getY(); 100 double endY = getYChartStart(); 101 double dimY = endY - startY; 102 103 if (e.getX() > this.m_startPoint.getX()) { 104 startX = this.m_startPoint.getX(); 105 endX = e.getX(); 106 } else { 107 startX = e.getX(); 108 endX = this.m_startPoint.getX(); 109 } 110 111 if (startX < this.getXChartStart()) { 112 startX = this.getXChartStart(); 113 } 114 115 if (endX > (this.getWidth() - 20)) { 116 endX = this.getWidth() - 20; 117 } 118 119 dimX = endX - startX; 120 121 this.m_zoomArea = new Rectangle2D.Double (startX, startY, dimX, dimY); 122 123 repaint(); 124 } 125 126 129 public void mouseEntered(final MouseEvent e) { 130 } 132 133 136 public void mouseExited(final MouseEvent e) { 137 } 139 140 143 public void mouseMoved(final MouseEvent e) { 144 } 146 147 150 public void mousePressed(final MouseEvent e) { 151 this.m_startPoint = new Point2D.Double (e.getX(), 20); 152 } 153 154 157 public void mouseReleased(final MouseEvent e) { 158 159 if (this.m_zoomArea == null) { 160 return; 161 } 162 163 double startPx = this.m_zoomArea.getX(); 164 double endPx = this.m_zoomArea.getX() + this.m_zoomArea.getWidth(); 165 166 Range range = getAxisX().getRangePolicy().getRange(); 167 168 double max = range.getMax(); 169 double min = range.getMin(); 170 171 if (max == Double.MAX_VALUE) { 172 range = getAxisX().getRange(); 173 max = range.getMax(); 174 min = range.getMin(); 175 } 176 177 double xAxisDomain = max - min; 178 double xAxisLength = getWidth() - 20 - this.getXChartStart(); 179 180 double xAxisMin = min + xAxisDomain / xAxisLength * (startPx - this.getXChartStart()); 181 double xAxisMax = min + xAxisDomain / xAxisLength * (endPx - this.getXChartStart()); 182 183 zoom(xAxisMin, xAxisMax); 184 } 185 186 189 public void paintComponent(final Graphics g) { 190 191 super.paintComponent(g); 192 193 Graphics2D g2 = (Graphics2D ) g; 194 195 if (this.m_firstTime) { 196 Range range = getAxisX().getRange(); 197 this.m_zoomMin = range.getMin(); 198 this.m_zoomMax = range.getMax(); 199 this.m_firstTime = false; 200 } 201 202 if (this.m_zoomArea != null) { 203 g2.draw(this.m_zoomArea); 204 g2.setPaint(new Color (255, 255, 0, 100)); 205 g2.fill(this.m_zoomArea); 206 } 207 } 208 209 219 public void zoom(final double min, final double max) { 220 221 this.m_zoomArea = null; 222 223 IAxis axis = getAxisX(); 224 axis.setRangePolicy(new RangePolicyFixedViewport()); 226 axis.setRange(new Range(min, max)); 227 228 } 229 230 234 public void zoomAll() { 235 236 this.getAxisX().setRangePolicy( 237 new RangePolicyFixedViewport(new Range(this.m_zoomMin, this.m_zoomMax))); 238 } 239 } 240 | Popular Tags |