| <?xml version="1.0" encoding="utf-8"?> |
| <!-- |
| |
| Licensed to the Apache Software Foundation (ASF) under one or more |
| contributor license agreements. See the NOTICE file distributed with |
| this work for additional information regarding copyright ownership. |
| The ASF licenses this file to You under the Apache License, Version 2.0 |
| (the "License"); you may not use this file except in compliance with |
| the License. You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
| |
| --> |
| <!-- Christophe Coenraets, http://coenraets.org --> |
| <s:Group xmlns:fx="http://ns.adobe.com/mxml/2009" |
| xmlns:s="library://ns.adobe.com/flex/spark"> |
| |
| <fx:Script> |
| <![CDATA[ |
| |
| import model.Stock; |
| |
| import mx.binding.utils.ChangeWatcher; |
| import mx.collections.ArrayCollection; |
| |
| [Bindable] |
| public var _stock:Stock; |
| |
| [Bindable] protected var minValue:Number; |
| [Bindable] protected var maxValue:Number; |
| |
| protected var minTime:Number; |
| protected var maxTime:Number; |
| |
| protected var changeWatcher:ChangeWatcher; |
| |
| public function set stock(stock:Stock):void |
| { |
| _stock = stock; |
| changeWatcher = ChangeWatcher.watch(_stock, "last", drawChart, false, true); |
| callLater(drawChart); |
| } |
| |
| public function drawChart(e:Event=null):void |
| { |
| var history:ArrayCollection = _stock.history; |
| minValue = history[0].last; |
| maxValue = history[0].last; |
| var i:int; |
| for (i=1; i<history.length; i++) |
| { |
| if (history[i].last < minValue) minValue = history[i].last; |
| if (history[i].last > maxValue) maxValue = history[i].last; |
| } |
| |
| var pathData:String = ""; |
| |
| var length:int = history.length; |
| |
| for (i=0; i<length; i++) |
| { |
| var yPos:Number = width - (history[i].last - minValue) / (maxValue - minValue) * width; |
| var xPos:Number = (i - 0) / (length - 1) * width; |
| pathData += (i==0 ? "M " : " L ") + xPos + " " + yPos; |
| } |
| path.data = pathData; |
| |
| } |
| |
| ]]> |
| </fx:Script> |
| |
| <fx:Declarations> |
| <s:NumberFormatter id="nf" fractionalDigits="2" trailingZeros="true"/> |
| </fx:Declarations> |
| |
| <s:states> |
| <s:State name="default"/> |
| <s:State name="landscape"/> |
| </s:states> |
| <s:Line top="0" left="60" right="0"> |
| <s:stroke> |
| <s:SolidColorStroke weight="1" color="#999999"/> |
| </s:stroke> |
| </s:Line> |
| <s:Line top="{height/4}" left="60" right="0"> |
| <s:stroke> |
| <s:SolidColorStroke weight="1" color="#999999"/> |
| </s:stroke> |
| </s:Line> |
| <s:Line top="{height/4*2}" left="60" right="0"> |
| <s:stroke> |
| <s:SolidColorStroke weight="1" color="#999999"/> |
| </s:stroke> |
| </s:Line> |
| <s:Line top="{height/4*3}" left="60" right="0"> |
| <s:stroke> |
| <s:SolidColorStroke weight="1" color="#999999"/> |
| </s:stroke> |
| </s:Line> |
| <s:Line bottom="0" left="60" right="0"> |
| <s:stroke> |
| <s:SolidColorStroke weight="1" color="#999999"/> |
| </s:stroke> |
| </s:Line> |
| |
| <s:Label top="-8" left="4" text="{nf.format(maxValue)}" fontSize="16" /> |
| <s:Label top="{height/4-8}" left="4" text="{nf.format(minValue + (maxValue-minValue)/4*3)}" fontSize="16"/> |
| <s:Label top="{height/4*2-8}" left="4" text="{nf.format(minValue + (maxValue-minValue)/2)}" fontSize="16"/> |
| <s:Label top="{height/4*3-8}" left="4" text="{nf.format(minValue + (maxValue-minValue)/4)}" fontSize="16"/> |
| <s:Label bottom="-8" left="4" text="{nf.format(minValue)}" fontSize="16" /> |
| |
| <s:Path id="path" width="100%" height="100%"> |
| <s:stroke> |
| <s:SolidColorStroke weight="1" color="#FF5900" /> |
| </s:stroke> |
| </s:Path> |
| |
| </s:Group> |