You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flex.apache.org by pe...@apache.org on 2015/04/03 20:31:21 UTC
git commit: [flex-asjs] [refs/heads/develop] - Updated MobileTrader
FlexJS example to be a little more "real world". This version is tested only
with ActionScript/browser combination. Uses remote server to obtain stock
prices and demonstrates FlexJS mobi
Repository: flex-asjs
Updated Branches:
refs/heads/develop a60374afc -> 7f179c9dd
Updated MobileTrader FlexJS example to be a little more "real world". This version is tested only with ActionScript/browser combination. Uses remote server to obtain stock prices and demonstrates FlexJS mobile navigators.
Project: http://git-wip-us.apache.org/repos/asf/flex-asjs/repo
Commit: http://git-wip-us.apache.org/repos/asf/flex-asjs/commit/7f179c9d
Tree: http://git-wip-us.apache.org/repos/asf/flex-asjs/tree/7f179c9d
Diff: http://git-wip-us.apache.org/repos/asf/flex-asjs/diff/7f179c9d
Branch: refs/heads/develop
Commit: 7f179c9dd1be5452395e7bd00abf0043ef3da011
Parents: a60374a
Author: Peter Ent <pe...@apache.org>
Authored: Fri Apr 3 09:23:09 2015 -0400
Committer: Peter Ent <pe...@apache.org>
Committed: Fri Apr 3 09:23:09 2015 -0400
----------------------------------------------------------------------
examples/MobileTrader/src/MobileTrader.mxml | 5 +-
examples/MobileTrader/src/MyInitialView.mxml | 79 ++++++++-
.../src/StockDataJSONItemConverter.as | 40 +++++
.../src/controller/AlertsViewController.as | 121 ++++++++++++++
examples/MobileTrader/src/controller/Feed.as | 162 -------------------
.../src/controller/WatchListController.as | 119 ++++++++++++++
examples/MobileTrader/src/models/Alert.as | 76 +++++++++
examples/MobileTrader/src/models/AssetsModel.as | 0
.../MobileTrader/src/models/ProductsModel.as | 131 +++++++++++++--
examples/MobileTrader/src/models/Stock.as | 130 +++++++++++++--
.../MobileTrader/src/renderers/AlertRenderer.as | 44 +++++
.../MobileTrader/src/renderers/StockRenderer.as | 0
examples/MobileTrader/src/views/AlertsView.mxml | 66 +++++++-
examples/MobileTrader/src/views/AssetsView.mxml | 0
examples/MobileTrader/src/views/SearchView.mxml | 0
examples/MobileTrader/src/views/StockView.mxml | 65 +++++++-
.../MobileTrader/src/views/WatchListView.mxml | 72 +++++++--
.../FlexJSJX/src/org/apache/flex/mobile/View.as | 22 ++-
.../src/org/apache/flex/core/Application.as | 3 +
19 files changed, 915 insertions(+), 220 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/7f179c9d/examples/MobileTrader/src/MobileTrader.mxml
----------------------------------------------------------------------
diff --git a/examples/MobileTrader/src/MobileTrader.mxml b/examples/MobileTrader/src/MobileTrader.mxml
old mode 100644
new mode 100755
index cc9a43c..7ef80ce
--- a/examples/MobileTrader/src/MobileTrader.mxml
+++ b/examples/MobileTrader/src/MobileTrader.mxml
@@ -22,15 +22,18 @@
xmlns:local="*"
xmlns:models="models.*"
xmlns:basic="library://ns.apache.org/flexjs/basic"
+ xmlns:controller="controller.*"
>
<basic:valuesImpl>
<basic:SimpleCSSValuesImpl />
</basic:valuesImpl>
+
<basic:model>
<models:ProductsModel />
</basic:model>
+
<basic:initialView>
- <local:MyInitialView />
+ <local:MyInitialView />
</basic:initialView>
</basic:Application>
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/7f179c9d/examples/MobileTrader/src/MyInitialView.mxml
----------------------------------------------------------------------
diff --git a/examples/MobileTrader/src/MyInitialView.mxml b/examples/MobileTrader/src/MyInitialView.mxml
old mode 100644
new mode 100755
index b50490f..13191fa
--- a/examples/MobileTrader/src/MyInitialView.mxml
+++ b/examples/MobileTrader/src/MyInitialView.mxml
@@ -18,10 +18,13 @@ limitations under the License.
-->
<basic:ViewBase xmlns:fx="http://ns.adobe.com/mxml/2009"
+ xmlns:local="*"
xmlns:basic="library://ns.apache.org/flexjs/basic"
xmlns:views="views.*"
xmlns:apache="org.apache.flex.html.beads.*"
- xmlns:html="org.apache.flex.html.*">
+ xmlns:html="org.apache.flex.html.*"
+ xmlns:controller="controller.*"
+ initComplete="onInitComplete()" xmlns:models="models.*" >
@@ -87,6 +90,23 @@ limitations under the License.
views|WatchListView {
width: 480px;
height: 640px;
+ IBeadController:ClassReference('controller.WatchListController');
+ }
+
+ .WatchListInner {
+ height: 480px;
+ width: 480px;
+ }
+
+ .WatchListDataGrid {
+ height: 480px;
+ width: 480px;
+ }
+
+ .WatchListInputArea {
+ background-color: #FFFFFF;
+ padding: 10px;
+ width: 480px;
}
views|StockView {
@@ -97,6 +117,7 @@ limitations under the License.
views|AlertsView {
width: 480px;
height: 640px;
+ IBeadController:ClassReference('controller.AlertsViewController');
}
.redCell {
@@ -107,6 +128,47 @@ limitations under the License.
color: #00FF00;
}
+ .ViewTitle {
+ font-size: 18pt;
+ font-weight: bold;
+ padding: 10pt;
+ }
+
+ .StockName {
+ font-size: 14pt;
+ font-weight: normal;
+ padding: 10pt;
+ }
+
+ .StockDetailArea {
+ padding: 10pt;
+ }
+
+ .StockLabel {
+ font-size: 18pt;
+ font-weight: normal;
+ color: #2255DD;
+ }
+
+ .StockRemoveButton {
+ background-color: #FF5522;
+ font-size: 16pt;
+ font-weight: bold;
+ color: #FFFFFF;
+ width: 200px;
+ height: 50px;
+ }
+
+ .StockRemoveButton:hover {
+ background-color: #DD3300;
+ }
+
+ .StockValue {
+ font-size: 18pt;
+ font-weight: normal;
+ color: #999999;
+ }
+
@media -flex-flash
{
.NavigationBar {
@@ -118,11 +180,24 @@ limitations under the License.
<fx:Script>
<![CDATA[
+ import org.apache.flex.core.IBeadController;
+ import org.apache.flex.core.IBeadModel;
import org.apache.flex.events.Event;
import org.apache.flex.mobile.IView;
import org.apache.flex.mobile.IViewManager;
import org.apache.flex.mobile.chrome.NavigationBar;
+ private function onInitComplete():void
+ {
+ // Give the model to the WatchListView's dataModel; do not replace
+ // a component's model with a custom model as that can adversely
+ // affect a component's behavior.
+ watchListView.dataModel = applicationModel as IBeadModel;
+
+ alertsView.dataModel = applicationModel as IBeadModel;
+ trace("alerts view set");
+ }
+
private function onAssetsNext():void
{
@@ -170,7 +245,7 @@ limitations under the License.
<basic:StackedViewManager id="watchListStack" title="Watch List" viewChanged="watchListStackChanged(event)">
<basic:views>
- <views:WatchListView id="watchListView" />
+ <views:WatchListView id="watchListView"/>
</basic:views>
</basic:StackedViewManager>
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/7f179c9d/examples/MobileTrader/src/StockDataJSONItemConverter.as
----------------------------------------------------------------------
diff --git a/examples/MobileTrader/src/StockDataJSONItemConverter.as b/examples/MobileTrader/src/StockDataJSONItemConverter.as
new file mode 100755
index 0000000..6640bd5
--- /dev/null
+++ b/examples/MobileTrader/src/StockDataJSONItemConverter.as
@@ -0,0 +1,40 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// 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.
+//
+////////////////////////////////////////////////////////////////////////////////
+package
+{
+ import org.apache.flex.net.JSONItemConverter;
+
+ public class StockDataJSONItemConverter extends JSONItemConverter
+ {
+ public function StockDataJSONItemConverter()
+ {
+ super();
+ }
+
+ override public function convertItem(data:String):Object
+ {
+ var obj:Object = super.convertItem(data);
+ if (obj["query"]["count"] == 0)
+ return "No Data";
+
+ obj = obj["query"]["results"]["quote"];
+ return obj;
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/7f179c9d/examples/MobileTrader/src/controller/AlertsViewController.as
----------------------------------------------------------------------
diff --git a/examples/MobileTrader/src/controller/AlertsViewController.as b/examples/MobileTrader/src/controller/AlertsViewController.as
new file mode 100644
index 0000000..dc41591
--- /dev/null
+++ b/examples/MobileTrader/src/controller/AlertsViewController.as
@@ -0,0 +1,121 @@
+package controller
+{
+ import models.Alert;
+ import models.ProductsModel;
+ import models.Stock;
+
+ import org.apache.flex.core.IBeadController;
+ import org.apache.flex.core.IBeadModel;
+ import org.apache.flex.core.IStrand;
+ import org.apache.flex.events.Event;
+ import org.apache.flex.events.EventDispatcher;
+ import org.apache.flex.utils.Timer;
+
+ import views.AlertsView;
+
+ public class AlertsViewController extends EventDispatcher implements IBeadController
+ {
+ public function AlertsViewController()
+ {
+ super();
+
+ timer = new Timer(updateInterval, 0);
+ timer.addEventListener("timer", timerHandler);
+ }
+
+ public var updateInterval:Number = 5000;
+
+ protected var timer:Timer;
+
+ private var _strand:IStrand;
+
+ public function set strand(value:IStrand):void
+ {
+ _strand = value;
+
+ var view:AlertsView = value as AlertsView;
+ view.addEventListener("alertSet", handleAlertSet);
+ }
+
+ private var _model:IBeadModel;
+ public function set model(value:IBeadModel):void
+ {
+ _model = value;
+ }
+ public function get model():IBeadModel
+ {
+ return _model;
+ }
+
+ private function handleAlertSet(event:Event):void
+ {
+ var view:AlertsView = _strand as AlertsView;
+
+ var sym:String = view.symbolField.text.toUpperCase();
+ var value:Number = Number(view.valueField.text);
+
+ var alert:Alert = new Alert();
+ alert.symbol = sym;
+ alert.value = value;
+ alert.greaterThan = view.higherCheck.selected;
+
+ // add this stock to the watch list in case it isn't there already
+ alert.stock = (model as ProductsModel).addStock(sym);
+
+ // set up the alert for the stock
+ (model as ProductsModel).addAlert(alert);
+
+ view.symbolField.text = "";
+ view.valueField.text = "";
+
+ subscribe();
+ }
+
+ public function subscribe():void
+ {
+ if (!timer.running)
+ {
+ timer.start();
+ }
+ }
+
+ public function unsubscribe():void
+ {
+ if (timer.running)
+ {
+ timer.stop();
+ }
+ }
+
+ /**
+ * When the timer goes off, verify all of the alerts against each stocks' last
+ * price.
+ */
+ protected function timerHandler(event:*):void
+ {
+ var alerts:Array = (model as ProductsModel).alerts;
+
+ if (alerts.length == 0) return;
+
+ for (var i:int=0; i < alerts.length; i++)
+ {
+ var alert:Alert = alerts[i] as Alert;
+ alert.message = "";
+
+ if (alert.greaterThan) {
+ if (alert.stock.last >= alert.value) {
+ alert.message = "Now @"+alert.stock.last;
+ }
+ }
+ else {
+ if (alert.stock.last <= alert.value) {
+ alert.message = "Now @"+alert.stock.last;
+ }
+ }
+ }
+
+ var newEvent:Event = new Event("alertsUpdate");
+ model.dispatchEvent(newEvent);
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/7f179c9d/examples/MobileTrader/src/controller/Feed.as
----------------------------------------------------------------------
diff --git a/examples/MobileTrader/src/controller/Feed.as b/examples/MobileTrader/src/controller/Feed.as
deleted file mode 100755
index 043f31a..0000000
--- a/examples/MobileTrader/src/controller/Feed.as
+++ /dev/null
@@ -1,162 +0,0 @@
-////////////////////////////////////////////////////////////////////////////////
-//
-// 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.
-//
-////////////////////////////////////////////////////////////////////////////////s
-package controller
-{
-// import flash.events.TimerEvent;
-
- import models.Stock;
-
- import org.apache.flex.core.IBeadModel;
- import org.apache.flex.core.IStrand;
- import org.apache.flex.events.Event;
- import org.apache.flex.events.EventDispatcher;
- import org.apache.flex.utils.Timer;
-
- [Event("change",org.apache.flex.events.Event)]
-
- public class Feed extends EventDispatcher implements IBeadModel
- {
- protected var index:int = 0;
-
- protected var updateOrder:Array = [6,4,1,7,0,3,2,5]; // used to simulated randomness of updates
-
- protected var timer:Timer;
-
- protected var stockMap:Object;
-
- private var _stockList:Array;
- public function get stockList():Array
- {
- return _stockList;
- }
- public function set stockList(value:Array):void
- {
- _stockList = value;
- }
-
- public function set strand(value:IStrand):void
- {
- // not used
- }
-
- public function Feed()
- {
- stockMap = new Object();
- stockList = new Array();
-
- stockList.push(new Stock("XOM", 81.39));
- stockList.push(new Stock("WMT", 51.47));
- stockList.push(new Stock("CVX", 102.93));
- stockList.push(new Stock("AIG", 36.01));
- stockList.push(new Stock("IBM", 155.49));
- stockList.push(new Stock("SAP", 57.53));
- stockList.push(new Stock("MOT", 41.50));
- stockList.push(new Stock("MCD", 73));
-
- var stockCount:int = stockList.length;
-
- for (var k:int = 0; k < stockCount; k++)
- {
- var s:Stock = stockList[k] as Stock;
- s.open = s.last;
- s.high = s.last;
- s.low = s.last;
- s.change = 0;
- stockMap[s.symbol] = s;
- }
-
- // Simulate history for the last 2 minutes
- for (var i:int=0; i < 120 ; i++)
- {
- for (var j:int=0 ; j<stockCount ; j++)
- {
- simulateChange(stockList[j] as Stock, false);
- }
- }
- timer = new Timer(1000 / 4, 0);
- timer.addEventListener("timer", timerHandler);
- }
-
- public function subscribe():void
- {
- if (!timer.running)
- {
- timer.start();
- }
- }
-
- public function unsubscribe():void
- {
- if (timer.running)
- {
- timer.stop();
- }
- }
-
- protected function timerHandler(event:*):void
- {
- if (index >= stockList.length) index = 0;
- simulateChange(stockList[updateOrder[index]] as Stock, true);
- index++;
-
- var newEvent:Event = new Event("update");
- this.dispatchEvent(newEvent);
- }
-
- protected function simulateChange(stock:Stock, removeFirst:Boolean = true):void
- {
- var maxChange:Number = stock.open * 0.005;
- var change:Number = maxChange - Math.random() * maxChange * 2;
-
- change = change == 0 ? 0.01 : change;
-
- var newValue:Number = stock.last + change;
-
- if (newValue > stock.open * 1.15 || newValue < stock.open * 0.85)
- {
- change = -change;
- newValue = stock.last + change;
- }
-
- stock.change = change;
- stock.last = newValue;
-
- if (stock.last > stock.high)
- {
- stock.high = stock.last;
- }
- else if (stock.last < stock.low || stock.low == 0)
- {
- stock.low = stock.last;
- }
-
- if (!stock.history)
- {
- stock.history = new Array();
- }
- if (removeFirst)
- {
- stock.history.splice(1,0);
- }
- stock.history.push({high: stock.high, low: stock.low, open: stock.open, last: stock.last});
-
- }
-
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/7f179c9d/examples/MobileTrader/src/controller/WatchListController.as
----------------------------------------------------------------------
diff --git a/examples/MobileTrader/src/controller/WatchListController.as b/examples/MobileTrader/src/controller/WatchListController.as
new file mode 100644
index 0000000..115d23f
--- /dev/null
+++ b/examples/MobileTrader/src/controller/WatchListController.as
@@ -0,0 +1,119 @@
+package controller
+{
+ import models.ProductsModel;
+ import models.Stock;
+
+ import org.apache.flex.core.IBeadController;
+ import org.apache.flex.core.IBeadModel;
+ import org.apache.flex.core.IStrand;
+ import org.apache.flex.events.Event;
+ import org.apache.flex.events.EventDispatcher;
+ import org.apache.flex.utils.Timer;
+
+ import views.StockView;
+ import views.WatchListView;
+
+ public class WatchListController extends EventDispatcher implements IBeadController
+ {
+ public function WatchListController()
+ {
+ super();
+
+ timer = new Timer(updateInterval, 0);
+ timer.addEventListener("timer", timerHandler);
+ }
+
+ public var updateInterval:Number = 5000;
+
+ protected var timer:Timer;
+
+ private var index:Number = 0;
+ private var selectedStock:Stock;
+ private var _strand:IStrand;
+
+ public function set strand(value:IStrand):void
+ {
+ _strand = value;
+
+ var view:WatchListView = value as WatchListView;
+ view.addEventListener("addSymbol", handleAddSymbol);
+ view.addEventListener("stockSelected", handleGridSelection);
+ }
+
+ private var _model:IBeadModel;
+ public function set model(value:IBeadModel):void
+ {
+ _model = value;
+ }
+ public function get model():IBeadModel
+ {
+ return _model;
+ }
+
+ private function handleAddSymbol(event:Event):void
+ {
+ var view:WatchListView = _strand as WatchListView;
+ var symbol:String = view.symbolName.text.toUpperCase();
+
+ view.symbolName.text = "";
+
+ (model as ProductsModel).addStock(symbol);
+
+ subscribe();
+ }
+
+ private function handleGridSelection(event:Event):void
+ {
+ var view:WatchListView = _strand as WatchListView;
+ selectedStock = (model as ProductsModel).watchList[view.selectedStockIndex] as Stock;
+ trace("Selected stock "+selectedStock.symbol);
+
+ var stockView:StockView = view.showStockDetails(selectedStock);
+ stockView.addEventListener("removeFromList", handleRemoveFromList);
+ }
+
+ public function handleRemoveFromList(event:Event):void
+ {
+ (model as ProductsModel).removeStock(selectedStock);
+
+ var view:WatchListView = _strand as WatchListView;
+ view.popView();
+ }
+
+ public function subscribe():void
+ {
+ if (!timer.running)
+ {
+ timer.start();
+ }
+ }
+
+ public function unsubscribe():void
+ {
+ if (timer.running)
+ {
+ timer.stop();
+ }
+ }
+
+ /**
+ * Each time the handler goes off a different stock in the list
+ * is updated. This keeps the app from sending too many requests
+ * all at once.
+ */
+ protected function timerHandler(event:*):void
+ {
+ var stockList:Array = (model as ProductsModel).watchList;
+
+ if (stockList.length == 0) return;
+
+ if (index >= stockList.length) index = 0;
+
+ (model as ProductsModel).updateStockData(stockList[index] as Stock);
+ index++;
+
+ var newEvent:Event = new Event("update");
+ model.dispatchEvent(newEvent);
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/7f179c9d/examples/MobileTrader/src/models/Alert.as
----------------------------------------------------------------------
diff --git a/examples/MobileTrader/src/models/Alert.as b/examples/MobileTrader/src/models/Alert.as
new file mode 100644
index 0000000..56fbd82
--- /dev/null
+++ b/examples/MobileTrader/src/models/Alert.as
@@ -0,0 +1,76 @@
+package models
+{
+ import org.apache.flex.events.Event;
+ import org.apache.flex.events.EventDispatcher;
+
+ public class Alert extends EventDispatcher
+ {
+ public function Alert()
+ {
+ super();
+ message = "";
+ }
+
+ private var _symbol:String;
+ private var _value:Number;
+ private var _greaterThan:Boolean;
+ private var _message:String;
+ private var _stock:Stock;
+
+ [Binding("symbolChanged")]
+ public function get symbol():String
+ {
+ return _symbol;
+ }
+ public function set symbol(value:String):void
+ {
+ _symbol = value;
+ dispatchEvent(new Event("symbolChanged"));
+ }
+
+ [Binding("messageChanged")]
+ public function get message():String
+ {
+ return _message;
+ }
+ public function set message(value:String):void
+ {
+ _message = value;
+ dispatchEvent(new Event("messageChanged"));
+ }
+
+ [Binding("valueChanged")]
+ public function get value():Number
+ {
+ return _value;
+ }
+ public function set value(newValue:Number):void
+ {
+ _value = newValue;
+ dispatchEvent(new Event("valueChanged"));
+ }
+
+ [Binding("greaterThanChanged")]
+ public function get greaterThan():Boolean
+ {
+ return _greaterThan;
+ }
+ public function set greaterThan(value:Boolean):void
+ {
+ _greaterThan = value;
+ dispatchEvent(new Event("greaterThanChanged"));
+ }
+
+ [Binding("stockChanged")]
+ public function get stock():Stock
+ {
+ return _stock;
+ }
+ public function set stock(value:Stock):void
+ {
+ _stock = value;
+ dispatchEvent(new Event("stockChanged"));
+ }
+
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/7f179c9d/examples/MobileTrader/src/models/AssetsModel.as
----------------------------------------------------------------------
diff --git a/examples/MobileTrader/src/models/AssetsModel.as b/examples/MobileTrader/src/models/AssetsModel.as
old mode 100644
new mode 100755
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/7f179c9d/examples/MobileTrader/src/models/ProductsModel.as
----------------------------------------------------------------------
diff --git a/examples/MobileTrader/src/models/ProductsModel.as b/examples/MobileTrader/src/models/ProductsModel.as
old mode 100644
new mode 100755
index dd1cf2e..553f091
--- a/examples/MobileTrader/src/models/ProductsModel.as
+++ b/examples/MobileTrader/src/models/ProductsModel.as
@@ -18,12 +18,38 @@
////////////////////////////////////////////////////////////////////////////////
package models
{
+ import org.apache.flex.core.IBeadModel;
+ import org.apache.flex.core.IStrand;
+ import org.apache.flex.events.Event;
import org.apache.flex.events.EventDispatcher;
+ import org.apache.flex.net.HTTPService;
+ import org.apache.flex.net.JSONInputParser;
+ import org.apache.flex.net.dataConverters.LazyCollection;
- public class ProductsModel extends EventDispatcher
+ public class ProductsModel extends EventDispatcher implements IBeadModel
{
public function ProductsModel()
{
+ super();
+
+ service = new HTTPService();
+ collection = new LazyCollection;
+ collection.inputParser = new JSONInputParser();
+ collection.itemConverter = new StockDataJSONItemConverter();
+ }
+
+ private var service:HTTPService;
+ private var collection:LazyCollection;
+ private var queryBegin:String = "http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20yahoo.finance.quotes%20where%20symbol%20in%20(%22";
+ private var queryEnd:String = "%22)%0A%09%09&env=http%3A%2F%2Fdatatables.org%2Falltables.env&format=json";
+
+ private var _strand:IStrand;
+ public function set strand(value:IStrand):void
+ {
+ _strand = value;
+
+ service.addBead(collection);
+ _strand.addBead(service);
}
private var _tabList:Array = ["Assets", "Watch", "Alerts"];
@@ -31,21 +57,104 @@ package models
{
return _tabList;
}
-
- private var _stockData:Array = [
- {stock:"XOM", open:81.39, last:86.22, high:88.40, low:81.30, image:""},
- {stock:"WMT", open:51.47, last:52.00, high:52.50, low:51.04, image:""},
- {stock:"CVX", open:102.93, last:104.13, high:104.41, low:101.15, image:""}
- ];
- public function get stockData():Array
- {
- return _stockData;
- }
private var _labelFields:Array = [ "id", "title", "detail" ];
public function get labelFields():Array
{
return _labelFields;
}
+
+ private var _watchList:Array = [];
+
+ public function get watchList():Array
+ {
+ return _watchList;
+ }
+
+ private var _alerts:Array = [];
+
+ public function get alerts():Array
+ {
+ return _alerts;
+ }
+
+ public function addAlert(value:Alert):void
+ {
+ for (var i:int =0; i < _alerts.length; i++)
+ {
+ var alert:Alert = _alerts[i] as Alert;
+ if (alert.symbol == value.symbol) {
+ _alerts[i] = value;
+ return;
+ }
+ }
+
+ _alerts.push(value);
+ dispatchEvent(new Event("alertsUpdate"));
+ }
+
+ public function addStock(symbol:String):Stock
+ {
+ for (var i:int=0; i < _watchList.length; i++)
+ {
+ var stock:Stock = _watchList[i];
+ if (stock.symbol == symbol) return stock;
+ }
+
+ stock = new Stock(symbol);
+
+ _watchList.push(stock);
+ dispatchEvent(new Event("update"));
+
+ updateStockData(stock);
+ return stock;
+ }
+
+ public function updateStockData(value:Stock):void
+ {
+ var sym:String = value.symbol;
+ service.url = queryBegin + sym + queryEnd;
+ service.send();
+ service.addEventListener("complete", completeHandler);
+ }
+
+ public function removeStock(stock:Stock):void
+ {
+ for (var i:int=0; i < alerts.length; i++)
+ {
+ var alert:Alert = alerts[i] as Alert;
+ if (stock.symbol == alert.symbol) {
+ alerts.splice(i,1);
+ break;
+ }
+ }
+
+ for (i=0; i < _watchList.length; i++)
+ {
+ var s:Stock = _watchList[i] as Stock;
+ if (stock.symbol == s.symbol) {
+ _watchList.splice(i,1);
+ break;
+ }
+ }
+
+ dispatchEvent(new Event("alertsUpdate"));
+ dispatchEvent(new Event("update"));
+ }
+
+ private function completeHandler(event:Event):void
+ {
+ var responseData:Object = collection.getItemAt(0);
+
+ var sym:String = responseData["Symbol"];
+ for (var i:int=0; i < _watchList.length; i++)
+ {
+ var stock:Stock = _watchList[i];
+ if (stock.symbol == sym) {
+ stock.updateFromData(responseData);
+ break;
+ }
+ }
+ }
}
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/7f179c9d/examples/MobileTrader/src/models/Stock.as
----------------------------------------------------------------------
diff --git a/examples/MobileTrader/src/models/Stock.as b/examples/MobileTrader/src/models/Stock.as
index 49e63d2..9e53f47 100755
--- a/examples/MobileTrader/src/models/Stock.as
+++ b/examples/MobileTrader/src/models/Stock.as
@@ -18,25 +18,131 @@
////////////////////////////////////////////////////////////////////////////////
package models
{
- public class Stock
- {
- public var symbol:String;
- public var name:String;
- public var low:Number;
- public var high:Number;
- public var open:Number;
- public var last:Number;
- public var change:Number = 0;
- public var date:Date;
-
+ import org.apache.flex.events.Event;
+ import org.apache.flex.events.EventDispatcher;
+
+ public class Stock extends EventDispatcher
+ {
public var history:Array;
- public function Stock(symbol:String, last:Number)
+ public function Stock(symbol:String=null, last:Number=0)
{
this.symbol = symbol;
this.last = last;
+ this.low = last;
+ this.high = last;
+ this.open = last;
+ this.change = 0;
+ this.name = "";
+ }
+
+ public function updateFromData(obj:Object):void
+ {
+ name = obj["Name"];
+ low = obj["DaysLow"];
+ high = obj["DaysHigh"];
+ open = obj["Open"];
+ change = obj["Change"];
+ symbol = obj["Symbol"];
+ last = obj["LastTradePriceOnly"];
+ }
+
+ private var _symbol:String;
+ private var _name:String;
+ private var _low:Number;
+ private var _high:Number;
+ private var _open:Number;
+ private var _last:Number;
+ private var _change:Number;
+ private var _date:Date;
+
+ [Bindable("symbolChanged")]
+ public function get symbol():String
+ {
+ return _symbol;
+ }
+ public function set symbol(value:String):void
+ {
+ _symbol = value;
+ dispatchEvent(new Event("symbolChanged"));
}
+ [Bindable("nameChanged")]
+ public function get name():String
+ {
+ return _name;
+ }
+ public function set name(value:String):void
+ {
+ _name = value;
+ dispatchEvent(new Event("nameChanged"));
+ }
+
+ [Bindable("lowChanged")]
+ public function get low():Number
+ {
+ return _low;
+ }
+ public function set low(value:Number):void
+ {
+ _low = value;
+ dispatchEvent(new Event("lowChanged"));
+ }
+
+ [Bindable("highChanged")]
+ public function get high():Number
+ {
+ return _high;
+ }
+ public function set high(value:Number):void
+ {
+ _high = value;
+ dispatchEvent(new Event("highChanged"));
+ }
+
+ [Bindable("openChanged")]
+ public function get open():Number
+ {
+ return _open;
+ }
+ public function set open(value:Number):void
+ {
+ _open = value;
+ dispatchEvent(new Event("openChanged"));
+ }
+
+ [Bindable("lastChanged")]
+ public function get last():Number
+ {
+ return _last;
+ }
+ public function set last(value:Number):void
+ {
+ _last = value;
+ dispatchEvent(new Event("lastChanged"));
+ }
+
+ [Bindable("changeChanged")]
+ public function get change():Number
+ {
+ return _change;
+ }
+ public function set change(value:Number):void
+ {
+ _change = value;
+ dispatchEvent(new Event("changeChanged"));
+ }
+
+ [Bindable("dateChanged")]
+ public function get date():Date
+ {
+ return _date;
+ }
+ public function set date(value:Date):void
+ {
+ _date = value;
+ dispatchEvent(new Event("dateChanged"));
+ }
}
}
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/7f179c9d/examples/MobileTrader/src/renderers/AlertRenderer.as
----------------------------------------------------------------------
diff --git a/examples/MobileTrader/src/renderers/AlertRenderer.as b/examples/MobileTrader/src/renderers/AlertRenderer.as
new file mode 100644
index 0000000..e683020
--- /dev/null
+++ b/examples/MobileTrader/src/renderers/AlertRenderer.as
@@ -0,0 +1,44 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// 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.
+//
+////////////////////////////////////////////////////////////////////////////////
+package renderers
+{
+ import org.apache.flex.html.supportClasses.StringItemRenderer;
+
+ public class AlertRenderer extends StringItemRenderer
+ {
+ public function AlertRenderer()
+ {
+ super();
+ }
+
+ override public function set data(value:Object):void
+ {
+ super.data = value;
+
+ if (labelField == "greaterThan") {
+ if (Boolean(value[labelField])) {
+ text = "when over "+value["value"];
+ }
+ else {
+ text = "when under "+value["value"];
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/7f179c9d/examples/MobileTrader/src/renderers/StockRenderer.as
----------------------------------------------------------------------
diff --git a/examples/MobileTrader/src/renderers/StockRenderer.as b/examples/MobileTrader/src/renderers/StockRenderer.as
old mode 100644
new mode 100755
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/7f179c9d/examples/MobileTrader/src/views/AlertsView.mxml
----------------------------------------------------------------------
diff --git a/examples/MobileTrader/src/views/AlertsView.mxml b/examples/MobileTrader/src/views/AlertsView.mxml
old mode 100644
new mode 100755
index 996fbd9..91b3c0e
--- a/examples/MobileTrader/src/views/AlertsView.mxml
+++ b/examples/MobileTrader/src/views/AlertsView.mxml
@@ -21,7 +21,7 @@ limitations under the License.
title="Alerts"
xmlns:basic="library://ns.apache.org/flexjs/basic"
xmlns:local="*"
- className="AlertsView">
+ className="AlertsView" xmlns:renderers="renderers.*">
<fx:Metadata>
[Event("next")]
@@ -29,16 +29,70 @@ limitations under the License.
<fx:Script>
<![CDATA[
+ import controller.AlertsViewController;
+
+ import org.apache.flex.core.IBeadModel;
import org.apache.flex.events.Event;
- private function gotoNext():void
+
+ public function set dataModel(value:IBeadModel):void
+ {
+ (controller as AlertsViewController).model = value;
+ }
+ public function get dataModel():IBeadModel
+ {
+ return (controller as AlertsViewController).model;
+ }
+
+ private function onAlertSet():void
{
- trace("goto next");
- dispatchEvent(new org.apache.flex.events.Event("next"));
+ dispatchEvent(new org.apache.flex.events.Event("alertSet"));
}
]]>
</fx:Script>
+
+ <basic:Container x="4" y="10" >
+ <basic:beads>
+ <basic:NonVirtualHorizontalLayout />
+ </basic:beads>
+ <basic:Label text="Symbol:" />
+ <basic:TextInput id="symbolField" />
+ <basic:Label text="Value:" />
+ <basic:TextInput id="valueField" />
+ <basic:CheckBox text="Higher?" id="higherCheck" />
+ <basic:TextButton text="Set" click="onAlertSet()" />
+ </basic:Container>
- <basic:Label text="Alerts View" x="20" y="100" />
- <basic:TextButton text="Next" x="20" y="150" click="gotoNext()" />
+ <basic:DataGrid x="0" y="40" width="480" height="200">
+ <basic:beads>
+ <basic:SimpleBinding
+ eventName="alertAdded"
+ sourceID="dataModel"
+ sourcePropertyName="alerts"
+ destinationPropertyName="dataProvider" />
+ </basic:beads>
+ <basic:columns>
+ <basic:DataGridColumn label="Symbol" dataField="symbol">
+ <basic:itemRenderer>
+ <fx:Component>
+ <basic:StringItemRenderer />
+ </fx:Component>
+ </basic:itemRenderer>
+ </basic:DataGridColumn>
+ <basic:DataGridColumn label="Alert" dataField="greaterThan">
+ <basic:itemRenderer>
+ <fx:Component>
+ <renderers:AlertRenderer />
+ </fx:Component>
+ </basic:itemRenderer>
+ </basic:DataGridColumn>
+ <basic:DataGridColumn label="Message" dataField="message">
+ <basic:itemRenderer>
+ <fx:Component>
+ <basic:StringItemRenderer />
+ </fx:Component>
+ </basic:itemRenderer>
+ </basic:DataGridColumn>
+ </basic:columns>
+ </basic:DataGrid>
</basic:View>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/7f179c9d/examples/MobileTrader/src/views/AssetsView.mxml
----------------------------------------------------------------------
diff --git a/examples/MobileTrader/src/views/AssetsView.mxml b/examples/MobileTrader/src/views/AssetsView.mxml
old mode 100644
new mode 100755
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/7f179c9d/examples/MobileTrader/src/views/SearchView.mxml
----------------------------------------------------------------------
diff --git a/examples/MobileTrader/src/views/SearchView.mxml b/examples/MobileTrader/src/views/SearchView.mxml
old mode 100644
new mode 100755
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/7f179c9d/examples/MobileTrader/src/views/StockView.mxml
----------------------------------------------------------------------
diff --git a/examples/MobileTrader/src/views/StockView.mxml b/examples/MobileTrader/src/views/StockView.mxml
old mode 100644
new mode 100755
index 9f9792b..31ff256
--- a/examples/MobileTrader/src/views/StockView.mxml
+++ b/examples/MobileTrader/src/views/StockView.mxml
@@ -25,20 +25,75 @@ limitations under the License.
<fx:Script>
<![CDATA[
+ import models.Stock;
+
+ import org.apache.flex.events.Event;
import org.apache.flex.mobile.StackedViewManager;
+
+ private var _stock:Stock;
+
+ [Bindable("stockChanged")]
+ public function get stock():Stock
+ {
+ return _stock;
+ }
+ public function set stock(value:Stock):void
+ {
+ _stock = value;
+ dispatchEvent(new org.apache.flex.events.Event("stockChanged"));
+ }
+
private function onBackClick() : void
{
(viewManager as StackedViewManager).pop();
}
- private function onNextClick() : void
+ override public function addedToParent():void
{
- var nextView:SearchView = new SearchView();
- (viewManager as StackedViewManager).push(nextView);
+ super.addedToParent();
+
+ stockSymbol.text = stock.symbol;
+ stockName.text = stock.name;
+ lastPrice.text = String(stock.last);
+ openPrice.text = String(stock.open);
+ lowPrice.text = String(stock.low);
+ highPrice.text = String(stock.high);
+ changeAmount.text = String(stock.change);
+ }
+
+ private function removeFromList():void
+ {
+ dispatchEvent(new org.apache.flex.events.Event("removeFromList"));
}
]]>
</fx:Script>
+
+ <basic:Container>
+ <basic:beads>
+ <basic:NonVirtualVerticalLayout />
+ <basic:ViewBaseDataBinding />
+ </basic:beads>
+ <basic:style>
+ <basic:SimpleCSSStyles top="10px" left="10px" />
+ </basic:style>
+
+ <basic:Label id="stockSymbol" text="{stock.symbol}" className="ViewTitle" />
+ <basic:Label id="stockName" text="{stock.name}" className="StockName" />
+
+ <basic:Container className="StockDetailArea">
+ <basic:beads>
+ <basic:VerticalColumnLayout numColumns="2" />
+ </basic:beads>
+
+ <basic:Label text="Last Price:" className="StockLabel" /> <basic:Label id="lastPrice" className="StockValue" />
+ <basic:Label text="Open Price:" className="StockLabel" /> <basic:Label id="openPrice" className="StockValue" />
+ <basic:Label text="Low Price:" className="StockLabel" /> <basic:Label id="lowPrice" className="StockValue" />
+ <basic:Label text="High Price:" className="StockLabel" /> <basic:Label id="highPrice" className="StockValue" />
+ <basic:Label text="Change: " className="StockLabel" /> <basic:Label id="changeAmount" className="StockValue" />
+ </basic:Container>
- <basic:Label text="Stock View" x="20" y="100" />
- <basic:TextButton text="Again" x="20" y="130" click="onNextClick()" />
+ <basic:Container className="StockDetailArea">
+ <basic:TextButton text="Remove From List" width="200" className="StockRemoveButton" click="removeFromList()" />
+ </basic:Container>
+ </basic:Container>
</basic:View>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/7f179c9d/examples/MobileTrader/src/views/WatchListView.mxml
----------------------------------------------------------------------
diff --git a/examples/MobileTrader/src/views/WatchListView.mxml b/examples/MobileTrader/src/views/WatchListView.mxml
old mode 100644
new mode 100755
index 5243ca8..b10b987
--- a/examples/MobileTrader/src/views/WatchListView.mxml
+++ b/examples/MobileTrader/src/views/WatchListView.mxml
@@ -27,10 +27,27 @@ limitations under the License.
<fx:Script>
<![CDATA[
+ import controller.WatchListController;
+
+ import models.ProductsModel;
+ import models.Stock;
+
+ import org.apache.flex.binding.SimpleBinding;
+ import org.apache.flex.core.IBeadController;
+ import org.apache.flex.core.IBeadModel;
import org.apache.flex.events.Event;
import org.apache.flex.mobile.IViewManager;
import org.apache.flex.mobile.StackedViewManager;
-
+
+ public function set dataModel(value:IBeadModel):void
+ {
+ (controller as WatchListController).model = value;
+ }
+ public function get dataModel():IBeadModel
+ {
+ return (controller as WatchListController).model;
+ }
+
private function onSelectStock():void
{
var stockView:StockView = new StockView();
@@ -38,37 +55,60 @@ limitations under the License.
(viewManager as StackedViewManager).push(stockView);
}
- private function onStockChange(event:org.apache.flex.events.Event):void
+ private function addSymbol():void
{
-
+ dispatchEvent(new org.apache.flex.events.Event("addSymbol"));
+ }
+
+ public var selectedStockIndex:Number;
+
+ private function selectRow():void
+ {
+ selectedStockIndex = dataGrid.selectedIndex;
+ dispatchEvent(new org.apache.flex.events.Event("stockSelected"));
}
- override public function addedToParent():void
+ public function showStockDetails(stock:Stock):StockView
{
- super.addedToParent();
+ var stockView:StockView = new StockView();
+ stockView.stock = stock;
+ (viewManager as StackedViewManager).push(stockView);
- var feed:Feed = this.model as Feed;
- feed.addEventListener("update",onStockChange);
- feed.subscribe();
+ return stockView;
+ }
+
+ public function popView():void
+ {
+ (viewManager as StackedViewManager).pop();
}
]]>
</fx:Script>
- <basic:model>
- <controller:Feed />
- </basic:model>
+ <basic:beads>
+ <basic:NonVirtualVerticalLayout />
+ </basic:beads>
+
+ <basic:Container className="WatchListInputArea">
+ <basic:beads>
+ <basic:NonVirtualHorizontalLayout />
+ </basic:beads>
+ <basic:Label text="Symbol:" />
+ <basic:TextInput id="symbolName" />
+ <basic:TextButton text="Add" click="addSymbol()" />
+ </basic:Container>
- <basic:Container x="0" y="0" width="480" className="WatchListInner">
+ <basic:Container x="0" y="0" className="WatchListInner">
<basic:beads>
- <basic:NonVirtualVerticalLayout />
+ <basic:ScrollingContainerView />
+ <basic:NonVirtualVerticalScrollingLayout />
</basic:beads>
- <basic:DataGrid width="480" height="380" change="onSelectStock()">
+ <basic:DataGrid id="dataGrid" change="selectRow()" width="480" height="480" className="WatchListDataGrid">
<basic:beads>
<basic:SimpleBinding
eventName="update"
- sourceID="model"
- sourcePropertyName="stockList"
+ sourceID="dataModel"
+ sourcePropertyName="watchList"
destinationPropertyName="dataProvider" />
</basic:beads>
<basic:columns>
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/7f179c9d/frameworks/as/projects/FlexJSJX/src/org/apache/flex/mobile/View.as
----------------------------------------------------------------------
diff --git a/frameworks/as/projects/FlexJSJX/src/org/apache/flex/mobile/View.as b/frameworks/as/projects/FlexJSJX/src/org/apache/flex/mobile/View.as
index 6b355f1..456116f 100644
--- a/frameworks/as/projects/FlexJSJX/src/org/apache/flex/mobile/View.as
+++ b/frameworks/as/projects/FlexJSJX/src/org/apache/flex/mobile/View.as
@@ -18,7 +18,10 @@
////////////////////////////////////////////////////////////////////////////////
package org.apache.flex.mobile
{
+ import org.apache.flex.core.IBead;
+ import org.apache.flex.core.IBeadController;
import org.apache.flex.core.IUIBase;
+ import org.apache.flex.core.ValuesManager;
import org.apache.flex.html.Container;
/**
@@ -57,12 +60,21 @@ package org.apache.flex.mobile
_viewManager = value;
}
- override public function addedToParent():void
+ private var _controller:IBeadController;
+ public function get controller():IBeadController
{
- super.addedToParent();
-// this.width = this.viewManager.contentWidth;
-// this.height = this.viewManager.contentHeight;
-// trace("Set View to "+this.width+"x"+this.height);
+ if (_controller == null) {
+ _controller = getBeadByType(IBeadController) as IBeadController;
+ if (_controller == null) {
+ _controller = new (ValuesManager.valuesImpl.getValue(this, "iBeadController")) as IBeadController;
+ addBead(_controller);
+ }
+ }
+ return _controller;
+ }
+ public function set controller(value:IBeadController):void
+ {
+ _controller = value;
}
}
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/7f179c9d/frameworks/as/projects/FlexJSUI/src/org/apache/flex/core/Application.as
----------------------------------------------------------------------
diff --git a/frameworks/as/projects/FlexJSUI/src/org/apache/flex/core/Application.as b/frameworks/as/projects/FlexJSUI/src/org/apache/flex/core/Application.as
index 9b9506e..0bc16b7 100644
--- a/frameworks/as/projects/FlexJSUI/src/org/apache/flex/core/Application.as
+++ b/frameworks/as/projects/FlexJSUI/src/org/apache/flex/core/Application.as
@@ -125,6 +125,9 @@ package org.apache.flex.core
private function initHandler(event:flash.events.Event):void
{
+ if (model) addBead(model as IBead);
+ if (controller) addBead(controller as IBead);
+
MouseEventConverter.setupAllConverters(stage);
for each (var bead:IBead in beads)