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 2016/09/22 21:10:04 UTC
[2/2] git commit: [flex-asjs] [refs/heads/develop] - New MobileStocks
app. A work in progress so it is not connected to the examples build yet.
New MobileStocks app. A work in progress so it is not connected to the examples build yet.
Project: http://git-wip-us.apache.org/repos/asf/flex-asjs/repo
Commit: http://git-wip-us.apache.org/repos/asf/flex-asjs/commit/c1682af6
Tree: http://git-wip-us.apache.org/repos/asf/flex-asjs/tree/c1682af6
Diff: http://git-wip-us.apache.org/repos/asf/flex-asjs/diff/c1682af6
Branch: refs/heads/develop
Commit: c1682af60f20a3a76dce40841fbb34d848baa1ff
Parents: 1dac615
Author: Peter Ent <pe...@apache.org>
Authored: Thu Sep 22 17:09:59 2016 -0400
Committer: Peter Ent <pe...@apache.org>
Committed: Thu Sep 22 17:09:59 2016 -0400
----------------------------------------------------------------------
.../flexjs/MobileStocks/MobileStocks-app.xml | 252 ++++++++++++++++
examples/flexjs/MobileStocks/build-web.xml | 61 ++++
examples/flexjs/MobileStocks/build.xml | 94 ++++++
examples/flexjs/MobileStocks/pom.xml | 94 ++++++
.../flexjs/MobileStocks/src/MobileStocks.mxml | 43 +++
.../flexjs/MobileStocks/src/MyInitialView.mxml | 264 +++++++++++++++++
.../src/StockDataJSONItemConverter.as | 40 +++
.../MobileStocks/src/assets/arrow_left_24.png | Bin 0 -> 47785 bytes
.../MobileStocks/src/assets/background.png | Bin 0 -> 49376 bytes
.../flexjs/MobileStocks/src/assets/logo.png | Bin 0 -> 55223 bytes
.../src/controller/AlertsViewController.as | 141 +++++++++
.../src/controller/LaunchViewController.as | 150 ++++++++++
.../src/controller/WatchListController.as | 139 +++++++++
.../flexjs/MobileStocks/src/models/Alert.as | 94 ++++++
.../flexjs/MobileStocks/src/models/Asset.as | 77 +++++
.../MobileStocks/src/models/AssetsModel.as | 57 ++++
.../MobileStocks/src/models/ProductsModel.as | 296 +++++++++++++++++++
.../flexjs/MobileStocks/src/models/Stock.as | 168 +++++++++++
.../MobileStocks/src/renderers/AlertRenderer.as | 44 +++
.../src/renderers/CompanyNameRenderer.as | 37 +++
.../src/renderers/SharesTotalRenderer.as | 37 +++
.../MobileStocks/src/renderers/StockRenderer.as | 47 +++
.../MobileStocks/src/views/AlertsView.mxml | 102 +++++++
.../MobileStocks/src/views/AssetsView.mxml | 125 ++++++++
.../MobileStocks/src/views/LaunchView.mxml | 161 ++++++++++
.../MobileStocks/src/views/SearchView.mxml | 37 +++
.../MobileStocks/src/views/StockView.mxml | 102 +++++++
.../MobileStocks/src/views/WatchListView.mxml | 154 ++++++++++
28 files changed, 2816 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/c1682af6/examples/flexjs/MobileStocks/MobileStocks-app.xml
----------------------------------------------------------------------
diff --git a/examples/flexjs/MobileStocks/MobileStocks-app.xml b/examples/flexjs/MobileStocks/MobileStocks-app.xml
new file mode 100644
index 0000000..e673bc5
--- /dev/null
+++ b/examples/flexjs/MobileStocks/MobileStocks-app.xml
@@ -0,0 +1,252 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<!--
+
+ 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.
+
+-->
+<application xmlns="http://ns.adobe.com/air/application/16.0">
+
+<!-- Adobe AIR Application Descriptor File Template.
+
+ Specifies parameters for identifying, installing, and launching AIR applications.
+
+ xmlns - The Adobe AIR namespace: http://ns.adobe.com/air/application/3.8
+ The last segment of the namespace specifies the version
+ of the AIR runtime required for this application to run.
+
+ minimumPatchLevel - The minimum patch level of the AIR runtime required to run
+ the application. Optional.
+-->
+
+ <!-- A universally unique application identifier. Must be unique across all AIR applications.
+ Using a reverse DNS-style name as the id is recommended. (Eg. com.example.ExampleApplication.) Required. -->
+ <id>org.apache.flexjs.mobilestocks</id>
+
+ <!-- Used as the filename for the application. Required. -->
+ <filename>Apache FlexJS Mobile Stocks Example</filename>
+
+ <!-- The name that is displayed in the AIR application installer.
+ May have multiple values for each language. See samples or xsd schema file. Optional. -->
+ <name>Apache FlexJS Mobile Stocks Example</name>
+
+ <!-- A string value of the format <0-999>.<0-999>.<0-999> that represents application version which can be used to check for application upgrade.
+ Values can also be 1-part or 2-part. It is not necessary to have a 3-part value.
+ An updated version of application must have a versionNumber value higher than the previous version. Required for namespace >= 2.5 . -->
+ <versionNumber>0.8.0</versionNumber>
+
+ <!-- A string value (such as "v1", "2.5", or "Alpha 1") that represents the version of the application, as it should be shown to users. Optional. -->
+ <!-- <versionLabel></versionLabel> -->
+
+ <!-- Description, displayed in the AIR application installer.
+ May have multiple values for each language. See samples or xsd schema file. Optional. -->
+ <!-- <description></description> -->
+
+ <!-- Copyright information. Optional -->
+ <copyright>Copyright 2016 The Apache Software Foundation.</copyright>
+
+ <!-- Publisher ID. Used if you're updating an application created prior to 1.5.3 -->
+ <!-- <publisherID></publisherID> -->
+
+ <!-- Settings for the application's initial window. Required. -->
+ <initialWindow>
+ <!-- The main SWF or HTML file of the application. Required. -->
+ <!-- Note: In Flash Builder, the SWF reference is set automatically. -->
+ <content>MobileStocks.swf</content>
+
+ <!-- The title of the main window. Optional. -->
+ <!-- <title></title> -->
+
+ <!-- The type of system chrome to use (either "standard" or "none"). Optional. Default standard. -->
+ <!-- <systemChrome></systemChrome> -->
+
+ <!-- Whether the window is transparent. Only applicable when systemChrome is none. Optional. Default false. -->
+ <!-- <transparent></transparent> -->
+
+ <!-- Whether the window is initially visible. Optional. Default false. -->
+ <!-- <visible></visible> -->
+
+ <!-- Whether the user can minimize the window. Optional. Default true. -->
+ <!-- <minimizable></minimizable> -->
+
+ <!-- Whether the user can maximize the window. Optional. Default true. -->
+ <!-- <maximizable></maximizable> -->
+
+ <!-- Whether the user can resize the window. Optional. Default true. -->
+ <!-- <resizable></resizable> -->
+
+ <!-- The window's initial width in pixels. Optional. -->
+ <width>640</width>
+
+ <!-- The window's initial height in pixels. Optional. -->
+ <height>720</height>
+
+ <!-- The window's initial x position. Optional. -->
+ <!-- <x></x> -->
+
+ <!-- The window's initial y position. Optional. -->
+ <!-- <y></y> -->
+
+ <!-- The window's minimum size, specified as a width/height pair in pixels, such as "400 200". Optional. -->
+ <!-- <minSize></minSize> -->
+
+ <!-- The window's initial maximum size, specified as a width/height pair in pixels, such as "1600 1200". Optional. -->
+ <!-- <maxSize></maxSize> -->
+
+ <!-- The initial aspect ratio of the app when launched (either "portrait" or "landscape"). Optional. Mobile only. Default is the natural orientation of the device -->
+
+ <!-- <aspectRatio></aspectRatio> -->
+
+ <!-- Whether the app will begin auto-orienting on launch. Optional. Mobile only. Default false -->
+
+ <!-- <autoOrients></autoOrients> -->
+
+ <!-- Whether the app launches in full screen. Optional. Mobile only. Default false -->
+
+ <!-- <fullScreen></fullScreen> -->
+
+ <!-- The render mode for the app (either auto, cpu, gpu, or direct). Optional. Default auto -->
+
+ <!-- <renderMode></renderMode> -->
+
+ <!-- Whether or not to pan when a soft keyboard is raised or lowered (either "pan" or "none"). Optional. Defaults "pan." -->
+ <!-- <softKeyboardBehavior></softKeyboardBehavior> -->
+ <autoOrients>false</autoOrients>
+ <fullScreen>false</fullScreen>
+ <visible>true</visible>
+ </initialWindow>
+
+ <!-- We recommend omitting the supportedProfiles element, -->
+ <!-- which in turn permits your application to be deployed to all -->
+ <!-- devices supported by AIR. If you wish to restrict deployment -->
+ <!-- (i.e., to only mobile devices) then add this element and list -->
+ <!-- only the profiles which your application does support. -->
+ <!-- <supportedProfiles>desktop extendedDesktop mobileDevice extendedMobileDevice</supportedProfiles> -->
+ <supportedProfiles>extendedDesktop desktop</supportedProfiles>
+
+ <!-- The subpath of the standard default installation location to use. Optional. -->
+ <installFolder>Apache Flex</installFolder>
+
+ <!-- The subpath of the Programs menu to use. (Ignored on operating systems without a Programs menu.) Optional. -->
+ <programMenuFolder>Apache Flex</programMenuFolder>
+
+ <!-- The icon the system uses for the application. For at least one resolution,
+ specify the path to a PNG file included in the AIR package. Optional. -->
+ <icon>
+ <image16x16>assets/icons/16.png</image16x16>
+ <image29x29>assets/icons/29.png</image29x29>
+ <image32x32>assets/icons/32.png</image32x32>
+ <image36x36>assets/icons/36.png</image36x36>
+ <image48x48>assets/icons/48.png</image48x48>
+ <image57x57>assets/icons/57.png</image57x57>
+ <image72x72>assets/icons/72.png</image72x72>
+ <image114x114>assets/icons/114.png</image114x114>
+ <image128x128>assets/icons/128.png</image128x128>
+ </icon>
+
+ <!-- Whether the application handles the update when a user double-clicks an update version
+ of the AIR file (true), or the default AIR application installer handles the update (false).
+ Optional. Default false. -->
+ <!-- <customUpdateUI></customUpdateUI> -->
+
+ <!-- Whether the application can be launched when the user clicks a link in a web browser.
+ Optional. Default false. -->
+ <!-- <allowBrowserInvocation></allowBrowserInvocation> -->
+
+ <!-- Listing of file types for which the application can register. Optional. -->
+ <!-- <fileTypes> -->
+
+ <!-- Defines one file type. Optional. -->
+ <!-- <fileType> -->
+
+ <!-- The name that the system displays for the registered file type. Required. -->
+ <!-- <name></name> -->
+
+ <!-- The extension to register. Required. -->
+ <!-- <extension></extension> -->
+
+ <!-- The description of the file type. Optional. -->
+ <!-- <description></description> -->
+
+ <!-- The MIME content type. -->
+ <!-- <contentType></contentType> -->
+
+ <!-- The icon to display for the file type. Optional. -->
+ <!-- <icon>
+ <image16x16></image16x16>
+ <image32x32></image32x32>
+ <image48x48></image48x48>
+ <image128x128></image128x128>
+ </icon> -->
+
+ <!-- </fileType> -->
+ <!-- </fileTypes> -->
+
+ <!-- iOS specific capabilities -->
+ <!-- <iPhone> -->
+ <!-- A list of plist key/value pairs to be added to the application Info.plist -->
+ <!-- <InfoAdditions>
+ <![CDATA[
+ <key>UIDeviceFamily</key>
+ <array>
+ <string>1</string>
+ <string>2</string>
+ </array>
+ <key>UIStatusBarStyle</key>
+ <string>UIStatusBarStyleBlackOpaque</string>
+ <key>UIRequiresPersistentWiFi</key>
+ <string>YES</string>
+ ]]>
+ </InfoAdditions> -->
+ <!-- A list of plist key/value pairs to be added to the application Entitlements.plist -->
+ <!-- <Entitlements>
+ <![CDATA[
+ <key>keychain-access-groups</key>
+ <array>
+ <string></string>
+ <string></string>
+ </array>
+ ]]>
+ </Entitlements> -->
+ <!-- Display Resolution for the app (either "standard" or "high"). Optional. Default "standard" -->
+ <!-- <requestedDisplayResolution></requestedDisplayResolution> -->
+ <!-- </iPhone> -->
+
+ <!-- Specify Android specific tags that get passed to AndroidManifest.xml file. -->
+ <!--<android> -->
+ <!-- <manifestAdditions>
+ <![CDATA[
+ <manifest android:installLocation="auto">
+ <uses-permission android:name="android.permission.INTERNET"/>
+ <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
+ <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
+ <uses-feature android:required="true" android:name="android.hardware.touchscreen.multitouch"/>
+ <application android:enabled="true">
+ <activity android:excludeFromRecents="false">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN"/>
+ <category android:name="android.intent.category.LAUNCHER"/>
+ </intent-filter>
+ </activity>
+ </application>
+ </manifest>
+ ]]>
+ </manifestAdditions> -->
+ <!-- Color depth for the app (either "32bit" or "16bit"). Optional. Default 16bit before namespace 3.0, 32bit after -->
+ <!-- <colorDepth></colorDepth> -->
+ <!-- </android> -->
+ <!-- End of the schema for adding the android specific tags in AndroidManifest.xml file -->
+
+</application>
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/c1682af6/examples/flexjs/MobileStocks/build-web.xml
----------------------------------------------------------------------
diff --git a/examples/flexjs/MobileStocks/build-web.xml b/examples/flexjs/MobileStocks/build-web.xml
new file mode 100644
index 0000000..6892dc0
--- /dev/null
+++ b/examples/flexjs/MobileStocks/build-web.xml
@@ -0,0 +1,61 @@
+<?xml version="1.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.
+
+-->
+
+
+<project name="mobilestocks" default="main" basedir=".">
+ <property name="FLEXJS_HOME" location="../../.."/>
+ <property name="example" value="MobileStocks" />
+
+ <property environment="env"/>
+ <property file="${FLEXJS_HOME}/build.properties"/>
+ <property name="FLEX_HOME" value="${FLEXJS_HOME}"/>
+ <property name="opt1_arg" value="-remove-circulars" />
+
+ <include file="${basedir}/../../build_example.xml" />
+
+ <condition property="extlib_arg" value="-external-library-path=${FLEXJS_HOME}/js/libs/js.swc" >
+ <and>
+ <not>
+ <isset property="extlib_arg" />
+ </not>
+ <available file="${FLEXJS_HOME}/js/libs/js.swc" type="file" />
+ </and>
+ </condition>
+ <condition property="extlib_arg" value="-external-library-path=${FALCONJX_HOME}/../js/libs/js.swc" >
+ <and>
+ <not>
+ <isset property="extlib_arg" />
+ </not>
+ <available file="${FALCONJX_HOME}/../js/libs/js.swc" type="file" />
+ </and>
+ </condition>
+ <property name="extlib_arg" value="-external-library-path=${FALCONJX_HOME}/../externs/js/out/bin/js.swc"/>
+
+ <target name="main" depends="clean,build_example.compile,build_example.compilejs" description="Clean build of ${example}">
+ </target>
+
+ <target name="clean">
+ <delete dir="${basedir}/bin" failonerror="false" />
+ <delete dir="${basedir}/bin-debug" failonerror="false" />
+ <delete dir="${basedir}/bin-release" failonerror="false" />
+ <delete dir="${basedir}/target" failonerror="false" />
+ </target>
+
+</project>
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/c1682af6/examples/flexjs/MobileStocks/build.xml
----------------------------------------------------------------------
diff --git a/examples/flexjs/MobileStocks/build.xml b/examples/flexjs/MobileStocks/build.xml
new file mode 100644
index 0000000..62d465e
--- /dev/null
+++ b/examples/flexjs/MobileStocks/build.xml
@@ -0,0 +1,94 @@
+<?xml version="1.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.
+
+-->
+
+
+<project name="mobilestocks" default="main" basedir=".">
+ <property name="FLEXJS_HOME" location="../../.."/>
+ <property name="example" value="MobileStocks" />
+
+ <!-- this project needs AIR 3.4 FP 11.4 -->
+ <property name="swf.version" value="17" />
+ <property name="playerglobal.version" value="11.4" />
+
+ <property file="${FLEXJS_HOME}/env.properties"/>
+ <property environment="env"/>
+ <property file="${FLEXJS_HOME}/build.properties"/>
+ <property name="FLEX_HOME" value="${FLEXJS_HOME}"/>
+ <property name="AIR_HOME" value="${env.AIR_HOME}"/>
+
+ <condition property="adl" value="adl.exe">
+ <os family="windows"/>
+ </condition>
+
+ <condition property="adl" value="adl">
+ <os family="mac"/>
+ </condition>
+
+ <condition property="runtime" value="win">
+ <os family="windows"/>
+ </condition>
+
+ <condition property="runtime" value="mac">
+ <os family="mac"/>
+ </condition>
+
+ <include file="${basedir}/../../build_example.xml" />
+
+ <condition property="extlib_arg" value="-external-library-path=${FLEXJS_HOME}/js/libs/cordova.swc" >
+ <and>
+ <not>
+ <isset property="extlib_arg" />
+ </not>
+ <available file="${FLEXJS_HOME}/js/libs/cordova.swc" type="file" />
+ </and>
+ </condition>
+ <condition property="extlib_arg" value="-external-library-path=${FALCONJX_HOME}/../js/libs/cordova.swc" >
+ <and>
+ <not>
+ <isset property="extlib_arg" />
+ </not>
+ <available file="${FALCONJX_HOME}/../js/libs/cordova.swc" type="file" />
+ </and>
+ </condition>
+ <property name="extlib_arg" value="-external-library-path=${FALCONJX_HOME}/../externs/cordova/out/bin/cordova.swc"/>
+ <property name="opt1_arg" value="-remove-circulars" />
+
+<!-- build_example.compileair, -->
+ <target name="main" depends="clean,build_example.compileair,build_example.compilejsair" description="Clean build of ${example}">
+ </target>
+
+ <target name="clean">
+ <echo>playerglobal.version = ${playerglobal.version}</echo>
+ <delete dir="${basedir}/bin" failonerror="false" />
+ <delete dir="${basedir}/bin-debug" failonerror="false" />
+ <delete dir="${basedir}/bin-release" failonerror="false" />
+ <delete dir="${basedir}/target" failonerror="false" />
+ </target>
+
+ <target name="run">
+ <exec executable="${AIR_HOME}/bin/${adl}" dir="${basedir}/bin-debug" failonerror="true">
+ <arg value="-runtime" />
+ <arg value="${AIR_HOME}/runtimes/air/${runtime}" />
+ <arg value="-profile" />
+ <arg value="extendedDesktop" />
+ <arg value="${basedir}/bin-debug/${example}-app.xml" />
+ </exec>
+ </target>
+</project>
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/c1682af6/examples/flexjs/MobileStocks/pom.xml
----------------------------------------------------------------------
diff --git a/examples/flexjs/MobileStocks/pom.xml b/examples/flexjs/MobileStocks/pom.xml
new file mode 100644
index 0000000..7868f63
--- /dev/null
+++ b/examples/flexjs/MobileStocks/pom.xml
@@ -0,0 +1,94 @@
+<?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.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <!--
+ TODO:
+ Flash Version:
+ Missing resources
+ -->
+
+ <parent>
+ <groupId>org.apache.flex.flexjs.examples</groupId>
+ <artifactId>examples-flexjs</artifactId>
+ <version>0.8.0-SNAPSHOT</version>
+ </parent>
+
+ <artifactId>MobileStocks</artifactId>
+ <version>0.8.0-SNAPSHOT</version>
+ <packaging>swf</packaging>
+
+ <name>Apache Flex - FlexJS: Examples: FlexJS: MobileStocks</name>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.flex.flexjs.compiler</groupId>
+ <artifactId>flexjs-maven-plugin</artifactId>
+ <extensions>true</extensions>
+ <configuration>
+ <mainClass>MobileStocks.mxml</mainClass>
+ <removeCirculars>true</removeCirculars>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-war-plugin</artifactId>
+ </plugin>
+ <plugin>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>build-helper-maven-plugin</artifactId>
+ </plugin>
+ </plugins>
+ </build>
+
+ <dependencies>
+ <dependency>
+ <groupId>com.adobe.flash.framework</groupId>
+ <artifactId>playerglobal</artifactId>
+ <version>${flash.version}</version>
+ <type>swc</type>
+ <scope>provided</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.flex.flexjs.framework</groupId>
+ <artifactId>Charts</artifactId>
+ <version>0.8.0-SNAPSHOT</version>
+ <type>swc</type>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.flex.flexjs.framework</groupId>
+ <artifactId>Mobile</artifactId>
+ <version>0.8.0-SNAPSHOT</version>
+ <type>swc</type>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.flex.flexjs.framework</groupId>
+ <artifactId>Network</artifactId>
+ <version>0.8.0-SNAPSHOT</version>
+ <type>swc</type>
+ </dependency>
+ </dependencies>
+
+</project>
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/c1682af6/examples/flexjs/MobileStocks/src/MobileStocks.mxml
----------------------------------------------------------------------
diff --git a/examples/flexjs/MobileStocks/src/MobileStocks.mxml b/examples/flexjs/MobileStocks/src/MobileStocks.mxml
new file mode 100755
index 0000000..5b208ba
--- /dev/null
+++ b/examples/flexjs/MobileStocks/src/MobileStocks.mxml
@@ -0,0 +1,43 @@
+<?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.
+//
+////////////////////////////////////////////////////////////////////////////////
+-->
+<js:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
+ xmlns:local="*"
+ xmlns:models="models.*"
+ xmlns:js="library://ns.apache.org/flexjs/basic"
+ >
+
+ <js:valuesImpl>
+ <js:SimpleCSSValuesImpl />
+ </js:valuesImpl>
+
+ <js:model>
+ <models:ProductsModel />
+ </js:model>
+
+ <js:initialView>
+ <local:MyInitialView width="100%" height="100%" />
+ </js:initialView>
+
+ <js:beads>
+ <js:MixinManager />
+ </js:beads>
+
+</js:Application>
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/c1682af6/examples/flexjs/MobileStocks/src/MyInitialView.mxml
----------------------------------------------------------------------
diff --git a/examples/flexjs/MobileStocks/src/MyInitialView.mxml b/examples/flexjs/MobileStocks/src/MyInitialView.mxml
new file mode 100755
index 0000000..11873b1
--- /dev/null
+++ b/examples/flexjs/MobileStocks/src/MyInitialView.mxml
@@ -0,0 +1,264 @@
+<?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.
+
+-->
+<js:View xmlns:fx="http://ns.adobe.com/mxml/2009"
+ xmlns:local="*"
+ xmlns:js="library://ns.apache.org/flexjs/basic"
+ xmlns:views="views.*"
+ xmlns:apache="org.apache.flex.html.beads.*"
+ xmlns:html="org.apache.flex.html.*"
+ xmlns:controller="controller.*"
+ initComplete="onInitComplete()" xmlns:models="models.*" >
+
+ <fx:Style>
+ @namespace js "library://ns.apache.org/flexjs/basic";
+ @namespace views "views.*";
+
+ js|Container {
+ background-color: #FFFFFF;
+ }
+
+ js|StackedViewManager {
+ padding-top: 0px;
+ padding-bottom: 0px;
+ padding-left: 0px;
+ padding-right: 0px;
+ }
+
+ js|TabbedViewManager {
+ position : absolute ;
+ height : 100% ;
+ width : 100% ;
+ left : 0px ;
+ top : 0px ;
+ border: solid 1px #444444;
+ background-color: #FFFFFF;
+ }
+
+ .NavigationBar {
+ background-image: url("assets/background.png");
+ height: 55px;
+ IBeadLayout: ClassReference("org.apache.flex.html.beads.layouts.HorizontalLayout");
+ }
+
+ .TabBar {
+ background-color: #DEDEDE;
+ height: 55px;
+ vertical-align: middle;
+ line-height: 55px;
+ }
+
+ .BackButton:hover {
+ background-image: url('assets/arrow_left_24.png');
+ }
+
+ .BackButton:active {
+ background-image: url('assets/arrow_left_24.png');
+ }
+
+ .BackButton {
+ background-image: url('assets/arrow_left_24.png');
+ }
+
+ .AssetsInner {
+ padding-top: 5px;
+ background-color: #FFFFFF;
+ }
+
+ views|AssetsView {
+ width: 100%;
+ height: 100%;
+ }
+
+ views|LaunchView {
+ width: 100%;
+ height: 100%;
+ IBeadController:ClassReference('controller.LaunchViewController');
+ background-color: #FFFFFF;
+ }
+
+ views|WatchListView {
+ width: 100%;
+ height: 100%;
+ IBeadController:ClassReference('controller.WatchListController');
+ background-color: #FFFFFF;
+ }
+
+ .WatchListInner {
+ height: 480px;
+ width: 100%;
+ background-color: #FFFFFF;
+ }
+
+ .WatchListDataGrid {
+ height: 480px;
+ width: 100%;
+ }
+
+ .WatchListInputArea {
+ background-color: #FFFFFF;
+ width: 480px;
+ height: 25px;
+ padding-top: 5px;
+ padding-bottom: 2px;
+ }
+
+ views|StockView {
+ width: 100%;
+ height: 100%;
+ }
+
+ views|AlertsView {
+ width: 100%;
+ height: 100%;
+ IBeadController:ClassReference('controller.AlertsViewController');
+ }
+
+ .redCell {
+ color: #FF0000;
+ }
+
+ .greenCell {
+ 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 {
+ IBackgroundBead: ClassReference("org.apache.flex.html.beads.BackgroundImageBead");
+ }
+ }
+
+ </fx:Style>
+
+ <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.IViewManagerView;
+ import org.apache.flex.mobile.IViewManager;
+ import org.apache.flex.mobile.chrome.NavigationBar;
+
+ import models.ProductsModel;
+
+ private function onInitComplete():void
+ {
+ (applicationModel as ProductsModel).loadDataFromStorage();
+ }
+
+ private function onAssetsNext():void
+ {
+
+ }
+
+ private function tabbedViewChanged(event:org.apache.flex.events.Event):void
+ {
+ var manager:IViewManager = event.currentTarget as IViewManager;
+ trace("TabbedViewChanged for "+manager);
+ }
+
+ private function watchListStackChanged(event:org.apache.flex.events.Event):void
+ {
+ trace("watchlist stack changed");
+ var manager:StackedViewManager = event.currentTarget as StackedViewManager;
+
+ var currentView:IViewManagerView = manager.selectedView;
+ backButton.visible = manager.views.length > 1;
+ }
+
+ private function goBack(event:org.apache.flex.events.MouseEvent):void
+ {
+ if (navController.selectedIndex == 1) {
+ watchListStack.pop();
+ }
+ }
+ ]]>
+ </fx:Script>
+
+ <js:beads>
+ <js:ViewDataBinding />
+ </js:beads>
+
+ <js:TabbedViewManager id="navController" width="100%" height="100%" x="0" y="0" viewChanged="tabbedViewChanged(event)">
+ <js:navigationBarItems>
+ <js:TextButton id="backButton" width="45" height="45" className="BackButton" visible="false" click="goBack(event)">
+ <js:beads>
+ <apache:ImageButtonView />
+ </js:beads>
+ </js:TextButton>
+ <js:Image source="assets/logo.png" width="218" height="55" />
+ </js:navigationBarItems>
+ <js:views>
+ <js:StackedViewManager title="Assets">
+ <js:views>
+ <views:LaunchView id="assetsView" title="Assets" next="onAssetsNext()" dataModel="{applicationModel}" />
+ </js:views>
+ </js:StackedViewManager>
+
+ <js:StackedViewManager id="watchListStack" title="Watch List" viewChanged="watchListStackChanged(event)">
+ <js:views>
+ <views:WatchListView id="watchListView" dataModel="{applicationModel}"/>
+ </js:views>
+ </js:StackedViewManager>
+ </js:views>
+ </js:TabbedViewManager>
+
+</js:View>
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/c1682af6/examples/flexjs/MobileStocks/src/StockDataJSONItemConverter.as
----------------------------------------------------------------------
diff --git a/examples/flexjs/MobileStocks/src/StockDataJSONItemConverter.as b/examples/flexjs/MobileStocks/src/StockDataJSONItemConverter.as
new file mode 100755
index 0000000..5c21c26
--- /dev/null
+++ b/examples/flexjs/MobileStocks/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.collections.converters.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/c1682af6/examples/flexjs/MobileStocks/src/assets/arrow_left_24.png
----------------------------------------------------------------------
diff --git a/examples/flexjs/MobileStocks/src/assets/arrow_left_24.png b/examples/flexjs/MobileStocks/src/assets/arrow_left_24.png
new file mode 100755
index 0000000..a3019ba
Binary files /dev/null and b/examples/flexjs/MobileStocks/src/assets/arrow_left_24.png differ
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/c1682af6/examples/flexjs/MobileStocks/src/assets/background.png
----------------------------------------------------------------------
diff --git a/examples/flexjs/MobileStocks/src/assets/background.png b/examples/flexjs/MobileStocks/src/assets/background.png
new file mode 100755
index 0000000..87bbd59
Binary files /dev/null and b/examples/flexjs/MobileStocks/src/assets/background.png differ
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/c1682af6/examples/flexjs/MobileStocks/src/assets/logo.png
----------------------------------------------------------------------
diff --git a/examples/flexjs/MobileStocks/src/assets/logo.png b/examples/flexjs/MobileStocks/src/assets/logo.png
new file mode 100755
index 0000000..0fb0f21
Binary files /dev/null and b/examples/flexjs/MobileStocks/src/assets/logo.png differ
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/c1682af6/examples/flexjs/MobileStocks/src/controller/AlertsViewController.as
----------------------------------------------------------------------
diff --git a/examples/flexjs/MobileStocks/src/controller/AlertsViewController.as b/examples/flexjs/MobileStocks/src/controller/AlertsViewController.as
new file mode 100644
index 0000000..76f230a
--- /dev/null
+++ b/examples/flexjs/MobileStocks/src/controller/AlertsViewController.as
@@ -0,0 +1,141 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// 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 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 org.apache.flex.collections.ArrayList;
+
+ 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).addStockToWatchList(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:ArrayList = (model as ProductsModel).alerts;
+
+ if (alerts.length == 0) return;
+
+ for (var i:int=0; i < alerts.length; i++)
+ {
+ var alert:Alert = alerts.getItemAt(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;
+ }
+ }
+ alerts.itemUpdatedAt(i);
+ }
+
+ 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/c1682af6/examples/flexjs/MobileStocks/src/controller/LaunchViewController.as
----------------------------------------------------------------------
diff --git a/examples/flexjs/MobileStocks/src/controller/LaunchViewController.as b/examples/flexjs/MobileStocks/src/controller/LaunchViewController.as
new file mode 100644
index 0000000..2b88d26
--- /dev/null
+++ b/examples/flexjs/MobileStocks/src/controller/LaunchViewController.as
@@ -0,0 +1,150 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// 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 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 org.apache.flex.collections.ArrayList;
+
+ import views.LaunchView;
+
+ public class LaunchViewController extends EventDispatcher implements IBeadController
+ {
+ public function LaunchViewController()
+ {
+ 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:LaunchView = value as LaunchView;
+ view.addEventListener("addSymbol", handleAddSymbol);
+ view.addEventListener("removeSymbol", handleRemoveSymbol);
+ view.addEventListener("symbolSelected", 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:LaunchView = _strand as LaunchView;
+ var symbol:String = view.symbolInput.text.toUpperCase();
+ var shares:Number = Number(view.sharesInput.text);
+ if (isNaN(shares) || shares < 0) shares = 0;
+
+ (model as ProductsModel).addStockToAssetList(symbol, shares);
+ (model as ProductsModel).saveDataToStorage();
+
+ subscribe();
+
+ view.symbolInput.text = "";
+ view.sharesInput.text = "";
+ view.addButton.text = "Add";
+ }
+
+ private function handleGridSelection(event:Event):void
+ {
+ var view:LaunchView = _strand as LaunchView;
+ var index:int = view.assetGrid.selectedIndex;
+ var data:Object = (model as ProductsModel).assetList.getItemAt(index);
+ view.symbolInput.text = data.symbol;
+ view.sharesInput.text = String(data.shares);
+
+ view.addButton.text = "Change";
+ }
+
+ public function handleRemoveSymbol(event:Event):void
+ {
+ var view:LaunchView = _strand as LaunchView;
+ var index:int = view.assetGrid.selectedIndex;
+ if (index < 0) return;
+
+ (model as ProductsModel).removeStockFromAssetListAtIndex(index);
+
+ view.symbolInput.text = "";
+ view.sharesInput.text = "";
+
+ view.addButton.text = "Add";
+ }
+
+ 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:ArrayList = (model as ProductsModel).assetList;
+
+ if (stockList.length == 0) return;
+
+ if (index >= stockList.length) index = 0;
+
+ (model as ProductsModel).updateStockData(stockList.getItemAt(index) as Stock);
+ index++;
+
+ var newEvent:Event = new Event("update");
+ model.dispatchEvent(newEvent);
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/c1682af6/examples/flexjs/MobileStocks/src/controller/WatchListController.as
----------------------------------------------------------------------
diff --git a/examples/flexjs/MobileStocks/src/controller/WatchListController.as b/examples/flexjs/MobileStocks/src/controller/WatchListController.as
new file mode 100644
index 0000000..0d94e5f
--- /dev/null
+++ b/examples/flexjs/MobileStocks/src/controller/WatchListController.as
@@ -0,0 +1,139 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// 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 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 org.apache.flex.collections.ArrayList;
+
+ 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).addStockToWatchList(symbol);
+ (model as ProductsModel).saveDataToStorage();
+
+ subscribe();
+ }
+
+ private function handleGridSelection(event:Event):void
+ {
+ var view:WatchListView = _strand as WatchListView;
+ selectedStock = (model as ProductsModel).watchList.getItemAt(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).removeStockFromWatchList(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:ArrayList = (model as ProductsModel).watchList;
+
+ if (stockList.length == 0) return;
+
+ if (index >= stockList.length) index = 0;
+
+ (model as ProductsModel).updateStockData(stockList.getItemAt(index) as Stock);
+ index++;
+
+ var newEvent:Event = new Event("update");
+ model.dispatchEvent(newEvent);
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/c1682af6/examples/flexjs/MobileStocks/src/models/Alert.as
----------------------------------------------------------------------
diff --git a/examples/flexjs/MobileStocks/src/models/Alert.as b/examples/flexjs/MobileStocks/src/models/Alert.as
new file mode 100644
index 0000000..7b9dc8b
--- /dev/null
+++ b/examples/flexjs/MobileStocks/src/models/Alert.as
@@ -0,0 +1,94 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// 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 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/c1682af6/examples/flexjs/MobileStocks/src/models/Asset.as
----------------------------------------------------------------------
diff --git a/examples/flexjs/MobileStocks/src/models/Asset.as b/examples/flexjs/MobileStocks/src/models/Asset.as
new file mode 100644
index 0000000..869ba72
--- /dev/null
+++ b/examples/flexjs/MobileStocks/src/models/Asset.as
@@ -0,0 +1,77 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// 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 models
+{
+ import org.apache.flex.events.Event;
+ import org.apache.flex.events.EventDispatcher;
+
+ public class Asset extends EventDispatcher
+ {
+ private var _label:String;
+ private var _value:Number;
+ private var _netChange:Number;
+
+ public function Asset(newLabel:String, newValue:Number, newNetChange:Number)
+ {
+ _label = newLabel;
+ _value = newValue;
+ _netChange = newNetChange;
+ }
+
+ [Bindable("labelChanged")]
+ public function get label():String
+ {
+ return _label;
+ }
+ public function set label(value:String):void
+ {
+ if (value != _label) {
+ _label = value;
+ dispatchEvent(new Event("labelChanged"));
+ }
+ }
+
+ [Bindable("valueChanged")]
+ public function get value():Number
+ {
+ return _value;
+ }
+ public function set value(newValue:Number):void
+ {
+ if (_value != newValue) {
+ _value = newValue;
+ dispatchEvent(new Event("valueChanged"));
+ }
+ }
+
+ [Bindable("netChangeChanged")]
+ public function get netChange():Number
+ {
+ return _netChange;
+ }
+ public function set netChange(value:Number):void
+ {
+ if (_netChange != value) {
+ _netChange = value;
+ dispatchEvent(new Event("netChangeChanged"));
+ }
+ }
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/c1682af6/examples/flexjs/MobileStocks/src/models/AssetsModel.as
----------------------------------------------------------------------
diff --git a/examples/flexjs/MobileStocks/src/models/AssetsModel.as b/examples/flexjs/MobileStocks/src/models/AssetsModel.as
new file mode 100755
index 0000000..3d72137
--- /dev/null
+++ b/examples/flexjs/MobileStocks/src/models/AssetsModel.as
@@ -0,0 +1,57 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// 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 models
+{
+ import org.apache.flex.core.IBeadModel;
+ import org.apache.flex.core.IStrand;
+ import org.apache.flex.events.EventDispatcher;
+ import org.apache.flex.collections.ArrayList;
+
+ public class AssetsModel extends EventDispatcher implements IBeadModel
+ {
+ public function AssetsModel()
+ {
+ super();
+ _assetsData = new ArrayList();
+ _assetsData.source = source;
+ }
+ private var source:Array = [
+ new Asset("NetWorth:", 161984, 2.36),
+ new Asset("Last Month:", 165915, 10.98),
+ new Asset("6 Months Ago:", 145962, 16.56),
+ new Asset("Last Year:", 138972, 8.36)
+ ];
+ private var _assetsData:ArrayList;
+
+ public function get assetsData():ArrayList
+ {
+ return _assetsData;
+ }
+
+ public function get assetsDataAsArray():Array
+ {
+ return source;
+ }
+
+ public function set strand(value:IStrand):void
+ {
+ // not used
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/c1682af6/examples/flexjs/MobileStocks/src/models/ProductsModel.as
----------------------------------------------------------------------
diff --git a/examples/flexjs/MobileStocks/src/models/ProductsModel.as b/examples/flexjs/MobileStocks/src/models/ProductsModel.as
new file mode 100755
index 0000000..91bc792
--- /dev/null
+++ b/examples/flexjs/MobileStocks/src/models/ProductsModel.as
@@ -0,0 +1,296 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// 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 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.collections.parsers.JSONInputParser;
+ import org.apache.flex.collections.LazyCollection;
+ import org.apache.flex.collections.ArrayList;
+
+ import org.apache.flex.storage.PermanentStorage;
+ import org.apache.flex.storage.events.FileEvent;
+ import org.apache.flex.storage.events.FileErrorEvent;
+
+ 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();
+
+ _watchList = new ArrayList();
+ _assetList = new ArrayList();
+ }
+
+ public function loadDataFromStorage():void
+ {
+ var storage:PermanentStorage = new PermanentStorage();
+ var useFile:String = "com.apache.flex.MobileStocks2";
+
+ storage.addEventListener("READ", handleRead);
+ storage.addEventListener("ERROR", handleReadError);
+ storage.readTextFromDataFile(useFile);
+ }
+
+ private function handleRead(event:FileEvent):void
+ {
+ trace(event.data);
+ var result:XML = new XML(event.data);
+ trace("XML parsing:");
+ trace(result);
+
+ var assetItems:XMLList = result..asset;
+ trace("Got "+assetItems.length()+" assets");
+ for each (var asset:XML in assetItems) {
+ trace("symbol = " + asset.@symbol + ", shares = " + asset.@shares);
+ addStockToAssetList(asset.@symbol, Number(asset.@shares));
+ }
+
+ var watchItems:XMLList = result..watch;
+ trace("Got "+watchItems.length()+" watches");
+ for each (var watch:XML in watchItems) {
+ trace("symbol = "+watch.@symbol);
+ addStockToWatchList(watch.@symbol);
+ }
+ }
+
+ private function handleReadError(event:FileErrorEvent):void
+ {
+ trace("Read error: "+event.errorMessage);
+ }
+
+ public function saveDataToStorage():void
+ {
+ var storage:PermanentStorage = new PermanentStorage();
+ var useFile:String = "com.apache.flex.MobileStocks2";
+ var assets:String = "";
+
+ for (var i:int=0; i < _assetList.length; i++) {
+ var stock:Stock = _assetList.getItemAt(i) as Stock;
+ assets = assets + '<asset symbol="'+stock.symbol+'" shares="'+stock.shares+'" />';
+ }
+
+ var watches:String = "";
+ for (i=0; i < _watchList.length; i++) {
+ stock = _watchList.getItemAt(i) as Stock;
+ watches = watches + '<watch symbol="'+stock.symbol+'" />';
+ }
+
+ var output:String = "<data><assets>"+assets+"</assets><watches>"+watches+"</watches></data>";
+
+ trace("Writing: "+output);
+
+ storage.addEventListener("WRITE", handleSave);
+ storage.addEventListener("ERROR", handleSaveError);
+ storage.writeTextToDataFile(useFile, output);
+ }
+
+ private function handleSave(event:FileEvent):void
+ {
+ trace("Save completed");
+ }
+
+ private function handleSaveError(event:FileErrorEvent):void
+ {
+ trace("Write error: "+event.errorMessage);
+ }
+
+ 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"];
+ public function get tabList():Array
+ {
+ return _tabList;
+ }
+
+ private var _labelFields:Array = [ "id", "title", "detail" ];
+ public function get labelFields():Array
+ {
+ return _labelFields;
+ }
+
+ private var _watchList:ArrayList;
+
+ public function get watchList():ArrayList
+ {
+ return _watchList;
+ }
+
+ private var _assetList:ArrayList;
+
+ public function get assetList():ArrayList
+ {
+ return _assetList;
+ }
+
+ public function addStockToAssetList(symbol:String, shares:Number):Stock
+ {
+ for (var i:int=0; i < _assetList.length; i++)
+ {
+ var stock:Stock = _assetList.getItemAt(i) as Stock;
+ if (stock.symbol == symbol) {
+ stock.shares = shares;
+ _assetList.itemUpdatedAt(i);
+ return stock;
+ }
+ }
+
+ stock = new Stock(symbol);
+ stock.shares = shares;
+
+ _assetList.addItem(stock);
+ updateStockData(stock);
+
+ return stock;
+ }
+
+ public function addStockToWatchList(symbol:String):Stock
+ {
+ for (var i:int=0; i < _watchList.length; i++)
+ {
+ var stock:Stock = _watchList.getItemAt(i) as Stock;
+ if (stock.symbol == symbol) {
+ _watchList.itemUpdatedAt(i);
+ return stock;
+ }
+ }
+
+ stock = new Stock(symbol);
+ _watchList.addItem(stock);
+ updateStockData(stock);
+ return stock;
+ }
+
+ public function removeStockFromWatchList(stock:Stock):void
+ {
+ for (var i:int=0; i < _watchList.length; i++)
+ {
+ var s:Stock = _watchList.getItemAt(i) as Stock;
+ if (stock.symbol == s.symbol) {
+ _watchList.removeItemAt(i);
+ break;
+ }
+ }
+
+ dispatchEvent(new Event("update"));
+ }
+
+ public function removeStockFromAssetListAtIndex(index:int):void
+ {
+ if (index >= 0 && index < _assetList.length) {
+ _assetList.removeItemAt(index);
+ dispatchEvent(new Event("update"));
+ }
+ }
+
+ // UPDATE STOCK INFORMATION FROM REMOTE SYSTEM
+
+ public function updateStockData(value:Stock):void
+ {
+ var sym:String = value.symbol;
+ service.url = queryBegin + sym + queryEnd;
+ service.send();
+ service.addEventListener("complete", completeHandler);
+ }
+
+ private function completeHandler(event:Event):void
+ {
+ var responseData:Object = collection.getItemAt(0);
+ var sym:String = responseData["Symbol"];
+
+ var queueNext:Stock = null;
+
+ for (var i:int=0; i < _watchList.length; i++)
+ {
+ var stock:Stock = _watchList.getItemAt(i) as Stock;
+ if (stock.symbol == sym) {
+ stock.updateFromData(responseData);
+ _watchList.itemUpdatedAt(i);
+ }
+ else if (stock.last == 0) {
+ queueNext = stock;
+ }
+ }
+
+ for (i=0; i < _assetList.length; i++)
+ {
+ stock = _assetList.getItemAt(i) as Stock;
+ if (stock.symbol == sym) {
+ stock.updateFromData(responseData);
+ _assetList.itemUpdatedAt(i);
+ }
+ else if (stock.last == 0) {
+ queueNext = stock;
+ }
+ }
+
+ if (queueNext != null) {
+ trace("--- queue: "+queueNext.symbol);
+ updateStockData(queueNext);
+ }
+
+ }
+
+
+
+
+ // discard alerts
+ private var _alerts:ArrayList;
+
+ public function get alerts():ArrayList
+ {
+ return _alerts;
+ }
+
+ public function addAlert(value:Alert):void
+ {
+ for (var i:int =0; i < _alerts.length; i++)
+ {
+ var alert:Alert = _alerts.getItemAt(i) as Alert;
+ if (alert.symbol == value.symbol) {
+ _alerts.setItemAt(value, i);
+ return;
+ }
+ }
+
+ _alerts.addItem(value);
+ dispatchEvent(new Event("alertsUpdate"));
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/c1682af6/examples/flexjs/MobileStocks/src/models/Stock.as
----------------------------------------------------------------------
diff --git a/examples/flexjs/MobileStocks/src/models/Stock.as b/examples/flexjs/MobileStocks/src/models/Stock.as
new file mode 100755
index 0000000..55f74cc
--- /dev/null
+++ b/examples/flexjs/MobileStocks/src/models/Stock.as
@@ -0,0 +1,168 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// 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 models
+{
+ 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=null, last:Number=0)
+ {
+ this.symbol = symbol;
+ this.last = last;
+ this.low = last;
+ this.high = last;
+ this.open = last;
+ this.change = 0;
+ this.name = "";
+ this.shares = 0;
+ }
+
+ 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"];
+ // shares do not change this way
+ }
+
+ 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;
+
+ private var _shares:Number;
+
+ [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"));
+ }
+
+ [Bindable("sharedChanged")]
+ public function get shares():Number
+ {
+ return _shares;
+ }
+ public function set shares(value:Number):void
+ {
+ _shares = value;
+ dispatchEvent(new Event("sharesChanged"));
+ }
+
+ public function get total():Number
+ {
+ return _shares * _last;
+ }
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/c1682af6/examples/flexjs/MobileStocks/src/renderers/AlertRenderer.as
----------------------------------------------------------------------
diff --git a/examples/flexjs/MobileStocks/src/renderers/AlertRenderer.as b/examples/flexjs/MobileStocks/src/renderers/AlertRenderer.as
new file mode 100644
index 0000000..e683020
--- /dev/null
+++ b/examples/flexjs/MobileStocks/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/c1682af6/examples/flexjs/MobileStocks/src/renderers/CompanyNameRenderer.as
----------------------------------------------------------------------
diff --git a/examples/flexjs/MobileStocks/src/renderers/CompanyNameRenderer.as b/examples/flexjs/MobileStocks/src/renderers/CompanyNameRenderer.as
new file mode 100644
index 0000000..e899b57
--- /dev/null
+++ b/examples/flexjs/MobileStocks/src/renderers/CompanyNameRenderer.as
@@ -0,0 +1,37 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// 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 CompanyNameRenderer extends StringItemRenderer
+ {
+ public function CompanyNameRenderer()
+ {
+ super();
+ }
+
+ override public function set data(value:Object):void
+ {
+ super.data = value;
+
+ text = data.name + " (" + data.symbol + ")";
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/c1682af6/examples/flexjs/MobileStocks/src/renderers/SharesTotalRenderer.as
----------------------------------------------------------------------
diff --git a/examples/flexjs/MobileStocks/src/renderers/SharesTotalRenderer.as b/examples/flexjs/MobileStocks/src/renderers/SharesTotalRenderer.as
new file mode 100644
index 0000000..f6ac94b
--- /dev/null
+++ b/examples/flexjs/MobileStocks/src/renderers/SharesTotalRenderer.as
@@ -0,0 +1,37 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// 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 SharesTotalRenderer extends StringItemRenderer
+ {
+ public function SharesTotalRenderer()
+ {
+ super();
+ }
+
+ override public function set data(value:Object):void
+ {
+ super.data = value;
+
+ text = "$"+String( int(data.total*100)/100.0 );
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/c1682af6/examples/flexjs/MobileStocks/src/renderers/StockRenderer.as
----------------------------------------------------------------------
diff --git a/examples/flexjs/MobileStocks/src/renderers/StockRenderer.as b/examples/flexjs/MobileStocks/src/renderers/StockRenderer.as
new file mode 100755
index 0000000..afba26f
--- /dev/null
+++ b/examples/flexjs/MobileStocks/src/renderers/StockRenderer.as
@@ -0,0 +1,47 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// 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 StockRenderer extends StringItemRenderer
+ {
+ public function StockRenderer()
+ {
+ super();
+ }
+
+ override public function set data(value:Object):void
+ {
+ super.data = value;
+
+ var n1:Number = Number(value[labelField]);
+ if (!isNaN(n1)) {
+ n1 = Math.round(n1*100)/100.0;
+
+ // something to keep in mind when using FlexJS for cross-platform
+ // use: make sure that public properties are used versus protected
+ // functions or properties. in most cases, internal vars and functions
+ // will be platform-specific whereas public properties and function
+ // should be cross-platform.
+ text = String(n1);
+ }
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/c1682af6/examples/flexjs/MobileStocks/src/views/AlertsView.mxml
----------------------------------------------------------------------
diff --git a/examples/flexjs/MobileStocks/src/views/AlertsView.mxml b/examples/flexjs/MobileStocks/src/views/AlertsView.mxml
new file mode 100755
index 0000000..3cc2b79
--- /dev/null
+++ b/examples/flexjs/MobileStocks/src/views/AlertsView.mxml
@@ -0,0 +1,102 @@
+<?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.
+
+-->
+<js:TitleView xmlns:fx="http://ns.adobe.com/mxml/2009"
+ title="Alerts"
+ xmlns:js="library://ns.apache.org/flexjs/basic"
+ xmlns:local="*"
+ className="AlertsView" xmlns:renderers="renderers.*">
+
+ <fx:Metadata>
+ [Event("next")]
+ </fx:Metadata>
+
+ <fx:Script>
+ <![CDATA[
+ import org.apache.flex.core.IBeadModel;
+ import org.apache.flex.core.IBeadController;
+ import org.apache.flex.events.Event;
+ import controller.AlertsViewController;
+
+ public function set dataModel(value:IBeadModel):void
+ {
+ var cm:IBeadController = controller;
+ (cm as AlertsViewController).model = value;
+ }
+ public function get dataModel():IBeadModel
+ {
+ var cm:IBeadController = controller;
+ return (cm as AlertsViewController).model;
+ }
+
+ private function onAlertSet():void
+ {
+ dispatchEvent(new org.apache.flex.events.Event("alertSet"));
+ }
+ ]]>
+ </fx:Script>
+
+ <js:Container x="4" y="10" >
+ <js:beads>
+ <js:HorizontalLayout />
+ </js:beads>
+ <js:Label text="Symbol:" />
+ <js:TextInput id="symbolField" width="50" />
+ <js:Label text="Value:" />
+ <js:TextInput id="valueField" width="50" />
+ <js:CheckBox text="Higher?" id="higherCheck" />
+ <js:TextButton text="Set" click="onAlertSet()" />
+ </js:Container>
+
+ <js:DataGrid id="dataGrid" x="0" y="40" width="100%" height="200">
+ <js:beads>
+ <js:DataProviderChangeNotifier sourceID="dataModel" propertyName="alerts"
+ destinationPropertyName="dataProvider" changeEventName="dataProviderChanged" />
+ <js:SimpleBinding
+ eventName="alertsUpdate"
+ sourceID="dataModel"
+ sourcePropertyName="alerts"
+ destinationPropertyName="dataProvider" />
+ </js:beads>
+ <js:columns>
+ <js:DataGridColumn label="Symbol" dataField="symbol">
+ <js:itemRenderer>
+ <fx:Component>
+ <js:StringItemRenderer />
+ </fx:Component>
+ </js:itemRenderer>
+ </js:DataGridColumn>
+ <js:DataGridColumn label="Alert" dataField="greaterThan">
+ <js:itemRenderer>
+ <fx:Component>
+ <renderers:AlertRenderer />
+ </fx:Component>
+ </js:itemRenderer>
+ </js:DataGridColumn>
+ <js:DataGridColumn label="Message" dataField="message">
+ <js:itemRenderer>
+ <fx:Component>
+ <js:StringItemRenderer />
+ </fx:Component>
+ </js:itemRenderer>
+ </js:DataGridColumn>
+ </js:columns>
+ </js:DataGrid>
+
+</js:TitleView>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/c1682af6/examples/flexjs/MobileStocks/src/views/AssetsView.mxml
----------------------------------------------------------------------
diff --git a/examples/flexjs/MobileStocks/src/views/AssetsView.mxml b/examples/flexjs/MobileStocks/src/views/AssetsView.mxml
new file mode 100755
index 0000000..944e759
--- /dev/null
+++ b/examples/flexjs/MobileStocks/src/views/AssetsView.mxml
@@ -0,0 +1,125 @@
+<?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.
+
+-->
+<js:TitleView xmlns:fx="http://ns.adobe.com/mxml/2009"
+ title="Assets"
+ xmlns:js="library://ns.apache.org/flexjs/basic"
+ xmlns:models="models.*"
+ xmlns:local="*"
+ className="AssetsView" xmlns:views="views.*">
+ <fx:Script>
+ <![CDATA[
+ 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.events.ValueChangeEvent;
+ import org.apache.flex.mobile.IViewManager;
+ import org.apache.flex.mobile.StackedViewManager;
+ import org.apache.flex.html.beads.DataProviderChangeNotifier;
+
+ private var localModel:ProductsModel;
+
+ public function set dataModel(value:IBeadModel):void
+ {
+ localModel = value as ProductsModel;
+
+ var newEvent:ValueChangeEvent = new ValueChangeEvent("valueChange", false, false, null, localModel);
+ newEvent.propertyName = "dataModel";
+ dispatchEvent(newEvent);
+ }
+ public function get dataModel():IBeadModel
+ {
+ return localModel;
+ }
+ ]]>
+ </fx:Script>
+
+ <fx:Metadata>
+ [Event("next")]
+ </fx:Metadata>
+
+ <js:beads>
+ <js:VerticalLayout />
+ </js:beads>
+
+ <js:model>
+ <models:AssetsModel />
+ </js:model>
+
+ <js:Label text="Summary" height="10%" />
+
+ <js:DataGrid id="assetGrid" height="150" width="100%">
+ <js:style>
+ <js:SimpleCSSStyles top="0" left="0" right="0" />
+ </js:style>
+ <js:beads>
+ <js:SimpleBinding
+ eventName="update"
+ sourceID="dataModel"
+ sourcePropertyName="watchList"
+ destinationPropertyName="dataProvider" />
+ <js:DataProviderChangeNotifier sourceID="dataModel" propertyName="watchList"
+ destinationPropertyName="dataProvider" changeEventName="dataProviderChanged" />
+ </js:beads>
+ <js:columns>
+ <js:DataGridColumn label="Symbol" dataField="symbol" />
+ <js:DataGridColumn label="Change" dataField="change" />
+ <js:DataGridColumn label="Last Value" dataField="last" />
+ </js:columns>
+ </js:DataGrid>
+
+ <js:Label text="Performance History" height="10%" />
+
+ <js:ColumnChart id="barChart" width="100%" height="40%">
+ <js:model>
+ <js:ChartArrayListSelectionModel />
+ </js:model>
+ <js:beads>
+ <js:DataItemRendererFactoryForSeriesArrayListData />
+ <js:ColumnChartLayoutForArrayList />
+ <js:SimpleBinding
+ eventName="update"
+ sourceID="dataModel"
+ sourcePropertyName="watchList"
+ destinationPropertyName="dataProvider" />
+ <js:DataProviderChangeNotifier sourceID="dataModel" propertyName="watchList"
+ destinationPropertyName="dataProvider" changeEventName="dataProviderChanged" />
+ <js:VerticalLinearAxisForArrayListBead valueField="last" />
+ <js:HorizontalCategoryAxisForArrayListBead categoryField="symbol" />
+ </js:beads>
+ <js:series>
+ <js:ColumnSeries yField="last">
+ <js:itemRenderer>
+ <fx:Component>
+ <js:BoxItemRenderer>
+ <js:fill>
+ <js:SolidColor color="#FF964D" alpha="1.0" />
+ </js:fill>
+ </js:BoxItemRenderer>
+ </fx:Component>
+ </js:itemRenderer>
+ </js:ColumnSeries>
+ </js:series>
+ </js:ColumnChart>
+
+</js:TitleView>
\ No newline at end of file