ChartDirector 5.1 (ColdFusion Edition)

Zooming and Scrolling Framework


Introduction

The ChartDirector Zooming and Scrolling Framework is a framework for "logical zooming" of charts. "Logical zooming" means the chart is plotted with more details as it is zoomed in, but the chart objects do not necessary become bigger. For example, the font size, line width, symbol size, etc, may remain the same. The chart may even change type or data when it is zoomed in. For example, for a finance chart, it may start as a daily candlestick chart when the time range is long, and becomes a realtime intraday line chart when zoomed to one day.

The main elements of the ChartDirector Zooming and Scrolling Framework include a click and drag user interface to control zooming and scrolling, a set of methods to manage axis scales, and AJAX support to allow updating charts without refreshing the web page.

WebChartViewer and JsChartViewer

The ChartDirector Zooming and Scrolling Framework for web applications is implemented in two controls - the WebChartViewer on the server side, and the JsChartViewer on the browser side.

In brief, for a typical web page with a zoomable and scrollable chart, the operation is as follows:

The last three steps may repeat as the user continues to zoom or scroll the chart.

The above is only a brief description and omit many details. For example, custom parameters may be included in the AJAX request/response. Besides click and drag, the framework also allows using external controls or custom methods for zooming and scrolling. In addition to updating the chart in an AJAX response, the framework also allows other custom things to be updated. These features will be discussed in the following sections.

The View Port

In the ChartDirector Zooming and Scrolling framework, the view port is used to determine which part of the data range should be plotted.

The view port can be imagined as a rectangular window over the entire XY data range. For example, suppose the full data range is 10 years in the horizontal direction. A view port width of 0.1 means only 10% of the horizontal data range should be plotted. In other words, the chart is zoomed in so that only 1 year of data is visible. The view port left side will determine exactly which year of data that is visible.

The view port position and size can be get and set on both the server side and the client side using the following methods. The full data range is always assumed to be 0 to 1. So the view port position and size should be between 0 to 1.

Server Side Methods

MethodDescription
WebChartViewer.getViewPortLeftGets the position of the left side of the view port.
WebChartViewer.setViewPortLeftSets the position of the left side of the view port.
WebChartViewer.getViewPortTopGets the position of the top side of the view port.
WebChartViewer.setViewPortTopSets the position of the top side of the view port.
WebChartViewer.getViewPortWidthGets the width of the view port.
WebChartViewer.setViewPortWidthSets the width of the view port.
WebChartViewer.getViewPortHeightGets the height of the view port.
WebChartViewer.setViewPortHeightSets the height of the view port.

Browser Side Methods

MethodDescription
JsChartViewer.getViewPortLeftGets the position of the left side of the view port.
JsChartViewer.setViewPortLeftSets the position of the left side of the view port.
JsChartViewer.getViewPortTopGets the position of the top side of the view port.
JsChartViewer.setViewPortTopSets the position of the top side of the view port.
JsChartViewer.getViewPortWidthGets the width of the view port.
JsChartViewer.setViewPortWidthSets the width of the view port.
JsChartViewer.getViewPortHeightGets the height of the view port.
JsChartViewer.setViewPortHeightSets the height of the view port.

The Zoom and Scroll User Interface

The JsChartViewer control allows using mouse actions on the chart to control zooming and scrolling. Several mouse usage modes are supported, including drag to scroll, drag to select a region to zoom into, click to zoom in, and click to zoom out. They can be selected using JsChartViewer.setMouseUsage. The zooming and scrolling direction can be horizontal only, vertical only, or both, configurable using JsChartViewer.setZoomDirection and JsChartViewer.setScrollDirection.

When the user performs zooming or scrolling, JsChartViewer will update the view port to reflect the new visible region and fires the JsChartViewer.ViewPortChanged event . In typical usage, JsChartViewer.attachHandler can be used to attach JsChartViewer.partialUpdate as the ViewPortChanged event handler. This will cause an AJAX request to be sent to the server to update the chart when the view port changes.

AJAX Chart Update and Full Page Update

