Index: lams_flash/src/common/flash/org/lamsfoundation/lams/common/ws/WorkspaceDialog.as =================================================================== RCS file: /usr/local/cvsroot/lams_flash/src/common/flash/org/lamsfoundation/lams/common/ws/WorkspaceDialog.as,v diff -u -r1.13 -r1.14 --- lams_flash/src/common/flash/org/lamsfoundation/lams/common/ws/WorkspaceDialog.as 29 Apr 2010 21:55:37 -0000 1.13 +++ lams_flash/src/common/flash/org/lamsfoundation/lams/common/ws/WorkspaceDialog.as 22 Mar 2012 04:33:11 -0000 1.14 @@ -1,1176 +1,1183 @@ -/*************************************************************************** - * Copyright (C) 2005 LAMS Foundation (http://lamsfoundation.org) - * ============================================================= - * License Information: http://lamsfoundation.org/licensing/lams/2.0/ - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2.0 - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 - * USA - * - * http://www.gnu.org/licenses/gpl.txt - * ************************************************************************ - */ - -import mx.controls.* -import mx.utils.* -import mx.managers.* -import mx.events.* -import org.lamsfoundation.lams.authoring.Application; -import org.lamsfoundation.lams.authoring.cv.Canvas; -import org.lamsfoundation.lams.authoring.DesignDataModel; -import org.lamsfoundation.lams.common.*; -import org.lamsfoundation.lams.common.ws.* -import org.lamsfoundation.lams.common.util.* -import org.lamsfoundation.lams.common.dict.* -import org.lamsfoundation.lams.common.style.* -import org.lamsfoundation.lams.common.ui.* -import it.sephiroth.TreeDnd; -/** -* @author DI & DC -*/ -class WorkspaceDialog extends MovieClip{ - - //private static var OK_OFFSET:Number = 50; - //private static var CANCEL_OFFSET:Number = 50; - - //References to components + clips - private var _container:MovieClip; //The container window that holds the dialog - private var ok_btn:Button; //OK+Cancel buttons - private var cancel_btn:Button; - private var panel:MovieClip; //The underlaying panel base - - private var switchView_tab:MovieClip; - - //location tab elements - private var treeview:Tree; //Treeview for navigation through workspace folder structure - private var location_dnd:TreeDnd; - private var input_txt:TextInput; - private var currentPath_lbl:Label; - private var name_lbl:Label; - private var resourceTitle_txi:TextInput; - private var new_btn:Button; - //private var cut_btn:Button; - private var copy_btn:Button; - private var paste_btn:Button; - private var delete_btn:Button; - private var rename_btn:Button; - - - //properties - private var description_lbl:Label; - private var license_lbl:Label; - private var license_comment_lbl:Label; - private var resourceDesc_txa:TextArea; - private var license_txa:TextArea; - private var licenseID_cmb:ComboBox; - private var licenseImg_pnl:MovieClip; - private var viewLicense_btn:Button; - - private var dateModified_lbl:Label; - private var authorOwner_lbl:Label; - - - private var fm:FocusManager; //Reference to focus manager - private var themeManager:ThemeManager; //Theme manager - - private var _workspaceView:WorkspaceView; - private var _workspaceModel:WorkspaceModel; - private var _workspaceController:WorkspaceController; - - - //Dimensions for resizing - private var xOkOffset:Number; - private var yOkOffset:Number; - private var xCancelOffset:Number; - private var yCancelOffset:Number; - - private var _resultDTO:Object; //This is an object to contain whatever the user has selected / set - will be passed back to the calling function - - - private var _selectedDesignId:Number; - private var _currentTab:Number; - - private static var OTHER_LICENSE_ID:Number = 6; - private static var LOCATION_TAB:Number = 0; - private static var PROP_TAB:Number = 1; - - //These are defined so that the compiler can 'see' the events that are added at runtime by EventDispatcher - private var dispatchEvent:Function; - public var addEventListener:Function; - public var removeEventListener:Function; - - - /** - * constructor - */ - function WorkspaceDialog(){ - //trace('WorkSpaceDialog.constructor'); - //Set up this class to use the Flash event delegation model - EventDispatcher.initialize(this); - - //set the reference to the StyleManager - themeManager = ThemeManager.getInstance(); - - //TODO: Make setStyles more efficient - setStyles(); - - _resultDTO = new Object(); - //this.tabEnabled = true - //Create a clip that will wait a frame before dispatching init to give components time to setup - this.onEnterFrame = init; - } - - /** - * Called a frame after movie attached to allow components to initialise - */ - private function init(){ - //Delete the enterframe dispatcher - delete this.onEnterFrame; - //TODO: DC apply the themes here - - //Set the container reference - Debugger.log('container=' + _container,Debugger.GEN,'init','org.lamsfoundation.lams.WorkspaceDialog'); - - //set up the tab bar: - - switchView_tab.addItem({label:Dictionary.getValue('ws_dlg_location_button'), data:'LOCATION'}); - switchView_tab.addItem({label:Dictionary.getValue('ws_dlg_properties_button'), data:'PROPERTIES'}); - - - //Set the text on the labels - currentPath_lbl.text = ""+Dictionary.getValue('ws_dlg_location_button')+":" - license_lbl.text = Dictionary.getValue('ws_license_lbl'); - license_comment_lbl.text = Dictionary.getValue('ws_license_comment_lbl'); - - name_lbl.text = Dictionary.getValue('ws_dlg_filename'); - description_lbl.text = Dictionary.getValue('ws_dlg_description'); - dateModified_lbl._visible = false; - authorOwner_lbl._visible = false; - - //Set the text for buttons - ok_btn.label = Dictionary.getValue('ws_dlg_ok_button'); - cancel_btn.label = Dictionary.getValue('ws_dlg_cancel_button'); - viewLicense_btn.label = Dictionary.getValue('ws_view_license_button'); - - new_btn.label = Dictionary.getValue('new_btn'); - copy_btn.label = Dictionary.getValue('copy_btn'); - paste_btn.label = Dictionary.getValue('paste_btn'); - delete_btn.label = Dictionary.getValue('delete_btn'); - rename_btn.label = Dictionary.getValue('rename_btn'); - //TODO: Dictionary calls for all the rest of the buttons - - //get focus manager + set focus to OK button, focus manager is available to all components through getFocusManager - fm = _container.getFocusManager(); - fm.enabled = true; - ok_btn.setFocus(); - //fm.defaultPushButton = ok_btn; - - Debugger.log('ok_btn.tabIndex: '+ok_btn.tabIndex,Debugger.GEN,'init','org.lamsfoundation.lams.WorkspaceDialog'); - - - //Tie parent click event (generated on clicking close button) to this instance - _container.addEventListener('click',this); - //Register for LFWindow size events - _container.addEventListener('size',this); - - //panel.setStyle('backgroundColor',0xFFFFFF); - - //Debugger.log('setting offsets',Debugger.GEN,'init','org.lamsfoundation.lams.common.ws.WorkspaceDialog'); - - //work out offsets from bottom RHS of panel - xOkOffset = panel._width - ok_btn._x; - yOkOffset = panel._height - ok_btn._y; - xCancelOffset = panel._width - cancel_btn._x; - yCancelOffset = panel._height - cancel_btn._y; - - //Register as listener with StyleManager and set Styles - themeManager.addEventListener('themeChanged', this); - - treeview = location_dnd.getTree(); - //Fire contentLoaded event, this is required by all dialogs so that creator of LFWindow can know content loaded - resourceTitle_txi.setFocus(); - _container.contentLoaded(); - this.tabChildren = true; - Cursor.showCursor(ApplicationParent.C_DEFAULT); - setTabIndex(); - //removeProps(_workspaceView.getModel(). - } - - /** - * Called by the worspaceView after the content has loaded - * @usage - * @return - */ - public function setUpContent():Void{ - - //register to recive updates form the model - WorkspaceModel(_workspaceView.getModel()).addEventListener('viewUpdate',this); - - Debugger.log('_workspaceView:'+_workspaceView,Debugger.GEN,'setUpContent','org.lamsfoundation.lams.common.ws.WorkspaceDialog'); - - //get a ref to the controller and kkep it here to listen for events: - _workspaceController = _workspaceView.getController(); - Debugger.log('_workspaceController:'+_workspaceController,Debugger.GEN,'setUpContent','org.lamsfoundation.lams.common.ws.WorkspaceDialog'); - removeProps(_workspaceController.getWSModel()) - - //Add event listeners for ok, cancel and close buttons - ok_btn.addEventListener('click',Delegate.create(this, ok)); - cancel_btn.addEventListener('click',Delegate.create(this, cancel)); - switchView_tab.addEventListener("change",Delegate.create(this, switchTab)); - - //think this is failing.... - switchView_tab.setSelectedIndex(0); - - new_btn.addEventListener('click',Delegate.create(_workspaceController, _workspaceController.fileOperationRequest)); - copy_btn.addEventListener('click',Delegate.create(_workspaceController, _workspaceController.fileOperationRequest)); - paste_btn.addEventListener('click',Delegate.create(_workspaceController, _workspaceController.fileOperationRequest)); - delete_btn.addEventListener('click',Delegate.create(_workspaceController, _workspaceController.fileOperationRequest)); - rename_btn.addEventListener('click',Delegate.create(_workspaceController, _workspaceController.fileOperationRequest)); - - viewLicense_btn.addEventListener('click',Delegate.create(this, openLicenseURL)); - licenseID_cmb.addEventListener('change',Delegate.create(this, onLicenseComboSelect)); - - //Set up the treeview - setUpTreeview(); - - itemSelected(treeview.selectedNode); - - } - - - /** - * Recieved update events from the WorkspaceModel. Dispatches to relevent handler depending on update.Type - * @usage - * @param event - */ - public function viewUpdate(event:Object):Void{ - Debugger.log('Received an Event dispatcher UPDATE!, updateType:'+event.updateType+', target'+event.target,4,'viewUpdate','org.lamsfoundation.lams.ws.WorkspaceDialog'); - //Update view from info object - var wm:WorkspaceModel = event.target; - //set a permenent ref to the model for ease (sorry mvc guru) - _workspaceModel = wm; - - switch (event.updateType){ - case 'POPULATE_LICENSE_DETAILS' : - populateAvailableLicenses(event.data, wm); - break; - case 'REFRESH_TREE' : - refreshTree(wm); - break; - case 'UPDATE_CHILD_FOLDER' : - updateChildFolderBranches(event.data,wm); - openFolder(event.data, wm); - break; - case 'UPDATE_CHILD_FOLDER_NOOPEN' : - updateChildFolderBranches(event.data,wm); - break; - case 'ITEM_SELECTED' : - itemSelected(event.data,wm); - break; - case 'OPEN_FOLDER' : - openFolder(event.data, wm, false); - break; - case 'CLOSE_FOLDER' : - closeFolder(event.data, wm); - break; - case 'REFRESH_FOLDER' : - refreshFolder(event.data, wm); - break; - case 'SHOW_TAB' : - showTab(event.data, wm); - break; - case 'UPDATED_PROP_DETAILS' : - populatePropDetails(event.data, wm); - break; - case 'SET_UP_BRANCHES_INIT' : - setUpBranchesInit(); - break; - - default : - Debugger.log('unknown update type :' + event.updateType,Debugger.GEN,'viewUpdate','org.lamsfoundation.lams.ws.WorkspaceDialog'); - } - - } - - - - /** - * called witht he result when a child folder is opened.. - * updates the tree branch satus, then refreshes. - * @usage - * @param changedNode - * @param wm - * @return - */ - private function updateChildFolderBranches(changedNode:XMLNode,wm:WorkspaceModel){ - Debugger.log('updateChildFolder....:' ,Debugger.GEN,'updateChildFolder','org.lamsfoundation.lams.ws.WorkspaceDialog'); - //we have to set the new nodes to be branches, if they are branches - if(changedNode.attributes.isBranch){ - treeview.setIsBranch(changedNode,true); - //do its kids - for(var i=0; i 0){ - for(var i=0; i 0){ - - for(var i=0; i - * _resultDTO.selectedResourceID //The ID of the resource that was selected when the dialogue closed - * _resultDTO.resourceName //The contents of the Name text field - * _resultDTO.resourceDescription //The contents of the description field on the propertirs tab - * _resultDTO.resourceLicenseText //The contents of the license text field - * _resultDTO.resourceLicenseID //The ID of the selected license from the drop down. - * - */ - private function ok(){ - _global.breakpoint(); - _workspaceController = _workspaceView.getController(); - _workspaceController.setBusy() - - //TODO: Validate you are allowed to use the name etc... Are you overwriting - NOTE Same names are nto allowed in this version - - var snode = treeview.selectedNode; - - if(isVirtualFolder(snode)){ - _workspaceController.clearBusy(); - return; - } - - Debugger.log('_workspaceModel.currentMode: ' + _workspaceModel.currentMode,Debugger.GEN,'ok','org.lamsfoundation.lams.WorkspaceDialog'); - var tempTitle = StringUtils.replace(resourceTitle_txi.text, " ", ""); - if(_workspaceModel.currentMode==Workspace.MODE_SAVE || _workspaceModel.currentMode==Workspace.MODE_SAVEAS){ - if (tempTitle == "" || tempTitle == undefined){ - Cursor.showCursor(ApplicationParent.C_DEFAULT); - - var sendMsg:String = Dictionary.getValue('ws_file_name_empty')+"\n"+Dictionary.getValue('ws_entre_file_name')+"\n\n"; - LFMessage.showMessageAlert(sendMsg,null); - _workspaceController.clearBusy(); - resourceTitle_txi.setFocus(); - }else{ - Cursor.showCursor(ApplicationParent.C_HOURGLASS); - saveFile(snode); - } - } else { - openFile(snode); - } - } - - /** - * Open file from Workspace - * - * @param snode file to open or folder to open from - */ - - private function openFile(snode:XMLNode):Void{ - Debugger.log('Opening a file.',Debugger.GEN,'openFile','org.lamsfoundation.lams.WorkspaceDialog'); - _workspaceController = _workspaceView.getController(); - - if (snode.attributes.data.resourceType==_workspaceModel.RT_FOLDER){ - if(resourceTitle_txi.text == null){ - } else { - if(!searchForFile(snode, resourceTitle_txi.text)){ - _workspaceController.clearBusy() - } - } - } else { - doWorkspaceDispatch(true); - } - } - - /** - * Save file to Workspace - * - * @param snode folder to save to - */ - private function saveFile(snode:XMLNode):Void{ - Debugger.log('Saving a file.',Debugger.GEN,'saveFile','org.lamsfoundation.lams.WorkspaceDialog'); - ok_btn.enabled = false; - - var snodeData = treeview.selectedNode.attributes.data; - var isWritable:Boolean = _workspaceModel.isWritableResource(snodeData.resourceType,snodeData.resourceID); - - Debugger.log("isWritable: "+isWritable, Debugger.CRITICAL, "saveFile", "WorkspaceDialog"); - _workspaceController = _workspaceView.getController(); - - if(StringUtils.containsReservedChar(resourceTitle_txi.text)) { - LFMessage.showMessageAlert(Dictionary.getValue('ws_save_title_reserved_chars', [StringUtils.reserved_str]), null); - ok_btn.enabled = true; - Cursor.showCursor(ApplicationParent.C_DEFAULT); - return; - } - - if(snode == treeview.dataProvider.firstChild){ - LFMessage.showMessageAlert(Dictionary.getValue('ws_save_folder_invalid'),null); - ok_btn.enabled = true; - } else if(snode.attributes.data.resourceType==_workspaceModel.RT_LD){ - - if(snode.parentNode != null) { - - if(searchForFile(snode.parentNode, resourceTitle_txi.text, true)) { - - if(isWritable) { - //run a confirm dialogue as user is about to overwrite a design! - LFMessage.showMessageConfirm(Dictionary.getValue('ws_chk_overwrite_resource'), Proxy.create(this,doWorkspaceDispatch,true), Proxy.create(this, enable_ok, true)); - _workspaceController.clearBusy(); - } - else { // don't have permission, file is read-only - ok_btn.enabled = true; - LFMessage.showMessageAlert(Dictionary.getValue('ws_no_permission'),null,null) - } - } - } - - } else if(snode.attributes.data.resourceType==_workspaceModel.RT_FOLDER){ - - if(snode.attributes.data.resourceID < 0){ - ok_btn.enabled = true; - LFMessage.showMessageAlert(Dictionary.getValue('ws_save_folder_invalid'),null); - _workspaceController.clearBusy(); - } else if (!isWritable) { - ok_btn.enabled = true; - LFMessage.showMessageAlert(Dictionary.getValue('ws_no_permission'),null,null); - } else if(searchForFile(snode, resourceTitle_txi.text)){ - //run a alert dialogue as user is using the same name as an existing design! - ok_btn.enabled = true; - LFMessage.showMessageAlert(Dictionary.getValue('ws_chk_overwrite_existing', [resourceTitle_txi.text]), null); - _workspaceController.clearBusy(); - } - } else { - LFMessage.showMessageAlert(Dictionary.getValue('ws_click_folder_file'),null); - _workspaceController.clearBusy(); - ok_btn.enabled = true; - } - - Cursor.showCursor(ApplicationParent.C_DEFAULT); - } - - private function enable_ok(e:Boolean) { - ok_btn.enabled = e; - } - - private function searchForFile(snode:XMLNode, filename:String, isParentNode:Boolean){ - - var _isParentNode:Boolean = isParentNode; - - if(_isParentNode == null) { - _isParentNode = false; - } - - Debugger.log('Searching for file (' + snode.childNodes.length + '): ' + filename,Debugger.GEN,'openFile','org.lamsfoundation.lams.WorkspaceDialog'); - var cnode:XMLNode; - - if(snode.hasChildNodes() || snode.attributes.isEmpty){ - - cnode = snode.firstChild; - do { - Debugger.log('matching file: ' + cnode.attributes.data.name + ' to: ' + filename,Debugger.GEN,'openFile','org.lamsfoundation.lams.WorkspaceDialog'); - - // look for matching Learning Design file in the folder - var _filename:String = cnode.attributes.data.name; - var _filetype:String = cnode.attributes.data.resourceType; - if(_filename == filename && _filetype == _workspaceModel.RT_LD){ - if(_workspaceModel.currentMode == Workspace.MODE_OPEN){ - treeview.selectedNode = null; - _resultDTO.file = cnode; - doWorkspaceDispatch(true); - } - - return true; - } - - cnode = cnode.nextSibling; - - } while(cnode != null); - - if(_workspaceModel.currentMode == Workspace.MODE_SAVE || _workspaceModel.currentMode == Workspace.MODE_SAVEAS){ - if(!_isParentNode) - doWorkspaceDispatch(false); - else - doWorkspaceDispatch(false, snode) - } - return false; - - } else { - // save filename value - _resultDTO.resourceName = filename; - - // get folder contents - var callback:Function = Proxy.create(this,receivedFolderContents); - _workspaceModel.getWorkspace().requestFolderContents(snode.attributes.data.resourceID, callback); - - if(_workspaceModel.currentMode == Workspace.MODE_SAVE || _workspaceModel.currentMode == Workspace.MODE_SAVEAS){ - return false; - } else { - return true; - } - } - } - - - public function receivedFolderContents(dto:Object){ - _workspaceModel.setFolderContents(dto, false); - _workspaceController = _workspaceView.getController(); - if(_workspaceModel.getWorkspaceResource('Folder_'+dto.workspaceFolderID)!=null){ - if(_workspaceModel.currentMode == Workspace.MODE_SAVE || _workspaceModel.currentMode == Workspace.MODE_SAVEAS){ - if(searchForFile(_workspaceModel.getWorkspaceResource('Folder_'+dto.workspaceFolderID), _resultDTO.resourceName)){ - ok_btn.enabled = true; - //run a alert dialogue as user is using the same name as an existing design! - LFMessage.showMessageAlert(Dictionary.getValue('ws_chk_overwrite_existing', [_resultDTO.resourceName]), null); - _workspaceController.clearBusy() - } - } else { - if(!searchForFile(_workspaceModel.getWorkspaceResource('Folder_'+dto.workspaceFolderID), _resultDTO.resourceName)){ - _workspaceController.clearBusy() - } - } - } - } - - /** - * Check if the folder node against a resource ID - * - * @usage - * @param snode - * @param resourceID - * @return - */ - private function isVirtualFolder(folder:XMLNode){ - return folder.attributes.data.resourceID < 0; - } - - /** - * Dispatches an event - picked up by the canvas in authoring - * sends paramter containing: - * _resultDTO.selectedResourceID - * _resultDTO.targetWorkspaceFolderID - * _resultDTO.resourceName - _resultDTO.resourceDescription - _resultDTO.resourceLicenseText - _resultDTO.resourceLicenseID - * @usage - * @param useResourceID //if its true then we will send the resorceID of teh item selected in the tree - usually this means we are overwriting something - * @return - */ - public function doWorkspaceDispatch(useResourceID:Boolean, snode:XMLNode){ - //ObjectUtils.printObject(); - var _snode = snode; - if(_snode == null) { - _snode = treeview.selectedNode; // item selected in tree - } - - if(_snode == null){ - // set to file item found in search - _snode = _resultDTO.file; - } - - if(useResourceID){ - //its an LD - _resultDTO.selectedResourceID = Number(_snode.attributes.data.resourceID); - _resultDTO.targetWorkspaceFolderID = Number(_snode.attributes.data.workspaceFolderID); - }else{ - //its a folder - _resultDTO.selectedResourceID = null; - _resultDTO.targetWorkspaceFolderID = Number(_snode.attributes.data.resourceID); - - } - - Debugger.log("SNode: " + _snode.attributes.data.name + ", Target WorkspceFolder ID: " + _resultDTO.targetWorkspaceFolderID + " , useResourceID: " + useResourceID + " , selectedResourceID: " + _resultDTO.selectedResourceID, Debugger.CRITICAL, "doWorkspaceDispatch", "WorkspaceDialog"); - _resultDTO.resourceName = resourceTitle_txi.text; - _resultDTO.resourceDescription = resourceDesc_txa.text; - _resultDTO.resourceLicenseText = license_txa.text; - _resultDTO.resourceLicenseID = licenseID_cmb.value.licenseID; - - dispatchEvent({type:'okClicked',target:this}); - _workspaceController.clearBusy(); - } - - public function closeThisDialogue(){ - close(); - } - - /** - * Called when the tabs are clicked - * @usage - * @param e - * @return - */ - private function switchTab(e){ - Debugger.log('Switch tab called!',Debugger.GEN,'switchTab','org.lamsfoundation.lams.common.ws.WorkspaceDialog'); - if(e.newIndex == 0){ - dispatchEvent({type:'locationTabClick',target:this}); - }else if(e.newIndex ==1){ - dispatchEvent({type:'propertiesTabClick',target:this}); - } - } - - /** - * Event dispatched by parent container when close button clicked - */ - private function click(e:Object){ - close(e.target); - } - - private function close(container:Object){ - // restore learningDesignID - var ddm:DesignDataModel = Application.getInstance().getCanvas().ddm; - - if(ddm.prevLearningDesignID != null) { - ddm.learningDesignID = ddm.prevLearningDesignID; - ddm.prevLearningDesignID = null; - } - - workspaceView.isOpen = false; - - //close parent window - if(container != null) { container.deletePopUp(); } - else { _container.deletePopUp(); } - } - - /** - * Recursive function to set any folder with children to be a branch - * TODO: Might / will have to change this behaviour once designs are being returned into the mix - * @usage - * @param node - * @return - */ - private function setBranches(node:XMLNode){ - if(node.hasChildNodes() || node.attributes.isBranch){ - treeview.setIsBranch(node, true); - for (var i = 0; i:" + license_lbl.text = Dictionary.getValue('ws_license_lbl'); + license_comment_lbl.text = Dictionary.getValue('ws_license_comment_lbl'); + + name_lbl.text = Dictionary.getValue('ws_dlg_filename'); + description_lbl.text = Dictionary.getValue('ws_dlg_description'); + dateModified_lbl._visible = false; + authorOwner_lbl._visible = false; + originalAuthor_lbl._visible = false; + + //Set the text for buttons + ok_btn.label = Dictionary.getValue('ws_dlg_ok_button'); + cancel_btn.label = Dictionary.getValue('ws_dlg_cancel_button'); + viewLicense_btn.label = Dictionary.getValue('ws_view_license_button'); + + new_btn.label = Dictionary.getValue('new_btn'); + copy_btn.label = Dictionary.getValue('copy_btn'); + paste_btn.label = Dictionary.getValue('paste_btn'); + delete_btn.label = Dictionary.getValue('delete_btn'); + rename_btn.label = Dictionary.getValue('rename_btn'); + //TODO: Dictionary calls for all the rest of the buttons + + //get focus manager + set focus to OK button, focus manager is available to all components through getFocusManager + fm = _container.getFocusManager(); + fm.enabled = true; + ok_btn.setFocus(); + //fm.defaultPushButton = ok_btn; + + Debugger.log('ok_btn.tabIndex: '+ok_btn.tabIndex,Debugger.GEN,'init','org.lamsfoundation.lams.WorkspaceDialog'); + + + //Tie parent click event (generated on clicking close button) to this instance + _container.addEventListener('click',this); + //Register for LFWindow size events + _container.addEventListener('size',this); + + //panel.setStyle('backgroundColor',0xFFFFFF); + + //Debugger.log('setting offsets',Debugger.GEN,'init','org.lamsfoundation.lams.common.ws.WorkspaceDialog'); + + //work out offsets from bottom RHS of panel + xOkOffset = panel._width - ok_btn._x; + yOkOffset = panel._height - ok_btn._y; + xCancelOffset = panel._width - cancel_btn._x; + yCancelOffset = panel._height - cancel_btn._y; + + //Register as listener with StyleManager and set Styles + themeManager.addEventListener('themeChanged', this); + + treeview = location_dnd.getTree(); + //Fire contentLoaded event, this is required by all dialogs so that creator of LFWindow can know content loaded + resourceTitle_txi.setFocus(); + _container.contentLoaded(); + this.tabChildren = true; + Cursor.showCursor(ApplicationParent.C_DEFAULT); + setTabIndex(); + //removeProps(_workspaceView.getModel(). + } + + /** + * Called by the worspaceView after the content has loaded + * @usage + * @return + */ + public function setUpContent():Void{ + + //register to recive updates form the model + WorkspaceModel(_workspaceView.getModel()).addEventListener('viewUpdate',this); + + Debugger.log('_workspaceView:'+_workspaceView,Debugger.GEN,'setUpContent','org.lamsfoundation.lams.common.ws.WorkspaceDialog'); + + //get a ref to the controller and kkep it here to listen for events: + _workspaceController = _workspaceView.getController(); + Debugger.log('_workspaceController:'+_workspaceController,Debugger.GEN,'setUpContent','org.lamsfoundation.lams.common.ws.WorkspaceDialog'); + removeProps(_workspaceController.getWSModel()) + + //Add event listeners for ok, cancel and close buttons + ok_btn.addEventListener('click',Delegate.create(this, ok)); + cancel_btn.addEventListener('click',Delegate.create(this, cancel)); + switchView_tab.addEventListener("change",Delegate.create(this, switchTab)); + + //think this is failing.... + switchView_tab.setSelectedIndex(0); + + new_btn.addEventListener('click',Delegate.create(_workspaceController, _workspaceController.fileOperationRequest)); + copy_btn.addEventListener('click',Delegate.create(_workspaceController, _workspaceController.fileOperationRequest)); + paste_btn.addEventListener('click',Delegate.create(_workspaceController, _workspaceController.fileOperationRequest)); + delete_btn.addEventListener('click',Delegate.create(_workspaceController, _workspaceController.fileOperationRequest)); + rename_btn.addEventListener('click',Delegate.create(_workspaceController, _workspaceController.fileOperationRequest)); + + viewLicense_btn.addEventListener('click',Delegate.create(this, openLicenseURL)); + licenseID_cmb.addEventListener('change',Delegate.create(this, onLicenseComboSelect)); + + //Set up the treeview + setUpTreeview(); + + itemSelected(treeview.selectedNode); + + } + + + /** + * Recieved update events from the WorkspaceModel. Dispatches to relevent handler depending on update.Type + * @usage + * @param event + */ + public function viewUpdate(event:Object):Void{ + Debugger.log('Received an Event dispatcher UPDATE!, updateType:'+event.updateType+', target'+event.target,4,'viewUpdate','org.lamsfoundation.lams.ws.WorkspaceDialog'); + //Update view from info object + var wm:WorkspaceModel = event.target; + //set a permenent ref to the model for ease (sorry mvc guru) + _workspaceModel = wm; + + switch (event.updateType){ + case 'POPULATE_LICENSE_DETAILS' : + populateAvailableLicenses(event.data, wm); + break; + case 'REFRESH_TREE' : + refreshTree(wm); + break; + case 'UPDATE_CHILD_FOLDER' : + updateChildFolderBranches(event.data,wm); + openFolder(event.data, wm); + break; + case 'UPDATE_CHILD_FOLDER_NOOPEN' : + updateChildFolderBranches(event.data,wm); + break; + case 'ITEM_SELECTED' : + itemSelected(event.data,wm); + break; + case 'OPEN_FOLDER' : + openFolder(event.data, wm, false); + break; + case 'CLOSE_FOLDER' : + closeFolder(event.data, wm); + break; + case 'REFRESH_FOLDER' : + refreshFolder(event.data, wm); + break; + case 'SHOW_TAB' : + showTab(event.data, wm); + break; + case 'UPDATED_PROP_DETAILS' : + populatePropDetails(event.data, wm); + break; + case 'SET_UP_BRANCHES_INIT' : + setUpBranchesInit(); + break; + + default : + Debugger.log('unknown update type :' + event.updateType,Debugger.GEN,'viewUpdate','org.lamsfoundation.lams.ws.WorkspaceDialog'); + } + + } + + + + /** + * called witht he result when a child folder is opened.. + * updates the tree branch satus, then refreshes. + * @usage + * @param changedNode + * @param wm + * @return + */ + private function updateChildFolderBranches(changedNode:XMLNode,wm:WorkspaceModel){ + Debugger.log('updateChildFolder....:' ,Debugger.GEN,'updateChildFolder','org.lamsfoundation.lams.ws.WorkspaceDialog'); + //we have to set the new nodes to be branches, if they are branches + if(changedNode.attributes.isBranch){ + treeview.setIsBranch(changedNode,true); + //do its kids + for(var i=0; i 0){ + for(var i=0; i 0){ + + for(var i=0; i + * _resultDTO.selectedResourceID //The ID of the resource that was selected when the dialogue closed + * _resultDTO.resourceName //The contents of the Name text field + * _resultDTO.resourceDescription //The contents of the description field on the propertirs tab + * _resultDTO.resourceLicenseText //The contents of the license text field + * _resultDTO.resourceLicenseID //The ID of the selected license from the drop down. + * + */ + private function ok(){ + _global.breakpoint(); + _workspaceController = _workspaceView.getController(); + _workspaceController.setBusy() + + //TODO: Validate you are allowed to use the name etc... Are you overwriting - NOTE Same names are nto allowed in this version + + var snode = treeview.selectedNode; + + if(isVirtualFolder(snode)){ + _workspaceController.clearBusy(); + return; + } + + Debugger.log('_workspaceModel.currentMode: ' + _workspaceModel.currentMode,Debugger.GEN,'ok','org.lamsfoundation.lams.WorkspaceDialog'); + var tempTitle = StringUtils.replace(resourceTitle_txi.text, " ", ""); + if(_workspaceModel.currentMode==Workspace.MODE_SAVE || _workspaceModel.currentMode==Workspace.MODE_SAVEAS){ + if (tempTitle == "" || tempTitle == undefined){ + Cursor.showCursor(ApplicationParent.C_DEFAULT); + + var sendMsg:String = Dictionary.getValue('ws_file_name_empty')+"\n"+Dictionary.getValue('ws_entre_file_name')+"\n\n"; + LFMessage.showMessageAlert(sendMsg,null); + _workspaceController.clearBusy(); + resourceTitle_txi.setFocus(); + }else{ + Cursor.showCursor(ApplicationParent.C_HOURGLASS); + saveFile(snode); + } + } else { + openFile(snode); + } + } + + /** + * Open file from Workspace + * + * @param snode file to open or folder to open from + */ + + private function openFile(snode:XMLNode):Void{ + Debugger.log('Opening a file.',Debugger.GEN,'openFile','org.lamsfoundation.lams.WorkspaceDialog'); + _workspaceController = _workspaceView.getController(); + + if (snode.attributes.data.resourceType==_workspaceModel.RT_FOLDER){ + if(resourceTitle_txi.text == null){ + } else { + if(!searchForFile(snode, resourceTitle_txi.text)){ + _workspaceController.clearBusy() + } + } + } else { + doWorkspaceDispatch(true); + } + } + + /** + * Save file to Workspace + * + * @param snode folder to save to + */ + private function saveFile(snode:XMLNode):Void{ + Debugger.log('Saving a file.',Debugger.GEN,'saveFile','org.lamsfoundation.lams.WorkspaceDialog'); + ok_btn.enabled = false; + + var snodeData = treeview.selectedNode.attributes.data; + var isWritable:Boolean = _workspaceModel.isWritableResource(snodeData.resourceType,snodeData.resourceID); + + Debugger.log("isWritable: "+isWritable, Debugger.CRITICAL, "saveFile", "WorkspaceDialog"); + _workspaceController = _workspaceView.getController(); + + if(StringUtils.containsReservedChar(resourceTitle_txi.text)) { + LFMessage.showMessageAlert(Dictionary.getValue('ws_save_title_reserved_chars', [StringUtils.reserved_str]), null); + ok_btn.enabled = true; + Cursor.showCursor(ApplicationParent.C_DEFAULT); + return; + } + + if(snode == treeview.dataProvider.firstChild){ + LFMessage.showMessageAlert(Dictionary.getValue('ws_save_folder_invalid'),null); + ok_btn.enabled = true; + } else if(snode.attributes.data.resourceType==_workspaceModel.RT_LD){ + + if(snode.parentNode != null) { + + if(searchForFile(snode.parentNode, resourceTitle_txi.text, true)) { + + if(isWritable) { + //run a confirm dialogue as user is about to overwrite a design! + LFMessage.showMessageConfirm(Dictionary.getValue('ws_chk_overwrite_resource'), Proxy.create(this,doWorkspaceDispatch,true), Proxy.create(this, enable_ok, true)); + _workspaceController.clearBusy(); + } + else { // don't have permission, file is read-only + ok_btn.enabled = true; + LFMessage.showMessageAlert(Dictionary.getValue('ws_no_permission'),null,null) + } + } + } + + } else if(snode.attributes.data.resourceType==_workspaceModel.RT_FOLDER){ + + if(snode.attributes.data.resourceID < 0){ + ok_btn.enabled = true; + LFMessage.showMessageAlert(Dictionary.getValue('ws_save_folder_invalid'),null); + _workspaceController.clearBusy(); + } else if (!isWritable) { + ok_btn.enabled = true; + LFMessage.showMessageAlert(Dictionary.getValue('ws_no_permission'),null,null); + } else if(searchForFile(snode, resourceTitle_txi.text)){ + //run a alert dialogue as user is using the same name as an existing design! + ok_btn.enabled = true; + LFMessage.showMessageAlert(Dictionary.getValue('ws_chk_overwrite_existing', [resourceTitle_txi.text]), null); + _workspaceController.clearBusy(); + } + } else { + LFMessage.showMessageAlert(Dictionary.getValue('ws_click_folder_file'),null); + _workspaceController.clearBusy(); + ok_btn.enabled = true; + } + + Cursor.showCursor(ApplicationParent.C_DEFAULT); + } + + private function enable_ok(e:Boolean) { + ok_btn.enabled = e; + } + + private function searchForFile(snode:XMLNode, filename:String, isParentNode:Boolean){ + + var _isParentNode:Boolean = isParentNode; + + if(_isParentNode == null) { + _isParentNode = false; + } + + Debugger.log('Searching for file (' + snode.childNodes.length + '): ' + filename,Debugger.GEN,'openFile','org.lamsfoundation.lams.WorkspaceDialog'); + var cnode:XMLNode; + + if(snode.hasChildNodes() || snode.attributes.isEmpty){ + + cnode = snode.firstChild; + do { + Debugger.log('matching file: ' + cnode.attributes.data.name + ' to: ' + filename,Debugger.GEN,'openFile','org.lamsfoundation.lams.WorkspaceDialog'); + + // look for matching Learning Design file in the folder + var _filename:String = cnode.attributes.data.name; + var _filetype:String = cnode.attributes.data.resourceType; + if(_filename == filename && _filetype == _workspaceModel.RT_LD){ + if(_workspaceModel.currentMode == Workspace.MODE_OPEN){ + treeview.selectedNode = null; + _resultDTO.file = cnode; + doWorkspaceDispatch(true); + } + + return true; + } + + cnode = cnode.nextSibling; + + } while(cnode != null); + + if(_workspaceModel.currentMode == Workspace.MODE_SAVE || _workspaceModel.currentMode == Workspace.MODE_SAVEAS){ + if(!_isParentNode) + doWorkspaceDispatch(false); + else + doWorkspaceDispatch(false, snode) + } + return false; + + } else { + // save filename value + _resultDTO.resourceName = filename; + + // get folder contents + var callback:Function = Proxy.create(this,receivedFolderContents); + _workspaceModel.getWorkspace().requestFolderContents(snode.attributes.data.resourceID, callback); + + if(_workspaceModel.currentMode == Workspace.MODE_SAVE || _workspaceModel.currentMode == Workspace.MODE_SAVEAS){ + return false; + } else { + return true; + } + } + } + + + public function receivedFolderContents(dto:Object){ + _workspaceModel.setFolderContents(dto, false); + _workspaceController = _workspaceView.getController(); + if(_workspaceModel.getWorkspaceResource('Folder_'+dto.workspaceFolderID)!=null){ + if(_workspaceModel.currentMode == Workspace.MODE_SAVE || _workspaceModel.currentMode == Workspace.MODE_SAVEAS){ + if(searchForFile(_workspaceModel.getWorkspaceResource('Folder_'+dto.workspaceFolderID), _resultDTO.resourceName)){ + ok_btn.enabled = true; + //run a alert dialogue as user is using the same name as an existing design! + LFMessage.showMessageAlert(Dictionary.getValue('ws_chk_overwrite_existing', [_resultDTO.resourceName]), null); + _workspaceController.clearBusy() + } + } else { + if(!searchForFile(_workspaceModel.getWorkspaceResource('Folder_'+dto.workspaceFolderID), _resultDTO.resourceName)){ + _workspaceController.clearBusy() + } + } + } + } + + /** + * Check if the folder node against a resource ID + * + * @usage + * @param snode + * @param resourceID + * @return + */ + private function isVirtualFolder(folder:XMLNode){ + return folder.attributes.data.resourceID < 0; + } + + /** + * Dispatches an event - picked up by the canvas in authoring + * sends paramter containing: + * _resultDTO.selectedResourceID + * _resultDTO.targetWorkspaceFolderID + * _resultDTO.resourceName + _resultDTO.resourceDescription + _resultDTO.resourceLicenseText + _resultDTO.resourceLicenseID + * @usage + * @param useResourceID //if its true then we will send the resorceID of teh item selected in the tree - usually this means we are overwriting something + * @return + */ + public function doWorkspaceDispatch(useResourceID:Boolean, snode:XMLNode){ + //ObjectUtils.printObject(); + var _snode = snode; + if(_snode == null) { + _snode = treeview.selectedNode; // item selected in tree + } + + if(_snode == null){ + // set to file item found in search + _snode = _resultDTO.file; + } + + if(useResourceID){ + //its an LD + _resultDTO.selectedResourceID = Number(_snode.attributes.data.resourceID); + _resultDTO.targetWorkspaceFolderID = Number(_snode.attributes.data.workspaceFolderID); + }else{ + //its a folder + _resultDTO.selectedResourceID = null; + _resultDTO.targetWorkspaceFolderID = Number(_snode.attributes.data.resourceID); + + } + + Debugger.log("SNode: " + _snode.attributes.data.name + ", Target WorkspceFolder ID: " + _resultDTO.targetWorkspaceFolderID + " , useResourceID: " + useResourceID + " , selectedResourceID: " + _resultDTO.selectedResourceID, Debugger.CRITICAL, "doWorkspaceDispatch", "WorkspaceDialog"); + _resultDTO.resourceName = resourceTitle_txi.text; + _resultDTO.resourceDescription = resourceDesc_txa.text; + _resultDTO.resourceLicenseText = license_txa.text; + _resultDTO.resourceLicenseID = licenseID_cmb.value.licenseID; + + dispatchEvent({type:'okClicked',target:this}); + _workspaceController.clearBusy(); + } + + public function closeThisDialogue(){ + close(); + } + + /** + * Called when the tabs are clicked + * @usage + * @param e + * @return + */ + private function switchTab(e){ + Debugger.log('Switch tab called!',Debugger.GEN,'switchTab','org.lamsfoundation.lams.common.ws.WorkspaceDialog'); + if(e.newIndex == 0){ + dispatchEvent({type:'locationTabClick',target:this}); + }else if(e.newIndex ==1){ + dispatchEvent({type:'propertiesTabClick',target:this}); + } + } + + /** + * Event dispatched by parent container when close button clicked + */ + private function click(e:Object){ + close(e.target); + } + + private function close(container:Object){ + // restore learningDesignID + var ddm:DesignDataModel = Application.getInstance().getCanvas().ddm; + + if(ddm.prevLearningDesignID != null) { + ddm.learningDesignID = ddm.prevLearningDesignID; + ddm.prevLearningDesignID = null; + } + + workspaceView.isOpen = false; + + //close parent window + if(container != null) { container.deletePopUp(); } + else { _container.deletePopUp(); } + } + + /** + * Recursive function to set any folder with children to be a branch + * TODO: Might / will have to change this behaviour once designs are being returned into the mix + * @usage + * @param node + * @return + */ + private function setBranches(node:XMLNode){ + if(node.hasChildNodes() || node.attributes.isBranch){ + treeview.setIsBranch(node, true); + for (var i = 0; i