Chris Leonello avatar Chris Leonello committed 760da16

Fixed click and double click zoom handlers to check if appropriate option is set on current plot.
Updated change log for zooming.
Updated and added tests.

Comments (0)

Files changed (6)

 Title: Change Log
 
+0.8.5:
+
+* Added zooming ability with double click or single click options to reset zoom.
+* Modified default tick spacing algorithm for date axes to give more space to ticks.
+* Fixed bug #2 where tickInterval wasn't working properly.
+* Added neighborThreshold option to control how close mouse must be to 
+  point to trigger neighbor detection.
+* Added double click event handler on plot.
+
 0.8.0:
 
 * Support for up to 9 y axes.
 * Added option to control padding at max/min bounds of axes separately.
 * Closed issue #21, added options to control grid line color and width.
-* Closed issue #20, added options to filled line charts to stoke above fill and customize fill color and transparency.
-* Improved structure of on line documentation to make usage and options docs default.
+* Closed issue #20, added options to filled line charts to stoke above 
+  fill and customize fill color and transparency.
+* Improved structure of on line documentation to make usage and options 
+  docs default.
 * Added much documentation on options and css styling.
 
 0.7.1:
 
 * Bug fix release
 * Fixed bug #6, missing semi-colons messing up some javascript compressors.
-* Fixed bug #13 where 2D ticks array of [values, labels] would fail to renderer with DateAxisRenderer.
-* Fixes bug #16 where pie renderer overwriting options for all plot types and crashing non pie plots.
-* Fixes bug #17 constrainTo dragable option mispelled as "contstrainTo".  Fixed dragable color issue when used with trend lines.
+* Fixed bug #13 where 2D ticks array of [values, labels] would fail to 
+  renderer with DateAxisRenderer.
+* Fixes bug #16 where pie renderer overwriting options for all plot types 
+  and crashing non pie plots.
+* Fixes bug #17 constrainTo dragable option mispelled as "contstrainTo".  
+  Fixed dragable color issue when used with trend lines.
 
 0.7.0:
 
 * Pie chart support
 * Enabled tooltipLocation option in highlighter. 
-* Highlighter Tooltip will account for mark size and highlight size when positioning itself. 
+* Highlighter Tooltip will account for mark size and highlight size when 
+  positioning itself. 
 * Added ability to show just x, y or both axes in highlighter tooltip.
 * Added customization of separator between axes values in highlighter tooltip.
-* Modified how shadows are drawn for lines, bars and markers.  Now drawn first, so they are always behind the object.
+* Modified how shadows are drawn for lines, bars and markers.  Now drawn first, 
+  so they are always behind the object.
 * Adjustments to shadow parameters on lines to account for new shadow positioning.
-* Added a ColorGenerator class to robustly return next available color for a plot with wrap around to first color at end.
+* Added a ColorGenerator class to robustly return next available color 
+  for a plot with wrap around to first color at end.
 * Udates to docs about css file.
 * Fixed bug with String x values in series and IE error on sorting (Category Axis).
 * Added cursor changes in dragable plugin when cursor near dragable point.
 0.6.6b:
 
 * Added excanvas.js and excanvas.min.js to compressed distributions.
-* Added example/test html pages I had locally into repository and to compressed distributions.
+* Added example/test html pages I had locally into repository and to 
+  compressed distributions.
 
 0.6.6a:
 
 * Removed absolute positioning from dom element and put back into css file.
-* Duplicate of 0.6.6 with a suffix to unambiguously differentiate between previously posted 0.6.6 release.
+* Duplicate of 0.6.6 with a suffix to unambiguously differentiate between 
+  previously posted 0.6.6 release.
 
 0.6.6:
 
 * Fixed bug #5, trend line plugin failing when no trend line options specified.
 * Added absolute position css spec to axis tick dom element.
-* Enhancement to category axes, more intuitive handling of series with missing data values.
+* Enhancement to category axes, more intuitive handling of series with 
+  missing data values.
 
 0.6.5:
 
-* Fixed bug #4, series of unequal data length not rendering correctly.  This is a bugfix release only.
+* Fixed bug #4, series of unequal data length not rendering correctly.  
+  This is a bugfix release only.
 
 0.6.4:
 