Virtually all browsers support AJAX nowadays, so it is suggested AJAX be used to update the chart, as this does not require refreshing the whole web page. All zooming and scrolling examples included in ChartDirector use AJAX chart updates.

ChartDirector also supports non-AJAX chart update that requires refreshing the entire web page. This is for compatibility with previous versions of ChartDirector. Historically, non-AJAX chart update is called "full page update" in ChartDirector documentation, while AJAX based chart update is called "partial chart update". That is why the method that triggers AJAX chart update is called JsChartViewer.partialUpdate.

Zoom and Scroll with External Controls

In addition to using mouse actions on the plot area, it is often desirable to have other ways to control zooming and scrolling. For example, in finance charts, there are often links that allow the user to jump to certain predefined period (eg. the last 30, 90, 180 or 360 days), which are essentially a type of zooming and scrolling.

To perform zooming and scrolling using external controls, the controls can update the view port position and size, and then fire the JsChartViewer.ViewPortChanged event by using JsChartViewer.raiseViewPortChangedEvent.

In some cases, the updates may need to be bi-directional - that is, the external controls may need to be updated when the view port changes. For example, suppose a scroll bar control is used to scroll the chart (although there is no scroll bar controls in standard HTML, there are third party Javascript implementations). When the user drags on the scroll bar, it can update the view port. The user may also drag on the chart directly to scroll the chart. In this case, the scroll bar would need to be updated to reflect that the changed view port.

To handle updating external controls when the view port changes, one may use the JsChartViewer.PostUpdate event. This event occurs after the server has responded to the AJAX request from the browser, at which stage the view port should have been confirmed and validated by the server. External controls can be updated in the PostUpdate event handler to reflect the view port positions.

Custom Parameters in AJAX Requests and Responses

Apart from the view port state, in some cases, other custom parameters may be required to determine how to update the chart. For example, in a finance chart application, the server may need to know the "ticker symbol" to determine which data series to draw, and the "ticker symbol" can be controlled by the user through an HTML text box on the browser. In this case, during AJAX chart update, the contents of the HTML text box would also need to be sent to the server.

Similarly, in some cases, apart from updating the chart, the server may want to update other things in the web page. In this case, custom parameters would need to be sent from the server to the browser.

In ChartDirector, WebChartViewer.setCustomAttr, WebChartViewer.getCustomAttr, JsChartViewer.setCustomAttr and JsChartViewer.getCustomAttr can be used to transfer custom parameters between the server and the browser during an AJAX chart update.

In typical usage, to transfer parameters from the browser to the server, one may use JsChartViewer.setCustomAttr in a JsChartViewer.PreUpdate event. The PreUpdate event occurs just before an AJAX chart update, so any parameters set will be transferred immediately to the server. On the server side, WebChartViewer.getCustomAttr can be used to retrieve the parameters. If the server needs to transfer custom parameters to the browser side, it can use WebChartViewer.setCustomAttr. The browser can retrieve the parameters using JsChartViewer.getCustomAttr in a JsChartViewer.PostUpdate event, which occurs immediately after the browser receives an AJAX response from the server.

Managing Axis Scale

The view port always assumes the full data range to be 0 to 1. In practice, a chart can have multiple x-axes and y-axes, using a combination of date/time, linear and logarithmic scales.

To facilitate conversion between the view port and the axis scale, ChartDirector includes a number of methods as follows:

MethodDescription
WebChartViewer.setFullRangeDefines the full range of a view port data scale.
WebChartViewer.getValueAtViewPort
JsChartViewer.getValueAtViewPort
Converts a view port coordinate to a value of the specified data scale.
WebChartViewer.getViewPortAtValue
JsChartViewer.getViewPortAtValue
Converts a value of the specified data scale to a view port coordinate.
WebChartViewer.syncLinearAxisWithViewPortSynchronizes a linear Axis with the part of the data scale in view port.
WebChartViewer.syncLogAxisWithViewPortSynchronizes a logarithmic Axis with the part of the data scale in view port.
WebChartViewer.syncDateAxisWithViewPortSynchronizes a date/time Axis with the part of the data scale in view port.

