following are the action script classes...
package com { import flash.display.DisplayObject; import flash.events.Event; import flash.events.MouseEvent; import mx.controls.Button; import mx.controls.CheckBox; import mx.controls.tabBarClasses.*; import mx.core.DragSource; import mx.core.IFlexDisplayObject; import mx.core.mx_internal; import mx.events.DragEvent; import mx.events.ItemClickEvent; import mx.managers.DragManager; import mx.utils.StringUtil; use namespace mx_internal; [Style(name="showCloseButton", type="Boolean")] public class extended_Tab extends Tab { private var closeButton:Button; private var chkBox:CheckBox; private var dropIndicatorClass:Class = extended_TabDropIndicator; private var tabDropIndicator:IFlexDisplayObject; public var mystate:String="false" public function extended_Tab() { super(); mouseChildren = true; //use if text align is right //setStyle("paddingRight",15); //setStyle("textAlign","left"); //setStyle("labelPlacement","right"); addEventListener("creationComplete", handleCreationComplete); addEventListener(MouseEvent.MOUSE_MOVE,handleMouseMove); addEventListener(DragEvent.DRAG_ENTER,handleDragEnter); addEventListener(DragEvent.DRAG_DROP,handleDragDrop); addEventListener(DragEvent.DRAG_EXIT,handleDragExit); addEventListener(DragEvent.DRAG_OVER,handleDragOver); } //add close button and drop indication override protected function createChildren():void{ super.createChildren(); if (this.getStyle("showCloseButton")==true){ chkBox=new CheckBox(); chkBox.selected=false; chkBox.width = 10; chkBox.height = 10; chkBox.name="Check" closeButton = new Button(); closeButton.width = 11; closeButton.height = 11; closeButton.name="CloseButton" closeButton.styleName="CloseButton"; // closeButton.visible=false; // closeButton.enabled=false closeButton.mouseEnabled =true; chkBox.mouseEnabled =true; addChild(chkBox); addChild(closeButton); closeButton.move(width-18,textField.y+4); //the tab gets focus on mouse down so the only event //we can use is mouse down on the button for close closeButton.addEventListener(MouseEvent.MOUSE_DOWN,handleMouseDown); chkBox.addEventListener(MouseEvent.CLICK,handleMouseDown1); } //create the drop indicator tabDropIndicator = IFlexDisplayObject(new dropIndicatorClass()); addChildAt(DisplayObject(tabDropIndicator),numChildren-1) tabDropIndicator.visible=false; } /** * if the drag format is correct in form the user that * the location is acceptable for the drop **/ private function handleDragEnter(event:DragEvent):void{ if (event.dragSource.hasFormat('tabButton')) { var dropTarget:extended_Tab=extended_Tab(event.currentTarget); DragManager.acceptDragDrop(dropTarget); //make sure it is topmost display object and show it setChildIndex(DisplayObject(tabDropIndicator),numChildren-1) tabDropIndicator.visible=true; } } /** * basically draw an indicator to show user where the tab * will be inserted **/ private function handleDragOver(event:DragEvent):void{ if (event.dragSource.hasFormat('tabButton')) { } } /** * clean up the drag drop indicator **/ private function handleDragExit(event:DragEvent):void{ //hide it tabDropIndicator.visible=false; } /** * begin the drag operation **/ private function handleMouseMove(event:MouseEvent):void{ if (event.buttonDown){ startTabDrag(event,"tabButton"); } } /** * dispatch the drop event to the parent tab navigator **/ private function handleDragDrop(event:DragEvent):void { var DragDropEvent:DragEvent = new DragEvent("TAB_DRAG_DROP",true ,true,event.dragInitiator,event.dragSource,event.action,event.ctrlKey ,event.altKey,event.shiftKey); dispatchEvent(DragDropEvent); //hide it tabDropIndicator.visible=false; } /** * set up a proxy and begin the drag operation * */ private function startTabDrag(event:MouseEvent, format:String):void { var dragInitiator:Button=Button(event.currentTarget); var ds:DragSource = new DragSource(); ds.addData(this,format); var dragProxy:extended_Tab = new extended_Tab(); dragProxy.label=label; dragProxy.setStyle("icon",getStyle("icon")); dragProxy.width = width; dragProxy.height = height; DragManager.doDrag(dragInitiator, ds, event, dragProxy); } /** * handle the passing of an event to the parent * Note: We have to unfortunately close on mouse down * as I’ve yet to figure out how to stop the tab selecting * and causing index problems **/ private function handleMouseDown(event:MouseEvent):void{ event.stopPropagation(); event.preventDefault(); if (event.target is Button && event.target.name=="CloseButton"){ var closeEvent:ItemClickEvent = new ItemClickEvent("TAB_CLOSE_CLICK", true, true); closeEvent.index = parent.getChildIndex(this) closeButton.removeEventListener(MouseEvent.MOUSE_DOWN,handleMouseDown); removeEventListener("creationComplete", handleCreationComplete); dispatchEvent(closeEvent); } } private function handleMouseDown1(event:MouseEvent):void{ event.stopPropagation(); event.preventDefault(); if (event.target is CheckBox && event.target.name=="Check"){ //var _dispatchObj:DatasEvent=new DatasEvent(countUsers, "getCount", false); //dispatchEvent(_dispatchObj); mystate=""+chkBox.selected; var closeEvent:ItemClickEvent = new ItemClickEvent("Tab_Disable", true, true,StringUtil.trim(mystate)); closeEvent.index = parent.getChildIndex(this) //chkBox.removeEventListener(MouseEvent.CLICK,handleMouseDown1); removeEventListener("creationComplete", handleCreationComplete); dispatchEvent(closeEvent); /*if(chkBox.selected){ var _dispatchObj:DatasEvent=new DatasEvent("true~"+parent.getChildIndex(this), "Tab_Disable", false); chkBox.removeEventListener(MouseEvent.MOUSE_DOWN,handleMouseDown1); removeEventListener("creationComplete", handleCreationComplete); dispatchEvent(_dispatchObj); } else{ var _dispatchObj:DatasEvent=new DatasEvent("false~"+parent.getChildIndex(this), "Tab_Disable", false); chkBox.removeEventListener(MouseEvent.MOUSE_DOWN,handleMouseDown1); removeEventListener("creationComplete", handleCreationComplete); dispatchEvent(_dispatchObj);}*/ } } /** * adjust position of button when creation is complete **/ private function handleCreationComplete(event:Event):void{ if (this.getStyle("showCloseButton")==true){ closeButton.move(width-18,textField.y+4); chkBox.move(1,textField.y+4); } } /** * swap the button to the top of the z/depth order **/ override mx_internal function layoutContents(unscaledWidth:Number,unscaledHeight:Number, offset:Boolean):void{ super.layoutContents(unscaledWidth, unscaledHeight, offset); //if (this.getStyle("showCloseButton")==true){ setChildIndex(getChildByName("Check") , numChildren-1); chkBox.move(1,textField.y+4); setChildIndex(getChildByName("CloseButton") , numChildren-1); closeButton.move(width-18,textField.y+4); //} //make sure we set this otherwise the tabs are resized and //squished together using measured width to get a proper //tab size explicitWidth = measuredWidth; } } } package com { import flash.display.DisplayObject; import mx.containers.TabNavigator; import mx.controls.Alert; import mx.core.IFlexDisplayObject; import mx.core.mx_internal; import mx.events.DragEvent; import mx.events.ItemClickEvent; import mx.managers.DragManager; use namespace mx_internal; [Event(name="CloseClick",type="mx.events.ItemClickEvent")] [Event(name="checkClick",type="mx.events.ItemClickEvent")] public class extended_TabNavigator extends TabNavigator { private var dropIndicatorClass:Class = extended_TabDropIndicator; private var tabDropIndicator:IFlexDisplayObject; public function extended_TabNavigator() { super(); addEventListener("TAB_CLOSE_CLICK",handleTabCloseClick, false,0,true); addEventListener("Tab_Disable",handleTabDisableClick, false,0,true); addEventListener("TAB_DRAG_DROP",handleTabDragDrop, false,0,true); addEventListener(DragEvent.DRAG_ENTER,handleDragEnter, false,0,true); addEventListener(DragEvent.DRAG_DROP,handleTabDragDrop, false,0,true); addEventListener(DragEvent.DRAG_EXIT,handleDragExit, false,0,true); addEventListener(DragEvent.DRAG_OVER,handleDragOver, false,0,true); } /** * make sure that the tabbar is our extended version of the adobe tabbar **/ override protected function createChildren():void{ tabBar = new extended_TabBar(); tabBar.name = "tabBar"; tabBar.focusEnabled = false; tabBar.styleName = this; tabBar.setStyle("borderStyle", "none"); tabBar.setStyle("paddingTop", 0); tabBar.setStyle("paddingBottom", 0); rawChildren.addChild(tabBar); //create the drop indicator tabDropIndicator = IFlexDisplayObject(new dropIndicatorClass()); rawChildren.addChildAt(DisplayObject(tabDropIndicator),rawChildren.numChildren-1) tabDropIndicator.visible=false; super.createChildren(); } /** * accept drag and drop on the navigator as well, * for when there are no tabs present **/ private function handleDragEnter(event:DragEvent):void{ if (event.dragSource.hasFormat('tabButton')) { var dropTarget:extended_TabNavigator=extended_TabNavigator(event.currentTarget); DragManager.acceptDragDrop(dropTarget); //make sure it is topmost display object and show it rawChildren.setChildIndex(DisplayObject(tabDropIndicator),rawChildren.numChildren-1) tabDropIndicator.visible=true; } } /** * draw indicator to show user where the tab * will be inserted **/ private function handleDragOver(event:DragEvent):void{ if (event.dragSource.hasFormat('tabButton')) { } } /** * clean up the drag drop indicator **/ private function handleDragExit(event:DragEvent):void{ //hide it tabDropIndicator.visible=false; } /** * when dragged (even between navigators) if the format is correct * move the tab to the new parent and location if the target is the * navigator then the new tab is inserted at location 0. **/ private function handleTabDragDrop(event:DragEvent):void{ if(event.dragInitiator.parent.parent is extended_TabNavigator){ if (event.dragSource.hasFormat('tabButton')) { var oldIndex:int = event.dragInitiator.parent.getChildIndex(DisplayObject(event.dragInitiator)); var newIndex:int if (event.target is extended_Tab){ newIndex= event.target.parent.getChildIndex(event.target); } else{ newIndex=0; tabDropIndicator.visible=false; } var obj:DisplayObject = extended_TabNavigator(event.dragInitiator.parent.parent).removeChildAt(oldIndex); addChildAt(obj,newIndex); //validate the visible items for the tab bar. extended_TabBar(tabBar).validateVisibleTabs(); } } } /** * handle removal of container when close button is clicked **/ private function handleTabCloseClick(event:ItemClickEvent):void{ event.stopPropagation(); event.preventDefault(); var obj:DisplayObject = removeChildAt(event.index); obj = null; var dispEvent:ItemClickEvent = new ItemClickEvent("CloseClick"); dispEvent.index =event.index; dispEvent.item = event.item; dispEvent.label = event.label; dispEvent.relatedObject = event.relatedObject; dispatchEvent(dispEvent); } /** * handle removal of container when checkbox is clicked **/ private function handleTabDisableClick(event:ItemClickEvent):void{ event.stopPropagation(); event.preventDefault(); var dispEvent:ItemClickEvent = new ItemClickEvent("checkClick"); dispEvent.index =event.index; dispEvent.item = event.item; dispEvent.label = event.label; dispEvent.relatedObject = event.relatedObject; dispatchEvent(dispEvent); } } } package com { import mx.skins.halo.HaloBorder; public class extended_TabListToolButtonSkin extends HaloBorder { private var offset:Number=0; public function extended_TabListToolButtonSkin() { super(); } override protected function updateDisplayList(w:Number, h:Number):void{ var alpha:Number =getStyle("alpha"); var borderColor:uint =getStyle("borderColor"); graphics.beginFill(borderColor,alpha); graphics.drawRect(0,0,w-offset,h); drawArrow(w,h); } private function drawArrow(w:Number, h:Number):void{ if (this.parent is extendedPopUpMenuButton){ //draw the drop down arrow taking into account the right padding //and use the text color for the arrow color var PaddingRight:Number = getStyle("paddingRight"); var arrowColor:uint = getStyle("color"); graphics.lineStyle(1,arrowColor,0); graphics.beginFill(arrowColor,1); graphics.moveTo((w-PaddingRight)-7/2, h/2+3); graphics.lineTo(w-PaddingRight, 9); graphics.lineTo((w-PaddingRight)-7, 9); graphics.lineTo((w-PaddingRight)-7/2,h/2+3); graphics.endFill(); } } } } package com { import flash.display.DisplayObject; import flash.events.Event; import flash.events.MouseEvent; import mx.controls.Button; import mx.controls.Menu; import mx.controls.TabBar; import mx.core.ClassFactory; import mx.core.DragSource; import mx.core.IFlexDisplayObject; import mx.core.mx_internal; import mx.events.DragEvent; import mx.events.MenuEvent; import mx.managers.DragManager; use namespace mx_internal; public class extended_TabBar extends TabBar { private var listPopup:extendedPopUpMenuButton; public function extended_TabBar() { super(); //set the factory to our specific tab navItemFactory = new ClassFactory(extended_Tab); addEventListener("creationComplete", handleCreationComplete , false,0,true); } //store an internal array of tabs to work with private var _itemData:Array = []; private function set itemData(value:Array):void{ _itemData = value; } private function get itemData():Array{ return _itemData } private function handleCreationComplete (event:Event):void{ //make sure we get informed on the parent resize for the //popup positioning parent.addEventListener("resize", handleParentReSize, false,0,true); listPopup.addEventListener(MenuEvent.ITEM_CLICK,handleListDataItemClick, false,0,true); } private function handleListDataCreationComplete(event:Event):void{ Menu(listPopup.popUp).dragEnabled = true; Menu(listPopup.popUp).dragMoveEnabled = true; Menu(listPopup.popUp).addEventListener(MouseEvent.MOUSE_MOVE,handleListDataMouseMove, false,0,true); } private function handleListDataMouseMove(event:MouseEvent):void{ if (event.buttonDown && !DragManager.isDragging){ DragFromItemList(event,"tabButton"); } } /** * Set up a proxy and begin the drag operation. **/ private function DragFromItemList(event:MouseEvent, format:String):void { var dragInitiator:Button=Button(getChildAt(event.currentTarget.selectedIndex)); var ds:DragSource = new DragSource(); ds.addData(dragInitiator,format); //create a proxy drag image based on current dragged tab var dragProxy:extended_Tab = new extended_Tab(); dragProxy.label=dragInitiator.label; dragProxy.setStyle("icon",dragInitiator.getStyle("icon")); dragProxy.width = dragInitiator.width; dragProxy.height = dragInitiator.height; //get X position var proxyPointX:int =(dragInitiator.x+(dragInitiator.width/2))-event.stageX; //get Y position var proxyPointY:int; if(dragInitiator.contentMouseY > 0){ //popup below proxyPointY=(dragInitiator.y - (event.currentTarget.contentMouseY+(dragInitiator.height/2))); } else{ //popup above proxyPointY= event.currentTarget.height-(event.currentTarget.contentMouseY-(dragInitiator.height/2)); } //start the drag operation DragManager.doDrag(dragInitiator, ds, event, dragProxy,proxyPointX,proxyPointY); } //on the menu click update both the tab bar and the parent (when tab not visible) private function handleListDataItemClick(event:MenuEvent):void{ selectedIndex = event.index; if (getChildAt(event.index).visible==true){ selectedIndex = event.index; } else{ setChildIndex(getChildAt(event.index),0); selectedIndex = 0; validateVisibleTabs(); if (owner is extended_TabNavigator){ extended_TabNavigator(owner).setChildIndex(owner.getChildAt(event.index),0); extended_TabNavigator(owner).selectedIndex = 0; } } } override protected function createNavItem( label:String, icon:Class = null):IFlexDisplayObject{ var navItem:IFlexDisplayObject = super.createNavItem(label,icon); reBuildItemData(); return navItem; } public override function addChild(child:DisplayObject):DisplayObject{ return super.addChild(child); } public override function setChildIndex(child:DisplayObject, newIndex:int):void{ super.setChildIndex(child,newIndex); reBuildItemData(); } public override function removeChildAt(index:int):DisplayObject{ itemData.splice(index,1); listPopup.dataProvider = itemData; return super.removeChildAt(index); } //update the item data array private function reBuildItemData():void{ itemData = new Array(); for (var i:int;i= parent.width-listPopup.width){ currTab.visible=false; listPopup.visible = true; } else{ currTab.visible=true; listPopup.visible = false; listPopup.close(); } }*/ } //validate on display updates override protected function updateDisplayList(w:Number, h:Number):void{ super.updateDisplayList(w,h); validateVisibleTabs(); } } } package com { import mx.skins.ProgrammaticSkin; import flash.display.Graphics; import mx.utils.ColorUtil; public class extended_TabDropIndicator extends ProgrammaticSkin { public function extended_TabDropIndicator() { super(); } override protected function updateDisplayList(w:Number, h:Number):void{ super.updateDisplayList(w, h); //eventually use a style setting var dropIndicatorColor:uint =0x000000; graphics.lineStyle(0, 0, 0); graphics.beginFill(dropIndicatorColor); graphics.moveTo (4, 0); graphics.lineTo (0, 4); graphics.lineTo (-4, 0); graphics.lineTo (4,0); graphics.endFill(); } } } package com { import flash.events.MouseEvent; import mx.controls.PopUpMenuButton; import mx.core.mx_internal; import mx.controls.Menu; import mx.core.ClassFactory; import mx.events.MenuEvent; import flash.events.Event; [Event(name="menuItemClick", type="mx.events.MenuEvent")] public class extendedPopUpMenuButton extends PopUpMenuButton { public function extendedPopUpMenuButton():void{ super(); openAlways=true; addEventListener("open",handleOpenClose, false,0,true); addEventListener("close",handleOpenClose, false,0,true); } public var isOpen:Boolean; private function handleOpenClose(event:Event):void{ switch (event.type){ case "open": isOpen=true; break; case "close": isOpen=false; this.styleChanged("upSkin"); break; } } override public function close():void{ super.close(); } override public function open():void{ super.open(); } [Inspectable] public var iconField:String; override protected function clickHandler(event:MouseEvent):void { super.clickHandler(event); } override public function set dataProvider(value:Object):void{ super.dataProvider = value; } private function handelItemClick(event:MenuEvent):void{ //dispatch a specific menu event //bubble this so the parent navigator can receive it var menuEvent:MenuEvent = new MenuEvent("menuItemClick"); menuEvent.menu = Menu(popUp); menuEvent.menu.selectedIndex = Menu(popUp).selectedIndex; menuEvent.item = Menu(popUp).selectedItem menuEvent.itemRenderer = Menu(popUp).itemToItemRenderer(Menu(popUp).selectedItem); menuEvent.index = Menu(popUp).selectedIndex; dispatchEvent(menuEvent); } //override to block the default override public function setStyle(styleProp:String, newValue:*):void{} } } package raghu { import flash.events.Event; import flash.events.MouseEvent; import mx.containers.Canvas; import mx.containers.VBox; import mx.controls.TextInput; import mx.events.DragEvent; import mx.managers.DragManager; public class DragCanvas extends Canvas { public function DragCanvas() { super(); this.doubleClickEnabled=true; addEventListener(MouseEvent.DOUBLE_CLICK,test); addEventListener(DragEvent.DRAG_ENTER,candragEnterHandler); addEventListener(DragEvent.DRAG_OVER,candragOverHandler); addEventListener(DragEvent.DRAG_DROP,candragDropHandler); } private function test(e:Event):void{ } private function candragEnterHandler(event:DragEvent):void { // Accept the drop. if (event.dragSource.hasFormat("items")) { var dropTarget:Canvas=Canvas(event.currentTarget); //var txt:TextInput=new TextInput(); //dropTarget.addChild(txt); DragManager.acceptDragDrop(dropTarget); } //DragManager.acceptDragDrop(TextInput(event.currentTarget)); } private function candragOverHandler(event:DragEvent):void { if (event.dragSource.hasFormat("items")) DragManager.showFeedback(DragManager.COPY); } private var count:int=0; private function candragDropHandler(event:DragEvent):void { event.preventDefault(); var itemsArray:Array=event.dragSource.dataForFormat("items") as Array; var dropCanvas:Canvas = event.currentTarget as Canvas; var box:VBox=new VBox(); var txt:TextInput=new TextInput(); //if (TextInput(event.currentTarget).text == "") //{ txt.text=itemsArray[0].label; // } // else // { // TextInput(event.currentTarget).text=""; // TextInput(event.currentTarget).text=itemsArray[0].label; //} box.x=0; box.y=count*20; box.addChild(txt); dropCanvas.addChildAt(box,count); count++; } } }
following are the mxml
No comments:
Post a Comment