OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 /** | 5 /** |
6 * A TimelineGraphView displays a timeline graph on a canvas element. | 6 * A TimelineGraphView displays a timeline graph on a canvas element. |
7 */ | 7 */ |
8 var TimelineGraphView = (function() { | 8 var TimelineGraphView = (function() { |
9 'use strict'; | 9 'use strict'; |
10 // We inherit from TopMidBottomView. | 10 // We inherit from TopMidBottomView. |
(...skipping 338 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
349 // Figure out what time values to display. | 349 // Figure out what time values to display. |
350 var position = this.scrollbar_.getPosition(); | 350 var position = this.scrollbar_.getPosition(); |
351 // If the entire time range is being displayed, align the right edge of | 351 // If the entire time range is being displayed, align the right edge of |
352 // the graph to the end of the time range. | 352 // the graph to the end of the time range. |
353 if (this.scrollbar_.getRange() == 0) | 353 if (this.scrollbar_.getRange() == 0) |
354 position = this.getLength_() - this.canvas_.width; | 354 position = this.getLength_() - this.canvas_.width; |
355 var visibleStartTime = this.startTime_ + position * this.scale_; | 355 var visibleStartTime = this.startTime_ + position * this.scale_; |
356 | 356 |
357 // Make space at the bottom of the graph for the time labels, and then | 357 // Make space at the bottom of the graph for the time labels, and then |
358 // draw the labels. | 358 // draw the labels. |
| 359 var textHeight = height; |
359 height -= fontHeight + LABEL_VERTICAL_SPACING; | 360 height -= fontHeight + LABEL_VERTICAL_SPACING; |
360 this.drawTimeLabels(context, width, height, visibleStartTime); | 361 this.drawTimeLabels(context, width, height, textHeight, visibleStartTime); |
361 | 362 |
362 // Draw outline of the main graph area. | 363 // Draw outline of the main graph area. |
363 context.strokeStyle = GRID_COLOR; | 364 context.strokeStyle = GRID_COLOR; |
364 context.strokeRect(0, 0, width - 1, height - 1); | 365 context.strokeRect(0, 0, width - 1, height - 1); |
365 | 366 |
366 // Layout graphs and have them draw their tick marks. | 367 // Layout graphs and have them draw their tick marks. |
367 for (var i = 0; i < this.graphs_.length; ++i) { | 368 for (var i = 0; i < this.graphs_.length; ++i) { |
368 this.graphs_[i].layout(width, height, fontHeight, visibleStartTime, | 369 this.graphs_[i].layout(width, height, fontHeight, visibleStartTime, |
369 this.scale_); | 370 this.scale_); |
370 this.graphs_[i].drawTicks(context); | 371 this.graphs_[i].drawTicks(context); |
371 } | 372 } |
372 | 373 |
373 // Draw the lines of all graphs, and then draw their labels. | 374 // Draw the lines of all graphs, and then draw their labels. |
374 for (var i = 0; i < this.graphs_.length; ++i) | 375 for (var i = 0; i < this.graphs_.length; ++i) |
375 this.graphs_[i].drawLines(context); | 376 this.graphs_[i].drawLines(context); |
376 for (var i = 0; i < this.graphs_.length; ++i) | 377 for (var i = 0; i < this.graphs_.length; ++i) |
377 this.graphs_[i].drawLabels(context); | 378 this.graphs_[i].drawLabels(context); |
378 | 379 |
379 // Restore original transformation matrix. | 380 // Restore original transformation matrix. |
380 context.restore(); | 381 context.restore(); |
381 }, | 382 }, |
382 | 383 |
383 /** | 384 /** |
384 * Draw time labels below the graph. Takes in start time as an argument | 385 * Draw time labels below the graph. Takes in start time as an argument |
385 * since it may not be |startTime_|, when we're displaying the entire | 386 * since it may not be |startTime_|, when we're displaying the entire |
386 * time range. | 387 * time range. |
387 */ | 388 */ |
388 drawTimeLabels: function(context, width, height, startTime) { | 389 drawTimeLabels: function(context, width, height, textHeight, startTime) { |
389 var textHeight = height + LABEL_VERTICAL_SPACING; | |
390 | |
391 // Text for a time string to use in determining how far apart | 390 // Text for a time string to use in determining how far apart |
392 // to place text labels. | 391 // to place text labels. |
393 var sampleText = (new Date(startTime)).toLocaleTimeString(); | 392 var sampleText = (new Date(startTime)).toLocaleTimeString(); |
394 | 393 |
395 // The desired spacing for text labels. | 394 // The desired spacing for text labels. |
396 var targetSpacing = context.measureText(sampleText).width + | 395 var targetSpacing = context.measureText(sampleText).width + |
397 LABEL_LABEL_HORIZONTAL_SPACING; | 396 LABEL_LABEL_HORIZONTAL_SPACING; |
398 | 397 |
399 // The allowed time step values between adjacent labels. Anything much | 398 // The allowed time step values between adjacent labels. Anything much |
400 // over a couple minutes isn't terribly realistic, given how much memory | 399 // over a couple minutes isn't terribly realistic, given how much memory |
(...skipping 20 matching lines...) Expand all Loading... |
421 } | 420 } |
422 | 421 |
423 // If no such value, give up. | 422 // If no such value, give up. |
424 if (!timeStep) | 423 if (!timeStep) |
425 return; | 424 return; |
426 | 425 |
427 // Find the time for the first label. This time is a perfect multiple of | 426 // Find the time for the first label. This time is a perfect multiple of |
428 // timeStep because of how UTC times work. | 427 // timeStep because of how UTC times work. |
429 var time = Math.ceil(startTime / timeStep) * timeStep; | 428 var time = Math.ceil(startTime / timeStep) * timeStep; |
430 | 429 |
431 context.textBaseline = 'top'; | 430 context.textBaseline = 'bottom'; |
432 context.textAlign = 'center'; | 431 context.textAlign = 'center'; |
433 context.fillStyle = TEXT_COLOR; | 432 context.fillStyle = TEXT_COLOR; |
434 context.strokeStyle = GRID_COLOR; | 433 context.strokeStyle = GRID_COLOR; |
435 | 434 |
436 // Draw labels and vertical grid lines. | 435 // Draw labels and vertical grid lines. |
437 while (true) { | 436 while (true) { |
438 var x = Math.round((time - startTime) / this.scale_); | 437 var x = Math.round((time - startTime) / this.scale_); |
439 if (x >= width) | 438 if (x >= width) |
440 break; | 439 break; |
441 var text = (new Date(time)).toLocaleTimeString(); | 440 var text = (new Date(time)).toLocaleTimeString(); |
(...skipping 284 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
726 for (var i = 1; i < this.labels_.length; ++i) | 725 for (var i = 1; i < this.labels_.length; ++i) |
727 context.fillText(this.labels_[i], x, step * i); | 726 context.fillText(this.labels_[i], x, step * i); |
728 } | 727 } |
729 }; | 728 }; |
730 | 729 |
731 return Graph; | 730 return Graph; |
732 })(); | 731 })(); |
733 | 732 |
734 return TimelineGraphView; | 733 return TimelineGraphView; |
735 })(); | 734 })(); |
OLD | NEW |