In typical usage, WebChartViewer.setFullRange is used to define the full data ranges for the axes in the chart. WebChartViewer.getValueAtViewPort and WebChartViewer.getViewPortAtValue can then be used to map between data values and view port positions. WebChartViewer.syncLinearAxisWithViewPort, WebChartViewer.syncLogAxisWithViewPort and WebChartViewer.syncDateAxisWithViewPort can be used to synchronize the axis scale with the view port position.

If WebChartViewer.syncLinearAxisWithViewPort, WebChartViewer.syncLogAxisWithViewPort or WebChartViewer.syncDateAxisWithViewPort is called without first defining the full data range, ChartDirector will automatically configure the axis scale based on the data in the chart, and assume it to be the full data range. This is useful if the full data range is not known but must be inferred from the data.

Server Side Code Structure

The server side code needs to handle both the initial page request and subsequent AJAX chart updates. The first thing it needs to do is to distinguish which type of requests it is handling, so that it can execute the appropriate code. WebChartViewer.isPartialUpdateRequest can be used to detect if the current HTTP request is an AJAX chart update request.

Initial Page Request

In the initial page request, the chart image created can be stored in a session variable using BaseChart.makeSession, or in a temporary file using BaseChart.makeTmpFile.

The URL to retrieve the chart should be set to the WebChartViewer using WebChartViewer.setImageUrl. In addition, the chart metrics (which contains the plot area position and size) should be obtained using BaseChart.getChartMetrics and set to the WebChartViewer using WebChartViewer.setChartMetrics. If an image map is available for the chart, it should be set to the WebChartViewer using WebChartViewer.setImageMap.

After setting up the WebChartViewer, WebChartViewer.renderHTML should be used to generate the HTML tags that represent the chart. These tags may then be inserted into the HTML web page to be sent to the browser.

AJAX Chart Updates

In an AJAX chart update, only the chart needs to be updated. Instead of using WebChartViewer.renderHTML to generate the HTML tags for the chart, the server should use WebChartViewer.partialUpdateChart to return an AJAX response to the browser.

Note that HTTP GET or POST parameters in the initial page request would no longer exist in subsequent AJAX chart updates. If these parameters are necessary in AJAX chart updates, they should be stored as custom attributes using WebChartViewer.setCustomAttr during initial page request. As custom attributes are persistent (they are transferred from the server to the browser and then transferred back to the server in AJAX chart updates), they can be retrieved using WebChartViewer.getCustomAttr and used in charting code.

Browser Side Code Structure

On the browser side, the typical code structure is:

Library Files Required for Zoomable/Scrollable Charts

A zoomable/scrollable chart requires the following files. Please ensure you copy the necessary files to the proper directories (typically the same directory as the script) and reference them using the proper paths.

FileDescription
getchart.cfmThe standard utility script used in the <IMG> tag URL for retrieving the chart image from a session variable (see BaseChart.makeSession).
cdjcv.js
zoomin.cur
zoomout.cur
nozoom.cur
wait.gif
spacer.gif
The script file for JsChartViewer and the supporting cursor and image files. They must be in the same directory.

Zooming and Scrolling Examples

Sample CodeDescription
Simple Zooming and ScrollingA simple zoomable and scrollable chart with tooltips, using mouse click and drag to control zooming and scrolling.
Zooming and Scrolling with Track LineBesides using mouse click and drag for zooming and scrolling, this example has buttons for jumping immediately to display data for the last 30 days, last 90 days, last year or all time. There are check boxes to select the data series to plot, and an update button to immediately update the chart. In addition, the chart includes a track cursor that updates the legend dynamically to display the data values as the mouse cursor moves over the chart.
XY Zooming and ScrollingThis example demonstrates zooming and scrolling in both horizontal and vertical directions. In addition to using mouse click and drag, this example has a "navigation pad" which can be thought as a representation of the view port. You can drag the pad to move the view port around (that is, to perform 2D scrolling).