Steve Linabery
2008-Oct-29 20:39 UTC
[Ovirt-devel] [PATCH server] Add tooltips, y-axis labels, and first animation transition to flexchart.
Also improve OO design with new classes and better organization thereof.
---
src/app/controllers/graph_controller.rb | 3 +-
src/flexchart/README.txt | 2 +-
src/flexchart/flexchart.mxml | 69 +++++++--
src/flexchart/org/ovirt/ChartLoader.as | 64 --------
src/flexchart/org/ovirt/Constants.as | 28 ++++
src/flexchart/org/ovirt/DataSeries.as | 42 -----
src/flexchart/org/ovirt/DataSource.as | 14 +-
src/flexchart/org/ovirt/charts/BarChart.as | 158 ++++++++++++++++++++
src/flexchart/org/ovirt/charts/Chart.as | 46 ++++++
src/flexchart/org/ovirt/data/DataPoint.as | 47 ++++++
src/flexchart/org/ovirt/data/DataSeries.as | 54 +++++++
src/flexchart/org/ovirt/elements/SingleBar.as | 67 ++++++++
src/flexchart/org/ovirt/elements/TextLiberation.as | 46 ++++++
src/flexchart/org/ovirt/elements/YAxisLabel.as | 41 +++++
14 files changed, 556 insertions(+), 125 deletions(-)
delete mode 100644 src/flexchart/org/ovirt/ChartLoader.as
create mode 100644 src/flexchart/org/ovirt/Constants.as
delete mode 100644 src/flexchart/org/ovirt/DataSeries.as
create mode 100644 src/flexchart/org/ovirt/charts/BarChart.as
create mode 100644 src/flexchart/org/ovirt/charts/Chart.as
create mode 100644 src/flexchart/org/ovirt/data/DataPoint.as
create mode 100644 src/flexchart/org/ovirt/data/DataSeries.as
create mode 100644 src/flexchart/org/ovirt/elements/SingleBar.as
create mode 100644 src/flexchart/org/ovirt/elements/TextLiberation.as
create mode 100644 src/flexchart/org/ovirt/elements/YAxisLabel.as
diff --git a/src/app/controllers/graph_controller.rb
b/src/app/controllers/graph_controller.rb
index c1d27b5..0105ea6 100644
--- a/src/app/controllers/graph_controller.rb
+++ b/src/app/controllers/graph_controller.rb
@@ -15,7 +15,8 @@ class GraphController < ApplicationController
:values => graph_obj[:dataset][2][:values].last(40) }
my_data = graph_data[:labels].zip(graph_data[:values])
graph = { :vectors => my_data,
- :max_value => graph_obj[:total_peak]
+ :max_value => graph_obj[:total_peak],
+ :description => params[:target]
}
render :json => graph
end
diff --git a/src/flexchart/README.txt b/src/flexchart/README.txt
index 66eb183..3de7430 100644
--- a/src/flexchart/README.txt
+++ b/src/flexchart/README.txt
@@ -5,4 +5,4 @@ Once you have mxmlc on your system, run:
mxmlc flexchart.mxml
-in this directory, and copy the resulting file flexchart.swf to
/usr/share/ovirt-server/public on your appliance.
+in this directory, and copy the resulting file flexchart.swf to
/usr/share/ovirt-server/public/swfs on your appliance.
diff --git a/src/flexchart/flexchart.mxml b/src/flexchart/flexchart.mxml
index 796329d..35fa9a6 100644
--- a/src/flexchart/flexchart.mxml
+++ b/src/flexchart/flexchart.mxml
@@ -1,20 +1,67 @@
<?xml version="1.0"?>
-<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
applicationComplete="populate(flexChart)">
+<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
applicationComplete="myInit(); populate(mainChart);"
styleName="plain" horizontalScrollPolicy="off"
verticalScrollPolicy="off">
<mx:Script>
<![CDATA[
- import mx.containers.Box;
- import org.ovirt.*;
+ import mx.containers.VBox;
+ import mx.effects.Resize;
+ import org.ovirt.Constants;
+ import org.ovirt.charts.Chart;
+ import org.ovirt.charts.BarChart;
- private function populate(chart:Box):void {
- var chartLoader:ChartLoader = new ChartLoader(chart,
parameters['flexchart_data']);
- chartLoader.load();
- }
+ private function populate(container:VBox):void {
+ var chart:Chart = new BarChart(container,
parameters['flexchart_data']);
+ chart.load();
+ }
+
+ private var expandHistory:Resize = new Resize();
+ private var contractHistory:Resize = new Resize();
+
+ private var expandResources:Resize = new Resize();
+ private var contractResources:Resize = new Resize();
+
+ private function myInit():void {
+ mainChart.height = Constants.height;
+ mainChart.width = Constants.width;
+ hostsChart.width = Constants.width;
+
+ expandHistory.widthTo = Constants.width;
+ expandHistory.heightTo = Constants.height;
+ expandHistory.target = mainChart;
+
+ contractHistory.widthTo = Constants.width;
+ contractHistory.heightTo = Constants.height * .3333;
+ contractHistory.target = mainChart;
+
+ expandResources.widthTo = Constants.width;
+ expandResources.heightTo = Constants.height * .6666;
+ expandResources.target = hostsChart;
+ expandResources.duration = 500;
+
+ contractResources.widthTo = Constants.width;
+ contractResources.heightTo = 0;
+ contractResources.target = hostsChart;
+ contractResources.duration = 500;
+ }
+
+ private function zoomOutSeries(e:Event):void {
+ expandHistory.end(); expandHistory.play();
+ contractResources.end(); contractResources.play();
+ hostsChart.visible = false;
+ }
+
+ private function zoomIntoSeries(e:Event):void {
+ hostsChart.visible=true;
+ expandResources.end(); expandResources.play();
+ contractHistory.end(); contractHistory.play();
+ }
]]>
+
+
</mx:Script>
- <mx:Panel height="100%" width="100%"
visible="true">
- <mx:HBox id="flexChart" height="100%"
width="100%" visible="true" verticalAlign="bottom"
opaqueBackground="0xFFFFFF" borderThickness="0">
- </mx:HBox>
- </mx:Panel>
+
+ <mx:VBox id="mainChart" click="zoomIntoSeries(event)"
/>
+ <mx:VBox id="hostsChart" visible="false"
opaqueBackground="0x00ff00"
click="zoomOutSeries(event)"/>
+
</mx:Application>
diff --git a/src/flexchart/org/ovirt/ChartLoader.as
b/src/flexchart/org/ovirt/ChartLoader.as
deleted file mode 100644
index 4e493a4..0000000
--- a/src/flexchart/org/ovirt/ChartLoader.as
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- Copyright (C) 2008 Red Hat, Inc.
- Written by Steve Linabery <slinabery at redhat.com>
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; version 2 of the License.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
- MA 02110-1301, USA. A copy of the GNU General Public License is
- also available at http://www.gnu.org/copyleft/gpl.html.
-*/
-
-package org.ovirt {
-
- import mx.containers.Box;
- import mx.containers.HBox;
- import mx.controls.Text;
-
- public class ChartLoader {
-
- private var element:Box;
- private var datasourceUrl:String;
-
- public function ChartLoader(element:Box, datasourceUrl:String) {
- this.element = element;
- this.datasourceUrl = datasourceUrl;
- }
-
- public function addData(dataSeries:DataSeries):void {
- var points:Array = dataSeries.getPoints();
- var maxValue:Number = dataSeries.getMaxValue();
- var scale:Number = maxValue;
- if (scale == 0) { scale = 1; }
- var size:int = points.length;
- element.removeAllChildren();
- element.setStyle("horizontalGap","2");
- for (var i:int = 0; i < size; i++) {
- var value:Number = (points[i] as Array)[1];
- var bar:HBox = new HBox();
- bar.percentHeight = ((value / scale) * 90);
- bar.percentWidth = (100 / size);
- bar.setStyle("backgroundColor","0x0000FF");
- bar.setStyle("left","1");
- bar.setStyle("right","1");
- bar.visible = true;
- bar.setVisible(true);
- element.addChild(bar);
- }
- }
-
- public function load():void {
- var dataSource:DataSource = new DataSource(this);
- dataSource.retrieveData(datasourceUrl);
- }
- }
-}
\ No newline at end of file
diff --git a/src/flexchart/org/ovirt/Constants.as
b/src/flexchart/org/ovirt/Constants.as
new file mode 100644
index 0000000..996a31e
--- /dev/null
+++ b/src/flexchart/org/ovirt/Constants.as
@@ -0,0 +1,28 @@
+/*
+ Copyright (C) 2008 Red Hat, Inc.
+ Written by Steve Linabery <slinabery at redhat.com>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; version 2 of the License.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ MA 02110-1301, USA. A copy of the GNU General Public License is
+ also available at http://www.gnu.org/copyleft/gpl.html.
+*/
+
+package org.ovirt {
+ public class Constants {
+ public static var width:int = 722;
+ public static var height:int = 297;
+ public static var barSpacing:int = 2;
+ public static var labelHeight:int = 40;
+ }
+}
diff --git a/src/flexchart/org/ovirt/DataSeries.as
b/src/flexchart/org/ovirt/DataSeries.as
deleted file mode 100644
index d63162a..0000000
--- a/src/flexchart/org/ovirt/DataSeries.as
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- Copyright (C) 2008 Red Hat, Inc.
- Written by Steve Linabery <slinabery at redhat.com>
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; version 2 of the License.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
- MA 02110-1301, USA. A copy of the GNU General Public License is
- also available at http://www.gnu.org/copyleft/gpl.html.
-*/
-
-//class to encapsulate the json object representation of a data
-//series returned from stats package
-
-package org.ovirt {
-
- public class DataSeries {
-
- private var object:Object;
-
- public function DataSeries (object:Object) {
- this.object = object;
- }
-
- public function getPoints():Array {
- return object["vectors"] as Array;
- }
-
- public function getMaxValue():Number {
- return object["max_value"] as Number;
- }
- }
-}
\ No newline at end of file
diff --git a/src/flexchart/org/ovirt/DataSource.as
b/src/flexchart/org/ovirt/DataSource.as
index 1a64f03..44e482d 100644
--- a/src/flexchart/org/ovirt/DataSource.as
+++ b/src/flexchart/org/ovirt/DataSource.as
@@ -25,19 +25,21 @@ package org.ovirt {
import com.adobe.serialization.json.JSON;
import flash.events.Event;
import flash.events.IOErrorEvent;
+ import org.ovirt.data.DataSeries;
+ import org.ovirt.charts.Chart;
public class DataSource {
- private var chartLoader:ChartLoader;
+ private var chart:Chart;
- public function DataSource(chartLoader:ChartLoader) {
- this.chartLoader = chartLoader;
+ public function DataSource(chart:Chart) {
+ this.chart = chart;
}
public function retrieveData(url:String):void {
var loader:URLLoader = new URLLoader();
- loader.addEventListener( IOErrorEvent.IO_ERROR, this.ioError );
- loader.addEventListener( Event.COMPLETE, dataLoaded );
+ loader.addEventListener(IOErrorEvent.IO_ERROR, this.ioError);
+ loader.addEventListener(Event.COMPLETE, dataLoaded);
var request:URLRequest = new URLRequest(url);
loader.load(request);
}
@@ -46,7 +48,7 @@ package org.ovirt {
var loader:URLLoader = URLLoader(event.target);
var object:Object = JSON.decode(loader.data);
var series:DataSeries = new DataSeries(object);
- chartLoader.addData(series);
+ chart.addData(series);
}
private function ioError( e:IOErrorEvent ):void {
diff --git a/src/flexchart/org/ovirt/charts/BarChart.as
b/src/flexchart/org/ovirt/charts/BarChart.as
new file mode 100644
index 0000000..83cf0bb
--- /dev/null
+++ b/src/flexchart/org/ovirt/charts/BarChart.as
@@ -0,0 +1,158 @@
+/*
+ Copyright (C) 2008 Red Hat, Inc.
+ Written by Steve Linabery <slinabery at redhat.com>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; version 2 of the License.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ MA 02110-1301, USA. A copy of the GNU General Public License is
+ also available at http://www.gnu.org/copyleft/gpl.html.
+*/
+
+package org.ovirt.charts {
+
+ import mx.containers.Box;
+ import mx.containers.HBox;
+ import mx.containers.VBox;
+ import mx.controls.Text;
+ import mx.containers.Canvas;
+ import org.ovirt.data.*;
+ import org.ovirt.elements.*;
+ import org.ovirt.Constants;
+
+ public class BarChart extends Chart {
+
+ private var chartArea:HBox;
+ private var labelArea:Canvas;
+
+ public function BarChart(container:Box,
+ datasourceUrl:String) {
+ super(container,datasourceUrl);
+ chartArea = new HBox();
+ chartArea.setStyle("horizontalGap",Constants.barSpacing);
+ chartArea.setStyle("verticalAlign","bottom");
+ chartArea.percentHeight = 80;
+ chartArea.percentWidth = 100;
+ this.container.addChild(chartArea);
+
+ labelArea = new Canvas();
+ labelArea.height = Constants.labelHeight;
+ labelArea.minHeight = Constants.labelHeight;
+ labelArea.percentWidth = 100;
+ this.container.addChild(labelArea);
+ }
+
+ override public function addData(dataSeries:DataSeries):void {
+ try {
+ var dataPoints:Array = dataSeries.getDataPoints();
+ var maxValue:Number = dataSeries.getMaxValue();
+ var scale:Number = maxValue;
+ //avoid divide by zero
+ if (scale == 0) {
+ scale = 1;
+ }
+ var size:int = dataPoints.length;
+ if (size == 0) {
+ throw new Error("No data points in range");
+ }
+
+ //have to iterate through datapoint.timestamp strings,
+ //create a TextLiberation object with them, and add them to
+ //a parent container before we can tell how wide they are in pixels.
+ var labelWidth:Number = 0;
+ for (var i:int = 0; i < size; i++) {
+ var dataPoint:DataPoint = dataPoints[i] as DataPoint;
+ var textTemp:TextLiberation + new
TextLiberation(dataPoint.getTimestamp());
+ textTemp.setVisible(false);
+ chartArea.addChild(textTemp);
+ var tempLabelWidth:Number = textTemp.getTextWidth();
+ if (! isNaN(tempLabelWidth)) {
+ labelWidth = Math.max(labelWidth, tempLabelWidth);
+ }
+ }
+ //now we have to remove all the children we just added, since we
don't
+ //really want them to be part of the chart.
+ chartArea.removeAllChildren();
+
+ //we always want an odd number of y-axis labels, and we'll
+ //determine this by using the labelWidth we just determined
+ var labelCount:int = Math.floor(Constants.width / labelWidth);
+ if (labelCount > 3 && labelCount % 2 == 1) {
+ labelCount--;
+ }
+
+ //the distance between left edges of adjacent bars
+ var gridWidth:Number = Constants.width / size;
+
+ //the width of each SingleBar (does not including padding between bars)
+ var barWidth:Number = gridWidth - Constants.barSpacing;
+
+ //use this to center y-axis labels on the bars
+ var labelOffset:Number = barWidth / 2;
+
+ //distance between first and last label
+ var labelSpace:Number = Constants.width - gridWidth;
+ var labelSpacing:Number = labelSpace / labelCount;
+
+ //add the bars & labels to the chart
+ var labelCounter:int = 0;
+ for (i = 0; i < size; i++) {
+ dataPoint = dataPoints[i] as DataPoint;
+ var value:Number = dataPoint.getValue();
+ var bar:SingleBar = new SingleBar(dataPoint);
+ bar.percentHeight = ((value / scale) * 80);
+ bar.width = barWidth;
+ bar.setVisible(true);
+ chartArea.addChild(bar);
+ var currentLabelPosition:int = labelCounter * labelSpacing +
+ labelOffset;
+
+ if (currentLabelPosition >= i * gridWidth &&
+ currentLabelPosition < (i + 1) * gridWidth) {
+ var label:YAxisLabel = new YAxisLabel(dataPoint.getTimestamp());
+ label.setVisible(false);
+ label.y = ((labelCounter + 1) % 2) * 13 + 4;
+ labelArea.addChild(label);
+ //make sure the label is fully within the chart width
+ label.x = Math.max(0,
+ Math.min((i) * gridWidth -
+ (label.labelText.getTextWidth() / 2) +
+ labelOffset,
+ Constants.width -
+ label.labelText.getTextWidth() - 6)
+ );
+ label.setVisible(true);
+ labelCounter++;
+
+ //add a 'tick' in the center of the bar to which this label
+ //corresponds
+ var ind:Box = new Box();
+ ind.opaqueBackground = 0x000000;
+ ind.width=1;
+ ind.height=3;
+ ind.x = (i) * gridWidth + labelOffset;
+ ind.y = 0;
+ ind.setVisible(true);
+ ind.setStyle("backgroundColor","0x000000");
+ labelArea.addChild(ind);
+ }
+ }
+ } catch (e:Error) {
+ var err:Text = new Text();
+ err.text = e.message;
+ err.setVisible(true);
+ chartArea.addChild(err);
+ }
+ }
+ }
+}
diff --git a/src/flexchart/org/ovirt/charts/Chart.as
b/src/flexchart/org/ovirt/charts/Chart.as
new file mode 100644
index 0000000..26c8d02
--- /dev/null
+++ b/src/flexchart/org/ovirt/charts/Chart.as
@@ -0,0 +1,46 @@
+/*
+ Copyright (C) 2008 Red Hat, Inc.
+ Written by Steve Linabery <slinabery at redhat.com>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; version 2 of the License.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ MA 02110-1301, USA. A copy of the GNU General Public License is
+ also available at http://www.gnu.org/copyleft/gpl.html.
+*/
+
+package org.ovirt.charts {
+
+ public class Chart {
+
+ import org.ovirt.DataSource;
+ import mx.containers.Box;
+ import org.ovirt.data.DataSeries;
+
+ protected var container:Box;
+ protected var datasourceUrl:String;
+
+ public function Chart(container:Box, datasourceUrl:String) {
+ this.container = container;
+ this.datasourceUrl = datasourceUrl;
+ }
+
+ public function addData(dataSeries:DataSeries):void {
+ //override me!
+ }
+
+ public function load():void {
+ var dataSource:DataSource = new DataSource(this);
+ dataSource.retrieveData(datasourceUrl);
+ }
+ }
+}
diff --git a/src/flexchart/org/ovirt/data/DataPoint.as
b/src/flexchart/org/ovirt/data/DataPoint.as
new file mode 100644
index 0000000..00cd0a4
--- /dev/null
+++ b/src/flexchart/org/ovirt/data/DataPoint.as
@@ -0,0 +1,47 @@
+/*
+ Copyright (C) 2008 Red Hat, Inc.
+ Written by Steve Linabery <slinabery at redhat.com>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; version 2 of the License.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ MA 02110-1301, USA. A copy of the GNU General Public License is
+ also available at http://www.gnu.org/copyleft/gpl.html.
+*/
+
+package org.ovirt.data {
+
+ public class DataPoint {
+
+ private var timestamp:String;
+ private var value:Number;
+ private var description:String;
+
+ public function DataPoint (timestamp:String, value:Number,
description:String) {
+ this.timestamp = timestamp;
+ this.value = value;
+ this.description = description;
+ }
+
+ public function getTimestamp():String {
+ return timestamp;
+ }
+
+ public function getValue():Number {
+ return value;
+ }
+
+ public function getDescription():String {
+ return description;
+ }
+ }
+}
diff --git a/src/flexchart/org/ovirt/data/DataSeries.as
b/src/flexchart/org/ovirt/data/DataSeries.as
new file mode 100644
index 0000000..764fd34
--- /dev/null
+++ b/src/flexchart/org/ovirt/data/DataSeries.as
@@ -0,0 +1,54 @@
+/*
+ Copyright (C) 2008 Red Hat, Inc.
+ Written by Steve Linabery <slinabery at redhat.com>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; version 2 of the License.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ MA 02110-1301, USA. A copy of the GNU General Public License is
+ also available at http://www.gnu.org/copyleft/gpl.html.
+*/
+
+//class to encapsulate the json object representation of a data
+//series returned from stats package
+
+package org.ovirt.data {
+
+ public class DataSeries {
+
+ private var object:Object;
+ private var dataPoints:Array;
+ private var description:String;
+ private var maxValue:Number;
+
+ public function DataSeries (object:Object) {
+ this.object = object;
+ this.description = object["description"] as String;
+ dataPoints = new Array();
+ var inDataPoints:Array = object["vectors"] as Array;
+ for (var i:int = 0; i < inDataPoints.length; i++) {
+ dataPoints.push(new DataPoint((inDataPoints[i] as Array)[0] as String,
+ (inDataPoints[i] as Array)[1] as Number,
+ description));
+ }
+ maxValue = object["max_value"] as Number;
+ }
+
+ public function getDataPoints():Array {
+ return dataPoints;
+ }
+
+ public function getMaxValue():Number {
+ return maxValue;
+ }
+ }
+}
diff --git a/src/flexchart/org/ovirt/elements/SingleBar.as
b/src/flexchart/org/ovirt/elements/SingleBar.as
new file mode 100644
index 0000000..6e09bff
--- /dev/null
+++ b/src/flexchart/org/ovirt/elements/SingleBar.as
@@ -0,0 +1,67 @@
+/*
+ Copyright (C) 2008 Red Hat, Inc.
+ Written by Steve Linabery <slinabery at redhat.com>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; version 2 of the License.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ MA 02110-1301, USA. A copy of the GNU General Public License is
+ also available at http://www.gnu.org/copyleft/gpl.html.
+*/
+
+package org.ovirt.elements {
+
+ import mx.containers.Box;
+ import mx.controls.ToolTip;
+ import mx.managers.ToolTipManager;
+ import flash.events.Event;
+ import flash.events.MouseEvent;
+ import flash.geom.Rectangle;
+ import flash.display.DisplayObject;
+ import org.ovirt.data.DataPoint;
+
+ public class SingleBar extends Box {
+
+ private var tip:ToolTip;
+ private var dataPoint:DataPoint;
+
+ public function SingleBar(dataPoint:DataPoint) {
+ super();
+ this.dataPoint = dataPoint;
+ addEventListener(MouseEvent.MOUSE_OVER,showTip);
+ addEventListener(MouseEvent.MOUSE_OUT,destroyTip);
+ this.setStyle("backgroundColor","0x0000FF");
+ this.setStyle("left","1");
+ this.setStyle("right","1");
+ }
+
+ private function showTip(event:Event):void {
+ var w:Number = this.stage.width;
+ var target:DisplayObject = event.currentTarget as DisplayObject;
+ var pt:Rectangle = this.stage.getBounds(target);
+ var yPos:Number = pt.y * -1;
+ var xPos:Number = pt.x * -1;
+ tip = ToolTipManager.createToolTip(dataPoint.getDescription() +
"\n" +
+ dataPoint.getTimestamp() +
"\n" +
+ dataPoint.getValue(),
+ xPos,yPos) as ToolTip;
+ tip.x = Math.min(tip.x,
+ w - tip.width);
+ tip.y = Math.max(0,
+ tip.y - tip.height);
+ }
+
+ private function destroyTip(event:Event):void {
+ ToolTipManager.destroyToolTip(tip);
+ }
+ }
+}
diff --git a/src/flexchart/org/ovirt/elements/TextLiberation.as
b/src/flexchart/org/ovirt/elements/TextLiberation.as
new file mode 100644
index 0000000..f0314a2
--- /dev/null
+++ b/src/flexchart/org/ovirt/elements/TextLiberation.as
@@ -0,0 +1,46 @@
+/*
+ Copyright (C) 2008 Red Hat, Inc.
+ Written by Steve Linabery <slinabery at redhat.com>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; version 2 of the License.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ MA 02110-1301, USA. A copy of the GNU General Public License is
+ also available at http://www.gnu.org/copyleft/gpl.html.
+*/
+
+package org.ovirt.elements {
+
+ import mx.controls.Label;
+
+ public class TextLiberation extends Label {
+
+ //FIXME: this should point to a local asset somehow.
+
[Embed(source='/usr/share/fonts/liberation/LiberationSans-Regular.ttf',
+ fontName='liberation',
+ mimeType='application/x-font'
+ )]
+ //this variable exists so that the compiler will link in the font.
+ private var font1:Class;
+
+ public function TextLiberation(text:String) {
+ super();
+ this.text = text;
+ this.setStyle("fontFamily","liberation");
+ }
+
+ public function getTextWidth():Number {
+ this.validateNow();
+ return this.textWidth;
+ }
+ }
+}
diff --git a/src/flexchart/org/ovirt/elements/YAxisLabel.as
b/src/flexchart/org/ovirt/elements/YAxisLabel.as
new file mode 100644
index 0000000..0e93b97
--- /dev/null
+++ b/src/flexchart/org/ovirt/elements/YAxisLabel.as
@@ -0,0 +1,41 @@
+/*
+ Copyright (C) 2008 Red Hat, Inc.
+ Written by Steve Linabery <slinabery at redhat.com>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; version 2 of the License.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ MA 02110-1301, USA. A copy of the GNU General Public License is
+ also available at http://www.gnu.org/copyleft/gpl.html.
+*/
+
+package org.ovirt.elements {
+
+ import mx.containers.Box;
+ import mx.core.ScrollPolicy;
+
+ public class YAxisLabel extends Box {
+
+ public var labelText:TextLiberation;
+
+ public function YAxisLabel(text:String) {
+ super();
+ labelText = new TextLiberation(text);
+ labelText.setVisible(true);
+ this.addChild(labelText);
+ this.horizontalScrollPolicy = ScrollPolicy.OFF;
+ this.verticalScrollPolicy = ScrollPolicy.OFF;
+ this.setStyle("paddingLeft","0");
+ this.setStyle("paddingRight","0");
+ }
+ }
+}
--
1.5.6.5
Jason Guiditta
2008-Oct-31 20:52 UTC
[Ovirt-devel] [PATCH server] Add tooltips, y-axis labels, and first animation transition to flexchart.
On Wed, 2008-10-29 at 15:39 -0500, Steve Linabery wrote:> Also improve OO design with new classes and better organization thereof. > --- > src/app/controllers/graph_controller.rb | 3 +- > src/flexchart/README.txt | 2 +- > src/flexchart/flexchart.mxml | 69 +++++++-- > src/flexchart/org/ovirt/ChartLoader.as | 64 -------- > src/flexchart/org/ovirt/Constants.as | 28 ++++ > src/flexchart/org/ovirt/DataSeries.as | 42 ----- > src/flexchart/org/ovirt/DataSource.as | 14 +- > src/flexchart/org/ovirt/charts/BarChart.as | 158 ++++++++++++++++++++ > src/flexchart/org/ovirt/charts/Chart.as | 46 ++++++ > src/flexchart/org/ovirt/data/DataPoint.as | 47 ++++++ > src/flexchart/org/ovirt/data/DataSeries.as | 54 +++++++ > src/flexchart/org/ovirt/elements/SingleBar.as | 67 ++++++++ > src/flexchart/org/ovirt/elements/TextLiberation.as | 46 ++++++ > src/flexchart/org/ovirt/elements/YAxisLabel.as | 41 +++++ > 14 files changed, 556 insertions(+), 125 deletions(-) > delete mode 100644 src/flexchart/org/ovirt/ChartLoader.as > create mode 100644 src/flexchart/org/ovirt/Constants.as > delete mode 100644 src/flexchart/org/ovirt/DataSeries.as > create mode 100644 src/flexchart/org/ovirt/charts/BarChart.as > create mode 100644 src/flexchart/org/ovirt/charts/Chart.as > create mode 100644 src/flexchart/org/ovirt/data/DataPoint.as > create mode 100644 src/flexchart/org/ovirt/data/DataSeries.as > create mode 100644 src/flexchart/org/ovirt/elements/SingleBar.as > create mode 100644 src/flexchart/org/ovirt/elements/TextLiberation.as > create mode 100644 src/flexchart/org/ovirt/elements/YAxisLabel.as > > diff --git a/src/app/controllers/graph_controller.rb b/src/app/controllers/graph_controller.rb > index c1d27b5..0105ea6 100644 > --- a/src/app/controllers/graph_controller.rb > +++ b/src/app/controllers/graph_controller.rb > @@ -15,7 +15,8 @@ class GraphController < ApplicationController > :values => graph_obj[:dataset][2][:values].last(40) } > my_data = graph_data[:labels].zip(graph_data[:values]) > graph = { :vectors => my_data, > - :max_value => graph_obj[:total_peak] > + :max_value => graph_obj[:total_peak], > + :description => params[:target] > } > render :json => graph > end > diff --git a/src/flexchart/README.txt b/src/flexchart/README.txt > index 66eb183..3de7430 100644 > --- a/src/flexchart/README.txt > +++ b/src/flexchart/README.txt > @@ -5,4 +5,4 @@ Once you have mxmlc on your system, run: > > mxmlc flexchart.mxml > > -in this directory, and copy the resulting file flexchart.swf to /usr/share/ovirt-server/public on your appliance. > +in this directory, and copy the resulting file flexchart.swf to /usr/share/ovirt-server/public/swfs on your appliance. > diff --git a/src/flexchart/flexchart.mxml b/src/flexchart/flexchart.mxml > index 796329d..35fa9a6 100644 > --- a/src/flexchart/flexchart.mxml > +++ b/src/flexchart/flexchart.mxml > @@ -1,20 +1,67 @@ > <?xml version="1.0"?> > -<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" applicationComplete="populate(flexChart)"> > +<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" applicationComplete="myInit(); populate(mainChart);" styleName="plain" horizontalScrollPolicy="off" verticalScrollPolicy="off"> > <mx:Script> > <![CDATA[ > > - import mx.containers.Box; > - import org.ovirt.*; > + import mx.containers.VBox; > + import mx.effects.Resize; > + import org.ovirt.Constants; > + import org.ovirt.charts.Chart; > + import org.ovirt.charts.BarChart; > > - private function populate(chart:Box):void { > - var chartLoader:ChartLoader = new ChartLoader(chart, parameters['flexchart_data']); > - chartLoader.load(); > - } > + private function populate(container:VBox):void { > + var chart:Chart = new BarChart(container, parameters['flexchart_data']); > + chart.load(); > + } > + > + private var expandHistory:Resize = new Resize(); > + private var contractHistory:Resize = new Resize(); > + > + private var expandResources:Resize = new Resize(); > + private var contractResources:Resize = new Resize(); > + > + private function myInit():void { > + mainChart.height = Constants.height; > + mainChart.width = Constants.width; > + hostsChart.width = Constants.width; > + > + expandHistory.widthTo = Constants.width; > + expandHistory.heightTo = Constants.height; > + expandHistory.target = mainChart; > + > + contractHistory.widthTo = Constants.width; > + contractHistory.heightTo = Constants.height * .3333; > + contractHistory.target = mainChart; > + > + expandResources.widthTo = Constants.width; > + expandResources.heightTo = Constants.height * .6666; > + expandResources.target = hostsChart; > + expandResources.duration = 500; > + > + contractResources.widthTo = Constants.width; > + contractResources.heightTo = 0; > + contractResources.target = hostsChart; > + contractResources.duration = 500; > + } > + > + private function zoomOutSeries(e:Event):void { > + expandHistory.end(); expandHistory.play(); > + contractResources.end(); contractResources.play(); > + hostsChart.visible = false; > + } > + > + private function zoomIntoSeries(e:Event):void { > + hostsChart.visible=true; > + expandResources.end(); expandResources.play(); > + contractHistory.end(); contractHistory.play(); > + } > > ]]> > + > + > </mx:Script> > - <mx:Panel height="100%" width="100%" visible="true"> > - <mx:HBox id="flexChart" height="100%" width="100%" visible="true" verticalAlign="bottom" opaqueBackground="0xFFFFFF" borderThickness="0"> > - </mx:HBox> > - </mx:Panel> > + > + <mx:VBox id="mainChart" click="zoomIntoSeries(event)" /> > + <mx:VBox id="hostsChart" visible="false" opaqueBackground="0x00ff00" click="zoomOutSeries(event)"/> > + > </mx:Application> > diff --git a/src/flexchart/org/ovirt/ChartLoader.as b/src/flexchart/org/ovirt/ChartLoader.as > deleted file mode 100644 > index 4e493a4..0000000 > --- a/src/flexchart/org/ovirt/ChartLoader.as > +++ /dev/null > @@ -1,64 +0,0 @@ > -/* > - Copyright (C) 2008 Red Hat, Inc. > - Written by Steve Linabery <slinabery at redhat.com> > - > - This program is free software; you can redistribute it and/or modify > - it under the terms of the GNU General Public License as published by > - the Free Software Foundation; version 2 of the License. > - > - This program is distributed in the hope that it will be useful, > - but WITHOUT ANY WARRANTY; without even the implied warranty of > - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > - GNU General Public License for more details. > - > - You should have received a copy of the GNU General Public License > - along with this program; if not, write to the Free Software > - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, > - MA 02110-1301, USA. A copy of the GNU General Public License is > - also available at http://www.gnu.org/copyleft/gpl.html. > -*/ > - > -package org.ovirt { > - > - import mx.containers.Box; > - import mx.containers.HBox; > - import mx.controls.Text; > - > - public class ChartLoader { > - > - private var element:Box; > - private var datasourceUrl:String; > - > - public function ChartLoader(element:Box, datasourceUrl:String) { > - this.element = element; > - this.datasourceUrl = datasourceUrl; > - } > - > - public function addData(dataSeries:DataSeries):void { > - var points:Array = dataSeries.getPoints(); > - var maxValue:Number = dataSeries.getMaxValue(); > - var scale:Number = maxValue; > - if (scale == 0) { scale = 1; } > - var size:int = points.length; > - element.removeAllChildren(); > - element.setStyle("horizontalGap","2"); > - for (var i:int = 0; i < size; i++) { > - var value:Number = (points[i] as Array)[1]; > - var bar:HBox = new HBox(); > - bar.percentHeight = ((value / scale) * 90); > - bar.percentWidth = (100 / size); > - bar.setStyle("backgroundColor","0x0000FF"); > - bar.setStyle("left","1"); > - bar.setStyle("right","1"); > - bar.visible = true; > - bar.setVisible(true); > - element.addChild(bar); > - } > - } > - > - public function load():void { > - var dataSource:DataSource = new DataSource(this); > - dataSource.retrieveData(datasourceUrl); > - } > - } > -} > \ No newline at end of file > diff --git a/src/flexchart/org/ovirt/Constants.as b/src/flexchart/org/ovirt/Constants.as > new file mode 100644 > index 0000000..996a31e > --- /dev/null > +++ b/src/flexchart/org/ovirt/Constants.as > @@ -0,0 +1,28 @@ > +/* > + Copyright (C) 2008 Red Hat, Inc. > + Written by Steve Linabery <slinabery at redhat.com> > + > + This program is free software; you can redistribute it and/or modify > + it under the terms of the GNU General Public License as published by > + the Free Software Foundation; version 2 of the License. > + > + This program is distributed in the hope that it will be useful, > + but WITHOUT ANY WARRANTY; without even the implied warranty of > + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + GNU General Public License for more details. > + > + You should have received a copy of the GNU General Public License > + along with this program; if not, write to the Free Software > + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, > + MA 02110-1301, USA. A copy of the GNU General Public License is > + also available at http://www.gnu.org/copyleft/gpl.html. > +*/ > + > +package org.ovirt { > + public class Constants { > + public static var width:int = 722; > + public static var height:int = 297; > + public static var barSpacing:int = 2; > + public static var labelHeight:int = 40; > + } > +} > diff --git a/src/flexchart/org/ovirt/DataSeries.as b/src/flexchart/org/ovirt/DataSeries.as > deleted file mode 100644 > index d63162a..0000000 > --- a/src/flexchart/org/ovirt/DataSeries.as > +++ /dev/null > @@ -1,42 +0,0 @@ > -/* > - Copyright (C) 2008 Red Hat, Inc. > - Written by Steve Linabery <slinabery at redhat.com> > - > - This program is free software; you can redistribute it and/or modify > - it under the terms of the GNU General Public License as published by > - the Free Software Foundation; version 2 of the License. > - > - This program is distributed in the hope that it will be useful, > - but WITHOUT ANY WARRANTY; without even the implied warranty of > - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > - GNU General Public License for more details. > - > - You should have received a copy of the GNU General Public License > - along with this program; if not, write to the Free Software > - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, > - MA 02110-1301, USA. A copy of the GNU General Public License is > - also available at http://www.gnu.org/copyleft/gpl.html. > -*/ > - > -//class to encapsulate the json object representation of a data > -//series returned from stats package > - > -package org.ovirt { > - > - public class DataSeries { > - > - private var object:Object; > - > - public function DataSeries (object:Object) { > - this.object = object; > - } > - > - public function getPoints():Array { > - return object["vectors"] as Array; > - } > - > - public function getMaxValue():Number { > - return object["max_value"] as Number; > - } > - } > -} > \ No newline at end of file > diff --git a/src/flexchart/org/ovirt/DataSource.as b/src/flexchart/org/ovirt/DataSource.as > index 1a64f03..44e482d 100644 > --- a/src/flexchart/org/ovirt/DataSource.as > +++ b/src/flexchart/org/ovirt/DataSource.as > @@ -25,19 +25,21 @@ package org.ovirt { > import com.adobe.serialization.json.JSON; > import flash.events.Event; > import flash.events.IOErrorEvent; > + import org.ovirt.data.DataSeries; > + import org.ovirt.charts.Chart; > > public class DataSource { > > - private var chartLoader:ChartLoader; > + private var chart:Chart; > > - public function DataSource(chartLoader:ChartLoader) { > - this.chartLoader = chartLoader; > + public function DataSource(chart:Chart) { > + this.chart = chart; > } > > public function retrieveData(url:String):void { > var loader:URLLoader = new URLLoader(); > - loader.addEventListener( IOErrorEvent.IO_ERROR, this.ioError ); > - loader.addEventListener( Event.COMPLETE, dataLoaded ); > + loader.addEventListener(IOErrorEvent.IO_ERROR, this.ioError); > + loader.addEventListener(Event.COMPLETE, dataLoaded); > var request:URLRequest = new URLRequest(url); > loader.load(request); > } > @@ -46,7 +48,7 @@ package org.ovirt { > var loader:URLLoader = URLLoader(event.target); > var object:Object = JSON.decode(loader.data); > var series:DataSeries = new DataSeries(object); > - chartLoader.addData(series); > + chart.addData(series); > } > > private function ioError( e:IOErrorEvent ):void { > diff --git a/src/flexchart/org/ovirt/charts/BarChart.as b/src/flexchart/org/ovirt/charts/BarChart.as > new file mode 100644 > index 0000000..83cf0bb > --- /dev/null > +++ b/src/flexchart/org/ovirt/charts/BarChart.as > @@ -0,0 +1,158 @@ > +/* > + Copyright (C) 2008 Red Hat, Inc. > + Written by Steve Linabery <slinabery at redhat.com> > + > + This program is free software; you can redistribute it and/or modify > + it under the terms of the GNU General Public License as published by > + the Free Software Foundation; version 2 of the License. > + > + This program is distributed in the hope that it will be useful, > + but WITHOUT ANY WARRANTY; without even the implied warranty of > + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + GNU General Public License for more details. > + > + You should have received a copy of the GNU General Public License > + along with this program; if not, write to the Free Software > + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, > + MA 02110-1301, USA. A copy of the GNU General Public License is > + also available at http://www.gnu.org/copyleft/gpl.html. > +*/ > + > +package org.ovirt.charts { > + > + import mx.containers.Box; > + import mx.containers.HBox; > + import mx.containers.VBox; > + import mx.controls.Text; > + import mx.containers.Canvas; > + import org.ovirt.data.*; > + import org.ovirt.elements.*; > + import org.ovirt.Constants; > + > + public class BarChart extends Chart { > + > + private var chartArea:HBox; > + private var labelArea:Canvas; > + > + public function BarChart(container:Box, > + datasourceUrl:String) { > + super(container,datasourceUrl); > + chartArea = new HBox(); > + chartArea.setStyle("horizontalGap",Constants.barSpacing); > + chartArea.setStyle("verticalAlign","bottom"); > + chartArea.percentHeight = 80; > + chartArea.percentWidth = 100; > + this.container.addChild(chartArea); > + > + labelArea = new Canvas(); > + labelArea.height = Constants.labelHeight; > + labelArea.minHeight = Constants.labelHeight; > + labelArea.percentWidth = 100; > + this.container.addChild(labelArea); > + } > + > + override public function addData(dataSeries:DataSeries):void { > + try { > + var dataPoints:Array = dataSeries.getDataPoints(); > + var maxValue:Number = dataSeries.getMaxValue(); > + var scale:Number = maxValue; > + //avoid divide by zero > + if (scale == 0) { > + scale = 1; > + } > + var size:int = dataPoints.length; > + if (size == 0) { > + throw new Error("No data points in range"); > + } > + > + //have to iterate through datapoint.timestamp strings, > + //create a TextLiberation object with them, and add them to > + //a parent container before we can tell how wide they are in pixels. > + var labelWidth:Number = 0; > + for (var i:int = 0; i < size; i++) { > + var dataPoint:DataPoint = dataPoints[i] as DataPoint; > + var textTemp:TextLiberation > + new TextLiberation(dataPoint.getTimestamp()); > + textTemp.setVisible(false); > + chartArea.addChild(textTemp); > + var tempLabelWidth:Number = textTemp.getTextWidth(); > + if (! isNaN(tempLabelWidth)) { > + labelWidth = Math.max(labelWidth, tempLabelWidth); > + } > + } > + //now we have to remove all the children we just added, since we don't > + //really want them to be part of the chart. > + chartArea.removeAllChildren(); > + > + //we always want an odd number of y-axis labels, and we'll > + //determine this by using the labelWidth we just determined > + var labelCount:int = Math.floor(Constants.width / labelWidth); > + if (labelCount > 3 && labelCount % 2 == 1) { > + labelCount--; > + } > + > + //the distance between left edges of adjacent bars > + var gridWidth:Number = Constants.width / size; > + > + //the width of each SingleBar (does not including padding between bars) > + var barWidth:Number = gridWidth - Constants.barSpacing; > + > + //use this to center y-axis labels on the bars > + var labelOffset:Number = barWidth / 2; > + > + //distance between first and last label > + var labelSpace:Number = Constants.width - gridWidth; > + var labelSpacing:Number = labelSpace / labelCount; > + > + //add the bars & labels to the chart > + var labelCounter:int = 0; > + for (i = 0; i < size; i++) { > + dataPoint = dataPoints[i] as DataPoint; > + var value:Number = dataPoint.getValue(); > + var bar:SingleBar = new SingleBar(dataPoint); > + bar.percentHeight = ((value / scale) * 80); > + bar.width = barWidth; > + bar.setVisible(true); > + chartArea.addChild(bar); > + var currentLabelPosition:int = labelCounter * labelSpacing + > + labelOffset; > + > + if (currentLabelPosition >= i * gridWidth && > + currentLabelPosition < (i + 1) * gridWidth) { > + var label:YAxisLabel = new YAxisLabel(dataPoint.getTimestamp()); > + label.setVisible(false); > + label.y = ((labelCounter + 1) % 2) * 13 + 4; > + labelArea.addChild(label); > + //make sure the label is fully within the chart width > + label.x = Math.max(0, > + Math.min((i) * gridWidth - > + (label.labelText.getTextWidth() / 2) + > + labelOffset, > + Constants.width - > + label.labelText.getTextWidth() - 6) > + ); > + label.setVisible(true); > + labelCounter++; > + > + //add a 'tick' in the center of the bar to which this label > + //corresponds > + var ind:Box = new Box(); > + ind.opaqueBackground = 0x000000; > + ind.width=1; > + ind.height=3; > + ind.x = (i) * gridWidth + labelOffset; > + ind.y = 0; > + ind.setVisible(true); > + ind.setStyle("backgroundColor","0x000000"); > + labelArea.addChild(ind); > + } > + } > + } catch (e:Error) { > + var err:Text = new Text(); > + err.text = e.message; > + err.setVisible(true); > + chartArea.addChild(err); > + } > + } > + } > +} > diff --git a/src/flexchart/org/ovirt/charts/Chart.as b/src/flexchart/org/ovirt/charts/Chart.as > new file mode 100644 > index 0000000..26c8d02 > --- /dev/null > +++ b/src/flexchart/org/ovirt/charts/Chart.as > @@ -0,0 +1,46 @@ > +/* > + Copyright (C) 2008 Red Hat, Inc. > + Written by Steve Linabery <slinabery at redhat.com> > + > + This program is free software; you can redistribute it and/or modify > + it under the terms of the GNU General Public License as published by > + the Free Software Foundation; version 2 of the License. > + > + This program is distributed in the hope that it will be useful, > + but WITHOUT ANY WARRANTY; without even the implied warranty of > + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + GNU General Public License for more details. > + > + You should have received a copy of the GNU General Public License > + along with this program; if not, write to the Free Software > + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, > + MA 02110-1301, USA. A copy of the GNU General Public License is > + also available at http://www.gnu.org/copyleft/gpl.html. > +*/ > + > +package org.ovirt.charts { > + > + public class Chart { > + > + import org.ovirt.DataSource; > + import mx.containers.Box; > + import org.ovirt.data.DataSeries; > + > + protected var container:Box; > + protected var datasourceUrl:String; > + > + public function Chart(container:Box, datasourceUrl:String) { > + this.container = container; > + this.datasourceUrl = datasourceUrl; > + } > + > + public function addData(dataSeries:DataSeries):void { > + //override me! > + } > + > + public function load():void { > + var dataSource:DataSource = new DataSource(this); > + dataSource.retrieveData(datasourceUrl); > + } > + } > +} > diff --git a/src/flexchart/org/ovirt/data/DataPoint.as b/src/flexchart/org/ovirt/data/DataPoint.as > new file mode 100644 > index 0000000..00cd0a4 > --- /dev/null > +++ b/src/flexchart/org/ovirt/data/DataPoint.as > @@ -0,0 +1,47 @@ > +/* > + Copyright (C) 2008 Red Hat, Inc. > + Written by Steve Linabery <slinabery at redhat.com> > + > + This program is free software; you can redistribute it and/or modify > + it under the terms of the GNU General Public License as published by > + the Free Software Foundation; version 2 of the License. > + > + This program is distributed in the hope that it will be useful, > + but WITHOUT ANY WARRANTY; without even the implied warranty of > + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + GNU General Public License for more details. > + > + You should have received a copy of the GNU General Public License > + along with this program; if not, write to the Free Software > + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, > + MA 02110-1301, USA. A copy of the GNU General Public License is > + also available at http://www.gnu.org/copyleft/gpl.html. > +*/ > + > +package org.ovirt.data { > + > + public class DataPoint { > + > + private var timestamp:String; > + private var value:Number; > + private var description:String; > + > + public function DataPoint (timestamp:String, value:Number, description:String) { > + this.timestamp = timestamp; > + this.value = value; > + this.description = description; > + } > + > + public function getTimestamp():String { > + return timestamp; > + } > + > + public function getValue():Number { > + return value; > + } > + > + public function getDescription():String { > + return description; > + } > + } > +} > diff --git a/src/flexchart/org/ovirt/data/DataSeries.as b/src/flexchart/org/ovirt/data/DataSeries.as > new file mode 100644 > index 0000000..764fd34 > --- /dev/null > +++ b/src/flexchart/org/ovirt/data/DataSeries.as > @@ -0,0 +1,54 @@ > +/* > + Copyright (C) 2008 Red Hat, Inc. > + Written by Steve Linabery <slinabery at redhat.com> > + > + This program is free software; you can redistribute it and/or modify > + it under the terms of the GNU General Public License as published by > + the Free Software Foundation; version 2 of the License. > + > + This program is distributed in the hope that it will be useful, > + but WITHOUT ANY WARRANTY; without even the implied warranty of > + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + GNU General Public License for more details. > + > + You should have received a copy of the GNU General Public License > + along with this program; if not, write to the Free Software > + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, > + MA 02110-1301, USA. A copy of the GNU General Public License is > + also available at http://www.gnu.org/copyleft/gpl.html. > +*/ > + > +//class to encapsulate the json object representation of a data > +//series returned from stats package > + > +package org.ovirt.data { > + > + public class DataSeries { > + > + private var object:Object; > + private var dataPoints:Array; > + private var description:String; > + private var maxValue:Number; > + > + public function DataSeries (object:Object) { > + this.object = object; > + this.description = object["description"] as String; > + dataPoints = new Array(); > + var inDataPoints:Array = object["vectors"] as Array; > + for (var i:int = 0; i < inDataPoints.length; i++) { > + dataPoints.push(new DataPoint((inDataPoints[i] as Array)[0] as String, > + (inDataPoints[i] as Array)[1] as Number, > + description)); > + } > + maxValue = object["max_value"] as Number; > + } > + > + public function getDataPoints():Array { > + return dataPoints; > + } > + > + public function getMaxValue():Number { > + return maxValue; > + } > + } > +} > diff --git a/src/flexchart/org/ovirt/elements/SingleBar.as b/src/flexchart/org/ovirt/elements/SingleBar.as > new file mode 100644 > index 0000000..6e09bff > --- /dev/null > +++ b/src/flexchart/org/ovirt/elements/SingleBar.as > @@ -0,0 +1,67 @@ > +/* > + Copyright (C) 2008 Red Hat, Inc. > + Written by Steve Linabery <slinabery at redhat.com> > + > + This program is free software; you can redistribute it and/or modify > + it under the terms of the GNU General Public License as published by > + the Free Software Foundation; version 2 of the License. > + > + This program is distributed in the hope that it will be useful, > + but WITHOUT ANY WARRANTY; without even the implied warranty of > + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + GNU General Public License for more details. > + > + You should have received a copy of the GNU General Public License > + along with this program; if not, write to the Free Software > + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, > + MA 02110-1301, USA. A copy of the GNU General Public License is > + also available at http://www.gnu.org/copyleft/gpl.html. > +*/ > + > +package org.ovirt.elements { > + > + import mx.containers.Box; > + import mx.controls.ToolTip; > + import mx.managers.ToolTipManager; > + import flash.events.Event; > + import flash.events.MouseEvent; > + import flash.geom.Rectangle; > + import flash.display.DisplayObject; > + import org.ovirt.data.DataPoint; > + > + public class SingleBar extends Box { > + > + private var tip:ToolTip; > + private var dataPoint:DataPoint; > + > + public function SingleBar(dataPoint:DataPoint) { > + super(); > + this.dataPoint = dataPoint; > + addEventListener(MouseEvent.MOUSE_OVER,showTip); > + addEventListener(MouseEvent.MOUSE_OUT,destroyTip); > + this.setStyle("backgroundColor","0x0000FF"); > + this.setStyle("left","1"); > + this.setStyle("right","1"); > + } > + > + private function showTip(event:Event):void { > + var w:Number = this.stage.width; > + var target:DisplayObject = event.currentTarget as DisplayObject; > + var pt:Rectangle = this.stage.getBounds(target); > + var yPos:Number = pt.y * -1; > + var xPos:Number = pt.x * -1; > + tip = ToolTipManager.createToolTip(dataPoint.getDescription() + "\n" + > + dataPoint.getTimestamp() + "\n" + > + dataPoint.getValue(), > + xPos,yPos) as ToolTip; > + tip.x = Math.min(tip.x, > + w - tip.width); > + tip.y = Math.max(0, > + tip.y - tip.height); > + } > + > + private function destroyTip(event:Event):void { > + ToolTipManager.destroyToolTip(tip); > + } > + } > +} > diff --git a/src/flexchart/org/ovirt/elements/TextLiberation.as b/src/flexchart/org/ovirt/elements/TextLiberation.as > new file mode 100644 > index 0000000..f0314a2 > --- /dev/null > +++ b/src/flexchart/org/ovirt/elements/TextLiberation.as > @@ -0,0 +1,46 @@ > +/* > + Copyright (C) 2008 Red Hat, Inc. > + Written by Steve Linabery <slinabery at redhat.com> > + > + This program is free software; you can redistribute it and/or modify > + it under the terms of the GNU General Public License as published by > + the Free Software Foundation; version 2 of the License. > + > + This program is distributed in the hope that it will be useful, > + but WITHOUT ANY WARRANTY; without even the implied warranty of > + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + GNU General Public License for more details. > + > + You should have received a copy of the GNU General Public License > + along with this program; if not, write to the Free Software > + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, > + MA 02110-1301, USA. A copy of the GNU General Public License is > + also available at http://www.gnu.org/copyleft/gpl.html. > +*/ > + > +package org.ovirt.elements { > + > + import mx.controls.Label; > + > + public class TextLiberation extends Label { > + > + //FIXME: this should point to a local asset somehow. > + [Embed(source='/usr/share/fonts/liberation/LiberationSans-Regular.ttf', > + fontName='liberation', > + mimeType='application/x-font' > + )] > + //this variable exists so that the compiler will link in the font. > + private var font1:Class; > + > + public function TextLiberation(text:String) { > + super(); > + this.text = text; > + this.setStyle("fontFamily","liberation"); > + } > + > + public function getTextWidth():Number { > + this.validateNow(); > + return this.textWidth; > + } > + } > +} > diff --git a/src/flexchart/org/ovirt/elements/YAxisLabel.as b/src/flexchart/org/ovirt/elements/YAxisLabel.as > new file mode 100644 > index 0000000..0e93b97 > --- /dev/null > +++ b/src/flexchart/org/ovirt/elements/YAxisLabel.as > @@ -0,0 +1,41 @@ > +/* > + Copyright (C) 2008 Red Hat, Inc. > + Written by Steve Linabery <slinabery at redhat.com> > + > + This program is free software; you can redistribute it and/or modify > + it under the terms of the GNU General Public License as published by > + the Free Software Foundation; version 2 of the License. > + > + This program is distributed in the hope that it will be useful, > + but WITHOUT ANY WARRANTY; without even the implied warranty of > + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + GNU General Public License for more details. > + > + You should have received a copy of the GNU General Public License > + along with this program; if not, write to the Free Software > + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, > + MA 02110-1301, USA. A copy of the GNU General Public License is > + also available at http://www.gnu.org/copyleft/gpl.html. > +*/ > + > +package org.ovirt.elements { > + > + import mx.containers.Box; > + import mx.core.ScrollPolicy; > + > + public class YAxisLabel extends Box { > + > + public var labelText:TextLiberation; > + > + public function YAxisLabel(text:String) { > + super(); > + labelText = new TextLiberation(text); > + labelText.setVisible(true); > + this.addChild(labelText); > + this.horizontalScrollPolicy = ScrollPolicy.OFF; > + this.verticalScrollPolicy = ScrollPolicy.OFF; > + this.setStyle("paddingLeft","0"); > + this.setStyle("paddingRight","0"); > + } > + } > +}Conditional ACK. This works for me as I understand we expect for the moment. I got back valid (so far as I can tell) data for memory, cpu, and load so long as I was looking at the default pool. However, if I looked at the data returned for a VmResourcePool, the data points were null. As we discussed in irc, I believe this is more a problem with what rrd is returning vs the actual graph. If this assumption is correct, then ACK, we can deal with the data issues separately. -j