The axis color now controls the color of the axis line, instead of its ticks and labels, while the tickColor controls the tick color. This makes a little more sense and provides the minor feature of being able to change the axis line color separately from that of its ticks. Pull request #917 ought to be easier to merge now, too.
Plugins are re-initialized with each re-plot (which may not be the right thing to do, but that's how it works for now). The previous approach of saving references to the original Canvas functions therefore broke, since the second time around we'd get a reference to our new function. Instead we hold those references as globals within the plugin, and only set them once. This whole idea of replacing prototype functions is, now that I step back and look at it, really awful. This needs to be changed ASAP to something less ridiculous.
This allows us to reuse the canvas elements without having to retain the rest of the Canvas object, which should really be reset when the plot is reconstructed. It's also a little simpler, and the Canvas constructor just feels like the right place for this code.
Previously, if the selected area was very small, the selection rectangle would not be displayed. This commit adds an "alwaysShow" option so that, when true, the selection rectangle will always be displayed. When the selected area is very small, the selection rectangle will become a line.
Previously the cache was divided only by layer, with entries keyed on a string built from the text and style. Now the style has its own tier in the cache, i.e. layers > styles > text > info. This introduces some complexity, since the nested for loops are ugly, but at the same time we avoid having to create the cache-key strings. More importantly it solves the problem of uniqueness that exists when we try to join strings that may contain arbitrary text. It also allows a further optimization in the canvas plugin, which can now set text style and color just once per distinct style, instead of with every string.
This lets users 'namespace' text more naturally, i.e. placing x-axis labels in a different container from y-axis labels, providing more flexibility when it comes to styling and interactivity. Internally the text cache now has a second tier: layers > text > info.
The getTextInfo method previously added new text to the top-level container when measuring it. Now it adds the text to the text layer, just as it will be when rendered, so that parent-child CSS rules can resolve correctly. This also avoids having to safe a reference to the top-level container, since it wasn't used anywhere else.
Every cache element now contains the actual text element instead of just its HTML, plus a flag indicating whether it is visible. The addText and removeText methods control the state of this flag, and the render method uses it to manage elements within the text container. So where we previously used drawText to actually render text, now we add each string once, then let the render method take care of drawing them as necessary. This dramatically improves performance by eliminating the need to clear and re-populate HTML text on every drawing cycle. Since the elements are now static between add/remove calls, this also allows users to add interactivity, as they could in 0.7. Finally, it eliminates the need for a separate 'hot' cache. I also removed the unnecessary 'dimensions' object; it's easier and faster to store the width and height at the top level of the info object.