-* Fixed bug (issue #1 in tracker) where flat line data series (all x and/or y values are euqal) or single value data series would crash.
+* Fixed bug (issue #1 in tracker) where flat line data series (all x and/or y 
+  values are euqal) or single value data series would crash.
 
 0.6.3:
 
-* Support for stacked line (a.k.a. area) and stacked bar (horizontal and vertical) charts.
+* Support for stacked line (a.k.a. area) and stacked bar (horizontal and 
+  vertical) charts.
 * Refactored barRenderer to use default shape and shadow renderers.
 * Added info (contacts & support information) page to web site.
 
 
 0.6.0:
 
-* Added rotated text support.  Uses native canvas text functionality in browsers that support it or draws text on canvas with Hershey font
+* Added rotated text support.  Uses native canvas text functionality in 
+  browsers that support it or draws text on canvas with Hershey font
 * metrics for non-supporting browsers.
 * Removed lots of lint in js code.
 * Moved tick css from js code into css file.

src/plugins/jqplot.cursor.js

 * This software is licensed under the GPL version 2.0 and MIT licenses.
 */
 (function($) {
-	$.jqplot.eventListenerHooks.push(['jqplotMouseEnter', handleMouseEnter]);
-	$.jqplot.eventListenerHooks.push(['jqplotMouseLeave', handleMouseLeave]);
-    $.jqplot.eventListenerHooks.push(['jqplotMouseMove', handleMouseMove]);
-    $.jqplot.eventListenerHooks.push(['jqplotMouseDown', handleMouseDown]);
-    $.jqplot.eventListenerHooks.push(['jqplotMouseUp', handleMouseUp]);
 	
 	/**
 	 * Class: $.jqplot.Cursor
 	    // prop: zoom
 	    // Enable plot zooming.
 	    this.zoom = false;
-	    this._zoom = {start:[], end:[], zooming:false, axes:{start:{}, end:{}}};
+	    // prop: clickReset
+	    // Will reset plot zoom if single click on plot without drag.
+	    this.clickReset = false;
+	    // prop: dblClickReset
+	    // Will reset plot zoom if double click on plot without drag.
+	    this.dblClickReset = true;
+	    this._zoom = {start:[], end:[], started: false, zooming:false, axes:{start:{}, end:{}}};
 	    this._tooltipElem;
 	    this.zoomCanvas;
 	    $.extend(true, this, options);
 	    // add a cursor attribute to the plot
 	    var options = opts || {};
 	    this.plugins.cursor = new $.jqplot.Cursor(options.cursor);
+
+        if (this.plugins.cursor.show) {
+        	$.jqplot.eventListenerHooks.push(['jqplotMouseEnter', handleMouseEnter]);
+        	$.jqplot.eventListenerHooks.push(['jqplotMouseLeave', handleMouseLeave]);
+            $.jqplot.eventListenerHooks.push(['jqplotMouseMove', handleMouseMove]);
+            
+            if (this.plugins.cursor.zoom) {
+                $.jqplot.eventListenerHooks.push(['jqplotMouseDown', handleMouseDown]);
+                $.jqplot.eventListenerHooks.push(['jqplotMouseUp', handleMouseUp]);
+                
+                if (this.plugins.cursor.clickReset) {
+                    $.jqplot.eventListenerHooks.push(['jqplotClick', handleClick]);
+                }
+                
+                if (this.plugins.cursor.dblClickReset) {
+                    $.jqplot.eventListenerHooks.push(['jqplotDblClick', handleDblClick]);
+                }
+            }
+        }
 	};
 	
 	// called with context of plot
 	    var axes = plot.axes;
 	    var cax = plot.plugins.cursor._zoom.axes;
 	    for (var ax in axes) {
-	        axes[ax]._ticks = cax[ax]._ticks;
+            axes[ax]._ticks = [];
 	        axes[ax].min = cax[ax].min;
 	        axes[ax].max = cax[ax].max;
 	        axes[ax].numberTicks = cax[ax].numberTicks; 
 	        axes[ax].tickInterval = cax[ax].tickInterval;
+	        // for date axes
+	        axes[ax]._tickInterval = cax[ax]._tickInterval;
 	    }
 	    plot.redraw();
 	};
         }
 	}
 	
+	function handleClick (ev, gridpos, datapos, neighbor, plot) {
+	    var c = plot.plugins.cursor;
+        if (c.clickReset) {
+            $.jqplot.Cursor.resetZoom(plot);
+        }
+        return true;
+	}
+	
+	function handleDblClick (ev, gridpos, datapos, neighbor, plot) {
+	    var c = plot.plugins.cursor;
+        if (c.dblClickReset) {
+            $.jqplot.Cursor.resetZoom(plot);
+        }
+        return;
+	}
+	
+	function handleMouseLeave(ev, gridpos, datapos, neighbor, plot) {
+	    var c = plot.plugins.cursor;
+	    if (c.show) {
+	        $(ev.target).css('cursor', c.previousCursor);
+            if (c.showTooltip) {
+                c._tooltipElem.hide();
+            }
+            if (c.zoom) {
+                c._zoom.started = false;
+                c._zoom.zooming = false;
+	            var ctx = c.zoomCanvas._ctx;
+                ctx.clearRect(0,0,ctx.canvas.width, ctx.canvas.height);
+                
+            }
+	    }
+	}
+	
 	function handleMouseEnter(ev, gridpos, datapos, neighbor, plot) {
 	    var c = plot.plugins.cursor;
 	    if (c.show) {
 	    }
 	}
 	
-	function handleMouseLeave(ev, gridpos, datapos, neighbor, plot) {
-	    var c = plot.plugins.cursor;
-	    if (c.show) {
-	        $(ev.target).css('cursor', c.previousCursor);
-            if (c.showTooltip) {
-                c._tooltipElem.hide();
-            }
-	    }
-	}
-	
 	function handleMouseMove(ev, gridpos, datapos, neighbor, plot) {
     	var c = plot.plugins.cursor;
-    	if (c.show && c.showTooltip) {
-            updateTooltip(gridpos, datapos, plot);
-            if (c.followMouse) {
-                moveTooltip(gridpos, plot);
-            }
-            if (c.zoom && c._zoom.zooming) {
+    	if (c.show) {
+    	    if (c.showTooltip) {
+                updateTooltip(gridpos, datapos, plot);
+                if (c.followMouse) {
+                    moveTooltip(gridpos, plot);
+                }
+    	    }
+            if (c.zoom && c._zoom.started) {
+                c._zoom.zooming = true;
                 c._zoom.end = [gridpos.x, gridpos.y];
                 drawZoomBox.call(c);
             }
 	
 	function handleMouseDown(ev, gridpos, datapos, neighbor, plot) {
 	    var c = plot.plugins.cursor;
+	    var axes = plot.axes;
 	    if (c.zoom) {
 	        c._zoom.start = [gridpos.x, gridpos.y];
-	        c._zoom.zooming = true;
+	        c._zoom.started = true;
             for (var ax in datapos) {
+                // get zoom starting position.
                 c._zoom.axes.start[ax] = datapos[ax];
                 // make a copy of the original axes to revert back.
                 if (c._zoom.axes[ax] == undefined) {
                     c._zoom.axes[ax] = {};
-                    c._zoom.axes[ax]._ticks = $.extend(true, [], plot.axes[ax]._ticks);
-                    c._zoom.axes[ax].numberTicks = plot.axes[ax].numberTicks;
-                    c._zoom.axes[ax].tickInterval = plot.axes[ax].tickInterval;
-                    c._zoom.axes[ax].min = plot.axes[ax].min;
-                    c._zoom.axes[ax].max = plot.axes[ax].max;
+                    c._zoom.axes[ax].numberTicks = axes[ax].numberTicks;
+                    c._zoom.axes[ax].tickInterval = axes[ax].tickInterval;
+                    // for date axes...
+                    c._zoom.axes[ax]._tickInterval = axes[ax]._tickInterval;
+                    c._zoom.axes[ax].min = axes[ax].min;
+                    c._zoom.axes[ax].max = axes[ax].max;
                 }
                 
             }
 	
 	function handleMouseUp(ev, gridpos, datapos, neighbor, plot) {
 	    var c = plot.plugins.cursor;
-	    if (c.zoom) {
+	    if (c.zoom && c._zoom.zooming) {
 	        var axes = plot.axes;
 	        var zaxes = c._zoom.axes;
 	        var start = zaxes.start;
 	        var end = zaxes.end;
 	        var min, max;
-	        c._zoom.zooming = false;
 	        var ctx = c.zoomCanvas._ctx;
             ctx.clearRect(0,0,ctx.canvas.width, ctx.canvas.height);
-            for (var ax in datapos) {
-                dp = datapos[ax];
-                if (dp != null) {
-                    if (dp > start[ax]) {
-                        axes[ax].min = start[ax];
-                        axes[ax].max = dp;
+            // don't zoom is zoom area is too small (in pixels)
+            if (!(Math.abs(gridpos.x - c._zoom.start[0]) < 8 || Math.abs(gridpos.y - c._zoom.start[1]) < 8)) {
+                for (var ax in datapos) {
+                    dp = datapos[ax];
+                    if (dp != null) {           
+                        if (dp > start[ax]) { 
+                            axes[ax].min = start[ax];
+                            axes[ax].max = dp;
+                        }
+                        else {
+                            span = start[ax] - dp;
+                            axes[ax].max = start[ax];
+                            axes[ax].min = dp;
+                        }
+                        axes[ax].tickInterval = null;
+                        // for date axes...
+                        axes[ax]._tickInterval = null;
+                        axes[ax]._ticks = [];
                     }
-                    else {
-                        axes[ax].max = start[ax];
-                        axes[ax].min = dp;
-                    }
-                    axes[ax]._ticks = [];
                 }
+                plot.redraw();
             }
-            plot.redraw();
         }
+        c._zoom.started = false;
+        c._zoom.zooming = false;
 	}
 	
 	function drawZoomBox() {
 <?php
-  $pages = array('coretests.php', 'pieTests.php', 'multipleYAxesTests.php', 'logAxisTests.php', 'dateAxisTests.php', 'categoryAxisTests.php', 'barRendererTests.php', 'dragableTests.php', 'stackedTests.php', 'canvasAxisTests.php', 'highlighterTests.php');
+  $pages = array('coretests.php', 'pieTests.php', 'multipleYAxesTests.php', 'logAxisTests.php', 'dateAxisTests.php', 'highlighterTests.php', 'zoomTests.php', 'categoryAxisTests.php', 'barRendererTests.php', 'dragableTests.php', 'stackedTests.php', 'canvasAxisTests.php');
         
   $len = count($pages);
   $parts = explode("/", $_SERVER["REQUEST_URI"]);

tests/highlighterTests.php

 <?php
   $title = "jqPlot Highlighter and Cursor Plugin Tests";
-  $jspec_title = "jqPlot Data Point Highlighter and Cursor Tracking Plugin Tests and Examples";
+  $jspec_title = "jqPlot Data Point Highlighter and Cursor Tracking Plugin";
   $jqplot_js_includes = array();
   $jqplot_js_includes[] = "../src/plugins/jqplot.dateAxisRenderer.js";
   $jqplot_js_includes[] = "../src/plugins/jqplot.canvasTextRenderer.js";
         <div id="jspec-top">
           <div id="jspec-title">jqPlot Unit Tests and Examples</div>
           <div class="nav top">
-            <a href="highlighterTests.php"><img src="images/arrow_left_48.png" /></a>  
+            <a href="canvasAxisTests.php"><img src="images/arrow_left_48.png" /></a>  
             <a href="./index.html"><img src="images/arrow_up_48.png" /></a>
             <a href="coretests.php"><img src="images/arrow_right_48.png" /></a>
           </div>
               <tr class="description"><td><a href="multipleYAxesTests.php">Multiple Y Axes</a></td></tr>
               <tr class="description"><td><a href="logAxisTests.php">Log Axes</a></td></tr>
               <tr class="description"><td><a href="dateAxisTests.php">Date Axes</a></td></tr>
+              <tr class="description"><td><a href="highlighterTests.php">Data Point Highlighter</a></td></tr>
+              <tr class="description"><td><a href="zoomTests.php">Plot Zooming</a></td></tr>
               <tr class="description"><td><a href="categoryAxisTests.php">Category Axes</a></td></tr>
               <tr class="description"><td><a href="barRendererTests.php">Bar Charts</a></td></tr>
               <tr class="description"><td><a href="dragableTests.php">Drag and Drop and Trend Lines</a></td></tr>
               <tr class="description"><td><a href="stackedTests.php">Stacked Bar and Line Charts</a></td></tr>
               <tr class="description"><td><a href="canvasAxisTests.php">Rotated Axis Text</a></td></tr>
-              <tr class="description"><td><a href="highlighterTests.php">Data Point Highlighter</a></td></tr>
             </table>
           </div>
         </div>

tests/zoomTests.php

   require("opener.php");
 ?>
   <script language="javascript" type="text/javascript">
-var goog = [["6/22/2009",425.32],["6/15/2009",420.09],["6/8/2009",424.84],["6/1/2009",444.32],["5/26/2009",417.23],["5/18/2009",393.5],["5/11/2009",390],["5/4/2009",407.33],["4/27/2009",393.69],["4/20/2009",389.49],["4/13/2009",392.24],["4/6/2009",372.5],["3/30/2009",369.78],["3/23/2009",347.7],["3/16/2009",330.16],
-["3/9/2009",324.42],["3/2/2009",308.57],["2/23/2009",337.99],["2/17/2009",346.45],["2/9/2009",357.68],["2/2/2009",371.28],["1/26/2009",338.53],["1/20/2009",324.7],["1/12/2009",299.67],["1/5/2009",315.07],["12/29/2008",321.32],["12/22/2008",300.36],["12/15/2008",310.17],["12/8/2008",315.76],["12/1/2008",283.99],["11/24/2008",292.96],["11/17/2008",262.43],["11/10/2008",310.02],["11/3/2008",331.14],["10/27/2008",359.36],["10/20/2008",339.29],["10/13/2008",372.54],["10/6/2008",332],["9/29/2008",386.91],["9/22/2008",431.04],["9/15/2008",449.15],["9/8/2008",437.66],["9/2/2008",444.25],["8/25/2008",463.29],
-["8/18/2008",490.59],["8/11/2008",510.15],["8/4/2008",495.01],["7/28/2008",467.86],["7/21/2008",491.98],["7/14/2008",481.32],["7/7/2008",533.8],["6/30/2008",537],["6/23/2008",528.07],["6/16/2008",546.43],["6/9/2008",571.51],["6/2/2008",567],["5/27/2008",585.8],["5/19/2008",544.62],["5/12/2008",580.07],["5/5/2008",573.2],["4/28/2008",581.29],["4/21/2008",544.06],["4/14/2008",539.41],["4/7/2008",457.45],["3/31/2008",471.09],["3/24/2008",438.08],["3/17/2008",433.55],["3/10/2008",437.92],["3/3/2008",433.35],["2/25/2008",471.18],["2/19/2008",507.8],["2/11/2008",529.64],["2/4/2008",516.69],["1/28/2008",515.9],
-["1/22/2008",566.4],["1/14/2008",600.25],["1/7/2008",638.25],["12/31/2007",657],["12/24/2007",702.53],["12/17/2007",696.69],["12/10/2007",689.96],["12/3/2007",714.87],["11/26/2007",693],["11/19/2007",676.7],["11/12/2007",633.63],["11/5/2007",663.97],["10/29/2007",711.25],["10/22/2007",674.6],["10/15/2007",644.71],["10/8/2007",637.39],["10/1/2007",594.05],["9/24/2007",567.27],["9/17/2007",560.1],["9/10/2007",528.75],["9/4/2007",519.35],["8/27/2007",515.25],["8/20/2007",515]];
+var goog = [["6/22/2009",425.32],
+["6/8/2009",424.84],
+["5/26/2009",417.23],
+["5/11/2009",390],
+["4/27/2009",393.69],
+["4/13/2009",392.24],
+["3/30/2009",369.78],
+["3/16/2009",330.16],
+["3/2/2009",308.57],
+["2/17/2009",346.45],
+["2/2/2009",371.28],
+["1/20/2009",324.7],
+["1/5/2009",315.07],
+["12/22/2008",300.36],
+["12/8/2008",315.76],
+["11/24/2008",292.96],
+["11/10/2008",310.02],
+["10/27/2008",359.36],
+["10/13/2008",372.54],
+["9/29/2008",386.91],
+["9/15/2008",449.15],
+["9/2/2008",444.25],
+["8/25/2008",463.29],
+["8/11/2008",510.15],
+["7/28/2008",467.86],
+["7/14/2008",481.32],
+["6/30/2008",537],
+["6/16/2008",546.43],
+["6/2/2008",567],
+["5/19/2008",544.62],
+["5/5/2008",573.2],
+["4/21/2008",544.06],
+["4/7/2008",457.45],
+["3/24/2008",438.08],
+["3/10/2008",437.92],
+["2/25/2008",471.18],
+["2/11/2008",529.64],
+["1/28/2008",515.9],
+["1/14/2008",600.25],
+["12/31/2007",657],
+["12/17/2007",696.69],
+["12/3/2007",714.87],
+["11/19/2007",676.7],
+["11/5/2007",663.97],
+["10/22/2007",674.6],
+["10/8/2007",637.39],
+["9/24/2007",567.27],
+["9/10/2007",528.75],
+["8/27/2007",515.25]];
 var InPr = [[0.0,85.0],[10.0,87.4],[20.0,90.0],[30.0,91.3],[40.0,93.5],[50.0,94.1],[60.0,95.4],[70.0,95.8],[80.0,96.1],[90.0,97.6],[100.0,97.4],[110.0,97.7],[120.0,97.9],[130.0,98.3],[140.0,97.9],[150.0,98.4],[160.0,99.8],[170.0,100.5],[180.0,100.4],[190.0,100.3],[200.0,102.9],[210.0,104.1],[220.0,104.4],[230.0,103.9],[240.0,104.4],[250.0,104.0],[260.0,103.9],[270.0,103.5],[280.0,105.4],[290.0,105.7],[300.0,105.7],[310.0,105.3],[320.0,105.0],[330.0,105.1],[340.0,105.0],[350.0,105.1],[360.0,104.7],[370.0,104.4],[380.0,104.3],[390.0,105.7],[400.0,106.4],[410.0,105.7],[420.0,105.4],[430.0,105.7],[440.0,105.7],[450.0,105.9],[460.0,105.3],[470.0,105.7],[480.0,105.8],[490.0,105.4],[500.0,105.4],[510.0,105.4],[520.0,105.6],[530.0,104.9],[540.0,104.8],[550.0,105.2],[560.0,105.2],[570.0,105.1],[580.0,104.8],[590.0,104.6],[600.0,104.3],[610.0,104.2],[620.0,104.1],[630.0,104.7],[640.0,104.6],[650.0,104.7],[660.0,104.6],[670.0,104.4],[680.0,106.8],[690.0,106.6],
 [700.0,106.3],[710.0,107.1],[720.0,106.2],[730.0,106.1],[740.0,106.7],[750.0,106.5],[760.0,106.8],[770.0,106.7],[780.0,106.6],[790.0,106.7],[800.0,106.8],[810.0,106.4],[820.0,106.7],[830.0,106.5],[840.0,106.9],[850.0,106.7],[860.0,106.7],[870.0,106.8],[880.0,107.1],[890.0,106.6],[900.0,106.8],[910.0,106.9],[920.0,106.8],[930.0,107.3],[940.0,106.9],[950.0,106.5],[960.0,107.2],[970.0,107.0],[980.0,106.9],[990.0,107.2],[1000.0,107.7],[1010.0,107.6],[1020.0,107.1],[1030.0,107.6],[1040.0,107.2],[1050.0,107.2],[1060.0,107.5],[1070.0,107.7],[1080.0,107.3],[1090.0,107.0],[1100.0,107.7],[1110.0,107.0],[1120.0,107.8],[1130.0,107.8],[1140.0,107.7],[1150.0,107.4],[1160.0,107.8],[1170.0,107.8],[1180.0,107.6],[1190.0,107.7],[1200.0,107.4],[1210.0,108.0],[1220.0,372.6],[1230.0,90.4],[1240.0,125.0],[1250.0,110.4],[1260.0,108.5],[1270.0,109.7],[1280.0,108.9],[1290.0,109.6],[1300.0,110.2],[1310.0,110.0],[1320.0,110.7],[1330.0,110.3],[1340.0,110.6],[1350.0,110.5],
 [1360.0,110.8],[1370.0,110.6],[1380.0,111.0],[1390.0,113.0],[1400.0,112.1],[1410.0,112.3],[1420.0,112.3],[1430.0,137.6],[1440.0,179.0],[1450.0,216.9],[1460.0,399.2],[1470.0,433.6],[1480.0,203.5],[1490.0,223.3],[1500.0,229.8],[1510.0,416.9],[1520.0,198.8],[1530.0,208.7],[1540.0,172.0],[1550.0,145.7],[1560.0,119.2],[1570.0,104.8],[1580.0,100.1],[1590.0,97.7],[1600.0,97.2],[1610.0,98.8],[1620.0,98.1],[1630.0,98.1],[1640.0,98.8],[1650.0,98.7],[1660.0,98.5],[1670.0,98.8],[1680.0,98.2],[1690.0,98.2],[1700.0,97.7],[1710.0,98.1],[1720.0,97.1],[1730.0,97.6],[1740.0,97.7],[1750.0,97.4],[1760.0,97.6],[1770.0,98.0],[1780.0,97.6],[1790.0,97.7],[1800.0,97.8],[1810.0,97.6],[1820.0,97.9],
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.