http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/d33fe63c/examples/flexjs/FlexJSStore/src/productsView/ProductCatalogPanel.mxml ---------------------------------------------------------------------- diff --git a/examples/flexjs/FlexJSStore/src/productsView/ProductCatalogPanel.mxml b/examples/flexjs/FlexJSStore/src/productsView/ProductCatalogPanel.mxml new file mode 100755 index 0000000..48fa69a --- /dev/null +++ b/examples/flexjs/FlexJSStore/src/productsView/ProductCatalogPanel.mxml @@ -0,0 +1,546 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +--> +<js:Panel xmlns:fx="http://ns.adobe.com/mxml/2009" + xmlns:js="library://ns.apache.org/flexjs/basic" + implements="org.apache.flex.core.IDragInitiator" + xmlns:productsView="productsView.*" + currentState="browse" + title="SpaceHolder" + title.browse="Browse" + title.compare="Product Comparison" + title.details="Product Details" + className="catalogPanel" + > + + <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 org.apache.flex.core.IUIBase; + import org.apache.flex.effects.Effect; + import org.apache.flex.effects.Fade; + import org.apache.flex.effects.Move; + import org.apache.flex.effects.Parallel; + import org.apache.flex.effects.Tween; + import org.apache.flex.events.DragEvent; + import org.apache.flex.events.Event; + import org.apache.flex.collections.LazyCollection; + + import samples.flexstore.Product; + import samples.flexstore.ProductFilter; + import samples.flexstore.ProductFilterEvent; + import samples.flexstore.ProductThumbEvent; + + + private var accepted:Object = new Object(); + private var thumbnails:Array; + private var filterCount:int; + private var thumbnailState:String = 'browse'; //either 'browse' or 'compare' + + [Bindable] + public var cartCount:int; + + //----------------------------- + // catalog + //----------------------------- + + private var _catalog:LazyCollection; + + [Bindable] + public function set catalog(c:LazyCollection):void + { + _catalog = c; + createThumbnails(); + } + + public function get catalog():LazyCollection + { + 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++) + { + thumbContentGroup.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(); + thumb.x = 0; + thumb.y = 0; + thumbnails[i] = thumb; + // thumbnails[i].showInAutomationHierarchy = true; + thumb.product = catalog.getItemAt(i) as Product; + accepted[thumb.product.productId.toString()] = true; + thumbContentGroup.addElement(thumb); + thumb.addEventListener(ProductThumbEvent.PURCHASE, productThumbEventHandler); + thumb.addEventListener(ProductThumbEvent.COMPARE, productThumbEventHandler); + thumb.addEventListener(ProductThumbEvent.DETAILS, productThumbEventHandler); + thumb.addEventListener(DragEvent.DRAG_START,thumbDragStartHandler); + } + + var lastMove:Effect = layoutCatalog(); + if (lastMove) + { + lastMove.addEventListener(Tween.TWEEN_UPDATE, updateLayout); + lastMove.addEventListener(Tween.TWEEN_END, updateLayout); + } + } + + private function updateLayout(event:org.apache.flex.events.Event):void + { + thumbContentGroup.dispatchEvent(new org.apache.flex.events.Event("layoutNeeded")); + } + + private function thumbDragStartHandler(event:MouseEvent):void + { + if (DragMouseController.dragging == false) + { + var thumb:ProductCatalogThumbnail = event.target as ProductCatalogThumbnail; + DragEvent.dragSource = thumb.product; + + var di:ProductCatalogThumbnail = new ProductCatalogThumbnail(); + di.product = thumb.product; + di.currentState = thumb.currentState; + DragMouseController.dragImage = di; + + DragEvent.dragInitiator = this; + } + } + + public function filter(productFilter:ProductFilter, live:Boolean):void + { + currentState = "browse"; + thumbnailState = "browse"; + var count:int=0; + var n:int = thumbnails.length; + 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.productId.toString()] = true; + thumb.alpha = 1; + count++; + } + else + { + accepted[product.productId.toString()] = 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) + { + var p:Parallel = new Parallel(); + n = targets.length; + for (i = 0; i < n; i++) + { + var fadeOut:Fade = new Fade(targets[i] as IUIBase); + fadeOut.alphaFrom = 1; + fadeOut.alphaTo = .1; + p.addChild(fadeOut); + } + p.play(); + p.addEventListener(Effect.EFFECT_END, + function(event:org.apache.flex.events.Event):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.productId.toString()]) + { + 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 + scv.verticalScrollPosition = 0; + // Fade in newly selected thumbnails after the last + // visible thumbnail has moved to its new position. + move.addEventListener(Effect.EFFECT_END, + function(event:org.apache.flex.events.Event):void + { + fadeInThumbnails(); + }); + } + thumbContentGroup.dispatchEvent(new org.apache.flex.events.Event("layoutNeeded")); + //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 targets:Array = []; + for (var i:int = 0; i < n ; i++) + { + var thumb:ProductCatalogThumbnail = thumbnails[i]; + if (accepted[thumb.product.productId.toString()] && !thumb.visible) + { + thumb.alpha = 0; + thumb.visible = true; + targets.push(thumb); + } + } + if (targets.length > 0) + { + n = targets.length; + for (i = 0; i < n; i++) + { + var effect:Fade = new Fade(targets[i] as IUIBase); + effect.alphaTo = 1; + 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 = thumbContentGroup.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(Effect.EFFECT_END, + function(event:org.apache.flex.events.Event):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(Effect.EFFECT_END, + function(e:org.apache.flex.events.Event):void + { + var curpos:int = scv.verticalScrollPosition; + if (selectedThumb.y < curpos) + { + scv.verticalScrollPosition = y; + } + else if (selectedThumb.y + ProductCatalogThumbnail.COL_HEIGHT_4 > curpos + thumbContentGroup.height) + { + //this logic doesn't seem to be perfect but it will do + var diff:int = selectedThumb.y - (curpos + thumbContentGroup.height) + scv.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.productId.toString()] = false; + } + for (i=0; i < toCompare.length; i++) + { + accepted[toCompare[i].productId.toString()] = true; + } + } + var lastEffect:Effect = layoutCatalog(); + if (lastEffect != null) + { + lastEffect.addEventListener(Effect.EFFECT_END, + function (event:org.apache.flex.events.Event):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.productId.toString()]) + { + thumb.currentState = "compare"; + } + } + + } + } + + public function acceptingDrop(dropTarget:Object, type:String):void + { + + } + + public function acceptedDrop(dropTarget:Object, type:String):void + { + + } + + ]]> + </fx:Script> + + <js:beads> + <js:ContainerDataBinding /> + <js:VerticalLayout /> + <js:DragMouseController id="dragger" /> + <js:ParentDocumentBead id="pdb" /> + <js:PanelView> + <js:titleBar> + <js:TitleBar height="20" > + <js:style> + <js:SimpleCSSStyles backgroundColor="0xA65904" /> + </js:style> + <js:beads> + <productsView:ProductCatalogPanelTitleBarView /> + </js:beads> + </js:TitleBar> + </js:titleBar> + </js:PanelView> + </js:beads> + <js:Container width="100%" height="100%"> + <js:Container id="thumbContentGroup" width="100%" height="100%"> + <js:beads> + <js:ScrollingViewport id="scv" /> + </js:beads> + </js:Container> + <productsView:ProductDetails id="details" y="0" + width="{ProductCatalogThumbnail.COL_WIDTH_4 * 3}" + height="100%" + visible="false" + visible.details="true" + compare="productThumbEventHandler(event)" + purchase="productThumbEventHandler(event)" + browse="productThumbEventHandler(event)" /> + </js:Container> + + <js:states> + <js:State name="browse" /> + <js:State name="compare" /> + <js:State name="details" /> + </js:states> + +</js:Panel>
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/d33fe63c/examples/flexjs/FlexJSStore/src/productsView/ProductCatalogPanelTitleBarView.mxml ---------------------------------------------------------------------- diff --git a/examples/flexjs/FlexJSStore/src/productsView/ProductCatalogPanelTitleBarView.mxml b/examples/flexjs/FlexJSStore/src/productsView/ProductCatalogPanelTitleBarView.mxml new file mode 100755 index 0000000..5e82f95 --- /dev/null +++ b/examples/flexjs/FlexJSStore/src/productsView/ProductCatalogPanelTitleBarView.mxml @@ -0,0 +1,49 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +--> +<js:MXMLBeadViewBase xmlns:fx="http://ns.adobe.com/mxml/2009" + xmlns:js="library://ns.apache.org/flexjs/basic" + xmlns:productsView="productsView.*" + > + <fx:Script> + <![CDATA[ + import org.apache.flex.html.TitleBar; + import org.apache.flex.core.ITitleBarModel; + import org.apache.flex.core.UIBase; + import org.apache.flex.events.Event; + + private function clickHandler():void + { + var newEvent:org.apache.flex.events.Event = new org.apache.flex.events.Event('close',true); + UIBase(_strand).dispatchEvent(newEvent) + } + ]]> + </fx:Script> + <js:beads> + <js:MXMLBeadViewBaseDataBinding /> + <js:ParentDocumentBead id="pdb" /> + <js:LayoutChangeNotifier watchedProperty="{buttons.width}" /> + </js:beads> + <js:Label id="titleLabel" text="{ITitleBarModel(model).title}" + /> + <js:CloseButton id="closeButton" click="clickHandler()" + visible="{ITitleBarModel(model).showCloseButton}"; + /> + <productsView:CatalogTitleButtons id="buttons" /> +</js:MXMLBeadViewBase> http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/d33fe63c/examples/flexjs/FlexJSStore/src/productsView/ProductCatalogThumbnail.mxml ---------------------------------------------------------------------- diff --git a/examples/flexjs/FlexJSStore/src/productsView/ProductCatalogThumbnail.mxml b/examples/flexjs/FlexJSStore/src/productsView/ProductCatalogThumbnail.mxml new file mode 100755 index 0000000..dec248f --- /dev/null +++ b/examples/flexjs/FlexJSStore/src/productsView/ProductCatalogThumbnail.mxml @@ -0,0 +1,220 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +--> +<js:Container xmlns:fx="http://ns.adobe.com/mxml/2009" + xmlns:js="library://ns.apache.org/flexjs/basic" + width="{COL_WIDTH_4}" height="{COL_HEIGHT_4}" height.compare="502" + width.x4cols="{COL_WIDTH_4}" height.x4cols="{COL_HEIGHT_4}" + width.x3cols="{COL_WIDTH_3}" height.x3cols="{COL_HEIGHT_3}" + width.x2cols="{COL_WIDTH_2}" height.x2cols="{COL_HEIGHT_2}" + rollOver="rollOverHandler(event)" + rollOut="rollOutHandler(event)" + mouseDown="mouseDownHandler(event)" + mouseMove="mouseMoveHandler(event)" + mouseUp="mouseUpHandler(event)" + click="clickHandler(event)" + currentState="x4cols" + > + <!-- automationName="{product.name}" --> + <js:beads> + <js:ContainerDataBinding /> + <js:LayoutChangeNotifier watchedProperty="{borderStyles.borderColor}" initialValue="#FFFFFF" /> + </js:beads> + <js:style> + <js:BindableCSSStyles id="borderStyles" borderStyle="solid" borderWidth="1" + borderColor="#FFFFFF" backgroundColor="#FFFFFF"/> + </js:style> + <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 org.apache.flex.events.*; + import org.apache.flex.utils.PointUtils; + + import samples.flexstore.Product; + import samples.flexstore.ProductThumbEvent; + + public static const COL_WIDTH_4:int = 162; + public static const COL_HEIGHT_4:int = 122; + public static const COL_WIDTH_3:int = 217; + public static const COL_HEIGHT_3:int = 165; + public static const COL_WIDTH_2:int = 327; + public static const COL_HEIGHT_2:int = 250; + public static const COMPARE_WIDTH:int = 162; + public static const HORIZONTAL_GAP:int = 2; + public static const VERTICAL_GAP:int = 3; + + [Bindable] + public var product:Product; + + private function rollOverHandler(event:MouseEvent):void + { + borderStyles.borderColor = "#CCCCCC"; + //style["dropShadowEnabled"] = true; + buttons.visible = true; + } + + private function rollOutHandler(event:MouseEvent):void + { + borderStyles.borderColor = "#FFFFFF"; + //style["dropShadowEnabled"] = false; + buttons.visible = false; + } + + private var dragStartPoint:Point; + + public function mouseDownHandler(event:MouseEvent):void + { + if (event.target != purchase && + event.target != compare && + event.target != details) + { + dragStartPoint = new Point(event.clientX, event.clientY); + } + } + + public function mouseMoveHandler(event:MouseEvent):void + { + if (dragStartPoint != null) + { + var dragEvent:DragEvent = new DragEvent(DragEvent.DRAG_START, true); + dragEvent.clientX = dragStartPoint.x; + dragEvent.clientY = dragStartPoint.y; + dragEvent.buttonDown = true; + dispatchEvent(dragEvent); + + rollOutHandler(event); + + dragStartPoint = null; + } + } + + public function mouseUpHandler(event:MouseEvent):void + { + if (dragStartPoint != null) + { + dragStartPoint = null; + } + } + + public function clickHandler(event:org.apache.flex.events.Event):void + { + if (event.target != purchase && + event.target != compare && + event.target != details) + { + dispatchEvent(new ProductThumbEvent(ProductThumbEvent.DETAILS, product)); + } + } + + ]]> + </fx:Script> + <fx:Declarations> + <js:CurrencyFormatter currencySymbol="$" id="cf" fractionalDigits="2"/> + </fx:Declarations> + + <js:VContainer id="vb" width="100%" height="100%"> + <js:style> + <js:SimpleCSSStyles paddingLeft="6" paddingTop="4" paddingRight="8" paddingBottom="4" /> + <!-- gap="0"> --> + </js:style> + + + <js:Label text="{product.name}" style="fontWeight:bold"/> + + <js:HContainer width="100%" > + <js:style> + <js:SimpleCSSStyles paddingTop="0" /> <!-- gap="4 -->" + </js:style> + + <js:Image id="img" height="45" width="45" + width.x3cols="60" height.x3cols="60" + width.x2cols="60" height.x2cols="60" + source="{product.image}" /> + + <js:VContainer id="descr" height="100%" > + <js:style> + <js:SimpleCSSStyles paddingTop="0" right="0" /> <!-- gap="0" --> + </js:style> + <js:Label text="{product.featureString}" width="60" height="48" /> + <js:Label text="{cf.format(product.price)}" style="fontWeight:bold"/> + <js:Spacer height="4"/> + <js:Label text="{product.highlight1}" style="color:#EE8D0C" includeIn="x3cols, x2cols"/> + <js:Label text="{product.highlight2}" style="color:#EE8D0C" includeIn="x3cols, x2cols"/> + </js:VContainer> + + </js:HContainer> + + <js:Spacer height="8"/> + + <js:Label id="compYears" text="Years: {product.experience}" includeIn="compare"/> + <js:Label id="compBlaze" text="BlazeDS: {product.blazeds}" includeIn="compare"/> + <js:Label id="compMobile" text="Mobile: {product.mobile}" includeIn="compare"/> + <js:Label id="compVideo" text="Video: {product.video}" includeIn="compare"/> + <js:Label id="compHigh1" text="Highlight: {product.highlight1}" includeIn="compare"/> + <js:Label id="compHigh2" text="Highlight: {product.highlight2}" includeIn="compare"/> + <js:Label text="Description:" includeIn="compare"/> + <js:MultilineLabel id="compDesc" text="{product.description}" width="100%" includeIn="compare"/> + </js:VContainer> + + + <js:VContainer id="buttons" visible="false" width="30"> + <js:style> + <js:SimpleCSSStyles paddingRight="8" right="8" top="12" /> <!-- gap="4" --> + </js:style> + <js:ImageButton id="purchase" backgroundImage="assets/button_cart_empty.png" className="hoverButton" + click="dispatchEvent(new ProductThumbEvent(ProductThumbEvent.PURCHASE, product))" + width="30"> + <js:beads> + <js:ToolTipBead toolTip="Add to cart"/> + </js:beads> + </js:ImageButton> + <js:ImageButton id="compare" backgroundImage="assets/button_compare.png" className="hoverButton" + click="dispatchEvent(new ProductThumbEvent(ProductThumbEvent.COMPARE, product))" + width="30"> + <js:beads> + <js:ToolTipBead toolTip="Add to compare list"/> + </js:beads> + </js:ImageButton> + <js:ImageButton id="details" backgroundImage="assets/button_details.png" className="hoverButton" + click="dispatchEvent(new ProductThumbEvent(ProductThumbEvent.DETAILS, product))" + width="30"> + <js:beads> + <js:ToolTipBead toolTip="Show details"/> + </js:beads> + </js:ImageButton> + </js:VContainer> + + <js:states> + + <js:State name="compare" /> + + <js:State name="x4cols" /> + + <js:State name="x3cols" /> + + <js:State name="x2cols"/> + </js:states> + +</js:Container> http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/d33fe63c/examples/flexjs/FlexJSStore/src/productsView/ProductDetails.mxml ---------------------------------------------------------------------- diff --git a/examples/flexjs/FlexJSStore/src/productsView/ProductDetails.mxml b/examples/flexjs/FlexJSStore/src/productsView/ProductDetails.mxml new file mode 100755 index 0000000..f0162ad --- /dev/null +++ b/examples/flexjs/FlexJSStore/src/productsView/ProductDetails.mxml @@ -0,0 +1,145 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +--> +<js:Container xmlns:fx="http://ns.adobe.com/mxml/2009" + xmlns:js="library://ns.apache.org/flexjs/basic" + xmlns:productsView="productsView.*" + > + <js:beads> + <js:ContainerDataBinding /> + </js:beads> + + <fx:Metadata> + [Event(name="purchase", type="samples.flexstore.ProductThumbEvent")] + [Event(name="compare", type="samples.flexstore.ProductThumbEvent")] + [Event(name="browse", type="samples.flexstore.ProductThumbEvent")] + </fx:Metadata> + + <fx:Script> + <![CDATA[ + + import samples.flexstore.Product; + import samples.flexstore.ProductThumbEvent; + + private var _product:Product; + + [Bindable] + public function get product():Product + { + return _product; + } + + public function set product(p:Product):void + { + _product = p; + tn.selectedIndex = 0; + } + + ]]> + </fx:Script> + + <fx:Declarations> + <js:CurrencyFormatter currencySymbol="$" id="cf" fractionalDigits="2"/> + </fx:Declarations> + + <js:states> + <js:State name="Features" /> + <js:State name="Support" /> + </js:states> + + <js:transitions> + <js:Transition> + <js:Fade /> + </js:Transition> + </js:transitions> + + <js:ButtonBar id="tn" width="100%" change="currentState = tn.selectedItem as String"> + <js:dataProvider> + <fx:Array> + <fx:String>Features</fx:String> + <fx:String>Support</fx:String> + </fx:Array> + </js:dataProvider> + </js:ButtonBar> + <js:Container > + <js:style> + <js:SimpleCSSStyles left="4" right="8" top="34" bottom="4" /> + </js:style> + + + <js:VContainer includeIn="Features" > + <js:style> + <!--<js:SimpleCSSStyles gap="8"--> + <js:SimpleCSSStyles + left="8" top="8" right="8" bottom="8"/> + </js:style> + <js:Container style="left:0px;right:0px"> + + <js:Image id="img" width="101" height="101" source="{product.image}"/> + + <js:VContainer id="descr" > + <js:style> + <js:SimpleCSSStyles top="0" left="105" right="0" bottom="20" /> + <!--<js:SimpleCSSStyles paddingTop="0" gap="4" />--> + </js:style> + + <js:Label text="{product.name}" style="fontSize:11;fontWeight:'bold'"/> + + <js:Label text="{product.featureString}" width="80" height="48" /> + + <js:Label text="{product.highlight1}" style="color:#EE8D0C"/> + + <js:Label text="{product.highlight2}" style="color:#EE8D0C"/> + + <js:Label text="{cf.format(product.price)}" style="fontWeight:'bold'"/> + + </js:VContainer> + </js:Container> + + <js:Label id="descriptionText" style="left:0px;right:0px;bottom:0px" text="{product.description}"/> + + </js:VContainer> + + <productsView:ProductSupport width="100%" height="100%" includeIn="Support" /> + + </js:Container> + + <js:VContainer> + <js:style> + <js:SimpleCSSStyles marginTop="4" right="16" top="36" /> + </js:style> + <js:Spacer width="100%"/> + <js:ImageButton id="purchase" backgroundImage="assets/button_cart_empty.png" click="dispatchEvent(new ProductThumbEvent(ProductThumbEvent.PURCHASE, product))" width="30"> + <js:beads> + <js:ToolTipBead toolTip="Add to cart"/> + </js:beads> + </js:ImageButton> + <js:ImageButton id="compare" backgroundImage="assets/button_compare.png" click="dispatchEvent(new ProductThumbEvent(ProductThumbEvent.COMPARE, product))" width="30"> + <js:beads> + <js:ToolTipBead toolTip="Add to compare list"/> + </js:beads> + </js:ImageButton> + <js:ImageButton id="tiles" backgroundImage="assets/button_tiles.png" click="dispatchEvent(new ProductThumbEvent(ProductThumbEvent.BROWSE, product));" width="30"> + <js:beads> + <js:ToolTipBead toolTip="Back to thumbnail view"/> + </js:beads> + </js:ImageButton> + </js:VContainer> + +</js:Container> http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/d33fe63c/examples/flexjs/FlexJSStore/src/productsView/ProductFilterPanel.mxml ---------------------------------------------------------------------- diff --git a/examples/flexjs/FlexJSStore/src/productsView/ProductFilterPanel.mxml b/examples/flexjs/FlexJSStore/src/productsView/ProductFilterPanel.mxml new file mode 100755 index 0000000..26deaa9 --- /dev/null +++ b/examples/flexjs/FlexJSStore/src/productsView/ProductFilterPanel.mxml @@ -0,0 +1,215 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +--> +<js:VContainer xmlns:fx="http://ns.adobe.com/mxml/2009" + xmlns:js="library://ns.apache.org/flexjs/basic" + xmlns:productsView="productsView.*" + xmlns:flexstore="samples.flexstore.*" + height="100%" + currentState="showingThumbnails" + initComplete="series.selectedIndex = 0"> + <js:style> + <js:SimpleCSSStyles paddingLeft="4" + paddingRight="12" + paddingTop="12" + paddingBottom="8" + /> + + </js: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> + + <js:CurrencyFormatter currencySymbol="$" id="cf"/> + + </fx:Declarations> + <js:beads> + <js:ContainerDataBinding /> + </js:beads> + + <js:Label text="Find" className="sectionHeader"/> + + <js:Container width="100%"> + <js:beads> + <js:FlexibleFirstChildHorizontalLayout /> + </js:beads> + <js:TextInput className="glass" width="100%"/> + <js:TextButton className="glass" text="Go" click="SimpleAlert.show('This feature is not implemented in this sample', 'Find')"/> + </js:Container> + + <js:Spacer height="18"/> + + <js:HRule width="100%"/> + + <js:Spacer height="8"/> + + <js:HContainer> + <js:style> + <js:SimpleCSSStyles paddingTop="0" paddingLeft="0" verticalAlign="bottom" /> + </js:style> + <js:Label text="Filter" className="sectionHeader"/> + <js:Label text="({filter.count} items selected)" > + <js:style> + <js:SimpleCSSStyles fontWeight="bold" /> + <!--<js:SimpleCSSStyles color="{getStyle('themeColor')}" fontWeight="bold" />--> + </js:style> + </js:Label> + </js:HContainer> + + <js:Spacer height="8"/> + + <js:Label text="Years of Experience"/> + + <js:DropDownList id="series" className="glass" width="140" change="dispatchFilter();"> + <js: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> + </js:dataProvider> + </js:DropDownList> + + <js:Spacer height="18"/> + + <js: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()" + />--> + <js:HContainer id="nsholder" width="100%"> + <js:NumericStepper width="48%" id="loPrice" minimum="0" maximum="{hiPrice.value}" value="0" valueChange="dispatchFilter()" /> + <js:NumericStepper width="48%" id="hiPrice" minimum="{loPrice.value}" maximum="200" value="200" valueChange="dispatchFilter()" /> + </js:HContainer> + + <js:Spacer height="18"/> + + <js:Label text="Required Features"/> + + <js:Spacer height="4"/> + + <js:CheckBox id="cbBlazeDS" className="glass" text="BlazeDS" click="dispatchFilter();"/> + <js:Spacer height="4"/> + <js:CheckBox id="cbMobile" className="glass" text="Mobile" click="dispatchFilter()"/> + <js:Spacer height="4"/> + <js:CheckBox id="cbVideo" className="glass" text="Video" click="dispatchFilter();"/> + + <js:Spacer height="18"/> + + <js:HRule width="100%"/> + + <js:Spacer height="8"/> + + <js:HContainer> + <js:Label text="Compare" className="sectionHeader"/> + <js:Label text="(Drag items here to compare)" className="instructions"/> + </js:HContainer> + + + <js: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()"/> + + <js:Spacer height="8"/> + + <js: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" /> + + <js:states> + <js:State name="showingThumbnails" /> + <js:State name="showingComparison" /> + </js:states> + +</js:VContainer> http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/d33fe63c/examples/flexjs/FlexJSStore/src/productsView/ProductList.mxml ---------------------------------------------------------------------- diff --git a/examples/flexjs/FlexJSStore/src/productsView/ProductList.mxml b/examples/flexjs/FlexJSStore/src/productsView/ProductList.mxml new file mode 100755 index 0000000..951b1fa --- /dev/null +++ b/examples/flexjs/FlexJSStore/src/productsView/ProductList.mxml @@ -0,0 +1,219 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +--> +<js:Container xmlns:fx="http://ns.adobe.com/mxml/2009" + xmlns:js="library://ns.apache.org/flexjs/basic" + > + <js:style> + <js:SimpleCSSStyles borderStyle="solid" borderWidth="1" backgroundColor="#BCB29F" /> + </js: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 + { + if (items == null) + items = []; + + 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 + { + //TODO scrollingView.model.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> + <js:beads> + <js:DropMouseController id="dmc" dragEnter="doDragEnter(event)" dragDrop="doDragDrop(event)" /> + <js:VerticalLayout /> + <js:ScrollingViewport id="scrollingView" /> + </js:beads> + <js:Container id="viewport" width="100%" height="100%" > + </js:Container> +</js:Container> http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/d33fe63c/examples/flexjs/FlexJSStore/src/productsView/ProductListItem.mxml ---------------------------------------------------------------------- diff --git a/examples/flexjs/FlexJSStore/src/productsView/ProductListItem.mxml b/examples/flexjs/FlexJSStore/src/productsView/ProductListItem.mxml new file mode 100755 index 0000000..0a83e1a --- /dev/null +++ b/examples/flexjs/FlexJSStore/src/productsView/ProductListItem.mxml @@ -0,0 +1,130 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +--> +<js:Container xmlns:fx="http://ns.adobe.com/mxml/2009" + xmlns:js="library://ns.apache.org/flexjs/basic" + 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> + <js:CurrencyFormatter currencySymbol="$" id="cf" fractionalDigits="2"/> + </fx:Declarations> + + <js:beads> + <js:ContainerDataBinding /> + </js:beads> + + <js:ImageButton id="removeButton" backgroundImage="assets/trashcan.png" + width="14" height="14" y="5" + click="removeItem()"> + <js:beads> + <js:ToolTipBead toolTip="Remove from cart" /> + </js:beads> + </js:ImageButton> + + <js:Image id="productImage" x="16" y="6" width="12" height="12" source="{product.image}"/> + + <js:Label id="productName" x="30" width="100" y="4" text="{product.name}"/> + + <js:Label id="productPrice" width="60" y="4" + text="{cf.format(product.price)}" style="textAlign:right;right:0" + style.showQuantity="textAlign:right;right:25"/> + + <js:TextInput id="qty" width="25" y="3" text="{product.qty}" includeIn="showQuantity" + style="textAlign:right;right:0;marginTop:0" change="qtyChange()" > + <js:beads> + <js:NumericOnlyTextInputBead maxChars="3" /> + </js:beads> + </js:TextInput> + + <js:states> + <js:State name="compare" /> + <js:State name="showQuantity" /> + </js:states> + +</js:Container> http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/d33fe63c/examples/flexjs/FlexJSStore/src/productsView/ProductSupport.mxml ---------------------------------------------------------------------- diff --git a/examples/flexjs/FlexJSStore/src/productsView/ProductSupport.mxml b/examples/flexjs/FlexJSStore/src/productsView/ProductSupport.mxml new file mode 100755 index 0000000..b3c8429 --- /dev/null +++ b/examples/flexjs/FlexJSStore/src/productsView/ProductSupport.mxml @@ -0,0 +1,90 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +--> +<js:HContainer xmlns:fx="http://ns.adobe.com/mxml/2009" + xmlns:js="library://ns.apache.org/flexjs/basic" + > + <js:style> + <js:SimpleCSSStyles paddingLeft="4" paddingRight="8" paddingBottom="4" /> + </js:style> + <js:beads> + <js:ContainerDataBinding /> + </js: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> + <js:Parallel id="hideList"> + <js:children> + <fx:Array> + <js:Resize target="{list}" widthTo="0"/> + <!--<mx:Resize target="{vd}" widthTo="400" heightTo="314"/>--> + </fx:Array> + </js:children> + </js:Parallel> + + <js:Parallel id="showList"> + <js:children> + <fx:Array> + <js:Resize target="{list}" widthTo="130"/> + <!--<mx:Resize target="{vd}" widthTo="270" heightTo="217"/>--> + </fx:Array> + </js:children> + </js:Parallel> + </fx:Declarations> + <js:List id="list" width="130" height="100%" selectedIndex="0"> + <js:dataProvider> + <fx:Array> + <fx:Object label="Install SIM Card"/> + </fx:Array> + </js:dataProvider> + </js:List> + + <js: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> + --> + </js:Container> + + +</js:HContainer> http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/d33fe63c/examples/flexjs/FlexJSStore/src/samples/flexstore/ButtonBarButtonSkin.as ---------------------------------------------------------------------- diff --git a/examples/flexjs/FlexJSStore/src/samples/flexstore/ButtonBarButtonSkin.as b/examples/flexjs/FlexJSStore/src/samples/flexstore/ButtonBarButtonSkin.as new file mode 100755 index 0000000..5e94b58 --- /dev/null +++ b/examples/flexjs/FlexJSStore/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/d33fe63c/examples/flexjs/FlexJSStore/src/samples/flexstore/Product.as ---------------------------------------------------------------------- diff --git a/examples/flexjs/FlexJSStore/src/samples/flexstore/Product.as b/examples/flexjs/FlexJSStore/src/samples/flexstore/Product.as new file mode 100755 index 0000000..040fb8f --- /dev/null +++ b/examples/flexjs/FlexJSStore/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/d33fe63c/examples/flexjs/FlexJSStore/src/samples/flexstore/ProductFilter.as ---------------------------------------------------------------------- diff --git a/examples/flexjs/FlexJSStore/src/samples/flexstore/ProductFilter.as b/examples/flexjs/FlexJSStore/src/samples/flexstore/ProductFilter.as new file mode 100755 index 0000000..d182371 --- /dev/null +++ b/examples/flexjs/FlexJSStore/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/d33fe63c/examples/flexjs/FlexJSStore/src/samples/flexstore/ProductFilterEvent.as ---------------------------------------------------------------------- diff --git a/examples/flexjs/FlexJSStore/src/samples/flexstore/ProductFilterEvent.as b/examples/flexjs/FlexJSStore/src/samples/flexstore/ProductFilterEvent.as new file mode 100755 index 0000000..28129e7 --- /dev/null +++ b/examples/flexjs/FlexJSStore/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/d33fe63c/examples/flexjs/FlexJSStore/src/samples/flexstore/ProductListEvent.as ---------------------------------------------------------------------- diff --git a/examples/flexjs/FlexJSStore/src/samples/flexstore/ProductListEvent.as b/examples/flexjs/FlexJSStore/src/samples/flexstore/ProductListEvent.as new file mode 100755 index 0000000..b6b9371 --- /dev/null +++ b/examples/flexjs/FlexJSStore/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/d33fe63c/examples/flexjs/FlexJSStore/src/samples/flexstore/ProductThumbEvent.as ---------------------------------------------------------------------- diff --git a/examples/flexjs/FlexJSStore/src/samples/flexstore/ProductThumbEvent.as b/examples/flexjs/FlexJSStore/src/samples/flexstore/ProductThumbEvent.as new file mode 100755 index 0000000..f92dc7f --- /dev/null +++ b/examples/flexjs/FlexJSStore/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 http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/d33fe63c/examples/flexjs/FlexJSStore_jquery/build.xml ---------------------------------------------------------------------- diff --git a/examples/flexjs/FlexJSStore_jquery/build.xml b/examples/flexjs/FlexJSStore_jquery/build.xml new file mode 100644 index 0000000..d4b9777 --- /dev/null +++ b/examples/flexjs/FlexJSStore_jquery/build.xml @@ -0,0 +1,91 @@ +<?xml version="1.0"?> +<!-- + + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +--> + + +<project name="flexjsstore" default="main" basedir="."> + <property name="FLEXJS_HOME" location="../.."/> + <property name="example" value="FlexJSStore" /> + + <property file="${FLEXJS_HOME}/env.properties"/> + <property environment="env"/> + <property file="${FLEXJS_HOME}/build.properties"/> + <property name="FLEX_HOME" value="${FLEXJS_HOME}"/> + <available file="${env.FALCON_HOME}/lib/falcon-mxmlc.jar" + type="file" + property="FALCON_HOME" + value="${env.FALCON_HOME}"/> + + <available file="${FLEXJS_HOME}/../flex-falcon/compiler/generated/dist/sdk/lib/falcon-mxmlc.jar" + type="file" + property="FALCON_HOME" + value="${FLEXJS_HOME}/../flex-falcon/compiler/generated/dist/sdk"/> + + <available file="${env.FALCONJX_HOME}/lib/jsc.jar" + type="file" + property="FALCONJX_HOME" + value="${env.FALCONJX_HOME}"/> + + <available file="${FLEXJS_HOME}/../flex-falcon/compiler.jx/lib/jsc.jar" + type="file" + property="FALCONJX_HOME" + value="${FLEXJS_HOME}/../flex-falcon/compiler.jx"/> + + <available file="${env.GOOG_HOME}/closure/goog/base.js" + type="file" + property="GOOG_HOME" + value="${env.GOOG_HOME}"/> + + <available file="${FLEXJS_HOME}/js/lib/google/closure-library/closure/goog/base.js" + type="file" + property="GOOG_HOME" + value="${FLEXJS_HOME}/js/lib/google/closure-library"/> + + <include file="${basedir}/../build_example.xml" /> + + <target name="main" depends="clean,build_example.compile,build_example.compilejs" description="Clean build of ${example}"> + <mkdir dir="${basedir}/bin-debug/data" /> + <copy file="${basedir}/src/data/catalog.json" tofile="${basedir}/bin-debug/data/catalog.json" /> + <mkdir dir="${basedir}/bin/js-debug/data" /> + <copy file="${basedir}/src/data/catalog.json" tofile="${basedir}/bin/js-debug/data/catalog.json" /> + <mkdir dir="${basedir}/bin/js-release/data" /> + <copy file="${basedir}/src/data/catalog.json" tofile="${basedir}/bin/js-release/data/catalog.json" /> + <mkdir dir="${basedir}/bin/js-debug/assets" /> + <copy todir="${basedir}/bin/js-debug/assets" > + <fileset dir="${basedir}/src/assets"> + <include name="**" /> + </fileset> + </copy> + <mkdir dir="${basedir}/bin/js-release/assets" /> + <copy todir="${basedir}/bin/js-release/assets" > + <fileset dir="${basedir}/src/assets"> + <include name="**" /> + </fileset> + </copy> + </target> + + <target name="clean"> + <delete dir="${basedir}/bin" failonerror="false" /> + <delete dir="${basedir}/bin-debug" failonerror="false" /> + <delete dir="${basedir}/bin-release" failonerror="false" /> + </target> + + + +</project>
