/* <copyright> This file contains proprietary software owned by Motorola Mobility, Inc.<br/> No rights, expressed or implied, whatsoever to this software are provided by Motorola Mobility, Inc. hereunder.<br/> (c) Copyright 2011 Motorola Mobility, Inc. All Rights Reserved. </copyright> */ var Montage = require("montage/core/core").Montage, snapManager = require("js/helper-classes/3D/snap-manager").SnapManager, viewUtils = require("js/helper-classes/3D/view-utils").ViewUtils, vecUtils = require("js/helper-classes/3D/vec-utils").VecUtils, drawUtils = require("js/helper-classes/3D/draw-utils").DrawUtils, DrawingTool = require("js/tools/drawing-tool").DrawingTool; exports.ZoomTool = Montage.create(DrawingTool, { drawingFeedback: { value: { mode: "Draw2D", type: "" } }, _mode :{ value: null}, _isDrawing: {value: false}, _zoomFactor :{value: 1.0}, _hasDraw :{value:false}, _escPressed:{value:true}, _layerX:{value:0}, _layerY:{value:0}, _delta:{value:0}, _x:{value:0}, _y:{value:0}, _factor:{value:1}, HandleLeftButtonDown: { value : function (event) { NJevent("enableStageMove"); this._isDrawing=true; var point = webkitConvertPointFromPageToNode(this.application.ninja.stage.canvas, new WebKitPoint(event.pageX, event.pageY)); this.downPoint.x = point.x; this.downPoint.y = point.y; } }, HandleAltKeyDown: { value: function(event) { this.setCursor(); this._altKeyDown=true; } }, HandleAltKeyUp: { value: function(event) { this.setCursor(); this._altKeyDown=false; } }, HandleEscape: { value: function(event) { this.application.ninja.stage.clearDrawingCanvas(); this._escPressed=false; } }, Configure: { value: function(wasSelected) { if(this.options.selectedElement==="zoomOutTool"){ var cursor = "url('images/cursors/zoom_minus.png'), default"; this.application.ninja.stage.drawingCanvas.style.cursor = cursor; } if(wasSelected) { this.AddCustomFeedback(); this.eventManager.addEventListener( "toolDoubleClick", this, false); this.application.ninja.stage.drawingCanvas.addEventListener("mousewheel", this, false); } else { this.RemoveCustomFeedback(); this.eventManager.removeEventListener( "toolDoubleClick", this, false); this.application.ninja.stage.drawingCanvas.removeEventListener("mousewheel", this, false); } } }, AddCustomFeedback: { value: function (event) { this.application.ninja.stage.canvas.addEventListener("mousewheel", this, false); } }, handleScrollValue:{ value:function(){ this._mode = "mouseWheelZoom"; this._zoomFactor= this.application.ninja.documentBar.zoomFactor/100; if(this._delta > 0){ this._zoomFactor *= 1.2; } else{ this._zoomFactor /= 1.2; } this._zoomFactor = this.checkZoomLimit(this._zoomFactor); this._setZoom(this._mode,this._zoomFactor); this._mode="modeReset"; } }, handleMousewheel :{ value:function(event){ var point = webkitConvertPointFromPageToNode(this.application.ninja.stage.canvas, new WebKitPoint(event.pageX, event.pageY)); this._layerX = point.x; this._layerY = point.y; this._delta = 0; if (event.wheelDelta) { this._delta = event.wheelDelta/120; } if (this._delta){ this.handleScrollValue(this._delta); } if (event.preventDefault) event.preventDefault(); event.returnValue = false; } }, HandleMouseMove: { value : function (event) { var point = webkitConvertPointFromPageToNode(this.application.ninja.stage.canvas, new WebKitPoint(event.pageX, event.pageY)); // check for some reasonable amount of mouse movement var dx = Math.abs(point.x - this.downPoint.x), dy = Math.abs(point.y - this.downPoint.y); if ((dx >= 10) || (dy >= 10)) { // Drawing the Marquee if(this.options.selectedElement==="zoomInTool") { if(this._altKeyDown) this._hasDraw=false; else this._hasDraw = true; } else { if(this._altKeyDown) this._hasDraw=true; else this._hasDraw=false; } if(this._hasDraw) { this.doDraw(event); this._x = this.downPoint.x; this._y = this.downPoint.y; } } } }, handleZoomChange: { value: function(event) { } }, _setZoom:{ value:function(mode,zoomFactor) { var userContent = this.application.ninja.currentDocument.model.documentRoot; this._oldValue = this.application.ninja.documentBar.zoomFactor; var globalPt; if(this._mode==="mouseClickZoom") { if(this.options.selectedElement==="zoomInTool") { if(this._altKeyDown) this._factor = this._oldValue/(zoomFactor*100); else this._factor = (zoomFactor*100)/this._oldValue; } else { if(this._altKeyDown) this._factor = (zoomFactor*100)/this._oldValue; else this._factor = this._oldValue/(zoomFactor*100); } var hitRec = snapManager.snap( this._layerX, this._layerY, true ); if (hitRec) { var elt = hitRec.getElement(); if (elt) { // console.log( "hit: " + hitRec.getElement().id ); var localToGlobalMat = viewUtils.getLocalToGlobalMatrix( elt ); var localPt; if (elt != userContent) localPt = hitRec.calculateElementPreTransformScreenPoint(); else { localPt = hitRec.calculateElementWorldPoint(); viewUtils.pushViewportObj( userContent ); var cop = viewUtils.getCenterOfProjection(); this._localPt = [cop[0] + localPt[0], cop[1] + localPt[1], localPt[2]]; localPt = this._localPt.slice(); viewUtils.popViewportObj(); } globalPt = MathUtils.transformAndDivideHomogeneousPoint( localPt, localToGlobalMat ); } else globalPt = [this._layerX, this._layerY, 0]; } else globalPt = [this._layerX, this._layerY, 0]; } else if (this._mode==="marqueeZoom") { this._factor = (zoomFactor*100)/this._oldValue; var p0 = [this._x, this._y, 0]; var p1 = [this._layerX, this._layerY, 0]; globalPt = vecUtils.vecAdd(3, p0, p1); vecUtils.vecScale(3, globalPt, 0.5); } else if (this._mode === "doubleClickReset") { if (userContent) { var w = userContent.offsetWidth, h = userContent.offsetHeight; if(userContent.width) w = userContent.width; if(userContent.height) h = userContent.height; globalPt = [ w/2, h/2, 0]; } else globalPt = [0,0,0]; zoomFactor = 1; } else if (this._mode === "mouseWheelZoom") { var w = this.application.ninja.stage._canvas.width, h = this.application.ninja.stage._canvas.height; globalPt = [w/2, h/2, 0]; } else { console.log( "unhandled zoom mode: " + this._mode ); return; } // apply the scale to the matrices var localPt = viewUtils.globalToLocal( globalPt, userContent ); viewUtils.setStageZoom( globalPt, zoomFactor ); // let the document and stage manager know about the zoom change this.application.ninja.stage._firstDraw = true; this.application.ninja.documentBar.zoomFactor = zoomFactor*100; //this.application.ninja.stage.zoomFactor = zoomFactor; if (zoomFactor >= 1) { this.application.ninja.currentDocument.model.views.design.iframe.style.zoom = zoomFactor; } this.application.ninja.stage._firstDraw = false; //tmp3 = viewUtils.localToGlobal( localPt, userContent ); // DEBUG - remove this line // if we are resetting the zoom, clear out the translation from the matrices if (this._mode === "doubleClickReset") { viewUtils.clearStageTranslation(); this.application.ninja.stage.centerStage(); } // we need to redraw the entire stage after a zoom this.application.ninja.stage.updatedStage = true; } }, handleToolDoubleClick: { value: function () { this._zoomFactor = 1; this._mode="doubleClickReset"; this._setZoom(this._mode ,this._zoomFactor); } }, RemoveCustomFeedback: { value: function (event) { this.application.ninja.stage.canvas.removeEventListener("mousewheel", this, false); } }, HandleLeftButtonUp : { value : function(event) { var point = webkitConvertPointFromPageToNode(this.application.ninja.stage.canvas, new WebKitPoint(event.pageX, event.pageY)); this._layerX = point.x; this._layerY = point.y; if(event.which===1){ if(this._isDrawing){ this.endDraw(event); if(this._hasDraw){ if(this._escPressed){ this._mode="marqueeZoom"; this._zoomFactor =this.application.ninja.documentBar.zoomFactor/100; this._zoomFactor *=4; this._zoomFactor = this.checkZoomLimit(this._zoomFactor); this._setZoom(this._mode,this._zoomFactor); this._mode="modeReset"; } this._escPressed=true; } else{ this._mode="mouseClickZoom"; this._zoomFactor=this.application.ninja.documentBar.zoomFactor/100; if((this.options.selectedElement==="zoomInTool")){ if(this._altKeyDown) this._zoomFactor /= 1.2 ; else this._zoomFactor *= 1.2 ; } else{ if(this._altKeyDown){ this._zoomFactor *= 1.2 ; } else{ this._zoomFactor /= 1.2 ; } } this._zoomFactor = this.checkZoomLimit(this._zoomFactor); this._setZoom(this._mode,this._zoomFactor); this._mode="modeReset"; } } this._hasDraw=false; NJevent("disableStageMove"); this._isDrawing = false ; } else { return; } } }, checkZoomLimit:{ value:function( zoomFactor ){ if(zoomFactor > 20) zoomFactor = 20; if(zoomFactor < .25) zoomFactor = .25; return zoomFactor; } }, setCursor:{ value:function(){ if(this._altKeyDown){ if(this.options.selectedElement==="zoomOutTool"){ var cursor = "url('images/cursors/zoom_minus.png'), default"; this.application.ninja.stage.drawingCanvas.style.cursor = cursor; } else{ var cursor = "url('images/cursors/zoom.png'), default"; this.application.ninja.stage.drawingCanvas.style.cursor = cursor; } } else{ if(this.options.selectedElement==="zoomOutTool"){ var cursor = "url('images/cursors/zoom.png'), default"; this.application.ninja.stage.drawingCanvas.style.cursor = cursor; } else{ var cursor = "url('images/cursors/zoom_minus.png'), default"; this.application.ninja.stage.drawingCanvas.style.cursor = cursor; } } } } });