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