/* This file contains proprietary software owned by Motorola Mobility, Inc.
No rights, expressed or implied, whatsoever to this software are provided by Motorola Mobility, Inc. hereunder.
(c) Copyright 2011 Motorola Mobility, Inc. All Rights Reserved.
*/ var Montage = require("montage/core/core").Montage, Component = require("montage/ui/component").Component, UndoManager = require("montage/core/undo-manager").UndoManager, AppData = require("js/data/appdata").AppData, Popup = require("js/components/popup.reel").Popup; var matrix = require("js/lib/math/matrix"); var NjUtils = require("js/lib/NJUtils").NJUtils; exports.Ninja = Montage.create(Component, { // SERIALIZABLE Properties ////////////////////////////// rulerTop: { value: null, serializable: true }, rulerLeft: { value: null, serializable: true }, appModel: { value: null, serializable: true }, toolsData: { value: null, serializable: true }, toolsList: { value: null, serializable: true }, toolsProperties: { value: null, serializable: true }, stage: { value: null, serializable: true }, elementMediator: { value: null, serializable: true }, dragDropMediator: { value: null, serializable: true }, undocontroller: { value: null, serializable: true }, selectionController: { value: null, serializable: true }, documentController: { value: null, serializable: true }, popupManager: { value: null, serializable: true }, colorController: { value: null, serializable: true }, stylesController: { value: null, serializable: true }, presetsController: { value: null, serializable: true }, filePickerController: { value: null, serializable: true }, newFileController: { value: null, serializable: true }, coreIoApi: { value: null, serializable: true }, documentBar: { value: null, serializable: true }, editorViewOptions: { value: null, serializable: true }, ioMediator: { value: null, serializable: true }, timeline: { value: null, serializable: true }, mainMenuController: { value: null, serializable: true }, codeEditorWrapper: { value: null, serializable: true }, rightPanelContainer: { value: null, serializable: true }, panelSplitter: { value: null, serializable: true }, timelineSplitter: { value: null, serializable: true }, toolsSplitter: { value: null, serializable: true }, optionsSplitter: { value: null, serializable: true }, documentList: { value: null, serializable: true }, ////////////////////////////// ninjaVersion: { value: null }, appData: { value: AppData }, currentDocument: { get: function() { if(this.documentList.selectedObjects) { return this.documentList.selectedObjects[0]; } else { return null; } } }, _workspaceMode: { value: null }, workspaceMode: { get: function() { return this._workspaceMode; }, set: function(val) { if(this._workspaceMode !== val ) { if(this._workspaceMode !== null) { document.body.classList.remove("ws-" + this._workspaceMode); } document.body.classList.add("ws-" + val); this._workspaceMode = val; } } }, _isResizing: { value: null }, _resizedHeight : { value: 0 }, _height: { value: null }, height: { get: function() { if(this._height === null) { var storedData = this.application.localStorage.getItem("timelinePanel"); if(storedData && storedData.value) { this._height = storedData.value; } } return this._height; }, set: function(val) { if(this._height != val) { this._height = val; this.application.localStorage.setItem("timelinePanel", {"version": this.version, "value": val}); this.needsDraw = true; } } }, _resizedWidth: { value: 0 }, _width: { value: null }, width: { get: function() { if(this._width === null) { var storedData = this.application.localStorage.getItem("rightPanelsContainer"); if(storedData && storedData.value) { this._width = storedData.value; } } return this._width; }, set: function(val) { if(this._width != val) { this._width = val; this.application.localStorage.setItem("rightPanelsContainer", {"version": this.version, "value": val}); this.needsDraw = true; } } }, handleResizeStart: { value:function(e) { this.isResizing = true; this.height = parseInt(this.timeline.element.offsetHeight); this.width = parseInt(this.rightPanelContainer.offsetWidth); this.rightPanelContainer.classList.add("disableTransition"); this.timeline.element.classList.add("disableTransition"); this.needsDraw = true; } }, handleResizeMove: { value:function(e) { this._resizedHeight = e._event.dY; this._resizedWidth = e._event.dX; this.stage.resizeCanvases = true; this.needsDraw = true; } }, handleResizeEnd: { value: function(e) { this.stage.resizeCanvases = true; this._resizedHeight = 0; this._resizedWidth = 0; this.isResizing = false; this.needsDraw = true; this.rightPanelContainer.classList.remove("disableTransition"); this.timeline.element.classList.remove("disableTransition"); this.height = this.timeline.element.offsetHeight; this.width = this.rightPanelContainer.offsetWidth; } }, handleResizeReset: { value: function(e) { this.width = 253; this.height = 140; this._resizedHeight = 0; this._resizedWidth = 0; this.timelineSplitter.collapsed = false; this.panelSplitter.collapsed = false; this.stage.resizeCanvases = true; this.needsDraw = true; } }, selectedElements: { value: [] }, templateDidLoad: { value: function() { this.ninjaVersion = window.ninjaVersion.ninja.version; this.undoManager = document.application.undoManager = UndoManager.create(); document.application.njUtils = NjUtils; } }, prepareForDraw: { value: function() { this.workspaceMode = "default"; console.log("Loading Ninja --> ", this.ninjaVersion); this.application.ninja = this; this.toolsData.selectedTool = this.toolsData.defaultToolsData[this.application.ninja.toolsData.selectionToolIndex]; this.toolsData.defaultSubToolsData = this.toolsData.defaultToolsData[this.application.ninja.toolsData.shapeToolIndex].subtools; this.toolsData.selectedSubTool = this.toolsData.defaultToolsData[this.application.ninja.toolsData.shapeToolIndex].subtools[1]; this.toolsData.selectedToolInstance = this.toolsList[this.toolsData.selectedTool.action]; this.setupGlobalHelpers(); window.addEventListener("resize", this, false); //Prompting the user to make sure data was saved before closing Ninja window.onbeforeunload = function () { return 'Are you sure you want to close Ninja? Any unsaved data will be lost.'; }; this.eventManager.addEventListener("selectTool", this, false); this.eventManager.addEventListener("selectSubTool", this, false); this.addPropertyChangeListener("appModel.livePreview", this.executeLivePreview, false); this.addPropertyChangeListener("appModel.chromePreview", this.executeChromePreview, false); this.addPropertyChangeListener("appModel.debug", this.toggleDebug, false); } }, //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// //TODO: Expand method to allow other browsers for preview executeChromePreview: { value: function () { //TODO: Make into proper component this.saveOperationScreen = {}; this._saveOperationPopup = {}; //Show this.saveOperationScreen.show = function (ctxt) { // ctxt._saveOperationPopup.blackout = document.createElement('div'); ctxt._saveOperationPopup.blackout.style.width = '100%'; ctxt._saveOperationPopup.blackout.style.height = '100%'; ctxt._saveOperationPopup.blackout.style.background = 'rgba(0,0,0,0.8)'; //'-webkit-radial-gradient(center, ellipse cover, rgba(0,0,0,.65) 0%, rgba(0,0,0,0.8) 80%)'; ctxt.application.ninja.popupManager.addPopup(ctxt._saveOperationPopup.blackout); }; //Hide this.saveOperationScreen.hide = function (ctxt) { ctxt.application.ninja.popupManager.removePopup(ctxt._saveOperationPopup.blackout); }; // this.currentDocument.model.browserPreview('chrome', this.saveOperationScreen, this); } }, //////////////////////////////////////////////////////////////////// //TODO: Make into proper component _saveOperationPopup: { value: null }, //TODO: Make into proper component saveOperationScreen: { value: null }, //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// handleResize: { value: function() { this.stage.resizeCanvases = true; } }, draw: { value: function() { if(this.isResizing) { this.timelineSplitter.collapsed = this.height - this._resizedHeight < 46; this.panelSplitter.collapsed = this.width - this._resizedWidth < 30; } this.rightPanelContainer.style.width = (this.width - this._resizedWidth) + "px"; this.timeline.element.style.height = (this.height - this._resizedHeight) + "px"; } }, _didDraw: { value: false }, didDraw: { value: function() { if(!this._didDraw) { if (!this.application.ninja.coreIoApi.ioServiceDetected) { var check = this.application.ninja.coreIoApi.cloudAvailable(); } NJevent("appLoaded"); this._didDraw = true; } } }, handleSelectTool: { value: function(event) { this.toolsData.defaultToolsData[this.toolsData.defaultToolsData.indexOf(this.toolsData.selectedTool)].selected = false; if(this.toolsData.selectedTool.container) { this.toolsList[this.toolsData.selectedSubTool.action]._configure(false); } else { this.toolsList[this.toolsData.selectedTool.action]._configure(false); } this.toolsData.selectedTool = event.detail; this.toolsData.defaultToolsData[this.toolsData.defaultToolsData.indexOf(this.toolsData.selectedTool)].selected = true; if(this.toolsData.selectedTool.container) { this.toolsData.selectedToolInstance = this.toolsList[this.toolsData.selectedSubTool.action]; } else { this.toolsData.selectedToolInstance = this.toolsList[this.toolsData.selectedTool.action]; } this.stage.SelectTool(this.toolsData.selectedTool.cursor); this.toolsData.selectedToolInstance._configure(true); } }, handleSelectSubTool: { value: function(event) { this.toolsData.defaultSubToolsData[this.toolsData.defaultSubToolsData.indexOf(this.toolsData.selectedSubTool)].selected = false; this.toolsList[this.toolsData.selectedSubTool.action]._configure(false); this.toolsData.selectedSubTool = event.detail; this.toolsData.defaultSubToolsData[this.toolsData.defaultSubToolsData.indexOf(this.toolsData.selectedSubTool)].selected = true; this.toolsData.selectedToolInstance = this.toolsList[this.toolsData.selectedSubTool.action]; this.toolsList[this.toolsData.selectedSubTool.action]._configure(true); } }, openDocument: { value: function(doc) { this.documentList.content.push(doc); // TODO: Check why this is still needed this.documentList.selectedObjects = [doc]; } }, closeFile: { value: function(document) { var doc = this.documentList.content[this.documentList.content.indexOf(document)], activeDocument; if(this.documentList.selectedObjects[0] !== doc) { activeDocument = this.documentList.selectedObjects[0]; } else { activeDocument = null; } this.documentList.removeObjects(doc); if(activeDocument) { this.documentList.selectedObjects = [activeDocument]; } else { if(this.documentList.content.length) { this.documentList.selectedObjects = this.documentList.content[0]; } } } }, executeLivePreview: { value: function() { var background, overflow, transitionStopRule; this.stage.hideCanvas(this.appModel.livePreview); // TODO: Remove marker for old template: NINJA-STAGE-REWORK if(this.appModel.livePreview) { // background = "#000000"; // overflow = "hidden"; transitionStopRule = "nj-css-garbage-selector"; } else { // background = "#808080"; // overflow = "visible"; transitionStopRule = "*" } // TODO: Remove marker for old template: NINJA-STAGE-REWORK // this.currentDocument.model.documentRoot.elementModel.controller.setProperty(this.currentDocument.model.documentRoot, "body-background", background); // this.currentDocument.model.documentRoot.elementModel.controller.setProperty(this.currentDocument.model.documentRoot, "overflow", overflow); // this.currentDocument.model.documentRoot.elementModel.controller.changeSelector(this.currentDocument.model.documentRoot, "transitionStopRule", transitionStopRule); this.application.ninja.stylesController._stageStylesheet.rules[0].selectorText = transitionStopRule; this._toggleWebGlAnimation(this.appModel.livePreview); } }, // Turn on WebGL animation during preview _toggleWebGlAnimation: { value: function(inLivePreview) { var glCanvases = this.currentDocument.model.views.design.iframe.contentWindow.document.querySelectorAll('[data-RDGE-id]'), glShapeModel; if(glCanvases) { for(var i = 0, len = glCanvases.length; i