You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flex.apache.org by ah...@apache.org on 2014/08/28 23:05:10 UTC
[2/4] add mx and spark versions of FlexStore
http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/HomeView.mxml
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/HomeView.mxml b/FlexStore/spark/src/HomeView.mxml
new file mode 100644
index 0000000..a1ad46f
--- /dev/null
+++ b/FlexStore/spark/src/HomeView.mxml
@@ -0,0 +1,171 @@
+<?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.
+
+-->
+<!--
+This component is primarily static and is only meant to show what other
+pages of the store could look like.
+
+Note that this page was put together in the Design view so you'll see more
+hard coded locations and sizes.
+
+Also note when working with a Canvas that using the constraint styles
+(e.g., left, top, right, bottom) can provide better layout predictability than
+using x and y, especially when percentage widths and heights are used.
+
+Width and height are hard-coded in the root tag to help the Design view.
+-->
+<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009"
+ xmlns:s="library://ns.adobe.com/flex/spark"
+ xmlns="*" width="990" height="550">
+ <fx:Script>
+ <![CDATA[
+ import mx.controls.Alert;
+
+ public function updateMapImage():void
+ {
+ mapImage.source = mapCanvas.getStyle('dottedMap');
+ }
+ ]]>
+ </fx:Script>
+ <s:HGroup width="100%" height="100%" y="0" x="0" styleName="colorPanel">
+
+ <s:VGroup width="230" height="100%">
+ <s:Group width="100%" height="100%">
+
+ <s:BorderContainer left="10" top="10" width="100%" height="60" backgroundColor="#ebebe9" styleName="homeSection">
+ <s:Label left="10" top="10" text="Search Developers" height="22" styleName="sectionHeader"/>
+ <s:Button left="168" top="30" label="Go" width="47" height="20" styleName="glass" click="Alert.show('This feature is not implemented in this sample', 'Go')"/>
+ <s:TextInput left="10" top="30" height="20" width="150"/>
+ </s:BorderContainer>
+
+ <s:BorderContainer left="10" top="78" width="100%" height="280" backgroundColor="#ffffff" styleName="homeSection">
+ <s:VGroup left="10" top="10" width="100%" height="100%" gap="0">
+ <s:Label text="Flex Experts That Can Help You" styleName="sectionHeader"/>
+ <s:Line height="5" width="197"/>
+ <s:Label text="General" styleName="homeProgramHeader"/>
+ <s:Label text="BlazeDS Experts" fontSize="9"/>
+ <s:Spacer height="8" width="100%"/>
+ <s:Label text="Server-side" styleName="homeProgramHeader"/>
+ <s:Label text="Java, PHP Developers" fontSize="9"/>
+ <s:Spacer height="8" width="100%"/>
+ <s:Label text="Mobile" styleName="homeProgramHeader"/>
+ <s:Label text="Android, IOS and more" fontSize="9"/>
+ <s:Spacer height="8" width="100%"/>
+ <s:Label text="Students" styleName="homeProgramHeader"/>
+ <s:Label text="Free Assistance" fontSize="9"/>
+ <s:Spacer height="8" width="100%"/>
+ </s:VGroup>
+ </s:BorderContainer>
+
+ <s:BorderContainer left="10" top="366" width="100%" height="174" styleName="homeSection" backgroundColor="#ebebe9">
+ <s:VGroup left="10" top="10" width="100%" height="100%" gap="0">
+
+ <s:Label text="Manage My Account" styleName="sectionHeader"/>
+
+ <s:Label text="Phone Number"/>
+
+ <s:HGroup width="100%" height="25" horizontalAlign="left" verticalAlign="middle">
+ <s:TextInput height="20" width="40"/>
+ <s:Line width="8" height="25"/>
+ <s:TextInput height="20" width="40"/>
+ <s:Line width="8" height="25"/>
+ <s:TextInput height="20" width="40"/>
+ </s:HGroup>
+
+ <s:Label text="Password"/>
+ <s:TextInput height="20"/>
+ <s:Spacer height="8" width="100%"/>
+
+ <s:CheckBox label="Remember my phone number" selected="true"/>
+ <s:Spacer height="8" width="100%"/>
+
+ <s:Button label="Login" styleName="glass" height="20" width="55" click="Alert.show('This feature is not implemented in this sample', 'Login')"/>
+
+ </s:VGroup>
+ </s:BorderContainer>
+
+ </s:Group>
+
+ </s:VGroup>
+
+ <s:VGroup width="750" height="100%">
+ <s:Group width="100%" height="100%">
+
+ <!-- can't use binding to set the mapImage source because the style isn't available early enough -->
+ <s:Group id="mapCanvas" width="100%" height="35%" styleName="homeMap" right="10" top="10">
+ <s:Image id="mapImage" width="487" height="100%" alpha="1.0" left="10" top="10"/>
+ <s:Label y="110" text="US Developers . Flex . FlexJS" width="95%" height="40" horizontalCenter="0" fontWeight="bold" fontSize="22" color="#ffffff" fontFamily="Arial" textAlign="center"/>
+ <s:Label text="Learn More >>" width="95" bottom="10" right="10" fontSize="12" fontFamily="Arial"/>
+ <s:Label text="$60/hr" fontSize="20" right="10" top="10" color="#ffffff" fontWeight="bold" fontFamily="Arial"/>
+ <s:Label text="Rates as low as" x="551" top="16" fontSize="12"/>
+ </s:Group>
+
+ <s:BorderContainer width="100%" height="330" backgroundColor="#ffffff" borderStyle="solid" cornerRadius="4" bottom="10" right="10">
+
+ <s:Label left="10" top="10" text="Featured Developers" width="173" height="25" styleName="sectionHeader"/>
+
+ <s:HGroup left="0" top="43" width="100%" height="100%">
+
+ <s:VGroup width="33%" height="100%">
+
+ <s:Group width="100%">
+ <s:Image source="@Embed('/assets/akotter.jpg')" horizontalCenter="0" verticalCenter="0"/>
+ </s:Group>
+
+ <s:Group width="100%">
+ <s:Label text="Annette Kotter" horizontalCenter="0" id="feat_prod_1" fontWeight="bold" fontSize="12"/>
+ </s:Group>
+
+ </s:VGroup>
+
+ <s:VGroup width="33%" height="100%">
+
+ <s:Group width="100%">
+ <s:Image horizontalCenter="0" verticalCenter="0" source="@Embed('/assets/bcrater.jpg')"/>
+ </s:Group>
+
+ <s:Group width="100%">
+ <s:Label text="Ben Crater" horizontalCenter="0" id="feat_prod_2" fontWeight="bold" fontSize="12"/>
+ </s:Group>
+
+ </s:VGroup>
+
+ <s:VGroup width="33%" height="100%">
+
+ <s:Group width="100%">
+ <s:Image horizontalCenter="0" verticalCenter="0" source="@Embed('/assets/jproctor.jpg')"/>
+ </s:Group>
+
+ <s:Group width="100%">
+ <s:Label text="Jane Proctor" horizontalCenter="0" id="feat_prod_3" fontWeight="bold" fontSize="12"/>
+ </s:Group>
+
+ </s:VGroup>
+
+ </s:HGroup>
+
+ </s:BorderContainer>
+
+ </s:Group>
+
+ </s:VGroup>
+
+ </s:HGroup>
+
+</s:Group>
http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/ProductsView.mxml
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/ProductsView.mxml b/FlexStore/spark/src/ProductsView.mxml
new file mode 100644
index 0000000..ac76f3f
--- /dev/null
+++ b/FlexStore/spark/src/ProductsView.mxml
@@ -0,0 +1,116 @@
+<?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.
+
+-->
+<!-- width and height hard-coded in the root tag to better support the
+ Design view in FlexBuilder since we know the width and height from the
+ settings in flexstore.mxml -->
+<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009"
+ xmlns:s="library://ns.adobe.com/flex/spark"
+ xmlns:productsView="productsView.*"
+ width="990" height="550"
+ currentState="showFilter"
+ creationComplete="trace('pview')"
+ >
+
+ <fx:Script>
+ <![CDATA[
+ import mx.collections.ArrayCollection;
+ import samples.flexstore.Product;
+
+ private var _catalog:ArrayCollection;
+
+ [Bindable]
+ public function get catalog():ArrayCollection
+ {
+ return _catalog;
+ }
+
+ public function set catalog(c:ArrayCollection):void
+ {
+ _catalog = c;
+ if (filterPanel != null)
+ {
+ filterPanel.filter.count = c.length;
+ }
+ }
+
+ public function addToCompare(product:Product):void
+ {
+ //setting the state before adding the product avoids jumpiness in the transition, not sure why
+ currentState = 'showFilter';
+ filterPanel.productList.addProduct(product);
+ }
+
+ public function addToCart(product:Product):void
+ {
+ //setting the state before adding the product avoids jumpiness in the transition, not sure why
+ currentState = 'showCart';
+ cartPanel.productList.addProduct(product);
+ }
+
+
+ ]]>
+ </fx:Script>
+
+ <s:HGroup
+ styleName="colorPanel"
+ height="100%" width="100%"
+ gap="0">
+
+ <productsView:Grip id="filterGrip" gripIcon="@Embed('/assets/icon_magnifier.png')"
+ gripTip="Show filter panel" click="currentState = 'showFilter'"/>
+
+ <productsView:ProductFilterPanel id="filterPanel" width="265" height="100%"
+ filter="catalogPanel.filter(event.filter, event.live)"
+ compare="catalogPanel.compare(filterPanel.productList.getProducts())"
+ creationComplete="if (catalog) filterPanel.filter.count = catalog.length"/>
+
+ <s:Spacer width="100%"/>
+
+ <productsView:ProductCart id="cartPanel" width="265" height="100%"/>
+
+ <productsView:Grip id="cartGrip" gripIcon="@Embed('/assets/icon_cart_empty.png')"
+ gripTip="Show cart" click="currentState = 'showCart'"/>
+
+ </s:HGroup>
+
+ <productsView:ProductCatalogPanel id="catalogPanel" y="4" width="685" height="540"
+ left.showFilter="285"
+ right.showCart="285"
+ catalog="{catalog}"
+ compare="addToCompare(event.product)"
+ purchase="addToCart(event.product)"
+ cartCount="{cartPanel.numProducts}"/>
+
+ <s:states>
+ <s:State name="showFilter" />
+ <s:State name="showCart" />
+ </s:states>
+
+ <!--
+ make sure to use transitions here instead of applying a Move effect
+ to the Panel itself which will result in odd behavior
+ -->
+ <s:transitions>
+ <s:Transition fromState="*" toState="*">
+ <s:Move target="{catalogPanel}" />
+ </s:Transition>
+ </s:transitions>
+
+</s:Group>
http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/SupportView.mxml
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/SupportView.mxml b/FlexStore/spark/src/SupportView.mxml
new file mode 100644
index 0000000..a2a089b
--- /dev/null
+++ b/FlexStore/spark/src/SupportView.mxml
@@ -0,0 +1,144 @@
+<?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.
+
+-->
+<!--
+This component is primarily static and is only meant to show what other
+pages of the store could look like.
+
+Note that this page was put together in the Design view so you'll see more
+hard coded locations and sizes.
+
+We did not have sizing issues here as much so you'll see more hardcoded
+"y" values rather than "top."
+
+The width and height are hard-coded in the root tag to help the Design view.
+-->
+<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009"
+ xmlns:s="library://ns.adobe.com/flex/spark" xmlns="*" alpha="1.0"
+ width="990" height="550">
+
+ <fx:Script>
+ <![CDATA[
+ import mx.controls.Alert;
+ ]]>
+ </fx:Script>
+
+ <fx:Declarations>
+ <fx:XML id="locationsModel">
+ <root>
+ <location image="assets/support_mapmarker_a.png" name="601 Townsend St" />
+ <location image="assets/support_mapmarker_b.png" name="Location B" />
+ <location image="assets/support_mapmarker_c.png" name="Location C" />
+ </root>
+ </fx:XML>
+
+ <s:ArrayCollection id="locations" source="{locationsModel.root.location}"/>
+ </fx:Declarations>
+
+ <s:HGroup x="0" y="0" width="100%" height="100%" styleName="colorPanel">
+
+ <s:VGroup width="32%" height="100%">
+ <s:Group width="100%" height="60%">
+
+ <s:Label y="10" text="Check Location" styleName="sectionHeader" x="20"/>
+
+ <s:Form width="95%" height="150" y="64" horizontalCenter="0">
+ <s:layout>
+ <s:VerticalLayout gap="8" paddingBottom="0" paddingRight="0" paddingTop="5" />
+ </s:layout>
+ <s:FormItem label="Address:" width="100%">
+ <s:TextInput id="address" width="90%"/>
+ </s:FormItem>
+
+ <s:FormItem label="City:" width="100%">
+ <s:TextInput id="city" width="60%"/>
+ </s:FormItem>
+
+ <s:FormItem label="State:" width="100%">
+ <s:ComboBox id="state" width="50%">
+ <s:dataProvider>
+ <s:ArrayList>
+ <fx:Array>
+ <fx:String>California</fx:String>
+ <fx:String>Nevada</fx:String>
+ <fx:String>Oregon</fx:String>
+ <fx:String>Washington</fx:String>
+ </fx:Array>
+ </s:ArrayList>
+ </s:dataProvider>
+ </s:ComboBox>
+ </s:FormItem>
+
+ <s:FormItem label="ZIP Code:" width="100%">
+ <s:TextInput id="zip" width="30%"/>
+ </s:FormItem>
+
+ </s:Form>
+
+ <s:Label y="38" text="Option1: Enter Address" horizontalCenter="0" styleName="instructions"/>
+
+ <s:Button y="297" label="Locate" click="Alert.show('This feature is not implemented in this sample', 'Locate')" horizontalCenter="0"/>
+
+ <s:HGroup y="327" width="80%" height="20" horizontalAlign="center" verticalAlign="middle" horizontalCenter="0">
+ <s:Line width="60">
+ <s:stroke>
+ <s:SolidColorStroke color="#000000"/>
+ </s:stroke>
+ </s:Line>
+ <s:Label text="OR"/>
+ <s:Line width="60">
+ <s:stroke>
+ <s:SolidColorStroke color="#000000"/>
+ </s:stroke>
+ </s:Line>
+ </s:HGroup>
+
+ <s:Label y="355" text="Option 2: Drag this marker into the map" horizontalCenter="0" styleName="instructions"/>
+
+ <s:Image y="380" horizontalCenter="0" source="@Embed('/assets/support_mapmarker_plus.png')"/>
+
+ <s:Line y="415" horizontalCenter="0" width="200" alpha="0.6"/>
+
+ </s:Group>
+
+ <s:Group width="100%" height="40%">
+ <s:VGroup width="80%" height="90%" horizontalCenter="0" top="0">
+ <s:Label text="Location" styleName="instructions"/>
+ <s:DataGroup width="100%" dataProvider="{locations}">
+ <s:itemRenderer>
+ <fx:Component>
+ <s:ItemRenderer styleName="listItem" width="100%">
+ <s:Image width="21" height="25" source="{data.image}" />
+ <s:Label width="100%" text="{data.name}" />
+ </s:ItemRenderer>
+ </fx:Component>
+ </s:itemRenderer>
+ </s:DataGroup>
+ </s:VGroup>
+ </s:Group>
+
+ </s:VGroup>
+
+ <s:Group width="68%" height="100%">
+ <s:Image source="@Embed('/assets/support_map.png')" fillMode="scale" left="2" right="2" top="2" bottom="2"/>
+ </s:Group>
+
+ </s:HGroup>
+
+</s:Group>
http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/assets/akotter.jpg
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/assets/akotter.jpg b/FlexStore/spark/src/assets/akotter.jpg
new file mode 100644
index 0000000..1124b71
Binary files /dev/null and b/FlexStore/spark/src/assets/akotter.jpg differ
http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/assets/bcrater.jpg
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/assets/bcrater.jpg b/FlexStore/spark/src/assets/bcrater.jpg
new file mode 100644
index 0000000..fd15d59
Binary files /dev/null and b/FlexStore/spark/src/assets/bcrater.jpg differ
http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/assets/beige_background.jpg
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/assets/beige_background.jpg b/FlexStore/spark/src/assets/beige_background.jpg
new file mode 100644
index 0000000..8f034ba
Binary files /dev/null and b/FlexStore/spark/src/assets/beige_background.jpg differ
http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/assets/beige_dotted_map.png
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/assets/beige_dotted_map.png b/FlexStore/spark/src/assets/beige_dotted_map.png
new file mode 100644
index 0000000..e88d9ef
Binary files /dev/null and b/FlexStore/spark/src/assets/beige_dotted_map.png differ
http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/assets/blue_background.jpg
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/assets/blue_background.jpg b/FlexStore/spark/src/assets/blue_background.jpg
new file mode 100644
index 0000000..361ce0e
Binary files /dev/null and b/FlexStore/spark/src/assets/blue_background.jpg differ
http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/assets/blue_dotted_map.png
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/assets/blue_dotted_map.png b/FlexStore/spark/src/assets/blue_dotted_map.png
new file mode 100644
index 0000000..5fa6714
Binary files /dev/null and b/FlexStore/spark/src/assets/blue_dotted_map.png differ
http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/assets/grip.png
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/assets/grip.png b/FlexStore/spark/src/assets/grip.png
new file mode 100644
index 0000000..64ee835
Binary files /dev/null and b/FlexStore/spark/src/assets/grip.png differ
http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/assets/icon_cart_empty.png
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/assets/icon_cart_empty.png b/FlexStore/spark/src/assets/icon_cart_empty.png
new file mode 100644
index 0000000..562064b
Binary files /dev/null and b/FlexStore/spark/src/assets/icon_cart_empty.png differ
http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/assets/icon_cart_full.png
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/assets/icon_cart_full.png b/FlexStore/spark/src/assets/icon_cart_full.png
new file mode 100644
index 0000000..007b08c
Binary files /dev/null and b/FlexStore/spark/src/assets/icon_cart_full.png differ
http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/assets/icon_compare.png
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/assets/icon_compare.png b/FlexStore/spark/src/assets/icon_compare.png
new file mode 100644
index 0000000..efc3ea1
Binary files /dev/null and b/FlexStore/spark/src/assets/icon_compare.png differ
http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/assets/icon_details.png
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/assets/icon_details.png b/FlexStore/spark/src/assets/icon_details.png
new file mode 100644
index 0000000..2d2bfb9
Binary files /dev/null and b/FlexStore/spark/src/assets/icon_details.png differ
http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/assets/icon_magnifier.png
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/assets/icon_magnifier.png b/FlexStore/spark/src/assets/icon_magnifier.png
new file mode 100644
index 0000000..939f814
Binary files /dev/null and b/FlexStore/spark/src/assets/icon_magnifier.png differ
http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/assets/icon_tiles.png
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/assets/icon_tiles.png b/FlexStore/spark/src/assets/icon_tiles.png
new file mode 100644
index 0000000..dbf75b6
Binary files /dev/null and b/FlexStore/spark/src/assets/icon_tiles.png differ
http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/assets/jproctor.jpg
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/assets/jproctor.jpg b/FlexStore/spark/src/assets/jproctor.jpg
new file mode 100644
index 0000000..1111787
Binary files /dev/null and b/FlexStore/spark/src/assets/jproctor.jpg differ
http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/assets/logo_blue.png
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/assets/logo_blue.png b/FlexStore/spark/src/assets/logo_blue.png
new file mode 100644
index 0000000..132b894
Binary files /dev/null and b/FlexStore/spark/src/assets/logo_blue.png differ
http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/assets/logo_orange.png
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/assets/logo_orange.png b/FlexStore/spark/src/assets/logo_orange.png
new file mode 100644
index 0000000..c776c8c
Binary files /dev/null and b/FlexStore/spark/src/assets/logo_orange.png differ
http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/assets/pic/abrilliam.jpg
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/assets/pic/abrilliam.jpg b/FlexStore/spark/src/assets/pic/abrilliam.jpg
new file mode 100644
index 0000000..6954858
Binary files /dev/null and b/FlexStore/spark/src/assets/pic/abrilliam.jpg differ
http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/assets/pic/akotter.jpg
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/assets/pic/akotter.jpg b/FlexStore/spark/src/assets/pic/akotter.jpg
new file mode 100644
index 0000000..1124b71
Binary files /dev/null and b/FlexStore/spark/src/assets/pic/akotter.jpg differ
http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/assets/pic/bcrater.jpg
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/assets/pic/bcrater.jpg b/FlexStore/spark/src/assets/pic/bcrater.jpg
new file mode 100644
index 0000000..fd15d59
Binary files /dev/null and b/FlexStore/spark/src/assets/pic/bcrater.jpg differ
http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/assets/pic/bleporte.jpg
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/assets/pic/bleporte.jpg b/FlexStore/spark/src/assets/pic/bleporte.jpg
new file mode 100644
index 0000000..c4769e8
Binary files /dev/null and b/FlexStore/spark/src/assets/pic/bleporte.jpg differ
http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/assets/pic/bvanbrocklin.jpg
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/assets/pic/bvanbrocklin.jpg b/FlexStore/spark/src/assets/pic/bvanbrocklin.jpg
new file mode 100644
index 0000000..489fa2e
Binary files /dev/null and b/FlexStore/spark/src/assets/pic/bvanbrocklin.jpg differ
http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/assets/pic/ccarpenter.jpg
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/assets/pic/ccarpenter.jpg b/FlexStore/spark/src/assets/pic/ccarpenter.jpg
new file mode 100644
index 0000000..c1dc3d8
Binary files /dev/null and b/FlexStore/spark/src/assets/pic/ccarpenter.jpg differ
http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/assets/pic/clampberto.jpg
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/assets/pic/clampberto.jpg b/FlexStore/spark/src/assets/pic/clampberto.jpg
new file mode 100644
index 0000000..9deacd2
Binary files /dev/null and b/FlexStore/spark/src/assets/pic/clampberto.jpg differ
http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/assets/pic/davenon.jpg
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/assets/pic/davenon.jpg b/FlexStore/spark/src/assets/pic/davenon.jpg
new file mode 100644
index 0000000..6a2a142
Binary files /dev/null and b/FlexStore/spark/src/assets/pic/davenon.jpg differ
http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/assets/pic/dmcgoyal.jpg
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/assets/pic/dmcgoyal.jpg b/FlexStore/spark/src/assets/pic/dmcgoyal.jpg
new file mode 100644
index 0000000..1124b71
Binary files /dev/null and b/FlexStore/spark/src/assets/pic/dmcgoyal.jpg differ
http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/assets/pic/dwillhelm.jpg
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/assets/pic/dwillhelm.jpg b/FlexStore/spark/src/assets/pic/dwillhelm.jpg
new file mode 100644
index 0000000..fd15d59
Binary files /dev/null and b/FlexStore/spark/src/assets/pic/dwillhelm.jpg differ
http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/assets/pic/esunderland.jpg
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/assets/pic/esunderland.jpg b/FlexStore/spark/src/assets/pic/esunderland.jpg
new file mode 100644
index 0000000..c4769e8
Binary files /dev/null and b/FlexStore/spark/src/assets/pic/esunderland.jpg differ
http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/assets/pic/jproctor.jpg
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/assets/pic/jproctor.jpg b/FlexStore/spark/src/assets/pic/jproctor.jpg
new file mode 100644
index 0000000..1111787
Binary files /dev/null and b/FlexStore/spark/src/assets/pic/jproctor.jpg differ
http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/assets/pic/mfields.jpg
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/assets/pic/mfields.jpg b/FlexStore/spark/src/assets/pic/mfields.jpg
new file mode 100644
index 0000000..489fa2e
Binary files /dev/null and b/FlexStore/spark/src/assets/pic/mfields.jpg differ
http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/assets/pic/pdempsey.jpg
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/assets/pic/pdempsey.jpg b/FlexStore/spark/src/assets/pic/pdempsey.jpg
new file mode 100644
index 0000000..9deacd2
Binary files /dev/null and b/FlexStore/spark/src/assets/pic/pdempsey.jpg differ
http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/assets/pic/ptranep.jpg
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/assets/pic/ptranep.jpg b/FlexStore/spark/src/assets/pic/ptranep.jpg
new file mode 100644
index 0000000..4b9a03b
Binary files /dev/null and b/FlexStore/spark/src/assets/pic/ptranep.jpg differ
http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/assets/pic/rcrawley.jpg
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/assets/pic/rcrawley.jpg b/FlexStore/spark/src/assets/pic/rcrawley.jpg
new file mode 100644
index 0000000..9b60320
Binary files /dev/null and b/FlexStore/spark/src/assets/pic/rcrawley.jpg differ
http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/assets/pic/rdreifus.jpg
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/assets/pic/rdreifus.jpg b/FlexStore/spark/src/assets/pic/rdreifus.jpg
new file mode 100644
index 0000000..6a2a142
Binary files /dev/null and b/FlexStore/spark/src/assets/pic/rdreifus.jpg differ
http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/assets/pic/twong.jpg
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/assets/pic/twong.jpg b/FlexStore/spark/src/assets/pic/twong.jpg
new file mode 100644
index 0000000..1124b71
Binary files /dev/null and b/FlexStore/spark/src/assets/pic/twong.jpg differ
http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/assets/support_map.png
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/assets/support_map.png b/FlexStore/spark/src/assets/support_map.png
new file mode 100644
index 0000000..c2f2394
Binary files /dev/null and b/FlexStore/spark/src/assets/support_map.png differ
http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/assets/support_mapmarker_a.png
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/assets/support_mapmarker_a.png b/FlexStore/spark/src/assets/support_mapmarker_a.png
new file mode 100644
index 0000000..20c21e1
Binary files /dev/null and b/FlexStore/spark/src/assets/support_mapmarker_a.png differ
http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/assets/support_mapmarker_b.png
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/assets/support_mapmarker_b.png b/FlexStore/spark/src/assets/support_mapmarker_b.png
new file mode 100644
index 0000000..069ccd8
Binary files /dev/null and b/FlexStore/spark/src/assets/support_mapmarker_b.png differ
http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/assets/support_mapmarker_c.png
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/assets/support_mapmarker_c.png b/FlexStore/spark/src/assets/support_mapmarker_c.png
new file mode 100644
index 0000000..f6b587e
Binary files /dev/null and b/FlexStore/spark/src/assets/support_mapmarker_c.png differ
http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/assets/support_mapmarker_plus.png
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/assets/support_mapmarker_plus.png b/FlexStore/spark/src/assets/support_mapmarker_plus.png
new file mode 100644
index 0000000..4192088
Binary files /dev/null and b/FlexStore/spark/src/assets/support_mapmarker_plus.png differ
http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/assets/trashcan.png
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/assets/trashcan.png b/FlexStore/spark/src/assets/trashcan.png
new file mode 100644
index 0000000..9df75d7
Binary files /dev/null and b/FlexStore/spark/src/assets/trashcan.png differ
http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/beige.css
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/beige.css b/FlexStore/spark/src/beige.css
new file mode 100644
index 0000000..48de215
--- /dev/null
+++ b/FlexStore/spark/src/beige.css
@@ -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.
+//
+////////////////////////////////////////////////////////////////////////////////
+*/
+
+/* Style for color-specific state - Beige */
+
+@namespace "library://ns.adobe.com/flex/spark";
+
+/*
+//----------------------------
+// Global styles
+//----------------------------
+*/
+.global
+{
+ highlightAlphas: .5, .25;
+ borderColor: #939A9D;
+ headerColors: #A65904, #E68701;
+ themeColor: #75B1CE;
+ rollOverColor: #D6E6EE;
+ selectionColor: #B8D5E4;
+}
+
+/*
+//----------------------------
+// Type selectors
+//----------------------------
+*/
+Application
+{
+ backgroundColor: #EAE6DD;
+ backgroundImage: Embed("assets/beige_background.jpg");
+}
+
+/*
+//----------------------------
+// Apply to Panels and Alerts by default
+//----------------------------
+*/
+.windowStatus {
+ color: #FFCC99;
+}
+
+.windowStyles { /* catalog panel's title text */
+ color: #FFCC99;
+}
+
+/*
+//----------------------------
+// Named styles
+//----------------------------
+*/
+
+.colorPanel /* for the background of some surfaces */
+{
+ borderStyle: "solid";
+ borderThickness: 0;
+ backgroundColor: #BCB29F;
+ backgroundAlpha: 0.4;
+ color: #170505;
+ cornerRadius: 4;
+ dropShadowEnabled: true;
+}
+
+.homeProgramHeader /* in HomeView */
+{
+ fontWeight: "bold";
+ fontSize: 13;
+ color: #BE7E3F;
+}
+
+.homeMap
+{
+ borderStyle: "solid";
+ cornerRadius: 4;
+ backgroundColor: #BE7E3F;
+ alpha: 1;
+ dottedMap: Embed("assets/beige_dotted_map.png");
+}
+
+.instructions
+{
+ alpha: .85;
+ color: #5C5857;
+}
+
+.storeControlBar
+{
+ fillAlphas: .60, .40;
+ fillColors: #8F8879, #BCB29F;
+ highlightAlphas: .05, .25;
+ cornerRadius: 3;
+ shadowDistance: 4;
+ paddingLeft: 0;
+ paddingRight: 0;
+ paddingTop: 0;
+ paddingBottom: 0;
+ horizontalGap: 0;
+ storeLogo: Embed("assets/logo_orange.png");
+}
+
+.storeButtonBar
+{
+ cornerRadius: 0;
+ buttonStyleName: "storeButton";
+ themeColor: #A65904;
+}
+
+.storeButton
+{
+ cornerRadius: 0;
+ fillColors: #8F8879, #BCB29F, #A65904, #E68701;
+ fillAlphas: 1, 1;
+ highlightAlphas: .5, .25;
+ fontWeight: "normal";
+ selectedOverSkin: ClassReference("samples.flexstore.ButtonBarButtonSkin");
+ selectedUpSkin: ClassReference("samples.flexstore.ButtonBarButtonSkin");
+ overSkin: ClassReference("samples.flexstore.ButtonBarButtonSkin");
+}
+
+.catalogTitleButtonSelected
+{
+ color: #FFFFFF;
+ fontWeight: "bold";
+}
+
+.catalogTitleButtonDeselected
+{
+ color: #222222;
+ fontWeight: "bold";
+}
+
+.catalogTitleButtonHighlighted
+{
+ color: #FFCC99;
+ fontWeight: "bold";
+}
+
+.catalogPanel
+{
+ highlightAlphas: .5, .25;
+ headerColors: #A65904, #E68701;
+ borderAlpha: 1;
+ borderColor: #FFFFFF;
+ borderThicknessRight: 1;
+ borderThicknessBottom: 1;
+ paddingRight: 0;
+ paddingBottom: 0;
+}
+
+
http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/blue.css
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/blue.css b/FlexStore/spark/src/blue.css
new file mode 100644
index 0000000..58e98cd
--- /dev/null
+++ b/FlexStore/spark/src/blue.css
@@ -0,0 +1,165 @@
+/*
+////////////////////////////////////////////////////////////////////////////////
+//
+// 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.
+//
+////////////////////////////////////////////////////////////////////////////////
+*/
+
+/* Style for color-specific state - Beige */
+
+/*
+//----------------------------
+// Global styles
+//----------------------------
+*/
+.global
+{
+ highlightAlphas: .5, .25;
+ borderColor: #939A9D;
+ headerColors: #456F84, #9ABBC9;
+ themeColor: #75B1CE;
+ rollOverColor: #D6E6EE;
+ selectionColor: #B8D5E4;
+}
+
+/*
+//----------------------------
+// Type selectors
+//----------------------------
+*/
+Application
+{
+ backgroundColor: #AAB2B7;
+ backgroundImage: Embed("assets/blue_background.jpg");
+}
+
+/*
+//----------------------------
+// Apply to Panels and Alerts by default
+//----------------------------
+*/
+.windowStatus {
+ color: #BDE9FA;
+}
+
+.windowStyles { /* catalog panel's title text */
+ color: #BDE9FA;
+}
+
+/*
+//----------------------------
+// Named styles
+//----------------------------
+*/
+
+.colorPanel /* for the background of some surfaces */
+{
+ borderStyle: "solid";
+ borderThickness: 0;
+ backgroundColor: #BDD6E2;
+ backgroundAlpha: 0.4;
+ color: #170505;
+ cornerRadius: 4;
+ dropShadowEnabled: true;
+}
+
+.homeProgramHeader /* in HomeView */
+{
+ fontWeight: "bold";
+ fontSize: 13;
+ color: #7AA4B9;
+}
+
+.homeMap
+{
+ borderStyle: "solid";
+ cornerRadius: 4;
+ backgroundColor: #7AA4B9;
+ alpha: 1;
+ dottedMap: Embed("assets/blue_dotted_map.png");
+}
+
+.instructions
+{
+ alpha: .85;
+ color: #5C5857;
+}
+
+.storeControlBar
+{
+ fillAlphas: .60, .40;
+ fillColors: #4A6F81, #BDD6E2;
+ highlightAlphas: .05, .25;
+ cornerRadius: 3;
+ shadowDistance: 4;
+ paddingLeft: 0;
+ paddingRight: 0;
+ paddingTop: 0;
+ paddingBottom: 0;
+ horizontalGap: 0;
+ storeLogo: Embed("assets/logo_blue.png");
+}
+
+.storeButtonBar
+{
+ cornerRadius: 0;
+ buttonStyleName: "storeButton";
+ themeColor: #456F84;
+}
+
+.storeButton
+{
+ cornerRadius: 0;
+ fillColors: #4A6F81, #BDD6E2, #456F84, #9ABBC9;
+ fillAlphas: 1, 1;
+ highlightAlphas: .5, .25;
+ fontWeight: "normal";
+ selectedOverSkin: ClassReference("samples.flexstore.ButtonBarButtonSkin");
+ selectedUpSkin: ClassReference("samples.flexstore.ButtonBarButtonSkin");
+ overSkin: ClassReference("samples.flexstore.ButtonBarButtonSkin");
+}
+
+.catalogTitleButtonSelected
+{
+ color: #FFFFFF;
+ fontWeight: "bold";
+}
+
+.catalogTitleButtonDeselected
+{
+ color: #222222;
+ fontWeight: "bold";
+}
+
+.catalogTitleButtonHighlighted
+{
+ color: #BDE9FA;
+ fontWeight: "bold";
+}
+
+.catalogPanel
+{
+ highlightAlphas: .5, .25;
+ headerColors: #456F84, #9ABBC9;
+ borderAlpha: 1;
+ borderColor: #FFFFFF;
+ borderThicknessRight: 1;
+ borderThicknessBottom: 1;
+ paddingRight: 0;
+ paddingBottom: 0;
+}
+
http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/data/catalog.xml
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/data/catalog.xml b/FlexStore/spark/src/data/catalog.xml
new file mode 100644
index 0000000..423e177
--- /dev/null
+++ b/FlexStore/spark/src/data/catalog.xml
@@ -0,0 +1,256 @@
+<?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.
+
+ -->
+<catalog>
+
+ <product productId="1">
+ <name>Andrew Brilliam</name>
+ <description>15 years experience. 8 years with Flex. Specializing in Text Layout Framework</description>
+ <price>60.00</price>
+ <image>assets/pic/abrilliam.jpg</image>
+ <experience>15</experience>
+ <blazeds>false</blazeds>
+ <mobile>false</mobile>
+ <video>false</video>
+ <highlight1>Text Layout Framework</highlight1>
+ <highlight2>Parsley</highlight2>
+ </product>
+
+ <product productId="2">
+ <name>Annette Kotter</name>
+ <description>Specializing in custom components. PHP servers.</description>
+ <price>55</price>
+ <image>assets/pic/akotter.jpg</image>
+ <experience>3</experience>
+ <blazeds>true</blazeds>
+ <mobile>false</mobile>
+ <video>false</video>
+ <highlight1>Custom Components</highlight1>
+ <highlight2>PHP</highlight2>
+ </product>
+
+ <product productId="3">
+ <name>Ben Crater</name>
+ <description>Specializing in BlazeDS backends.</description>
+ <price>55</price>
+ <image>assets/pic/bcrater.jpg</image>
+ <experience>4</experience>
+ <blazeds>true</blazeds>
+ <mobile>false</mobile>
+ <video>false</video>
+ <highlight1>BlazeDS</highlight1>
+ <highlight2>Remote Object</highlight2>
+ </product>
+
+ <product productId="4">
+ <name>Beth Leporte</name>
+ <description>BlazeDS or PHP servers. Multimedia messagin.</description>
+ <price>70.00</price>
+ <image>assets/pic/bleporte.jpg</image>
+ <experience>6</experience>
+ <blazeds>true</blazeds>
+ <mobile>false</mobile>
+ <video>false</video>
+ <highlight1>Multimedia messaging</highlight1>
+ <highlight2>BlazeDS</highlight2>
+ </product>
+
+ <product productId="5">
+ <name>Brad Van Brocklin</name>
+ <description>Emphasis on mobile application development</description>
+ <price>80</price>
+ <image>assets/pic/bvanbrocklin.jpg</image>
+ <experience>6</experience>
+ <blazeds>false</blazeds>
+ <mobile>true</mobile>
+ <video>false</video>
+ <highlight1>Mobile</highlight1>
+ <highlight2>Android</highlight2>
+ </product>
+
+ <product productId="6">
+ <name>Carlos Carpenter</name>
+ <description>Built many mobile apps and video apps.</description>
+ <price>80</price>
+ <image>assets/pic/ccarpenter.jpg</image>
+ <experience>4</experience>
+ <blazeds>false</blazeds>
+ <mobile>true</mobile>
+ <video>true</video>
+ <highlight1>Mobile</highlight1>
+ <highlight2>Video</highlight2>
+ </product>
+
+ <product productId="7">
+ <name>Christine Lampberto</name>
+ <description>7 years experience building mobile applications.</description>
+ <price>90</price>
+ <image>assets/pic/clampberto.jpg</image>
+ <experience>7</experience>
+ <blazeds>true</blazeds>
+ <mobile>true</mobile>
+ <video>false</video>
+ <highlight1>BlazeDS</highlight1>
+ <highlight2>Mobile</highlight2>
+ </product>
+
+ <product productId="8">
+ <name>Dee Dee Avenon</name>
+ <description>I've been making video apps for over 5 years and mobile apps for about 3 years.</description>
+ <price>100</price>
+ <image>assets/pic/davenon.jpg</image>
+ <experience>10</experience>
+ <blazeds>false</blazeds>
+ <mobile>true</mobile>
+ <video>true</video>
+ <highlight1>Video Applications</highlight1>
+ <highlight2>Mobile Applications</highlight2>
+ </product>
+
+ <product productId="9">
+ <name>Denise McGoyal</name>
+ <description>Specializing in video sharing applicaions. MObile apps too.</description>
+ <price>100</price>
+ <image>assets/pic/dmcgoyal.jpg</image>
+ <experience>5</experience>
+ <blazeds>false</blazeds>
+ <mobile>true</mobile>
+ <video>true</video>
+ <highlight1>Video Applications</highlight1>
+ <highlight2>Mobile Applications</highlight2>
+ </product>
+
+ <product productId="10">
+ <name>Daniel Willhelm</name>
+ <description>I'm into mobile apps, video apps and social apps.</description>
+ <price>70</price>
+ <image>assets/pic/dwillhelm.jpg</image>
+ <experience>90</experience>
+ <blazeds>false</blazeds>
+ <mobile>true</mobile>
+ <video>true</video>
+ <highlight1>Video Applications</highlight1>
+ <highlight2>Mobile Applications</highlight2>
+ </product>
+
+ <product productId="11">
+ <name>Eunice Sunderland</name>
+ <description>My recent focus is on mobile apps, but I have considerable experience in video apps as well.</description>
+ <price>150</price>
+ <image>assets/pic/esunderland.jpg</image>
+ <experience>30</experience>
+ <blazeds>false</blazeds>
+ <mobile>true</mobile>
+ <video>true</video>
+ <highlight1>Video Applications</highlight1>
+ <highlight2>Mobile Applications</highlight2>
+ </product>
+
+ <product productId="12">
+ <name>Jane Proctor</name>
+ <description>I've been developing mobile companion apps for the past 3 years.</description>
+ <price>75</price>
+ <image>assets/pic/jproctor.jpg</image>
+ <experience>6</experience>
+ <blazeds>false</blazeds>
+ <mobile>true</mobile>
+ <video>true</video>
+ <highlight1>Video Applications</highlight1>
+ <highlight2>Mobile Applications</highlight2>
+ </product>
+
+ <product productId="13">
+ <name>Mark Fields</name>
+ <description>Video is my favorite thing. Mobile is also a favorite.</description>
+ <price>60</price>
+ <image>assets/pic/mfields.jpg</image>
+ <experience>70</experience>
+ <blazeds>false</blazeds>
+ <mobile>true</mobile>
+ <video>true</video>
+ <highlight1>Video Applications</highlight1>
+ <highlight2>Mobile Applications</highlight2>
+ </product>
+
+ <product productId="14">
+ <name>Patricia Dempsey</name>
+ <description>I've been cranking out mobile apps for the past 6 years. A few have involved video as well.</description>
+ <price>120</price>
+ <image>assets/pic/pdempsey.jpg</image>
+ <experience>7</experience>
+ <blazeds>false</blazeds>
+ <mobile>true</mobile>
+ <video>true</video>
+ <highlight1>Video Applications</highlight1>
+ <highlight2>Mobile Applications</highlight2>
+ </product>
+
+ <product productId="15">
+ <name>Paul Trandep</name>
+ <description>I've been working on a mobile app that incorporates music. It just shipped so now I'm looking for the next fun thing to work on.'</description>
+ <price>50</price>
+ <image>assets/pic/ptranep.jpg</image>
+ <experience>6</experience>
+ <blazeds>false</blazeds>
+ <mobile>true</mobile>
+ <video>true</video>
+ <highlight1>Video Applications</highlight1>
+ <highlight2>Mobile Applications</highlight2>
+ </product>
+
+ <product productId="16">
+ <name>Roscoe Crawley</name>
+ <description>My main specialty is in BlazeDS connected to Flex.</description>
+ <price>59</price>
+ <image>assets/pic/rcrawley.jpg</image>
+ <experience>9</experience>
+ <blazeds>true</blazeds>
+ <mobile>false</mobile>
+ <video>false</video>
+ <highlight1>BlazeDS</highlight1>
+ <highlight2>Remote Object</highlight2>
+ </product>
+
+ <product productId="17">
+ <name>Renee Dreifus</name>
+ <description>I can do it all: BlazeDS, Mobile, Video.</description>
+ <price>79</price>
+ <image>assets/pic/rdreifus.jpg</image>
+ <experience>90</experience>
+ <blazeds>true</blazeds>
+ <mobile>true</mobile>
+ <video>true</video>
+ <highlight1>Video Applications</highlight1>
+ <highlight2>Mobile Applications</highlight2>
+ </product>
+
+ <product productId="18">
+ <name>Tina Wong</name>
+ <description>I've been developing Flex apps since 1.5. Most of my recent work has been on mobile apps.</description>
+ <price>109</price>
+ <image>assets/pic/twong.jpg</image>
+ <experience>9</experience>
+ <blazeds>false</blazeds>
+ <mobile>true</mobile>
+ <video>true</video>
+ <highlight1>Video Applications</highlight1>
+ <highlight2>Mobile Applications</highlight2>
+ </product>
+
+</catalog>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/main.css
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/main.css b/FlexStore/spark/src/main.css
new file mode 100644
index 0000000..23fd5c2
--- /dev/null
+++ b/FlexStore/spark/src/main.css
@@ -0,0 +1,83 @@
+/*
+////////////////////////////////////////////////////////////////////////////////
+//
+// 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.
+//
+////////////////////////////////////////////////////////////////////////////////
+*/
+
+/*
+//----------------------------
+// Global styles
+//----------------------------
+*/
+.global {
+ color: #170505;
+ fillAlphas: 1.00, 1.00; /* last pair are for OVER state */
+ fillColors: #FFFFFF, #DDDDDD, #FFFFFF, #EEEEEE;
+}
+
+/*
+//----------------------------
+// Type selectors
+//----------------------------
+*/
+
+HRule
+{
+ color: #666666;
+}
+
+/*
+//----------------------------
+// Named styles
+//----------------------------
+*/
+.glass {
+ borderColor: #767473;
+ fillAlphas: .60, .60, .60, .60;
+ fillColors: #888888, #F3F3F3, #9E9E9E, #FCFCFC;
+ highlightAlphas: .07, .45;
+}
+
+.glassSlider
+{
+ fillAlphas: .80, .80, .80, .80;
+ fillColors: #F3F3F3, #BBBBBB, #FCFCFC, #CCCCCC;
+}
+
+.listItem
+{
+ paddingLeft: 4;
+ paddingRight: 4;
+ horizontalGap: 5;
+ verticalAlign: "middle";
+ backgroundColor: #FFFFFF;
+ backgroundAlpha: .5;
+ borderStyle: "outset";
+}
+
+.sectionHeader
+{
+ fontWeight: "bold";
+ fontSize: 11;
+}
+
+.homeSection
+{
+ cornerRadius: 4;
+ borderStyle: "solid";
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/productsView/CatalogTitleButtons.mxml
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/productsView/CatalogTitleButtons.mxml b/FlexStore/spark/src/productsView/CatalogTitleButtons.mxml
new file mode 100644
index 0000000..db5abc3
--- /dev/null
+++ b/FlexStore/spark/src/productsView/CatalogTitleButtons.mxml
@@ -0,0 +1,64 @@
+<?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.
+
+-->
+<s:HGroup xmlns:fx="http://ns.adobe.com/mxml/2009"
+ xmlns:s="library://ns.adobe.com/flex/spark"
+ verticalAlign="middle"
+ paddingTop="0"
+ paddingBottom="0"
+ currentState="showFilter">
+ <fx:Script>
+ <![CDATA[
+ [Bindable]
+ public var cartCount:int;
+
+ private function rollOverLabel(event:Event):void
+ {
+ Label(event.target).setStyle("styleName", "catalogTitleButtonHighlighted");
+ }
+
+ private function rollOutLabel(event:Event):void
+ {
+ Label(event.target).setStyle("styleName", "catalogTitleButtonDeselected");
+ }
+ ]]>
+ </fx:Script>
+
+ <s:Spacer width="100%" />
+ <s:Label id="findPhones" text="Find Developers" click="currentState = 'showFilter'"
+ styleName.showFilter="catalogTitleButtonSelected"
+ styleName.showCart="catalogTitleButtonDeselected"
+ rollOver.showCart="rollOverLabel(event)"
+ rollOut.showCart="rollOutLabel(event)"/>
+ <s:Line height="{findPhones.height * .75}" alpha=".75">
+ <s:stroke>
+ <s:SolidColorStroke color="#333333" />
+ </s:stroke>
+ </s:Line>
+ <s:Label id="viewCart" text="View Cart ({cartCount} items)" click="currentState = 'showCart'"
+ styleName.showFilter="catalogTitleButtonDeselected"
+ styleName.showCart="catalogTitleButtonSelected"
+ rollOver.showFilter="rollOverLabel(event)"
+ rollOut.showFilter="rollOutLabel(event)"/>
+
+ <s:states>
+ <s:State name="showFilter" />
+ <s:State name="showCart" />
+ </s:states>
+</s:HGroup>
http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/productsView/Grip.mxml
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/productsView/Grip.mxml b/FlexStore/spark/src/productsView/Grip.mxml
new file mode 100644
index 0000000..1c0a8d9
--- /dev/null
+++ b/FlexStore/spark/src/productsView/Grip.mxml
@@ -0,0 +1,36 @@
+<?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.
+
+-->
+<s:VGroup xmlns:fx="http://ns.adobe.com/mxml/2009"
+ xmlns:s="library://ns.adobe.com/flex/spark" width="17" height="100%"
+ paddingTop="10" horizontalAlign="center">
+ <fx:Script>
+ <![CDATA[
+ [Bindable]
+ public var gripTip:String;
+
+ [Bindable]
+ public var gripIcon:Class;
+ ]]>
+ </fx:Script>
+
+ <s:Image source="{gripIcon}" />
+ <s:Image source="@Embed('/assets/grip.png')" toolTip="{gripTip}" />
+
+</s:VGroup>
http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/productsView/ProductCart.mxml
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/productsView/ProductCart.mxml b/FlexStore/spark/src/productsView/ProductCart.mxml
new file mode 100644
index 0000000..cb381ad
--- /dev/null
+++ b/FlexStore/spark/src/productsView/ProductCart.mxml
@@ -0,0 +1,118 @@
+<?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.
+
+-->
+<s:VGroup xmlns:fx="http://ns.adobe.com/mxml/2009"
+ xmlns:s="library://ns.adobe.com/flex/spark"
+ xmlns:productsView="productsView.*"
+ horizontalAlign="right"
+ paddingTop="8"
+ paddingBottom="8"
+ paddingRight="4"
+ paddingLeft="4"
+ >
+
+ <fx:Script>
+ <![CDATA[
+
+ import mx.controls.Alert;
+
+ import samples.flexstore.Product;
+ import samples.flexstore.ProductListEvent;
+
+ [Bindable]
+ public var numProducts:int=0;
+
+ [Bindable]
+ private var total:Number = 0;
+
+ private const SHIPPING:Number = 1.99;
+
+ private function productListEventHandler(event:ProductListEvent):void
+ {
+ switch (event.type)
+ {
+ case ProductListEvent.ADD_PRODUCT:
+ event.product.qty = 0;
+ //fall through into the same logic as dup
+ case ProductListEvent.DUPLICATE_PRODUCT:
+ event.product.qty++;
+ total += event.product.price;
+ numProducts++;
+ break;
+ case ProductListEvent.PRODUCT_QTY_CHANGE:
+ case ProductListEvent.REMOVE_PRODUCT:
+ var items:Array = productList.items;
+ total = 0;
+ numProducts = 0;
+ for (var i:int=0; i < items.length; i++)
+ {
+ var product:Product = items[i].product;
+ total += product.qty * product.price;
+ numProducts += product.qty;
+ }
+ break;
+ default:
+ break;
+ }
+ }
+
+ ]]>
+ </fx:Script>
+ <fx:Declarations>
+ <s:CurrencyFormatter currencySymbol="$" id="cf" fractionalDigits="2"/>
+ </fx:Declarations>
+
+ <s:Label width="100%" text="Your Shopping Cart" styleName="sectionHeader"/>
+
+ <productsView:ProductList id="productList" height="100%" width="100%"
+ newItemStartX="-100" newItemStartY="-100"
+ addProduct="productListEventHandler(event)"
+ duplicateProduct="productListEventHandler(event)"
+ productQtyChange="productListEventHandler(event)"
+ removeProduct="productListEventHandler(event)"
+ showQuantity="true"
+ />
+
+ <s:Form >
+ <s:layout>
+ <s:VerticalLayout gap="0" paddingRight="0" />
+ </s:layout>
+ <s:FormItem label="Total:" width="100%">
+
+ <s:Label width="70" text="{cf.format(total)}" textAlign="right"/>
+
+ </s:FormItem>
+
+ <s:FormItem label="Service Fee:" width="100%">
+
+ <s:Label width="70" text="{cf.format(numProducts * SHIPPING)}" textAlign="right"/>
+
+ </s:FormItem>
+
+ <s:FormItem label="Grand Total:" fontWeight="bold" width="100%">
+
+ <s:Label width="70" text="{cf.format(total + (numProducts * SHIPPING))}" textAlign="right"/>
+
+ </s:FormItem>
+
+ </s:Form>
+
+ <s:Button label="Submit Order" click="Alert.show('This feature is not implemented in this sample', 'Submit Order')"/>
+
+</s:VGroup>
http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/productsView/ProductCatalogPanel.mxml
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/productsView/ProductCatalogPanel.mxml b/FlexStore/spark/src/productsView/ProductCatalogPanel.mxml
new file mode 100644
index 0000000..4626475
--- /dev/null
+++ b/FlexStore/spark/src/productsView/ProductCatalogPanel.mxml
@@ -0,0 +1,513 @@
+<?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.
+
+-->
+<s:Panel xmlns:fx="http://ns.adobe.com/mxml/2009"
+ xmlns:s="library://ns.adobe.com/flex/spark"
+ xmlns:productsView="productsView.*"
+ currentState="browse"
+ title.browse="Browse"
+ title.compare="Product Comparison"
+ title.details="Product Details"
+ skinClass="productsView.ProductCatalogPanelSkin"
+ styleName="catalogPanel"
+ creationComplete="titleButtons = skin['titleButtons']">
+
+ <s:layout>
+ <s:VerticalLayout />
+ </s:layout>
+
+ <fx:Metadata>
+ [Event(name="purchase", type="samples.flexstore.ProductThumbEvent")]
+ [Event(name="compare", type="samples.flexstore.ProductThumbEvent")]
+ [Event(name="details", type="samples.flexstore.ProductThumbEvent")]
+ </fx:Metadata>
+
+ <fx:Script>
+ <![CDATA[
+ import flash.utils.Dictionary;
+
+ import mx.collections.ArrayCollection;
+ import mx.collections.IViewCursor;
+ import mx.core.DragSource;
+ import mx.core.IUIComponent;
+ import mx.effects.Effect;
+ import mx.effects.Fade;
+ import mx.effects.Move;
+ import mx.events.EffectEvent;
+ import mx.events.DragEvent;
+ import mx.managers.DragManager;
+
+ import samples.flexstore.Product;
+ import samples.flexstore.ProductFilter;
+ import samples.flexstore.ProductFilterEvent;
+ import samples.flexstore.ProductThumbEvent;
+
+
+ private var accepted:Dictionary = new Dictionary();
+ private var thumbnails:Array;
+ private var filterCount:int;
+ private var thumbnailState:String = 'browse'; //either 'browse' or 'compare'
+ [Bindable]
+ private var titleButtons:CatalogTitleButtons; //the buttons that also allow the panel to switch sides
+
+ [Bindable]
+ public var cartCount:int;
+
+ //-----------------------------
+ // catalog
+ //-----------------------------
+
+ private var _catalog:ArrayCollection;
+
+ [Bindable]
+ public function set catalog(c:ArrayCollection):void
+ {
+ _catalog = c;
+ createThumbnails();
+ }
+
+ public function get catalog():ArrayCollection
+ {
+ return _catalog;
+ }
+
+ //----------------------------------------------------------------------
+ // methods
+ //----------------------------------------------------------------------
+
+ private function createThumbnails():void
+ {
+ var i:int; //variables are hoisted up in scope so declare here to avoid warning
+ if (thumbnails != null)
+ {
+ for (i=0; i < thumbnails.length; i++)
+ {
+ thumbContent.removeElement(thumbnails[i]);
+ }
+ }
+
+ var row:int = 0;
+ var col:int = -1;
+ var n:int = catalog.length;
+ thumbnails = new Array(n);
+ filterCount = n;
+
+ for (i=0; i < n; i++)
+ {
+ var thumb:ProductCatalogThumbnail = new ProductCatalogThumbnail();
+ thumbnails[i] = thumb;
+ thumbnails[i].showInAutomationHierarchy = true;
+ thumb.product = catalog.getItemAt(i) as Product;
+ accepted[thumb.product] = true;
+ thumbContent.addElement(thumb);
+ thumb.addEventListener(ProductThumbEvent.PURCHASE, productThumbEventHandler);
+ thumb.addEventListener(ProductThumbEvent.COMPARE, productThumbEventHandler);
+ thumb.addEventListener(ProductThumbEvent.DETAILS, productThumbEventHandler);
+ thumb.addEventListener(DragEvent.DRAG_START,thumbDragStartHandler);
+ }
+
+ layoutCatalog();
+ }
+
+ private function thumbDragStartHandler(event:MouseEvent):void
+ {
+ if (DragManager.isDragging == false)
+ {
+ var thumb:ProductCatalogThumbnail = event.target as ProductCatalogThumbnail;
+ var ds:DragSource = new DragSource();
+ ds.addData(thumb.product, "product");
+
+ var di:ProductCatalogThumbnail = new ProductCatalogThumbnail();
+ di.product = thumb.product;
+
+ //the offset logic is honestly not the most intuitive but
+ //it's necessary to get the dragProxy positioned correctly
+ DragManager.doDrag(thumbContent, ds, event, di, -thumb.x,
+ -thumb.y + thumbContent.verticalScrollPosition,
+ 0.5, false);
+ }
+ }
+
+ public function filter(productFilter:ProductFilter, live:Boolean):void
+ {
+ currentState = "browse";
+ thumbnailState = "browse";
+ var count:int=0;
+ var n:int = thumbnails.length;
+ var fadeOut:Fade = new Fade();
+ fadeOut.alphaFrom = 1;
+ fadeOut.alphaTo = .1;
+ var targets:Array = [];
+ for (var i:int = 0; i < n; i++)
+ {
+ var thumb:ProductCatalogThumbnail = thumbnails[i];
+ var product:Product = thumb.product;
+ if (productFilter.accept(product))
+ {
+ accepted[product] = true;
+ thumb.alpha = 1;
+ count++;
+ }
+ else
+ {
+ accepted[product] = false;
+ if (live)
+ {
+ thumb.alpha = .1;
+ }
+ else if (thumb.alpha == 1) //only fade if we hadn't started
+ {
+ targets.push(thumb);
+ }
+ }
+ }
+ productFilter.count = count;
+ filterCount = count;
+
+ if (targets.length > 0)
+ {
+ fadeOut.targets = targets;
+ fadeOut.play();
+ fadeOut.addEventListener(EffectEvent.EFFECT_END,
+ function(event:EffectEvent):void
+ {
+ layoutCatalog();
+ });
+ }
+ else if (!live)
+ {
+ layoutCatalog();
+ }
+ }
+
+ private function layoutCatalog():Effect
+ {
+ var tileWidth:Number;
+ var tileHeight:Number;
+ var numCols:int;
+
+ if (filterCount > 9 || currentState == "compare")
+ {
+ numCols = 4;
+ tileWidth = ProductCatalogThumbnail.COL_WIDTH_4;
+ tileWidth = currentState == "compare"
+ ? ProductCatalogThumbnail.COMPARE_WIDTH
+ : ProductCatalogThumbnail.COL_WIDTH_4
+ tileHeight = currentState == "compare"
+ ? height - 4
+ : ProductCatalogThumbnail.COL_HEIGHT_4;
+ }
+ else if (filterCount > 4)
+ {
+ numCols = 3;
+ tileWidth = ProductCatalogThumbnail.COL_WIDTH_3;
+ tileHeight = ProductCatalogThumbnail.COL_HEIGHT_3;
+ }
+ else if (filterCount <= 9)
+ {
+ numCols = 2;
+ tileWidth = ProductCatalogThumbnail.COL_WIDTH_2;
+ tileHeight = ProductCatalogThumbnail.COL_HEIGHT_2;
+ }
+ else
+ {
+ }
+
+ var row:int = 0;
+ var col:int = -1;
+
+ var move:Move = null;
+
+ var n:int = catalog.length;
+ for (var i:int = 0 ; i < n ; i++)
+ {
+ var product:Product = catalog.getItemAt(i) as Product;
+ var thumb:ProductCatalogThumbnail = thumbnails[i];
+ if (accepted[product])
+ {
+ thumb.currentState = "x" + numCols + "cols";
+ col++;
+ if (col > numCols - 1)
+ {
+ row++;
+ col = 0;
+ }
+
+ var xTo:Number = col * (tileWidth + ProductCatalogThumbnail.HORIZONTAL_GAP);
+ var yTo:Number = row * (tileHeight + ProductCatalogThumbnail.VERTICAL_GAP);
+
+ // If the thumbnail is already visible
+ // animate it to its new position.
+ if (thumb.visible)
+ {
+ // Animate only if the position is different
+ // from its current position.
+ if (thumb.x != xTo || thumb.y != yTo)
+ {
+ move = new Move(thumb);
+ move.xTo = xTo;
+ move.yTo = yTo;
+ move.play();
+ }
+ }
+
+ // If the thumbnail was not previously visible, sets its
+ // x and y coordinates. We'll make it reappear after all
+ // the visible thumbnails have reached their new position.
+ else
+ {
+ thumb.x = xTo;
+ thumb.y = yTo;
+ thumb.includeInLayout = true;
+ }
+ }
+ else
+ {
+ thumb.visible = false;
+ thumb.includeInLayout = false;
+ }
+ }
+
+ if (!move)
+ {
+ // No visible thumbnails were animated to a new position;
+ // fade in newly selected thumbnails right away.
+ fadeInThumbnails();
+ }
+ else
+ {
+ //since movement is happening get the scrollbar back to the top
+ thumbContent.verticalScrollPosition = 0;
+ // Fade in newly selected thumbnails after the last
+ // visible thumbnail has moved to its new position.
+ move.addEventListener(EffectEvent.EFFECT_END,
+ function(event:EffectEvent):void
+ {
+ fadeInThumbnails();
+ });
+ }
+ //return the last move to watch
+ return move;
+ }
+
+ //return the last effect so we could add effectEnd handler if desired
+ private function fadeInThumbnails():void
+ {
+ var n:int = thumbnails.length;
+ var effect:Fade = new Fade();
+ effect.alphaTo = 1;
+ var targets:Array = [];
+ for (var i:int = 0; i < n ; i++)
+ {
+ var thumb:ProductCatalogThumbnail = thumbnails[i];
+ if (accepted[thumb.product] && !thumb.visible)
+ {
+ thumb.alpha = 0;
+ thumb.visible = true;
+ targets.push(thumb);
+ }
+ }
+ if (targets.length > 0)
+ {
+ effect.targets = targets;
+ effect.play();
+ }
+ }
+
+ private function showDetails(product:Product):void
+ {
+ if (currentState == "details")
+ {
+ details.product = product;
+ return;
+ }
+
+ var row:int = -1;
+
+ //should be computed using border metrics instead of hard-coding the 20, but...
+ var xTo:Number = thumbContent.width - ProductCatalogThumbnail.COL_WIDTH_4 - 20;
+ var yTo:Number;
+
+ var move:Move;
+ var first:Boolean = true;
+ var selectedThumb:ProductCatalogThumbnail;
+
+ var n:int = thumbnails.length;
+ for (var i:int = 0; i < n; i++)
+ {
+ var thumb:ProductCatalogThumbnail = thumbnails[i];
+ if (thumb.visible)
+ {
+ row++;
+ yTo = row * (ProductCatalogThumbnail.COL_HEIGHT_4 + ProductCatalogThumbnail.VERTICAL_GAP);
+
+ thumb.currentState = "x4cols";
+
+ if (thumb.x != xTo || thumb.y != yTo)
+ {
+ move = new Move(thumb);
+ if (first)
+ {
+ move.addEventListener(EffectEvent.EFFECT_END,
+ function(event:EffectEvent):void
+ {
+ details.product = product;
+ currentState = "details";
+ });
+
+ first = false;
+ }
+ move.xTo = xTo;
+ move.yTo = yTo;
+ move.play();
+ }
+
+ if (thumb.product == product)
+ {
+ selectedThumb = thumb;
+ }
+ }
+ }
+ if (selectedThumb != null)
+ {
+ //make sure that the selected thumb is visible in the list on the right
+ move.addEventListener(EffectEvent.EFFECT_END,
+ function(e:EffectEvent):void
+ {
+ var curpos:int = thumbContent.verticalScrollPosition;
+ if (selectedThumb.y < curpos)
+ {
+ thumbContent.verticalScrollPosition = y;
+ }
+ else if (selectedThumb.y + ProductCatalogThumbnail.COL_HEIGHT_4 > curpos + thumbContent.height)
+ {
+ //this logic doesn't seem to be perfect but it will do
+ var diff:int = selectedThumb.y - (curpos + thumbContent.height)
+ thumbContent.verticalScrollPosition += diff + ProductCatalogThumbnail.COL_HEIGHT_4 + ProductCatalogThumbnail.VERTICAL_GAP;
+ }
+ });
+ }
+
+ }
+
+ private function productThumbEventHandler(event:ProductThumbEvent):void
+ {
+ if (event.type == ProductThumbEvent.DETAILS)
+ {
+ showDetails(event.product);
+ }
+ else if (event.type == ProductThumbEvent.BROWSE)
+ {
+ if (thumbnailState == "browse")
+ {
+ currentState = "browse";
+ layoutCatalog();
+ }
+ else
+ {
+ compare();
+ }
+ }
+ else
+ {
+ dispatchEvent(event);
+ }
+ }
+
+ public function compare(toCompare:Array=null):void
+ {
+ currentState = "compare";
+ thumbnailState = "compare";
+ if (toCompare != null)
+ {
+ var n:int = thumbnails.length;
+ for (var i:int = 0; i < n; i++)
+ {
+ accepted[thumbnails[i].product] = false;
+ }
+ for (i=0; i < toCompare.length; i++)
+ {
+ accepted[toCompare[i]] = true;
+ }
+ }
+ var lastEffect:Effect = layoutCatalog();
+ if (lastEffect != null)
+ {
+ lastEffect.addEventListener(EffectEvent.EFFECT_END,
+ function (event:EffectEvent):void
+ {
+ setCompareState();
+ });
+ }
+ else
+ {
+ setCompareState();
+ }
+ }
+
+ private function setCompareState():void
+ {
+ //avoid an issue if the user clicks quickly where we move into
+ //compare state even though we're no longer in compare
+ if (currentState == "compare")
+ {
+ var n:int = thumbnails.length;
+ for (var i:int = 0; i < n; i++)
+ {
+ var thumb:ProductCatalogThumbnail = thumbnails[i];
+ if (accepted[thumb.product])
+ {
+ thumb.currentState = "compare";
+ }
+ }
+
+ }
+ }
+
+ ]]>
+ </fx:Script>
+
+ <fx:Binding source="cartCount" destination="titleButtons.cartCount" />
+ <!-- two-way binding between the states of panel title buttons and the product view state -->
+ <fx:Binding source="ProductsView(parentDocument).currentState" destination="titleButtons.currentState" />
+ <fx:Binding destination="ProductsView(parentDocument).currentState" source="titleButtons.currentState" />
+
+ <s:Group width="100%" height="100%">
+ <s:Group id="thumbContentGroup" width="100%" height="100%">
+ <s:Scroller width="100%" height="100%">
+ <s:Group id="thumbContent" width="100%" height="100%"/>
+ </s:Scroller>
+ </s:Group>
+ <productsView:ProductDetails id="details"
+ width="{ProductCatalogThumbnail.COL_WIDTH_4 * 3}"
+ height="100%"
+ visible="false"
+ visible.details="true"
+ compare="productThumbEventHandler(event)"
+ purchase="productThumbEventHandler(event)"
+ browse="productThumbEventHandler(event)" />
+ </s:Group>
+
+ <s:states>
+ <s:State name="browse" />
+ <s:State name="compare" />
+ <s:State name="details" />
+ </s:states>
+
+</s:Panel>