Index: lams_common/src/flash/org/lamsfoundation/lams/common/ws/Workspace.as =================================================================== diff -u -rc878e57661279a89f0195eb9fa58f5fb9b8e77bf -r3d826230b52cc8057e353796c9d9e18ce742793e --- lams_common/src/flash/org/lamsfoundation/lams/common/ws/Workspace.as (.../Workspace.as) (revision c878e57661279a89f0195eb9fa58f5fb9b8e77bf) +++ lams_common/src/flash/org/lamsfoundation/lams/common/ws/Workspace.as (.../Workspace.as) (revision 3d826230b52cc8057e353796c9d9e18ce742793e) @@ -67,6 +67,13 @@ } + /** + * Called when the user opens a node and we dont already have the children in the cache. + * either becasue never opened beofre or becasuse the cache was cleared for that folder + * @usage + * @param folderID + * @return + */ public function requestFolderContents(folderID:Number):Void{ var callback:Function = Proxy.create(this,recievedFolderContents); var uid:Number = Config.getInstance().userID; @@ -75,6 +82,12 @@ } + /** + * Response handler for requestFolderContents + * @usage + * @param dto The WDDX object containing the children of this folder + * @return + */ public function recievedFolderContents(dto:Object):Void{ workspaceModel.setFolderContents(dto); @@ -98,6 +111,13 @@ //http://localhost:8080/lams/workspace.do?method=copyResource&resourceID=10&targetFolderID=6&resourceType=FOLDER&userID=4 } + /** + * Handler for most of the workspace file operations, it just invalidates the cache from the folderID pending refresh + * and sends an open event to the dialog + * @usage + * @param dto + * @return + */ public function generalWorkspaceOperationResponseHandler(dto:Object){ if(dto instanceof LFError){ dto.showErrorAlert(); @@ -121,49 +141,22 @@ Application.getInstance().getComms().getRequest('workspace.do?method=deleteResource&resourceID='+resourceID+'&resourceType='+resourceType+'&userID='+uid,callback, false); } - /* - public function deleteResourceResponse(dto:Object){ - if(dto instanceof LFError){ - dto.showErrorAlert(); - } - workspaceModel.clearWorkspaceCache(workspaceModel.folderIDPendingRefresh); - //now open this node in the tree - workspaceModel.autoOpenFolderInTree(workspaceModel.folderIDPendingRefresh); - } - */ + public function requestNewFolder(parentFolderID:Number,folderName:String){ Debugger.log('parentFolderID:'+parentFolderID+', folderName'+folderName,Debugger.GEN,'requestNewFolder','Workspace'); var callback:Function = Proxy.create(this,generalWorkspaceOperationResponseHandler); var uid:Number = Config.getInstance().userID; Application.getInstance().getComms().getRequest('workspace.do?method=createFolderForFlash&parentFolderID='+parentFolderID+'&name='+folderName+'&userID='+uid,callback, false); } - /* - public function requestNewFolderResponse(dto:Object){ - if(dto instanceof LFError){ - dto.showErrorAlert(); - } - workspaceModel.clearWorkspaceCache(workspaceModel.folderIDPendingRefresh); - //now open this node in the tree - workspaceModel.autoOpenFolderInTree(workspaceModel.folderIDPendingRefresh); - } - */ + public function requestRenameResource(resourceID:Number,resourceType:Number,newName:String){ Debugger.log('resourceID:'+resourceID+', resourceType'+resourceType+', newName:'+newName,Debugger.GEN,'requestRenameResource','Workspace'); var callback:Function = Proxy.create(this,generalWorkspaceOperationResponseHandler); var uid:Number = Config.getInstance().userID; Application.getInstance().getComms().getRequest('workspace.do?method=renameResource&resourceID='+resourceID+'&resourceType='+resourceType+'&name='+newName+'&userID='+uid,callback, false); } - /* - public function requestRenameResourceResponse(dto){ - if(dto instanceof LFError){ - dto.showErrorAlert(); - } - workspaceModel.clearWorkspaceCache(workspaceModel.folderIDPendingRefresh); - //now open this node in the tree - workspaceModel.autoOpenFolderInTree(workspaceModel.folderIDPendingRefresh); - } - */ + public function requestMoveResource(resourceID:Number, targetFolderID:Number, resourceType:String){ Debugger.log('resourceID:'+resourceID+', resourceType'+resourceType+', targetFolderID:'+targetFolderID,Debugger.GEN,'requestMoveResource','Workspace'); var callback:Function = Proxy.create(this,requestMoveResourceResponse); @@ -187,6 +180,8 @@ PRIVATE The folder which belongs to the given User RUN_SEQUENCES The folder in which user stores his lessons ORGANISATIONS List of folders (root folder only) which belong to organizations of which user is a member + + NB THis dunction is not used in the new folder structure private function requestWorkspaceFolders():Void{ var callback:Function = Proxy.create(this,recievedWorkspaceFolders); @@ -202,21 +197,32 @@ } */ + /** + * Gets a list of available licenses to apply to the designs. Mostly they are creative commons licenses + * @usage + * @return + */ public function requestAvailableLicenses(){ var callback:Function = Proxy.create(this,recievedAvailableLicenses); var uid:Number = Config.getInstance().userID; Application.getInstance().getComms().getRequest('authoring/author.do?method=getAvailableLicenses',callback, false); } + /** + * The handler for requestAvailableLicenses + * @usage +` * @param dto An array contaning objects of each of the licenses. Each one has a url, an id, a code and a imageURL, see the model for more description + * @return + */ public function recievedAvailableLicenses(dto:Array){ workspaceModel.setAvailableLicenses(dto); } - - /** - * This is the method called when the user opens a design + /** + * Shows the workspace browsing dialoge to open a design + * Usually used by the canvas. * */ public function userSelectItem(callback){ @@ -248,8 +254,6 @@ public function itemSelected(designId:Number){ Debugger.log('!!designID:'+designId,Debugger.GEN,'itemSelected','org.lamsfoundation.lams.Workspace'); _onOKCallBack(designId); - //Design has been chosen, get Canvas to open design - //Application.getInstance().getCanvas().openDesignById(designId); } public function getDefaultWorkspaceID():Number{ Index: lams_common/src/flash/org/lamsfoundation/lams/common/ws/WorkspaceController.as =================================================================== diff -u -rc878e57661279a89f0195eb9fa58f5fb9b8e77bf -r3d826230b52cc8057e353796c9d9e18ce742793e --- lams_common/src/flash/org/lamsfoundation/lams/common/ws/WorkspaceController.as (.../WorkspaceController.as) (revision c878e57661279a89f0195eb9fa58f5fb9b8e77bf) +++ lams_common/src/flash/org/lamsfoundation/lams/common/ws/WorkspaceController.as (.../WorkspaceController.as) (revision 3d826230b52cc8057e353796c9d9e18ce742793e) @@ -42,30 +42,23 @@ evt.target.scrollContent.addEventListener('okClicked',Delegate.create(this,okClicked)); evt.target.scrollContent.addEventListener('locationTabClick',Delegate.create(this,locationTabClick)); evt.target.scrollContent.addEventListener('propertiesTabClick',Delegate.create(this,propertiesTabClick)); - //evt.target.scrollContent.addEventListener('click',Delegate.create(this,click)); - - - + //set a ref to the view evt.target.scrollContent.workspaceView = getView(); //set a ref to the dia in the view getView().workspaceDialogue = evt.target.scrollContent; - - //set up UI //note this function registeres the dialog to recieve view updates - evt.target.scrollContent.setUpContent(); - + evt.target.scrollContent.setUpContent(); //populate the licenses drop down - _workspaceModel.populateLicenseDetails(); - + _workspaceModel.populateLicenseDetails(); //select the right tab, dont pass anything to show the default tab _workspaceModel.showTab(_workspaceModel.currentTab); }else { //TODO DI 25/05/05 raise wrong event type error } } - /**/ + private function locationTabClick(evt:Object) { Debugger.log('locationTabClick:'+evt.type,Debugger.GEN,'locationTabClick','org.lamsfoundation.lams.WorkspaceController'); _workspaceModel.showTab("LOCATION"); @@ -84,11 +77,7 @@ //Check type is correct if(evt.type == 'okClicked'){ //Call the callback, passing in the design selected designId - _global.breakpoint(); - //okClickedCallback(evt.target.selectedDesignId); - //_workspaceModel.getWorkspace().itemSelected(evt.target.selectedDesignId); - //_workspaceModel.getWorkspace().onOKCallback(evt.target.selectedDesignId); - + //invalidate the cache of folders _workspaceModel.clearWorkspaceCache(evt.target.resultDTO.targetWorkspaceFolderID); @@ -99,7 +88,7 @@ } } - /** + /** * Workspace dialog OK button clicked handler */ private function clickFromDialog(evt:Object) { @@ -119,24 +108,14 @@ //data has already been got, nothing to do if(!nodeToOpen.hasChildNodes()){ - - - //if the resourceID is null then use the folderID - //var resourceToOpen = (nodeToOpen.attributes.data.resourceID) ? nodeToOpen.attributes.data.resourceID : nodeToOpen.attributes.data.workspaceFolderID; - // DC24-01-06 this resource ID must refer to a folder as its been marked as a branch var resourceToOpen = nodeToOpen.attributes.data.resourceID; - - - //TODO: I think it must be a folder ID, depoends if this event is fired for an "open" reousrce click + //must be a folder ID, depoends if this event is fired for an "open" reousrce click _workspaceModel.openFolderInTree(resourceToOpen); - }else{ Debugger.log('nodeToOpen already has children in cache',Debugger.GEN,'onTreeNodeOpen','org.lamsfoundation.lams.WorkspaceController'); } - - } /** @@ -145,20 +124,12 @@ public function onTreeNodeClose (evt:Object){ Debugger.log('type::'+evt.type,Debugger.GEN,'onTreeNodeClose','org.lamsfoundation.lams.WorkspaceController'); var treeview = evt.target; - - - - - } public function onTreeNodeChange (evt:Object){ Debugger.log('type::'+evt.type,Debugger.GEN,'onTreeNodeChange','org.lamsfoundation.lams.WorkspaceController'); var treeview = evt.target; _workspaceModel.setSelectedTreeNode(treeview.selectedNode); - - - } /** @@ -186,32 +157,22 @@ }else{ targetFolderID= targetNodeData.workspaceFolderID; } - //check the permission code for that folder var isWritable = _workspaceModel.isWritableResource(_workspaceModel.RT_FOLDER,targetFolderID); - - - var sourceFolderID:Number; if(sourceNodeData.resourceType == _workspaceModel.RT_FOLDER){ sourceFolderID= sourceNodeData.resourceID; }else{ sourceFolderID= sourceNodeData.workspaceFolderID; } - //must clear the entire cache as both the source and target folders need to be refreshed _workspaceModel.folderIDPendingRefresh = null; _workspaceModel.folderIDPendingRefreshList = new Array(targetFolderID,sourceFolderID); + //Debugger.log('SourceNode:\n'+ObjectUtils.toString(sourceNodeData),Debugger.GEN,'onDragComplete','org.lamsfoundation.lams.WorkspaceController'); + //Debugger.log('TargetNode:\n'+ObjectUtils.toString(targetNodeData),Debugger.GEN,'onDragComplete','org.lamsfoundation.lams.WorkspaceController'); - Debugger.log('SourceNode:\n'+ObjectUtils.toString(sourceNodeData),Debugger.GEN,'onDragComplete','org.lamsfoundation.lams.WorkspaceController'); - - Debugger.log('TargetNode:\n'+ObjectUtils.toString(targetNodeData),Debugger.GEN,'onDragComplete','org.lamsfoundation.lams.WorkspaceController'); - - - - //ok we are going to do a move: if(isWritable){ _workspaceModel.getWorkspace().requestMoveResource(sourceNodeData.resourceID, targetFolderID, sourceNodeData.resourceType); @@ -333,8 +294,7 @@ }else{ LFMessage.showMessageAlert(Dictionary.getValue('ws_no_permission'),null,null); } - - + }else{ //nothing to rename } @@ -348,6 +308,12 @@ } + /** + * Called when the user finishes the editing the name in the pop up dialog + * @usage + * @param newName + * @return + */ public function setNewResourceName(newName:String){ Debugger.log('newName:'+newName,Debugger.GEN,'setNewResourceName','org.lamsfoundation.lams.WorkspaceController'); var workspaceDialogue = getView().workspaceDialogue; @@ -356,6 +322,12 @@ _workspaceModel.getWorkspace().requestRenameResource(snodeData.resourceID,snodeData.resourceType,newName); } + /** + * Called when the user finishes the editing the name in the pop up dialog + * @usage + * @param newName + * @return + */ public function setNewFolderName(newName:String){ Debugger.log('newName:'+newName,Debugger.GEN,'setNewFolderName','org.lamsfoundation.lams.WorkspaceController'); var workspaceDialogue = getView().workspaceDialogue; @@ -380,29 +352,4 @@ return WorkspaceView(v); } - - /** - * Treeview data changed event handler - - private function onTvChange (event:Object){ - if (treeview == event.target) { - var node = treeview.selectedItem; - - // If this is a branch, expand/collapse it - if (treeview.getIsBranch(node)) { - treeview.setIsOpen(node, !treeview.getIsOpen(node), true); - } - - // If this is a hyperlink, jump to it - var url = node.attributes.url; - if (url) { - getURL(url, "_top"); - } - - // Clear any selection - treeview.selectedNode = null; - } - } - - */ } Index: lams_common/src/flash/org/lamsfoundation/lams/common/ws/WorkspaceDialog.as =================================================================== diff -u -rc878e57661279a89f0195eb9fa58f5fb9b8e77bf -r3d826230b52cc8057e353796c9d9e18ce742793e --- lams_common/src/flash/org/lamsfoundation/lams/common/ws/WorkspaceDialog.as (.../WorkspaceDialog.as) (revision c878e57661279a89f0195eb9fa58f5fb9b8e77bf) +++ lams_common/src/flash/org/lamsfoundation/lams/common/ws/WorkspaceDialog.as (.../WorkspaceDialog.as) (revision 3d826230b52cc8057e353796c9d9e18ce742793e) @@ -552,6 +552,19 @@ + /** + * 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){ //ObjectUtils.printObject(); var snode = treeview.selectedNode; @@ -582,12 +595,14 @@ public function closeThisDialogue(){ _container.deletePopUp(); } - - - //TODO: maan must be able to just send a single event type and detect the name od the button - + /** + * 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){ @@ -636,6 +651,11 @@ } + /** + * Sets up the inital branch detials + * @usage + * @return + */ private function setUpBranchesInit(){ Debugger.log('Running...',Debugger.GEN,'setUpBranchesInit','org.lamsfoundation.lams.common.ws.WorkspaceDialog'); //get the 1st child Index: lams_common/src/flash/org/lamsfoundation/lams/common/ws/WorkspaceModel.as =================================================================== diff -u -rc878e57661279a89f0195eb9fa58f5fb9b8e77bf -r3d826230b52cc8057e353796c9d9e18ce742793e --- lams_common/src/flash/org/lamsfoundation/lams/common/ws/WorkspaceModel.as (.../WorkspaceModel.as) (revision c878e57661279a89f0195eb9fa58f5fb9b8e77bf) +++ lams_common/src/flash/org/lamsfoundation/lams/common/ws/WorkspaceModel.as (.../WorkspaceModel.as) (revision 3d826230b52cc8057e353796c9d9e18ce742793e) @@ -106,6 +106,12 @@ } + /** + * Shows one or other of the tabs in the dialog + * @usage + * @param tabToSelect can be either LOCATION or PROPERTIES + * @return + */ public function showTab(tabToSelect:String){ if(tabToSelect == undefined){ tabToSelect = _defaultTab; @@ -125,98 +131,14 @@ dispatchEvent({type:'viewUpdate',target:this,updateType:_updateType,data:_data}); } + + /** - * Converts the de-serialised WDDX XML from an object into - * an xml format the tree likes - * This is parsing data from the call to getAccessibleWOrkspaceFolders, so we know that all the - * elements must be folders, as such we must set isBranch to be true; Also some other minor hacks to make the data match what we get with getFodlerContents() + * Sets up the tree for the 1st time + * Creates the dummy root folder with ID -1 * @usage - * @param dto - contains: - * PRIVATE The folder which belongs to the given User - * RUN_SEQUENCES The folder in which user stores his lessons - * ORGANISATIONS List of folders (root folder only) which belong to organizations of which user is a member + * @return */ - /* - public function parseDataForTree(dto:Object):Void{ - Debugger.log('Running....',Debugger.GEN,'parseDataForTree','org.lamsfoundation.lams.WorkspaceModel'); - - //_global.breakpoint(); - - if(_accessibleWorkspaceFoldersDTOCopy == null){ - //first time in so make a copy - _accessibleWorkspaceFoldersDTOCopy = ObjectCopy.copy(dto); - }else{ - //need to use the copy - dto = _accessibleWorkspaceFoldersDTOCopy; - } - - Debugger.log('_accessibleWorkspaceFoldersDTOCopy:'+ObjectUtils.toString(_accessibleWorkspaceFoldersDTOCopy),Debugger.GEN,'parseDataForTree','org.lamsfoundation.lams.WorkspaceModel'); - Debugger.log('dto:'+ObjectUtils.toString(dto),Debugger.GEN,'parseDataForTree','org.lamsfoundation.lams.WorkspaceModel'); - //this xml will be implementing the TreeDataProvider , see: http://livedocs.macromedia.com/flash/mx2004/main_7_2/wwhelp/wwhimpl/common/html/wwhelp.htm?context=Flash_MX_2004&file=00002902.html - _treeDP = new XML(); - _workspaceResources = new Array(); - //add top level - //create the data obj: - var mdto= {}; - mdto.creationDateTime = new Date(null); - mdto.description = ""; - mdto.lastModifiedDateTime = new Date(null); - mdto.name = Dictionary.getValue('ws_tree_mywsp'); - mdto.parentWorkspaceFolderID = null; - //read only - mdto.permissionCode = 1; - mdto.resourceID = "x1"; - mdto.resourceType = "Folder"; - mdto.workspaceFolderID = null; - - - var rootNode = _treeDP.addTreeNode(mdto.name,mdto); - rootNode.attributes.isBranch = true; - setWorkspaceResource(RT_FOLDER+'_'+mdto.resourceID,rootNode); - - //add org folder container - var fChild:XMLNode = _treeDP.firstChild; - var o_oto = {}; - o_oto.creationDateTime = new Date(null); - o_oto.description = ""; - o_oto.lastModifiedDateTime = new Date(null); - o_oto.name = Dictionary.getValue('ws_tree_orgs'); - o_oto.parentWorkspaceFolderID = null; - //read only - o_oto.permissionCode = 1; - o_oto.resourceID = "x2"; - o_oto.resourceType = "Folder"; - o_oto.workspaceFolderID = "x1"; - var orgNode:XMLNode = fChild.addTreeNode(o_oto.name,o_oto); - orgNode.attributes.isBranch = true; - setWorkspaceResource(RT_FOLDER+'_'+o_oto.resourceID,orgNode); - - for(var i=0;i -1){ - Debugger.log('Found a root/fake node',Debugger.GEN,'clearWorkspaceCache','org.lamsfoundation.lams.WorkspaceModel'); - //need refresh root data as is one of the fake root folders ( root , or orgs) - _folderIDPendingRefreshList = new Array(); - parseDataForTree(_accessibleWorkspaceFoldersDTOCopy); - Debugger.log('Gonna try auto open:'+folderIDPendingRefresh,Debugger.GEN,'clearWorkspaceCache','org.lamsfoundation.lams.WorkspaceModel'); - //setFolderOpen(folderIDPendingRefresh); - broadcastViewUpdate('SET_UP_BRANCHES_INIT',null); - return 'CLEARED_ALL'; - } - */ + }else{ Debugger.log('No Child nodes to delete',Debugger.GEN,'clearWorkspaceCache','org.lamsfoundation.lams.WorkspaceModel'); @@ -399,6 +308,11 @@ } + /** + * If mroe than one fodler is pending refresh - use this and ensure the _folderIDPendingRefreshList is populated + * @usage + * @return + */ public function clearWorkspaceCacheMultiple(){ if(_folderIDPendingRefreshList != null){ for (var i=0;i<_folderIDPendingRefreshList.length;i++){ @@ -417,13 +331,26 @@ } + /** + * Tells the dialog to open a folder, as if the user had expanded the node + * NOTE - this manually generated the onOpen event for the controller + * @usage + * @param folderID The folder to open + * @return + */ public function autoOpenFolderInTree(folderID){ var nodeToOpen:XMLNode = getWorkspaceResource('Folder_'+folderID); Debugger.log('Opening node:'+nodeToOpen,Debugger.GEN,'autoOpenFolderInTree','org.lamsfoundation.lams.WorkspaceModel'); broadcastViewUpdate('REFRESH_FOLDER',nodeToOpen); } + /** + * Opens folder but does not generate the event (therefore does not request the children, currently not used + * @usage + * @param folderID The folder to open + * @return + */ public function setFolderOpen(folderID){ var nodeToOpen:XMLNode = getWorkspaceResource('Folder_'+folderID); Debugger.log('Basic open folder call:'+nodeToOpen,Debugger.GEN,'setFolderOpen','org.lamsfoundation.lams.WorkspaceModel'); @@ -432,24 +359,41 @@ } + /** + * Telkls the dialog that the _availableLicenses array is now full and the combo can be populated + * @usage + * @return + */ public function populateLicenseDetails(){ broadcastViewUpdate('POPULATE_LICENSE_DETAILS',_availableLicenses); } + /** + * Sticks an item on the clipboard + * @usage + * @param item + * @param mode + * @return + */ public function setClipboardItem(item:Object,mode:String){ //mode not used :-) no cut, only copy functionality this time. _clipboardMode = mode; _clipboard = item; } + /** + * retrieves the item from the clipboard + * @usage + * @return + */ public function getClipboardItem():Object{ return _clipboard; } /** - * Checks to see if the user can wrote to this resource + * Checks to see if the user can write to this resource * If the resource is a folder, then can we write inside it * If the resource is a file/Design then can we overwrite it. * @usage Index: lams_common/src/flash/org/lamsfoundation/lams/common/ws/WorkspaceView.as =================================================================== diff -u -rf2b2b6d0f80bd82c2403170937a3f1dea0924c52 -r3d826230b52cc8057e353796c9d9e18ce742793e --- lams_common/src/flash/org/lamsfoundation/lams/common/ws/WorkspaceView.as (.../WorkspaceView.as) (revision f2b2b6d0f80bd82c2403170937a3f1dea0924c52) +++ lams_common/src/flash/org/lamsfoundation/lams/common/ws/WorkspaceView.as (.../WorkspaceView.as) (revision 3d826230b52cc8057e353796c9d9e18ce742793e) @@ -28,8 +28,7 @@ // This view has no user inputs, so no controller is required. super (m, c); //register to recive updates form the model - WorkspaceModel(m).addEventListener('viewUpdate',this); - //_workspaceController = getController(); + WorkspaceModel(m).addEventListener('viewUpdate',this); } /**