/* 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, iconsListModule = require("js/components/ui/icon-list-basic/iconsList.reel"), treeModule = require("js/components/ui/tree-basic/tree.reel"); var PickerNavigator = exports.PickerNavigator = Montage.create(Component, { popup:{ enumerable: false, writable: true, value: null }, mainContentData:{ enumerable:false, writable:true, value:null }, _firstTime: { enumerable: false, value: true }, firstTime:{ get: function(){}, set: function(){} }, pickerCallback:{ enumerable:false, writable:true, value:null }, selectedItems:{//passed to pickerCallback on click of OK enumerable:false, writable:true, value:[] }, /** * store a reference to the currently selected node... for single selection */ currentSelectedNode:{ enumerable:false, writable:true, value:null }, currentURI:{ enumerable:false, writable:true, value:null }, iconsViewDrawnOnce:{ enumerable:false, writable:true, value:false }, /** * for tree view only * will store folder uri vs tree instance map */ treeRefHash:{ enumerable:false, writable:true, value:{ } }, selectedPickerView:{ enumerable:false, writable:true, value:null }, /** * Contains the different Views and their update handlers */ pickerViews:{ enumerable:false, writable:true, value: function(){ var that = this; return { "iconView":that.updateIconView, "treeView":that.updateTreeView } } }, pickerModel:{ enumerable:false, writable:true, value:null }, willDraw: { enumerable: false, value: function() { } }, draw: { enumerable: false, value: function() { this.filterVal.innerHTML = this.pickerModel.currentFilter; if(this.pickerModel.fatalError !== null){ this.error.innerHTML = this.pickerModel.fatalError; } } }, didDraw: { enumerable: false, value: function() { var that = this; this.iconList = null; this.newContent = null; this.spanEl = null; this.addIdentifiers(); var topLevelDirs = this.pickerModel.topLevelDirectories; var leftNav = this.leftNav; //draw left nav if(!!topLevelDirs && (typeof topLevelDirs === "object") && ('splice' in topLevelDirs) && ('join' in topLevelDirs) &&(topLevelDirs.length > 0)){ topLevelDirs.forEach(function(dirObj){ var newDiv = document.createElement("div"); newDiv.className = "driversList"; newDiv.innerHTML = dirObj.name; leftNav.appendChild(newDiv); if(dirObj.uri === this.pickerModel.currentRoot){ newDiv.classList.add("highlighted"); //enable ok for logical drive selections, when in directory selection mode if(this.pickerModel.inFileMode === false){ this.okButton.removeAttribute("disabled"); //put into selectedItems..currently single selection is supported this.selectedItems = [dirObj.uri]; } } newDiv.addEventListener("click", function(evt){that.handleTopLevelDirectoryClicks(evt, dirObj);}, false); }, that); }else{ console.error("need at least 1 valid top level directory"); } //Draw icon view list //TODO: check the default view and draw the appropriate view if(this.mainContentData !== null){ this.currentURI = this.pickerModel.currentRoot; //draw the IconsList if icons view container is on if(this.iconViewContainer.style.display === "block"){ this.iconList = iconsListModule.IconsList.create(); //console.log(this.mainContentData); this.iconList.iconsViewDataObject = this.mainContentData; this.iconList.element = this.iconViewContainer; this.iconList.needsDraw = true; this.iconsViewDrawnOnce = true; this.selectedPickerView = "iconView"; if(!this.iconView.classList.contains("viewSelected")){ this.iconView.classList.add("viewSelected") } if(this.treeView.classList.contains("viewSelected")){ this.treeView.classList.remove("viewSelected"); } }else if(this.treeViewContainer.style.display === "block"){ //else draw the Tree if tree view container is on this.renderTree(this.treeViewContainer, this.currentURI); this.selectedPickerView = "treeView"; if(!this.treeView.classList.contains("viewSelected")){ this.treeView.classList.add("viewSelected") } if(this.iconView.classList.contains("viewSelected")){ this.iconView.classList.remove("viewSelected"); } } this.updateAddressBar(this.pickerModel.currentRoot); this.pickerModel.storeHistory(this.pickerModel.currentRoot);//populate history this.updateMetadata(this.currentURI); //for directory selection, selected url is the folder entered if(!this.pickerModel.inFileMode ){ this.okButton.removeAttribute("disabled"); //put into selectedItems..currently single selection is supported this.selectedItems = [this.pickerModel.currentRoot]; } } this.element.addEventListener("openFolder", function(evt){that.handlePickerNavOpenFolder(evt);}, false);//add icon double click event listener to reload iconList with new set of data this.element.addEventListener("selectedItem", function(evt){that.handlePickerNavSelectedItem(evt);}, false);//for single selection only this.element.addEventListener("selectFile", function(evt){that.handlePickerNavSelectedFile(evt);}, false);//for file selection this.element.addEventListener("showMetadata", function(evt){that.handlePickerNavShowMetadata(evt);}, false);//show metadata on hover of icon this.element.addEventListener("updateMetadata", function(evt){that.handlePickerNavUpdateMetadata(evt);}, false);//show metadata on click of icon //this.addressGo.addEventListener("click", this, false); this.addressBarUri.addEventListener("keydown", this, false); this.addressBarUri.addEventListener("keyup", this, false); this.refreshButton.addEventListener("click", this, false);//refresh - gets from file system directly this.backArrow.addEventListener("click", this, false); this.forwardArrow.addEventListener("click", this, false); //populate filters if in file selection mode if(this.pickerModel.inFileMode === true){ var filtersDD = this.element.querySelector(".filters .dropdown"); if(!!this.pickerModel.fileFilters && (typeof this.pickerModel.fileFilters === "object") && ('splice' in this.pickerModel.fileFilters) && ('join' in this.pickerModel.fileFilters)){ this.pickerModel.fileFilters.forEach(function(aFilter){ var newDiv = document.createElement("div"); newDiv.innerHTML = aFilter; filtersDD.appendChild(newDiv); newDiv.addEventListener("click", function(evt){that.handleFilterClick(evt, aFilter, filtersDD)}, false); }, this); } var renderedWidth = this.getComputedWidth(filtersDD); this.filters.style.width = "" + (parseInt((renderedWidth.substring(0, (renderedWidth.length - 2)))) + 20) + "px"; }else{ this.filters.style.display = "none"; } /** * attach click event listeners to the addressbar dropdown arrows */ var dropDownArrows = this.element.getElementsByClassName("dropdownArrow"); for(var x=0; x0){ arr.push(temp); }else{//for unix root / arr.push("/"); } } //console.log(arr); return arr; } }, renderTree:{ writable:false, enumerable:true, value:function(element, uri){ if(!!element){ var tree = treeModule.Tree.create(); tree.treeViewDataObject = this.application.ninja.filePickerController.prepareContentList(uri, this.pickerModel); //console.log("renderTree() for "+ uri); //console.log(tree.treeViewDataObject); tree.element = element; tree.needsDraw = true; } } }, updateIconView:{ writable:false, enumerable:true, value:function(uri, fromCache){ var status = true; var iconViewContainer = this.element.querySelector(".iconViewContainer"); if((typeof fromCache === 'undefined') || (fromCache === true)){ this.newContent = this.application.ninja.filePickerController.prepareContentList(uri, this.pickerModel); } else{ this.newContent = this.application.ninja.filePickerController.prepareContentList(uri, this.pickerModel, false); } if(!!this.newContent && this.newContent.length > 0){ //clear selection this.clearSelection(); this.spanEl = iconViewContainer.querySelector(".noResults"); if(!!this.spanEl){ this.spanEl.style.display = "none"; } this.iconList.iconsViewDataObject = this.newContent; }else{ this.iconList.iconsViewDataObject = []; this.spanEl = iconViewContainer.querySelector(".noResults"); if(!!this.spanEl){ this.spanEl.style.display = "block"; }else{ this.spanEl = document.createElement("span"); this.spanEl.className = "noResults"; this.spanEl.innerHTML = "no results"; this.spanEl.style.display = "block"; iconViewContainer.appendChild(this.spanEl); } status = false; //for no match } this.updateMetadata(uri); return status; } }, updateTreeView:{ writable:false, enumerable:true, value:function(uri, fromCache){ var status = true; //need to draw every time since an expanded tree won't update with just bound data update var treeViewContainer = this.element.querySelector(".treeViewContainer"); //first clean up treeViewContainer while(treeViewContainer.hasChilden){ treeViewContainer.removeChild(treeViewContainer.lastChild); } //now draw the unexpanded tree with the current uri data if(!!treeViewContainer){ var data = []; if((typeof fromCache === 'undefined') || (fromCache === true)){ data = this.application.ninja.filePickerController.prepareContentList(uri, this.pickerModel); } else{ data = this.application.ninja.filePickerController.prepareContentList(uri, this.pickerModel, false); } if(data.length > 0){ //clear selection this.clearSelection(); this.spanEl = this.element.querySelector(".treeViewContainer").querySelector(".noResults"); if(!!this.spanEl){ this.spanEl.style.display = "none"; } var tree = treeModule.Tree.create(); tree.treeViewDataObject = data; tree.element = treeViewContainer; tree.needsDraw = true; }else{ var treeUl = treeViewContainer.getElementsByTagName("ul")[0]; if(!!treeUl){ treeUl.style.display = "none"; } this.spanEl = this.element.querySelector(".treeViewContainer").querySelector(".noResults"); if(!!this.spanEl){ this.spanEl.style.display = "block"; }else{ this.spanEl = document.createElement("span"); this.spanEl.className = "noResults"; this.spanEl.innerHTML = "no results"; this.spanEl.style.display = "block"; this.element.querySelector(".treeViewContainer").appendChild(this.spanEl); } status = false; //for no match } this.updateMetadata(uri); return status; } } }, updateMetadata:{ enumerable: false, writable:false, value:function(currentUri){ var data = this.application.ninja.filePickerController._directoryContentCache[currentUri]; var metadata = ""; if(!!data){ if(data.name !== ""){ metadata = "Name: "+data.name; } metadata = metadata + "
" + "Type: "+data.type; if(data.size){metadata = metadata + "
" + "Size: "+data.size;} if(data.creationDate){metadata = metadata + "
" + "Creation date: "+ this.formatTimestamp(data.creationDate);} if(data.modifiedDate){metadata = metadata + "
" + "Modified date: "+ this.formatTimestamp(data.modifiedDate);} } this.element.getElementsByClassName("right-bottom")[0].innerHTML = metadata; } }, isOutside:{ enumerable:true, value:function(el, targetEl){ var isOutside = true; if(el){ var childElements = el.getElementsByTagName("*");//get a flat NodeList of all the child elements if(childElements != null){ for(var i=0; i< childElements.length; i++){ if(childElements[i] === targetEl){//targetEl matches with an element inside the menu isOutside = false; break; } } } } return isOutside; } }, /** * convert timestamp to human readable form * * @param: timestamp - UTC milliseconds */ formatTimestamp:{ writable:false, enumerable: false, value: function(timestamp) { var aDate = new Date(); timestamp = timestamp - (aDate.getTimezoneOffset()*60*1000);//convert from GMT to local timestamp aDate = new Date(timestamp); return aDate.toLocaleString(); } }, /** * Event Listners */ addIdentifiers:{ value: function(){ this.element.identifier = "pickerNav"; //this.addressGo.identifier = "addressGo"; this.addressBarUri.identifier = "addressBarUri"; this.refreshButton.identifier = "refreshButton"; this.backArrow.identifier = "backArrow"; this.forwardArrow.identifier = "forwardArrow"; this.iconView.identifier = "iconView"; this.treeView.identifier = "treeView"; this.resultsArea.identifier = "resultsArea"; } }, handleTopLevelDirectoryClicks : { enumerable: true, writable: false, value : function(evt, dirObj){ this.currentURI = dirObj.uri; var status = this.pickerViews()[this.selectedPickerView].call(this, dirObj.uri);//dynamically calls the update function of the current picker view this.updateAddressBar(dirObj.uri); this.pickerModel.currentRoot = dirObj.uri; //populate history this.pickerModel.storeHistory(dirObj.uri); //disable forward button for explicit new urls if(!this.forwardArrow.classList.contains("disable")){ this.forwardArrow.classList.add("disable"); } //enable back button if required if((this.pickerModel.currentHistoryPointer === 1) && this.backArrow.classList.contains("disable")){ this.backArrow.classList.remove("disable"); } //dehighlight current selection and highlight new selection var currentHighlighted = evt.target.parentNode.querySelector(".highlighted"); if(!!currentHighlighted){ currentHighlighted.classList.remove("highlighted"); } if(!evt.target.classList.contains("highlighted")){ evt.target.classList.add("highlighted"); } //enable ok for logical drive selections, when in directory selection mode if(this.pickerModel.inFileMode === false){ this.okButton.removeAttribute("disabled"); //put into selectedItems..currently single selection is supported this.selectedItems = [dirObj.uri]; } } }, handlePickerNavOpenFolder: { value: function(evt){ this.currentURI = evt.folderUri; var status = this.pickerViews()[this.selectedPickerView].call(this, evt.folderUri);//dynamically calls the update function of the current picker view //update address-bar this.updateAddressBar(evt.folderUri); //populate history this.pickerModel.storeHistory(evt.folderUri); //disable forward button for explicit new urls if(!this.forwardArrow.classList.contains("disable")){ this.forwardArrow.classList.add("disable"); } //enable back button if required if((this.pickerModel.currentHistoryPointer === 1) && this.backArrow.classList.contains("disable")){ this.backArrow.classList.remove("disable"); } //for directory selection, selected url is the folder entered if(!this.pickerModel.inFileMode ){ this.okButton.removeAttribute("disabled"); //put into selectedItems..currently single selection is supported this.selectedItems = [evt.folderUri]; } } }, handlePickerNavSelectedItem: { value:function(evt){ var uri = evt.uri; //handle deselection of other icons for single selection if((this.currentSelectedNode !== null) && (this.currentSelectedNode !== evt.target) && (this.currentSelectedNode.classList.contains("selected"))){ this.currentSelectedNode.classList.remove("selected"); this.currentSelectedNode = null; } //enable OK button if the selection is valid as per the picker mode if((this.pickerModel.inFileMode && (this.application.ninja.filePickerController._directoryContentCache[uri].type === "file")) || (!this.pickerModel.inFileMode && (this.application.ninja.filePickerController._directoryContentCache[uri].type === "directory"))){ this.okButton.removeAttribute("disabled"); //put into selectedItems..currently single selection is supported this.selectedItems = [uri]; if(!evt.target.classList.contains("selected")){ evt.target.classList.add("selected"); } this.currentSelectedNode = evt.target; }else{ //test: highlight non-selectable icons too if(!evt.target.classList.contains("selected")){ evt.target.classList.add("selected"); } this.currentSelectedNode = evt.target; //end- test //disable OK if(!this.okButton.hasAttribute("disabled")){ this.okButton.setAttribute("disabled", "true"); } } } }, handlePickerNavSelectedFile:{ value: function(evt){ var uri = evt.fileUri; //do selection if in file selection mode if(this.pickerModel.inFileMode && (this.application.ninja.filePickerController._directoryContentCache[uri].type === "file")){ this.okButton.removeAttribute("disabled"); //put into selectedItems..currently single selection is supported this.selectedItems = [uri]; this.currentURI = uri.substring(0, uri.lastIndexOf("/")); this.handleOkButtonAction(); } } }, handlePickerNavShowMetadata: { value: function(evt){ //update matadata only if nothing is already selected if(this.currentSelectedNode == null){ //console.log("handle showmetadata - true"); this.metadataSection.innerHTML = evt.metadata; } } }, handlePickerNavUpdateMetadata:{ value: function(evt){ this.metadataSection.innerHTML = evt.metadata; } }, handleAddressGoClick :{ value: function(evt){ if(this.addressBarUri.value !== ""){ var uri = this.addressBarUri.value; uri = this.cleanupUri(uri); this.currentURI = uri; var status = this.pickerViews()[this.selectedPickerView].call(this, uri);//dynamically calls the update function of the current picker view //populate history this.pickerModel.storeHistory(uri); //disable forward button for explicit new urls if(!this.forwardArrow.classList.contains("disable")){ this.forwardArrow.classList.add("disable"); } //enable back button if required if((this.pickerModel.currentHistoryPointer === 1) && this.backArrow.classList.contains("disable")){ this.backArrow.classList.remove("disable"); } } } }, handleAddressBarUriKeydown:{ value: function(evt){ if(evt.keyCode === 13 ){ var uri = this.addressBarUri.value; uri = this.cleanupUri(uri); this.currentURI = uri; var status = this.pickerViews()[this.selectedPickerView].call(this, uri);//dynamically calls the update function of the current picker view //populate history this.pickerModel.storeHistory(uri); //disable forward button for explicit new urls if(!this.forwardArrow.classList.contains("disable")){ this.forwardArrow.classList.add("disable"); } //enable back button if required if((this.pickerModel.currentHistoryPointer === 1) && this.backArrow.classList.contains("disable")){ this.backArrow.classList.remove("disable"); } } } }, handleAddressBarUriKeyup:{ value: function(evt){ //disable ok if user enters an invalid uri if(!this.application.ninja.coreIoApi.isValidUri(this.addressBarUri.value)){ //disable OK if(!this.okButton.hasAttribute("disabled")){ this.okButton.setAttribute("disabled", "true"); } }else{ this.okButton.removeAttribute("disabled"); this.selectedItems = [this.addressBarUri.value]; } } }, handleRefreshButtonClick:{ value:function(evt){ var uri = this.addressBarUri.value; uri = this.cleanupUri(uri); var status = this.pickerViews()[this.selectedPickerView].call(this, uri, false);//dynamically calls the update function of the current picker view } }, handleBackArrowClick :{ value:function(evt){ var uri = ""; //console.log("*** backArrow: pointer ="+this.pickerModel.currentHistoryPointer); if(this.pickerModel.currentHistoryPointer >0){ uri = this.pickerModel._history[this.pickerModel.currentHistoryPointer -1]; //console.log("*** back uri= "+ uri); //console.log(this.pickerModel._history); this.currentURI = uri; var status = this.pickerViews()[this.selectedPickerView].call(this, uri);//dynamically calls the update function of the current picker view //update address-bar this.updateAddressBar(uri); this.pickerModel.currentHistoryPointer -= 1; //disable back button if it is at the beginning if((this.pickerModel.currentHistoryPointer === 0) && (!evt.target.classList.contains("disable"))){ evt.target.classList.add("disable"); } //enable forward button if required if((this.pickerModel.currentHistoryPointer < (this.pickerModel._history.length -1) && (this.forwardArrow.classList.contains("disable")))){ this.forwardArrow.classList.remove("disable"); } } //console.log("***new backArrow: pointer ="+this.pickerModel.currentHistoryPointer); } }, handleForwardArrowClick: { value:function(evt){ var uri = ""; //console.log("*** forwardArrow: pointer ="+this.pickerModel.currentHistoryPointer); if(this.pickerModel.currentHistoryPointer < (this.pickerModel._history.length -1)){ uri = this.pickerModel._history[this.pickerModel.currentHistoryPointer + 1]; //console.log("*** forward uri= "+ uri); //console.log(this.pickerModel._history); this.currentURI = uri; var status = this.pickerViews()[this.selectedPickerView].call(this, uri);//dynamically calls the update function of the current picker view //update address-bar this.updateAddressBar(uri); this.pickerModel.currentHistoryPointer += 1; //disable forward button if pointer is at the end if((this.pickerModel.currentHistoryPointer === (this.pickerModel._history.length -1)) && (!evt.target.classList.contains("disable"))){ evt.target.classList.add("disable"); } //enable back button if required if((this.pickerModel.currentHistoryPointer > 0) && (this.backArrow.classList.contains("disable"))){ this.backArrow.classList.remove("disable"); } } //console.log("***new forwardArrow: pointer ="+this.pickerModel.currentHistoryPointer); } }, handleOkButtonAction : { value: function(evt){ //console.log("$$$ File Picker : selected "+ this.selectedItems.toString()); var success = true; if(!!this.pickerModel.callback && (this.selectedItems.length > 0)){//call the callback if it is available try{ this.pickerModel.callback({"uri":this.selectedItems}); }catch(e){ success = false; console.log("[Error] Failed to open "+ this.selectedItems.toString()); console.log(e.stack); } }else{//else send an event with the selected files var pickerSelectionEvent = document.createEvent("Events"); pickerSelectionEvent.initEvent("pickerSelectionsDone", false, false); pickerSelectionEvent.selectedItems = this.selectedItems; this.eventManager.dispatchEvent(pickerSelectionEvent); } //store last opened/saved folder, and view after IO is successful var dataStore = window.sessionStorage; try { if(this.pickerModel.pickerMode === "write"){ dataStore.setItem('lastSavedFolderURI',escape(""+this.currentURI)); } else if(this.pickerModel.inFileMode === true){ dataStore.setItem('lastOpenedFolderURI_fileSelection',escape(""+this.currentURI)); }else if(this.pickerModel.inFileMode === false){ dataStore.setItem('lastOpenedFolderURI_folderSelection',escape(""+this.currentURI)); } } catch(e){ if(e.code == 22){ dataStore.clear(); } } this.cleanup();//clear up any unnecessary memory if(this.popup){ this.popup.hide(); } //end - close dialog } }, handleCancelButtonAction :{ value:function(evt){ //clean up memory this.cleanup(); if(this.popup){ this.popup.hide(); } } }, handleFilterClick:{ value: function(evt, aFilter, filtersDD){ this.pickerModel.currentFilter = aFilter; this.pickerViews()[this.selectedPickerView].call(this, this.currentURI);//dynamically calls the update function of the current picker view this.element.querySelector(".filters .filterVal").innerHTML = evt.target.innerHTML; filtersDD.classList.toggle("hide"); } }, handleAddressDropdownArrowClick:{ value: function(evt){ var that = this; //populate dropdown dynamically for addressbar var addressbarDD = this.element.querySelector(".addressbar .dropdown"); if((evt.target === this.element.querySelector(".addressbar .dropdownArrow")) && (addressbarDD.classList.contains("hide"))){//dropdown is closed //clear old dropdown contents while(addressbarDD.hasChildNodes()){ addressbarDD.removeChild(addressbarDD.lastChild); } var uriTrail = this.prepareAddressDropdownData(this.addressBarUri.value); if(uriTrail.length >0){ uriTrail.forEach(function(aUri){ var newDiv = document.createElement("div"); newDiv.innerHTML = aUri; addressbarDD.appendChild(newDiv); newDiv.addEventListener("click", function(evt){that.handleAddressTrailClick(evt, aUri, addressbarDD);}, false); }, this); } } //open close dropdown this.toggleDropdown(evt.target); } }, handleAddressTrailClick: { value: function(evt, aUri, addressbarDD){ this.currentURI = aUri; var status = this.pickerViews()[this.selectedPickerView].call(this, aUri);//dynamically calls the update function of the current picker view //populate history this.pickerModel.storeHistory(aUri); //disable forward button for explicit new urls if(!this.forwardArrow.classList.contains("disable")){ this.forwardArrow.classList.add("disable"); } //enable back button if required if((this.pickerModel.currentHistoryPointer === 1) && this.backArrow.classList.contains("disable")){ this.backArrow.classList.remove("disable"); } this.addressBarUri.value = evt.target.innerHTML; addressbarDD.classList.toggle("hide"); } }, handleIconViewClick :{ value:function(evt){ this.selectedPickerView = "iconView"; if(this.element.querySelector(".iconViewContainer").style.display === "none"){ //draw if icons list is not already drawn if(this.iconsViewDrawnOnce === false){ this.iconList = iconsListModule.IconsList.create(); this.iconList.iconsViewDataObject = that.mainContentData; this.iconList.element = that.iconViewContainer; this.iconList.needsDraw = true; this.iconsViewDrawnOnce = true; }else{ this.pickerViews()[this.selectedPickerView].call(this, this.currentURI); } this.element.querySelector(".iconViewContainer").style.display = "block"; } this.element.querySelector(".treeViewContainer").style.display = "none"; //enable selection if(!evt.target.classList.contains("viewSelected")){ evt.target.classList.add("viewSelected") } if(this.treeView.classList.contains("viewSelected")){ this.treeView.classList.remove("viewSelected"); } } }, handleTreeViewClick : { value:function(evt){ this.selectedPickerView = "treeView"; if(this.element.querySelector(".treeViewContainer").style.display === "none"){ this.pickerViews()[this.selectedPickerView].call(this, this.currentURI); this.element.querySelector(".treeViewContainer").style.display = "block"; } this.element.querySelector(".iconViewContainer").style.display = "none"; //enable selection if(!evt.target.classList.contains("viewSelected")){ evt.target.classList.add("viewSelected") } if(this.iconView.classList.contains("viewSelected")){ this.iconView.classList.remove("viewSelected"); } } }, handlePickerNavDrawTree:{ value: function(evt){ //toggle open or close for directory if(evt.uriType === "directory"){ this.renderTree(evt.subTreeContainer, evt.uri); } } }, handlePickerNavRefreshTreeSegment:{ value: function(evt){ // if(this.application.ninja.filePickerController.checkIfStale(evt.uri)){ // //update tree segment if was stale // evt.treeSegment.treeViewDataObject = this.application.ninja.filePickerController.prepareContentList(evt.uri, this.pickerModel, true, false); // } } }, handleResultsAreaClick: { value:function(evt){ //console.log("### clicked right-top"); if((evt.target.querySelectorAll(".icon").length > 1) || (evt.target.querySelectorAll(".atreeItem").length > 1)){//not clicked on an icon //console.log("@@ clicked in empty area"); this.clearSelection(); } } }, handlePickerNavClick:{ value: function(evt){ //console.log("### clicked picker"); this.closeDropdowns(evt.target); } }, getComputedWidth:{ value: function(element){ var calculatedWidth = "0px"; var orginalDisplay = element.style.display; var originalVisibility = element.style.visibility; element.style.display = "block"; element.style.visibility = "hidden"; calculatedWidth = window.getComputedStyle(element, null).getPropertyValue("width"); element.style.display = orginalDisplay; element.style.visibility = originalVisibility; return calculatedWidth; } }, cleanup:{ writable:false, enumerable:true, value:function(){ //clear memory - TODO:check for more memory leaks this.pickerModel = null; this.application.ninja.filePickerController._directoryContentCache = {}; //remove listeners this.element.removeEventListener("openFolder", this, false);//add icon double click event listener to reload iconList with new set of data this.element.removeEventListener("selectedItem", this, false);//for single selection only this.element.removeEventListener("showMetadata", this, false);//show metadata on hover of icon this.element.removeEventListener("updateMetadata", this, false);//show metadata on click of icon //this.addressGo.removeEventListener("click", this, false); this.addressBarUri.removeEventListener("keydown", this, false); this.refreshButton.removeEventListener("click", this, false);//refresh - gets from file system directly this.backArrow.removeEventListener("click", this, false); this.forwardArrow.removeEventListener("click", this, false); this.iconView.removeEventListener("click", this, false); this.treeView.removeEventListener("click", this, false); this.element.removeEventListener("drawTree", this, false); this.resultsArea.removeEventListener("click", this, false); this.element.removeEventListener("click", this, false); } } });