[Ovirt-devel] [PATCH server] Add tooltips, y-axis labels, and first animation transition to flexchart.

Jason Guiditta jguiditt at redhat.com
Fri Oct 31 20:52:38 UTC 2008


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




More information about the ovirt-devel mailing list