package com.oxylusflash.book { import caurina.transitions.Tweener; import com.oxylusflash.events.ParamEvent; import flash.display.Sprite; import flash.events.Event; import flash.events.MouseEvent; import flash.filters.DropShadowFilter; public class FullViewToolbar extends Sprite { public static const MARGIN:Number = 3; public static const SNAP_X:Number = 20; public static const SNAP_Y:Number = 0; public var bgMc:Sprite; public var dragZoneMc:Sprite; private var btnHolder:Sprite; private var closeBtn:FullViewButton; private var nextBtn:FullViewButton; private var prevBtn:FullViewButton; private var cursorBtn:FullViewRadio; private var clickDragBtn:FullViewRadio; private var mousePanBtn:FullViewRadio; private var printBtn:FullViewButton; private var dx:Number = 0; private var dy:Number = 0; private var maxX:Number; private var maxY:Number; public var isDragged:Boolean = false; private static const BTN_X_MARGIN:Number = 4; private static const BTN_Y_MARGIN:Number = 2; private static const SCROLL_RADIO_GROUP:String = "scrollRadioGroup"; /** * Full view toolbar. */ public function FullViewToolbar() { Global.fullViewToolBar = this; this.visible = Global.toolbarVis; this.x = MARGIN; this.y = ZoomSourceWrapper.PADDING_Y; var shadow:DropShadowFilter = Global.SHADOW.clone() as DropShadowFilter; shadow.strength = 1; bgMc.filters = [shadow]; dragZoneMc.buttonMode = true; dragZoneMc.addEventListener(MouseEvent.MOUSE_DOWN, dragZoneMc_mouseDownHandler, false, 0, true); btnHolder = this.addChild(new Sprite) as Sprite; btnHolder.x = BTN_X_MARGIN; btnHolder.y = dragZoneMc.height + BTN_Y_MARGIN; } /** * Add items from xml. * @param tbarItems */ public function init(tbarItems:XMLList):void { var len:int = tbarItems.length(); var itemNode:XML; var sel:int = 0; for (var i:int = 0; i < len; i++) { itemNode = tbarItems[i]; if (itemNode.@selected == "true") sel++; switch(String(itemNode.@id)) { case "separator": addSeparator(); break; case "closeButton": addCloseButton(); break; case "nextButton": addNextButton(); break; case "previousButton": addPrevButton(); break; case "cursorButton": addCursorButton(); if (itemNode.@selected == "true") cursorBtn.simulateClick(); break; case "clickDragButton": addClickDragButton(); if (itemNode.@selected == "true") clickDragBtn.simulateClick(); break; case "mousePanButton": addMousePanButton(); if (itemNode.@selected == "true") mousePanBtn.simulateClick(); break; case "printButton": addPrintButton(); break; } } if (nextBtn || prevBtn) { Global.fullView.addEventListener(FullView.ZOOM_SOURCE_CHANGED, fullView_zoomSourceChangedHandler, false, 0, true); } if (printBtn) { Global.fullView.addEventListener(FullView.SOURCE_LOAD_START, sourceLoadHandlers, false, 0, true); Global.fullView.addEventListener(FullView.SOURCE_LOAD_END, sourceLoadHandlers, false, 0, true); } if (!closeBtn) closeBtn = new LibFullViewClose; if (!nextBtn) nextBtn = new LibFullViewNext; if (!prevBtn) prevBtn = new LibFullViewPrev; if (!cursorBtn) { cursorBtn = new LibFullViewCursor; if (sel == 1) cursorBtn.simulateClick(); } if (!clickDragBtn) { clickDragBtn = new LibFullViewClickDrag; if (sel == 2) cursorBtn.simulateClick(); } if (!mousePanBtn) { mousePanBtn = new LibFullViewMousePan; if (sel == 3) cursorBtn.simulateClick(); } if (!printBtn) printBtn = new LibFullViewPrint; } /** * Source load handlers. * @param e */ private function sourceLoadHandlers(e:Event):void { if (printBtn) { switch(e.type) { case FullView.SOURCE_LOAD_START: printBtn.mouseEnabled = false; break; case FullView.SOURCE_LOAD_END: printBtn.mouseEnabled = true; break; } } } /** * Update next/prev buttons. * @param e */ private function fullView_zoomSourceChangedHandler(e:ParamEvent):void { if (nextBtn) nextBtn.mouseEnabled = e.params.nextEnabled; if (prevBtn) prevBtn.mouseEnabled = e.params.prevEnabled; } /** * Add item from Library class. * @param LibClass Class name. * @return Returns the added item. */ private function addToolbarItem(LibClass:Class):* { var btn:* = new LibClass; btn.y = btnHolder.height + (btnHolder.numChildren ? BTN_Y_MARGIN : 0); btnHolder.addChild(btn); bgMc.height = Math.round(btnHolder.y + btnHolder.height + BTN_X_MARGIN); return btn; } /** * Add close button. */ private function addCloseButton():void { closeBtn = addToolbarItem(LibFullViewClose); closeBtn.tooltip = Global.xmlTranslate.str28; closeBtn.addEventListener(MouseEvent.CLICK, closeBtn_clickHandler, false, 0, true); } private function closeBtn_clickHandler(e:MouseEvent):void { Global.fullView.hide(); } /** * Add next button. */ private function addNextButton():void { nextBtn = addToolbarItem(LibFullViewNext); nextBtn.tooltip = Global.xmlTranslate.str29; nextBtn.addEventListener(MouseEvent.CLICK, nextBtn_clickHandler, false, 0, true); } private function nextBtn_clickHandler(e:MouseEvent):void { Global.fullView.loadNextZoomSrc(); } /** * Add prev button. */ private function addPrevButton():void { prevBtn = addToolbarItem(LibFullViewPrev); prevBtn.tooltip = Global.xmlTranslate.str30; prevBtn.addEventListener(MouseEvent.CLICK, prevBtn_clickHandler, false, 0, true); } private function prevBtn_clickHandler(e:MouseEvent):void { Global.fullView.loadPrevZoomSrc(); } /** * Add mouse pan button. */ private function addMousePanButton():void { mousePanBtn = addToolbarItem(LibFullViewMousePan); mousePanBtn.group = SCROLL_RADIO_GROUP; mousePanBtn.tooltip = Global.xmlTranslate.str33; mousePanBtn.addEventListener(MouseEvent.CLICK, mousePanBtn_clickHandler, false, 0, true); } private function mousePanBtn_clickHandler(e:MouseEvent):void { Global.fullView.zoomSrcHolder.interaction = ZoomSourceHolder.MOUSE_PAN; } /** * Add click drag button. */ private function addClickDragButton():void { clickDragBtn = addToolbarItem(LibFullViewClickDrag); clickDragBtn.group = SCROLL_RADIO_GROUP; clickDragBtn.tooltip = Global.xmlTranslate.str32; clickDragBtn.addEventListener(MouseEvent.CLICK, clickDragBtn_clickHandler, false, 0, true); } private function clickDragBtn_clickHandler(e:MouseEvent):void { Global.fullView.zoomSrcHolder.interaction = ZoomSourceHolder.CLICK_DRAG; } /** * Add print button. */ private function addPrintButton():void { printBtn = addToolbarItem(LibFullViewPrint); printBtn.tooltip = Global.xmlTranslate.str53; printBtn.addEventListener(MouseEvent.CLICK, printBtn_clickHandler, false, 0, true); } private function printBtn_clickHandler(e:MouseEvent):void { Global.fullView.printCurrentView(); } /** * Add cursor button. */ private function addCursorButton():void { cursorBtn = addToolbarItem(LibFullViewCursor); cursorBtn.group = SCROLL_RADIO_GROUP; cursorBtn.tooltip = Global.xmlTranslate.str31; cursorBtn.addEventListener(MouseEvent.CLICK, cursorBtn_clickHandler, false, 0, true); } private function cursorBtn_clickHandler(e:MouseEvent):void { Global.fullView.zoomSrcHolder.interaction = ZoomSourceHolder.NO_INTERACT; } /** * Add separator. */ private function addSeparator():void { addToolbarItem(LibSeparator2); } /** * Setup mouse dragging. * @param e */ private function dragZoneMc_mouseDownHandler(e:MouseEvent):void { isDragged = true; dx = this.parent.mouseX - this.x; dy = this.parent.mouseY - this.y; stage.addEventListener(MouseEvent.MOUSE_MOVE, stage_mouseMoveHandler, false, 0, true); stage.addEventListener(MouseEvent.MOUSE_UP, stage_mouseUpHandler, false, 0, true); } private function stage_mouseMoveHandler(e:MouseEvent):void { updatePosition(this.parent.mouseX - dx, this.parent.mouseY - dy); if (e) e.updateAfterEvent(); } private function stage_mouseUpHandler(e:MouseEvent):void { stage.removeEventListener(MouseEvent.MOUSE_MOVE, stage_mouseMoveHandler); stage.removeEventListener(MouseEvent.MOUSE_UP, stage_mouseUpHandler); isDragged = false; } /** * Update full view position. * @param xPos New x position. * @param yPos New y position. */ public function updatePosition(xPos:Number, yPos:Number):void { maxX = this.parent.width - (this.width + MARGIN); maxY = this.parent.height - (this.height + MARGIN); this.x = xPos < SNAP_X + MARGIN ? MARGIN : (xPos > maxX - SNAP_X ? maxX : xPos); this.y = yPos < SNAP_Y + MARGIN ? MARGIN : (yPos > maxY - SNAP_Y ? maxY : yPos); } /** * Update position so the full view source is visible. */ public function moveToBeVisible():void { updatePosition(this.x, this.y); } /** * Overrides. */ override public function get x():Number { return super.x; } override public function set x(value:Number):void { super.x = Math.round(value); } override public function get y():Number { return super.y; } override public function set y(value:Number):void { super.y = Math.round(value); } override public function get width():Number { return bgMc.width; } override public function set width(value:Number):void { } override public function get height():Number { return bgMc.height; } override public function set height(value:Number):void { } } }