Repository: flex-asjs
Updated Branches:
  refs/heads/develop 2be6d7351 -> 2bd7d1e8c


http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/2bd7d1e8/examples/FlexJSStore_jquery/src/productsView/ProductFilterPanel.mxml
----------------------------------------------------------------------
diff --git 
a/examples/FlexJSStore_jquery/src/productsView/ProductFilterPanel.mxml 
b/examples/FlexJSStore_jquery/src/productsView/ProductFilterPanel.mxml
new file mode 100755
index 0000000..4777e79
--- /dev/null
+++ b/examples/FlexJSStore_jquery/src/productsView/ProductFilterPanel.mxml
@@ -0,0 +1,216 @@
+<?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.
+
+-->
+<basic:VContainer xmlns:fx="http://ns.adobe.com/mxml/2009"; 
+                  xmlns:basic="library://ns.apache.org/flexjs/basic" 
+                  xmlns:mx="library://ns.adobe.com/flex/mx" 
+    xmlns:productsView="productsView.*"
+    xmlns:flexstore="samples.flexstore.*"
+    height="100%" 
+    currentState="showingThumbnails"
+    initComplete="series.selectedIndex = 0">
+    <basic:style>
+        <basic:SimpleCSSStyles paddingLeft="4" 
+                               paddingRight="12" 
+                               paddingTop="12" 
+                               paddingBottom="8" 
+                               />
+
+    </basic:style>
+    
+    <fx:Metadata>
+       [Event(name="filter", type="samples.flexstore.ProductFilterEvent")] 
+       [Event("compare")]
+    </fx:Metadata>
+    
+    <fx:Script>
+        <![CDATA[
+        import org.apache.flex.html.Slider;
+        import org.apache.flex.html.SimpleAlert; 
+        import samples.flexstore.ProductFilterEvent;
+           
+        private var thumbBeingPressed:Boolean;
+           
+        private function dispatchFilter():void
+        {
+            var event:ProductFilterEvent = 
+                new ProductFilterEvent(filter, thumbBeingPressed);
+            dispatchEvent(event);
+            currentState = "showingThumbnails";
+        }
+        
+        private function sliderValue(values:Array, index:int):Number
+        {
+            return values[index];
+        }
+        
+        private function productRemoved():void
+        {
+            if (currentState == "showingComparison")
+            {
+                if (productList.items.length == 0)
+                {
+                    dispatchFilter();
+                }
+                else
+                {
+                    attemptCompare();
+                }
+            }
+        }
+        
+        private function attemptCompare():void
+        {
+            if (productList.items.length > 0)
+            {
+                dispatchEvent(new Event("compare"));
+                currentState = "showingComparison";
+            }
+            else
+            {
+                SimpleAlert.show("There are no items to compare.", "Compare");
+            }
+        }
+        
+        ]]>
+    </fx:Script>
+    <fx:Declarations>
+        <flexstore:ProductFilter id="filter">
+            <flexstore:experience>{series.selectedItem}</flexstore:experience>
+            <flexstore:minPrice>{loPrice.value}</flexstore:minPrice>
+            <flexstore:maxPrice>{hiPrice.value}</flexstore:maxPrice>
+            <flexstore:blazeds>{cbBlazeDS.selected}</flexstore:blazeds>
+            <flexstore:mobile>{cbMobile.selected}</flexstore:mobile>
+            <flexstore:video>{cbVideo.selected}</flexstore:video>
+        </flexstore:ProductFilter>
+        
+        <basic:CurrencyFormatter currencySymbol="$" id="cf"/>    
+        
+    </fx:Declarations>
+    <basic:beads>
+        <basic:ContainerDataBinding />
+    </basic:beads>
+    
+    <basic:Label text="Find" className="sectionHeader"/>
+    
+    <basic:Container width="100%">
+        <basic:beads>
+            <basic:FlexibleFirstChildHorizontalLayout />
+        </basic:beads>
+        <basic:TextInput className="glass" width="100%"/>
+        <basic:TextButton className="glass" text="Go" 
click="SimpleAlert.show('This feature is not implemented in this sample', 
'Find')"/>
+    </basic:Container>
+
+    <basic:Spacer height="18"/>
+
+    <basic:HRule width="100%"/>
+
+    <basic:Spacer height="8"/>
+
+    <basic:HContainer>
+        <basic:style>
+            <basic:SimpleCSSStyles paddingTop="0" paddingLeft="0" 
verticalAlign="bottom" />
+        </basic:style>
+        <basic:Label text="Filter" className="sectionHeader"/>
+        <basic:Label text="({filter.count} items selected)" >
+            <basic:style>
+                <basic:SimpleCSSStyles fontWeight="bold" />
+                <!--<basic:SimpleCSSStyles color="{getStyle('themeColor')}" 
fontWeight="bold" />-->
+            </basic:style>
+        </basic:Label>
+    </basic:HContainer>
+
+    <basic:Spacer height="8"/>
+
+    <basic:Label text="Years of Experience"/>
+
+    <basic:DropDownList id="series" className="glass" width="140" 
change="dispatchFilter();">
+        <basic:dataProvider>
+            <fx:Array>
+                <fx:String>All</fx:String>
+                <fx:String>3</fx:String>
+                <fx:String>5</fx:String>
+                <fx:String>7</fx:String>
+                <fx:String>9</fx:String>
+            </fx:Array>                
+        </basic:dataProvider>
+    </basic:DropDownList>
+
+    <basic:Spacer height="18"/>
+
+    <basic:Label text="Price"/>
+
+    <!--<s:HSlider id="priceSlider" className="glassSlider" minimum="0" 
maximum="200" tickInterval="10" snapInterval="10"
+        width="100%" thumbCount="2" values="[0,200]" labels="[$0,$200]" 
liveDragging="true" dataTipFormatFunction="{cf.format}"
+        change="dispatchFilter()"
+        thumbPress="thumbBeingPressed=true"
+        thumbRelease="thumbBeingPressed=false;dispatchFilter()"
+        />-->
+    <basic:HContainer>
+        <basic:NumericStepper width="48%" id="loPrice" minimum="0" 
maximum="{hiPrice.value}" value="0" valueChange="dispatchFilter()" />
+        <basic:NumericStepper width="48%" id="hiPrice" 
minimum="{loPrice.value}" maximum="200" value="200" 
valueChange="dispatchFilter()" />
+    </basic:HContainer>
+
+    <basic:Spacer height="18"/>
+
+    <basic:Label text="Required Features"/>
+
+    <basic:Spacer height="4"/>
+
+    <basic:CheckBox id="cbBlazeDS" className="glass" text="BlazeDS" 
click="dispatchFilter();"/>
+    <basic:Spacer height="4"/>
+    <basic:CheckBox id="cbMobile" className="glass" text="Mobile" 
click="dispatchFilter()"/>
+    <basic:Spacer height="4"/>
+    <basic:CheckBox id="cbVideo" className="glass" text="Video" 
click="dispatchFilter();"/>
+
+    <basic:Spacer height="18"/>
+
+    <basic:HRule width="100%"/>
+
+    <basic:Spacer height="8"/>
+
+        <basic:HContainer>
+            <basic:Label text="Compare" className="sectionHeader"/>
+            <basic:Label text="(Drag items here to compare)" 
className="instructions"/>
+        </basic:HContainer>
+
+
+    <basic:Spacer height="4"/>
+
+    <!-- height is maxItems * ProductListItem.HEIGHT + 2px border -->
+    <productsView:ProductList id="productList" height="{productList.maxItems * 
ProductListItem.HEIGHT + 2}" width="100%"
+        newItemStartX="300" newItemStartY="-100" maxItems="4" 
+        removeProduct="productRemoved()"/>
+
+    <basic:Spacer height="8"/>
+    
+    <basic:ImageAndTextButton id="compareButton" className="glass" 
+                  click.showingThumbnails="attemptCompare()"
+                  click.showingComparison="dispatchFilter()"            
+                  text.showingComparison="Back to thumbnail view"
+                  text.showingThumbnails="Compare Items"
+                  image.showingThumbnails="assets/icon_compare.png"
+                  image.showingComparison="assets/icon_tiles.png" />
+    
+    <basic:states>
+       <mx:State name="showingThumbnails" />
+       <mx:State name="showingComparison" />
+    </basic:states>
+
+</basic:VContainer>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/2bd7d1e8/examples/FlexJSStore_jquery/src/productsView/ProductList.mxml
----------------------------------------------------------------------
diff --git a/examples/FlexJSStore_jquery/src/productsView/ProductList.mxml 
b/examples/FlexJSStore_jquery/src/productsView/ProductList.mxml
new file mode 100755
index 0000000..e99397d
--- /dev/null
+++ b/examples/FlexJSStore_jquery/src/productsView/ProductList.mxml
@@ -0,0 +1,217 @@
+<?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.
+
+-->
+<basic:Container xmlns:fx="http://ns.adobe.com/mxml/2009"; 
+                 xmlns:basic="library://ns.apache.org/flexjs/basic" 
+                 xmlns:mx="library://ns.adobe.com/flex/mx" 
+    > 
+    <basic:style>
+        <basic:SimpleCSSStyles borderStyle="solid" backgroundColor="#BCB29F" />
+    </basic:style>
+    <!-- need a background color for drag and drop but can set alpha to 0 -->
+    
+    <fx:Metadata>
+       [Event(name="addProduct", type="samples.flexstore.ProductListEvent")]
+       [Event(name="duplicateProduct", 
type="samples.flexstore.ProductListEvent")]
+       [Event(name="productQtyChange", 
type="samples.flexstore.ProductListEvent")]
+       [Event(name="removeProduct", type="samples.flexstore.ProductListEvent")]
+    </fx:Metadata>
+
+    <fx:Script>
+        <![CDATA[
+        import org.apache.flex.effects.Effect;
+        import org.apache.flex.effects.Move;
+        import org.apache.flex.effects.Sequence;
+        import org.apache.flex.core.DropType;
+        import org.apache.flex.core.IUIBase;
+        import org.apache.flex.events.DragEvent;
+        
+        import samples.flexstore.Product;
+        import samples.flexstore.ProductListEvent;
+        
+        public var items:Array = [];
+        
+        public var newItemStartX:int;
+        public var newItemStartY:int;
+        [Bindable]
+        public var maxItems:int = 0;
+        public var showQuantity:Boolean;
+        
+        private var playingEffects:Object = new Object();
+        
+        public function addProduct(product:Product):void
+               {
+            var index:int = indexOf(product.productId);
+            var event:ProductListEvent;
+            var item:ProductListItem;
+            
+            if (index != -1)
+                       {
+                           item = items[index] as ProductListItem;
+                           //if we don't keep track of what's playing a 
double-click can
+                           //cause the list item to keep rising
+                           if (playingEffects[item.uid] == null)
+                           {
+                    var jump:Sequence = new Sequence();
+                    var m1:Move = new Move(item)
+                    m1.yBy = -5;
+                    var m2:Move = new Move(item)
+                    m2.yBy = 5;
+                    jump.addChild(m1);
+                    jump.addChild(m2);
+                    jump.duration = 150;
+                    playingEffects[item.uid] = jump;
+                    jump.addEventListener(Effect.EFFECT_END, 
function(event:Event):void
+                    {
+                       delete playingEffects[item.uid];
+                    });
+                    jump.play();
+                }
+                event = new 
ProductListEvent(ProductListEvent.DUPLICATE_PRODUCT);
+                event.product = item.product;
+                dispatchEvent(event);
+            }
+                       else
+                       {
+                index = items.length;
+                if (maxItems <= 0 || index < maxItems)
+                               {
+                                   item = new ProductListItem();
+                                   if (showQuantity)
+                                   {
+                                       item.currentState = 'showQuantity';
+                                   }
+                                   item.product = product;
+                                   item.percentWidth = 100;
+                                   
item.addEventListener(ProductListEvent.REMOVE_PRODUCT, removeItemHandler);
+                    items[index] = item;
+                    viewport.addElement(item);
+                    layoutItems(index, true);
+                    event = new ProductListEvent(ProductListEvent.ADD_PRODUCT);
+                    event.product = product;
+                    dispatchEvent(event);
+                }
+            }
+        }
+        
+        public function getProducts():Array
+        {
+            var ret:Array = [];
+            for (var i:int = 0; i < items.length; i++)
+            {
+                ret[i] = ProductListItem(items[i]).product;
+            }
+            return ret;
+        }
+        
+        private function removeItemHandler(event:Event):void
+        {
+            var item:ProductListItem = event.target as ProductListItem;
+            var index:int = indexOf(item.product.productId);
+            items.splice(index, 1);
+            viewport.removeElement(item);
+            layoutItems(index);
+        }
+            
+        private function layoutItems(startIndex:int, 
scrollToBottom:Boolean=false):void
+               {
+            var n:int = items.length;
+            var e:Move;
+                       for (var i:int = startIndex; i < n ; i++)
+                       {
+                           var item:ProductListItem = items[i];
+                var yTo:Number = i * (item.height);
+                //still need to prevent items that are already in motion from 
getting
+                //jumpy
+                           if (playingEffects[item.uid] == null)
+                           {
+                    e = new Move(item);
+                    if (item.x == 0 && item.y == 0)
+                               {
+                                       e.xFrom = newItemStartX;
+                                       e.yFrom = newItemStartY;
+                    }
+    
+                    e.xTo = 0;
+                    e.yTo = yTo;
+                    playingEffects[item.uid] = e;
+                    e.addEventListener(Effect.EFFECT_END, 
function(event:Event):void
+                    {
+                       delete playingEffects[item.uid];
+                    });
+                    e.play();
+                }
+                else
+                {
+                    playingEffects[item.uid].pause();
+                    playingEffects[item.uid].yTo = yTo;
+                    playingEffects[item.uid].play();
+                }
+            }
+            //get the last event and if we should scroll make sure we can 
validate
+            //and scroll to maxVPosition
+            if (scrollToBottom)
+            {
+                e.addEventListener(Effect.EFFECT_END, 
function(event:Event):void
+                {
+                    scrollingView.verticalScrollPosition = 
scrollingView.maxVerticalScrollPosition;    
+                });
+            }
+        }
+        
+        private function indexOf(productId:int):int
+               {
+            var index:int = -1;
+
+            var n:int = items.length;
+                       for (var i:int = 0; i < items.length; i++)
+                       {
+                if (ProductListItem(items[i]).product.productId == productId)
+                               {
+                    index = i;
+                    break;
+                }
+            }
+
+            return index;
+        }     
+
+        private function doDragEnter(event:DragEvent):void
+        {
+            trace("doDragEnter");
+            dmc.acceptDragDrop(event.target as IUIBase, DropType.COPY);
+        }
+
+        private function doDragDrop(event:DragEvent):void
+        {
+            trace("doDragDrop");
+            var product:Product = DragEvent.dragSource as Product;
+            addProduct(product);
+        }  
+ 
+        ]]>
+    </fx:Script>
+    <basic:beads>
+        <basic:DropMouseController id="dmc" dragEnter="doDragEnter(event)" 
dragDrop="doDragDrop(event)" />
+        <basic:ScrollingContainerView id="scrollingView" />
+        <basic:NonVirtualVerticalScrollingLayout />
+    </basic:beads>
+    <basic:Container id="viewport" width="100%" height="100%" >
+    </basic:Container>
+</basic:Container>

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/2bd7d1e8/examples/FlexJSStore_jquery/src/productsView/ProductListItem.mxml
----------------------------------------------------------------------
diff --git a/examples/FlexJSStore_jquery/src/productsView/ProductListItem.mxml 
b/examples/FlexJSStore_jquery/src/productsView/ProductListItem.mxml
new file mode 100755
index 0000000..a7b77bf
--- /dev/null
+++ b/examples/FlexJSStore_jquery/src/productsView/ProductListItem.mxml
@@ -0,0 +1,131 @@
+<?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.
+
+-->
+<basic:Container xmlns:fx="http://ns.adobe.com/mxml/2009"; 
+                    xmlns:basic="library://ns.apache.org/flexjs/basic" 
+                    xmlns:mx="library://ns.adobe.com/flex/mx" 
+    className="listItem" 
+    height="{HEIGHT}" implements="org.apache.flex.core.IItemRenderer">
+    <!--automationName="{product.name}">-->
+
+    <fx:Metadata>
+       [Event(name="productQtyChange", 
type="samples.flexstore.ProductListEvent")]
+       [Event(name="removeProduct", type="samples.flexstore.ProductListEvent")]
+    </fx:Metadata>
+    
+    <fx:Script>
+    <![CDATA[
+    
+        import samples.flexstore.Product;
+        import samples.flexstore.ProductListEvent;
+        
+        private static var idCounter:int = 0;
+        public var uid:String = (idCounter++).toString();
+        
+        public static const HEIGHT:int = 30;
+        
+        [Bindable("__NoChangeEvent__")]
+        public function get product():Product
+        {
+            return _data as Product;
+        }
+        public function set product(value:Product):void
+        {
+            _data = value;
+        }
+        
+        private var _data:Object;
+        
+        public function get data():Object
+        {
+            return _data;
+        }
+        
+        public function set data(value:Object):void
+        {
+            _data = value;
+        }
+
+        private var _itemRendererParent:Object;
+        
+        public function get itemRendererParent():Object
+        {
+            return _itemRendererParent;
+        }
+        
+        public function set itemRendererParent(value:Object):void
+        {
+            _itemRendererParent = value;
+        }
+        
+        private function qtyChange():void
+       {
+            product.qty = int(qty.text);
+            var event:ProductListEvent = new 
ProductListEvent(ProductListEvent.PRODUCT_QTY_CHANGE);
+            event.product = product;
+               dispatchEvent(event);
+        }
+        
+        private function removeItem():void
+        {
+            var event:ProductListEvent = new 
ProductListEvent(ProductListEvent.REMOVE_PRODUCT);
+            event.product = product;
+               dispatchEvent(event);
+        }
+        
+    ]]>
+    </fx:Script>
+    
+    <fx:Declarations>
+        <basic:CurrencyFormatter currencySymbol="$" id="cf" 
fractionalDigits="2"/>
+    </fx:Declarations>
+    
+    <basic:beads>
+        <basic:ContainerDataBinding />
+    </basic:beads>
+        
+    <basic:ImageButton id="removeButton" backgroundImage="assets/trashcan.png"
+        width="14" height="14" y="5"
+        click="removeItem()">
+        <basic:beads>
+            <basic:ToolTipBead toolTip="Remove from cart" />
+        </basic:beads>
+    </basic:ImageButton>
+    
+    <basic:Image id="productImage" x="16" y="6" width="12" height="12" 
source="{product.image}"/>
+
+    <basic:Label id="productName" x="30" width="100" y="4" 
text="{product.name}"/>
+
+    <basic:Label id="productPrice" width="60" y="4"
+        text="{cf.format(product.price)}" style="textAlign:right;right:0"
+                                style.showQuantity="textAlign:right;right:25"/>
+        
+    <basic:TextInput id="qty" width="25" y="3" text="{product.qty}" 
includeIn="showQuantity"
+                  style="textAlign:right;right:0;marginTop:0" 
change="qtyChange()" >
+        <basic:beads>
+            <basic:NumericOnlyTextInputBead maxChars="3" />
+        </basic:beads>
+    </basic:TextInput>
+    
+    <basic:states>
+        <mx:State name="compare" />
+        <mx:State name="showQuantity" />
+    </basic:states>
+    
+</basic:Container>

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/2bd7d1e8/examples/FlexJSStore_jquery/src/productsView/ProductSupport.mxml
----------------------------------------------------------------------
diff --git a/examples/FlexJSStore_jquery/src/productsView/ProductSupport.mxml 
b/examples/FlexJSStore_jquery/src/productsView/ProductSupport.mxml
new file mode 100755
index 0000000..c28570e
--- /dev/null
+++ b/examples/FlexJSStore_jquery/src/productsView/ProductSupport.mxml
@@ -0,0 +1,91 @@
+<?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.
+
+-->
+<basic:HContainer xmlns:fx="http://ns.adobe.com/mxml/2009"; 
+          xmlns:basic="library://ns.apache.org/flexjs/basic" 
+          xmlns:mx="library://ns.adobe.com/flex/mx" 
+                >
+    <basic:style>
+        <basic:SimpleCSSStyles paddingLeft="4" paddingRight="8" 
paddingBottom="4" />
+    </basic:style>
+    <basic:beads>
+        <basic:ContainerDataBinding />
+    </basic:beads>
+
+    <fx:Script>
+       <![CDATA[
+
+        private function toggle():void
+               {
+                       /*
+            if (vd.playing)
+                       {
+                vd.stop();
+                list.visible = true;
+            }
+                       else
+                       {
+                list.visible = false;
+                vd.play();
+            }
+                       */
+        }
+
+       ]]>
+    </fx:Script>
+
+    <fx:Declarations>
+        <basic:Parallel id="hideList">
+            <basic:children>
+                <fx:Array>
+                    <basic:Resize target="{list}" widthTo="0"/>
+                    <!--<mx:Resize target="{vd}" widthTo="400" 
heightTo="314"/>-->
+                </fx:Array>
+            </basic:children>
+        </basic:Parallel>
+        
+        <basic:Parallel id="showList">
+            <basic:children>
+                <fx:Array>
+                    <basic:Resize target="{list}" widthTo="130"/>
+                    <!--<mx:Resize target="{vd}" widthTo="270" 
heightTo="217"/>-->
+                </fx:Array>
+            </basic:children>
+        </basic:Parallel>        
+    </fx:Declarations>
+    <basic:List id="list" width="130" height="100%" selectedIndex="0">
+        <basic:dataProvider>
+            <fx:Array>
+                <fx:Object label="Install SIM Card"/>
+            </fx:Array>
+        </basic:dataProvider>
+    </basic:List>
+
+    <basic:Container width="100%">
+
+               <!--<mx:VideoDisplay id="vd" width="270" height="217" 
source="assets/phone.flv"
+                                                autoPlay="false" 
complete="list.visible=true"/>
+
+               <mx:Button label="{vd.playing ? 'Stop' : 'Play'}" 
click="toggle()" left="8" bottom="8" includeInLayout="false">
+               </mx:Button>
+               -->
+       </basic:Container>
+
+
+</basic:HContainer>

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/2bd7d1e8/examples/FlexJSStore_jquery/src/samples/flexstore/ButtonBarButtonSkin.as
----------------------------------------------------------------------
diff --git 
a/examples/FlexJSStore_jquery/src/samples/flexstore/ButtonBarButtonSkin.as 
b/examples/FlexJSStore_jquery/src/samples/flexstore/ButtonBarButtonSkin.as
new file mode 100755
index 0000000..5e94b58
--- /dev/null
+++ b/examples/FlexJSStore_jquery/src/samples/flexstore/ButtonBarButtonSkin.as
@@ -0,0 +1,298 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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 samples.flexstore
+{
+
+import flash.display.GradientType;
+import mx.containers.BoxDirection;
+import mx.controls.Button;
+import mx.controls.ButtonBar;
+import mx.skins.Border;
+import mx.skins.halo.*;
+import mx.styles.StyleManager;
+import mx.utils.ColorUtil;
+
+/**
+ *  Adapted from mx.skins.halo.ButtonBarButtonSkin.
+ *  This version of the ButtonBarButtonSkin is applied for the
+ *  selectedOver, selectedUp, and over states to use the 2nd two
+ *  values of the fillColors for the selected state of the
+ *  button.  The over state then uses a computed value from
+ *  the themeColor to show emphasis.  The border of the selected
+ *  button also uses a computed value from the themeColor, but
+ *  is partially transparent.
+ */
+public class ButtonBarButtonSkin extends Border
+{
+       
//--------------------------------------------------------------------------
+       //
+       //  Class variables
+       //
+       
//--------------------------------------------------------------------------
+
+       /**
+        *  @private
+        */
+       private static var cache:Object = {};
+
+       
//--------------------------------------------------------------------------
+       //
+       //  Class methods
+       //
+       
//--------------------------------------------------------------------------
+
+       /**
+        *  @private
+        *  Several colors used for drawing are calculated from the base colors
+        *  of the component (themeColor, borderColor and fillColors).
+        *  Since these calculations can be a bit expensive,
+        *  we calculate once per color set and cache the results.
+        */
+       private static function calcDerivedStyles(themeColor:uint,
+                                                                               
          fillColor0:uint,
+                                                                               
          fillColor1:uint):Object
+       {
+               var key:String = HaloColors.getCacheKey(themeColor,
+                                                                               
                fillColor0, fillColor1);
+
+               if (!cache[key])
+               {
+                       var o:Object = cache[key] = {};
+
+                       // Cross-component styles.
+                       HaloColors.addHaloColors(o, themeColor, fillColor0, 
fillColor1);
+
+                       // Button-specific styles.
+                       o.innerEdgeColor1 = 
ColorUtil.adjustBrightness2(fillColor0, -10);
+                       o.innerEdgeColor2 = 
ColorUtil.adjustBrightness2(fillColor1, -25);
+               }
+
+               return cache[key];
+       }
+
+       
//--------------------------------------------------------------------------
+       //
+       //  Constructor
+       //
+       
//--------------------------------------------------------------------------
+
+       /**
+        *  @private
+        *  Constructor.
+        */
+       public function ButtonBarButtonSkin()
+       {
+               super();
+       }
+
+       
//--------------------------------------------------------------------------
+       //
+       //  Overridden properties
+       //
+       
//--------------------------------------------------------------------------
+
+       //----------------------------------
+       //  measuredWidth
+       //----------------------------------
+
+       /**
+        *  @private
+        */
+       override public function get measuredWidth():Number
+       {
+               return 50;
+       }
+
+       //----------------------------------
+       //  measuredHeight
+       //----------------------------------
+
+       /**
+        *  @private
+        */
+       override public function get measuredHeight():Number
+       {
+               return 22;
+       }
+
+       
//--------------------------------------------------------------------------
+       //
+       //  Overridden methods
+       //
+       
//--------------------------------------------------------------------------
+
+       /**
+        *  @private
+        */
+       override protected function updateDisplayList(w:Number, h:Number):void
+       {
+               super.updateDisplayList(w, h);
+
+               // User-defined styles.
+               var borderColor:uint = getStyle("borderColor");
+               var cornerRadius:Number = getStyle("cornerRadius");
+               var fillAlphas:Array = getStyle("fillAlphas");
+               var fillColors:Array = getStyle("fillColors");
+               styleManager.getColorNames(fillColors);
+               var highlightAlphas:Array = getStyle("highlightAlphas");
+               var themeColor:uint = getStyle("themeColor");
+
+               // Derivative styles.
+               var derStyles:Object = calcDerivedStyles(themeColor, 
fillColors[0],
+                                                                               
                 fillColors[1]);
+
+               var borderColorDrk1:Number =
+                       ColorUtil.adjustBrightness2(borderColor, -50);
+
+               var themeColorDrk1:Number =
+                       ColorUtil.adjustBrightness2(themeColor, -25);
+
+               var emph:Boolean = false;
+
+               if (parent is Button)
+                       emph = (parent as Button).emphasized;
+
+               var tmp:Number;
+
+               var bar:ButtonBar = parent ? ButtonBar(parent.parent) : null;
+               var horizontal:Boolean = true;
+               var pos:int = 0;
+
+               if (bar)
+               {
+                       if (bar.direction == BoxDirection.VERTICAL)
+                               horizontal = false;
+
+                       // first: -1, middle: 0, last: 1
+                       var index:int = bar.getChildIndex(parent);
+                       pos = (index == 0 ? -1 : (index == bar.numChildren - 1 
? 1 : 0));
+               }
+
+               var radius:Object = getCornerRadius(pos, horizontal, 
cornerRadius);
+               var cr:Object = getCornerRadius(pos, horizontal, cornerRadius);
+               var cr1:Object = getCornerRadius(pos, horizontal, cornerRadius 
- 1);
+               var cr2:Object = getCornerRadius(pos, horizontal, cornerRadius 
- 2);
+               var cr3:Object = getCornerRadius(pos, horizontal, cornerRadius 
- 3);
+
+               graphics.clear();
+
+               switch (name)
+               {
+                       case "selectedUpSkin":
+                       case "selectedOverSkin":
+                       {
+                               var overFillColors:Array;
+                               if (fillColors.length > 2)
+                                       overFillColors = [ fillColors[2], 
fillColors[3] ];
+                               else
+                                       overFillColors = [ fillColors[0], 
fillColors[1] ];
+
+                               var overFillAlphas:Array;
+                               if (fillAlphas.length > 2)
+                                       overFillAlphas = [ fillAlphas[2], 
fillAlphas[3] ];
+                               else
+                                       overFillAlphas = [ fillAlphas[0], 
fillAlphas[1] ];
+
+                               // button border/edge
+                               drawRoundRect(
+                                       0, 0, w, h, cr,
+                                       [ themeColor, derStyles.themeColDrk1 ], 
0.5,
+                                       verticalGradientMatrix(0, 0, w , h),
+                                       GradientType.LINEAR, null,
+                                       { x: 1, y: 1, w: w - 2, h: h - 2, r: 
cr1 });
+
+                               // button fill
+                               drawRoundRect(
+                                       1, 1, w - 2, h - 2, cr1,
+                                       overFillColors, overFillAlphas,
+                                       verticalGradientMatrix(0, 0, w - 2, h - 
2));
+
+                               // top highlight
+                               if (!(radius is Number))
+                                       { radius.bl = radius.br = 0;}
+                               drawRoundRect(
+                                       1, 1, w - 2, (h - 2) / 2, radius,
+                                       [ 0xFFFFFF, 0xFFFFFF ], highlightAlphas,
+                                       verticalGradientMatrix(1, 1, w - 2, (h 
- 2) / 2));
+                               break;
+                       }
+
+                       case "overSkin":
+                       {
+                               // button border/edge
+                               drawRoundRect(
+                                       0, 0, w, h, cr,
+                                       [ themeColor, derStyles.themeColDrk1 ], 
0.5,
+                                       verticalGradientMatrix(0, 0, w, h));
+
+                               // button fill
+                               drawRoundRect(
+                                       1, 1, w - 2, h - 2, cr1,
+                                       [ derStyles.fillColorPress1, 
derStyles.fillColorPress2 ], 1,
+                                       verticalGradientMatrix(0, 0, w - 2, h - 
2));
+
+                               // top highlight
+                               if (!(radius is Number))
+                                       { radius.bl = radius.br = 0;}
+                               drawRoundRect(
+                                       1, 1, w - 2, (h - 2) / 2, radius,
+                                       [ 0xFFFFFF, 0xFFFFFF ], highlightAlphas,
+                                       verticalGradientMatrix(1, 1, w - 2, (h 
- 2) / 2));
+
+                               break;
+                       }
+               }
+       }
+
+       
//--------------------------------------------------------------------------
+       //
+       //  Methods
+       //
+       
//--------------------------------------------------------------------------
+
+       /**
+        *  @private
+        */
+       private function getCornerRadius(pos:int, horizontal:Boolean,
+                                                                        
radius:Number):Object
+       {
+               if (pos == 0)
+                       return 0;
+
+               radius = Math.max(0, radius);
+
+               if (horizontal)
+               {
+                       if (pos == -1)
+                               return { tl: radius, tr: 0, bl: radius, br: 0 };
+                       else // pos == 1
+                               return { tl: 0, tr: radius, bl: 0, br: radius };
+               }
+               else
+               {
+                       if (pos == -1)
+                               return { tl: radius, tr: radius, bl: 0, br: 0 };
+                       else // pos == 1
+                               return { tl: 0, tr: 0, bl: radius, br: radius };
+               }
+       }
+}
+
+}

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/2bd7d1e8/examples/FlexJSStore_jquery/src/samples/flexstore/Product.as
----------------------------------------------------------------------
diff --git a/examples/FlexJSStore_jquery/src/samples/flexstore/Product.as 
b/examples/FlexJSStore_jquery/src/samples/flexstore/Product.as
new file mode 100755
index 0000000..040fb8f
--- /dev/null
+++ b/examples/FlexJSStore_jquery/src/samples/flexstore/Product.as
@@ -0,0 +1,78 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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 samples.flexstore
+{
+
+[Bindable]
+public class Product
+{
+
+    public var productId:int;
+    public var name:String;
+    public var description:String;
+    public var price:Number;
+    public var image:String;
+    public var experience:String;
+    public var blazeds:Boolean;
+    public var mobile:Boolean;
+    public var video:Boolean;
+    public var highlight1:String;
+    public var highlight2:String;
+    public var qty:int;
+
+    public function Product()
+    {
+
+    }
+
+    public function fill(obj:Object):void
+    {
+        for (var i:String in obj)
+        {
+            this[i] = obj[i];
+        }
+    }
+
+    [Bindable(event="propertyChange")]
+    public function get featureString():String
+    {
+       var str:String = "";
+       if (blazeds)
+               str += "BlazeDS";
+
+               if (mobile)
+               {
+                       if (str.length > 0)
+                               str += "\n";
+                       str += "Mobile";
+               }
+
+               if (video)
+               {
+                       if (str.length > 0)
+                               str += "\n";
+                       str += "Video";
+               }
+
+               return str;
+    }
+
+}
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/2bd7d1e8/examples/FlexJSStore_jquery/src/samples/flexstore/ProductFilter.as
----------------------------------------------------------------------
diff --git a/examples/FlexJSStore_jquery/src/samples/flexstore/ProductFilter.as 
b/examples/FlexJSStore_jquery/src/samples/flexstore/ProductFilter.as
new file mode 100755
index 0000000..d182371
--- /dev/null
+++ b/examples/FlexJSStore_jquery/src/samples/flexstore/ProductFilter.as
@@ -0,0 +1,56 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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 samples.flexstore
+{
+
+[Bindable]
+public class ProductFilter
+{
+    public var count:int;
+    public var experience:String;
+    public var minPrice:Number;
+    public var maxPrice:Number;
+    public var blazeds:Boolean;
+    public var mobile:Boolean;
+    public var video:Boolean;
+    
+    public function ProductFilter()
+    {
+        super();
+    }
+    
+    public function accept(product:Product):Boolean
+    {
+        //price is often the first test so let's fail fast if possible
+        if (minPrice > product.price || maxPrice < product.price)
+            return false;
+        if (experience != "All" && experience > product.experience)
+            return false;
+        if (blazeds && !product.blazeds)
+            return false;
+        if (mobile && !product.mobile)
+            return false;
+        if (video && !product.video)
+            return false;
+        
+        return true;
+    }
+}
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/2bd7d1e8/examples/FlexJSStore_jquery/src/samples/flexstore/ProductFilterEvent.as
----------------------------------------------------------------------
diff --git 
a/examples/FlexJSStore_jquery/src/samples/flexstore/ProductFilterEvent.as 
b/examples/FlexJSStore_jquery/src/samples/flexstore/ProductFilterEvent.as
new file mode 100755
index 0000000..28129e7
--- /dev/null
+++ b/examples/FlexJSStore_jquery/src/samples/flexstore/ProductFilterEvent.as
@@ -0,0 +1,39 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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 samples.flexstore
+{
+
+import org.apache.flex.events.Event;
+
+public class ProductFilterEvent extends Event
+{
+    public static const FILTER:String = "filter";
+    
+    public var live:Boolean;
+    public var filter:ProductFilter;
+    
+    public function ProductFilterEvent(filter:ProductFilter, live:Boolean)
+    {
+        super(FILTER);
+        this.filter = filter;
+        this.live = live;
+    }
+}
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/2bd7d1e8/examples/FlexJSStore_jquery/src/samples/flexstore/ProductListEvent.as
----------------------------------------------------------------------
diff --git 
a/examples/FlexJSStore_jquery/src/samples/flexstore/ProductListEvent.as 
b/examples/FlexJSStore_jquery/src/samples/flexstore/ProductListEvent.as
new file mode 100755
index 0000000..b6b9371
--- /dev/null
+++ b/examples/FlexJSStore_jquery/src/samples/flexstore/ProductListEvent.as
@@ -0,0 +1,42 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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 samples.flexstore
+{
+
+import org.apache.flex.events.Event;
+
+public class ProductListEvent extends Event
+{
+    public static const ADD_PRODUCT:String = "addProduct";
+    public static const DUPLICATE_PRODUCT:String = "duplicateProduct";
+    public static const REMOVE_PRODUCT:String = "removeProduct";
+    public static const PRODUCT_QTY_CHANGE:String = "productQtyChange";
+    
+    public var product:Product;
+    
+    //making the default bubbles behavior of the event to true since we want
+    //it to bubble out of the ProductListItem and beyond
+    public function ProductListEvent(type:String, bubbles:Boolean=true, 
cancelable:Boolean=false)
+    {
+        super(type, bubbles, cancelable);
+    }
+    
+}
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/2bd7d1e8/examples/FlexJSStore_jquery/src/samples/flexstore/ProductThumbEvent.as
----------------------------------------------------------------------
diff --git 
a/examples/FlexJSStore_jquery/src/samples/flexstore/ProductThumbEvent.as 
b/examples/FlexJSStore_jquery/src/samples/flexstore/ProductThumbEvent.as
new file mode 100755
index 0000000..f92dc7f
--- /dev/null
+++ b/examples/FlexJSStore_jquery/src/samples/flexstore/ProductThumbEvent.as
@@ -0,0 +1,45 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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 samples.flexstore
+{
+    
+import org.apache.flex.events.Event;
+
+public class ProductThumbEvent extends Event
+{
+    public static const PURCHASE:String = "purchase";
+    public static const COMPARE:String = "compare";
+    public static const DETAILS:String = "details";
+    public static const BROWSE:String = "browse";
+    
+    public var product:Product;
+    
+    public function ProductThumbEvent(type:String, product:Product)
+    {
+        super(type);
+        this.product = product;
+    }
+    
+    override public function cloneEvent():Event
+    {
+        return new ProductThumbEvent(type, product);
+    }
+}
+
+}
\ No newline at end of file

Reply via email to