Index: lams_common/src/flash/org/lamsfoundation/lams/common/ws/Workspace.as =================================================================== diff -u -rab7a8155c86c7f5c118ed165e1413c899a671aa8 -r013ffab327d1ae71d19c5fca8558145955d156d7 --- lams_common/src/flash/org/lamsfoundation/lams/common/ws/Workspace.as (.../Workspace.as) (revision ab7a8155c86c7f5c118ed165e1413c899a671aa8) +++ lams_common/src/flash/org/lamsfoundation/lams/common/ws/Workspace.as (.../Workspace.as) (revision 013ffab327d1ae71d19c5fca8558145955d156d7) @@ -78,8 +78,75 @@ } + + /** + * Asks the server to copy one resource to another location, if its the same folderID, + * then we have to change the name - append Copy of + * @usage + * @param resourceID //the resource to be copied, e.g. folder, LD or somethign else + * @param targetFolderID //the fodler to copy the resource too + * @param resourceType //the resource type string LearningDesign or Folder as of 1.1 + * @return + */ + public function requestCopyResource(resourceID:Number,targetFolderID:Number,resourceType:String){ + Debugger.log(resourceID+',to folder '+targetFolderID+','+resourceType,Debugger.GEN,'copyResourceResponse','Workspace'); + var callback:Function = Proxy.create(this,copyResourceResponse); + var uid:Number = Config.getInstance().userID; + Application.getInstance().getComms().getRequest('workspace.do?method=copyResource&resourceID='+resourceID+'&targetFolderID='+targetFolderID+'&resourceType='+resourceType+'&userID='+uid,callback, false); + //http://localhost:8080/lams/workspace.do?method=copyResource&resourceID=10&targetFolderID=6&resourceType=FOLDER&userID=4 + } + public function copyResourceResponse(dto:Object):Void{ + if(dto instanceof LFError){ + dto.showErrorAlert(); + } + Debugger.log('New resourceID:'+dto,Debugger.GEN,'copyResourceResponse','Workspace'); + //pass the folder that contained this resource + + workspaceModel.clearWorkspaceCache(workspaceModel.folderIDPendingRefresh); + //now open this node in the tree + workspaceModel.autoOpenFolderInTree(workspaceModel.folderIDPendingRefresh); + + + // if it comes back ok, clear the clipboard & refresh + // if not, alertUser + } + public function requestDeleteResource(resourceID:Number,resourceType:String){ + Debugger.log('resourceID:'+resourceID+', resourceType'+resourceType,Debugger.GEN,'copyResourceResponse','Workspace'); + var callback:Function = Proxy.create(this,deleteResourceResponse); + var uid:Number = Config.getInstance().userID; + 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,requestNewFolderResponse); + 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); + } + + /** * Retrieves the available folders: * The information returned is categorized under 3 main heads @@ -104,6 +171,8 @@ } + + /** * This is the method called when the user opens a design * Index: lams_common/src/flash/org/lamsfoundation/lams/common/ws/WorkspaceController.as =================================================================== diff -u -rf2b2b6d0f80bd82c2403170937a3f1dea0924c52 -r013ffab327d1ae71d19c5fca8558145955d156d7 --- lams_common/src/flash/org/lamsfoundation/lams/common/ws/WorkspaceController.as (.../WorkspaceController.as) (revision f2b2b6d0f80bd82c2403170937a3f1dea0924c52) +++ lams_common/src/flash/org/lamsfoundation/lams/common/ws/WorkspaceController.as (.../WorkspaceController.as) (revision 013ffab327d1ae71d19c5fca8558145955d156d7) @@ -1,6 +1,7 @@ import org.lamsfoundation.lams.common.ws.* import org.lamsfoundation.lams.common.mvc.* import org.lamsfoundation.lams.common.util.* +import org.lamsfoundation.lams.common.ui.* import mx.utils.* /* @@ -9,13 +10,15 @@ class org.lamsfoundation.lams.common.ws.WorkspaceController extends AbstractController { private var _workspaceModel:WorkspaceModel; + private var _workspaceController:WorkspaceController; /** * Constructor * * @param cm The model to modify. */ public function WorkspaceController (wm:Observable) { super (wm); + _workspaceController = this; _workspaceModel = WorkspaceModel(wm); } @@ -79,7 +82,7 @@ //_workspaceModel.getWorkspace().onOKCallback(evt.target.selectedDesignId); //invalidate the cache of folders - _workspaceModel.clearWorkspaceCache(); + _workspaceModel.clearWorkspaceCache(evt.target.resultDTO.targetWorkspaceFolderID); //pass the resultant DTO back to the class that called us. _workspaceModel.getWorkspace().onOKCallback(evt.target.resultDTO); @@ -102,15 +105,15 @@ public function onTreeNodeOpen (evt:Object){ var treeview = evt.target; var nodeToOpen:XMLNode = evt.node; - + Debugger.log('nodeToOpen workspaceFolderID:'+nodeToOpen.attributes.data.workspaceFolderID,Debugger.GEN,'onTreeNodeOpen','org.lamsfoundation.lams.WorkspaceController'); + Debugger.log('nodeToOpen resourceID:'+nodeToOpen.attributes.data.resourceID,Debugger.GEN,'onTreeNodeOpen','org.lamsfoundation.lams.WorkspaceController'); //if this ndoe has children then the //data has already been got, nothing to do if(!nodeToOpen.hasChildNodes()){ - Debugger.log('nodeToOpen workspaceFolderID:'+nodeToOpen.attributes.data.workspaceFolderID,Debugger.GEN,'onTreeNodeOpen','org.lamsfoundation.lams.WorkspaceController'); - Debugger.log('nodeToOpen resourceID:'+nodeToOpen.attributes.data.resourceID,Debugger.GEN,'onTreeNodeOpen','org.lamsfoundation.lams.WorkspaceController'); + //if the resourceID is null then use the folderID //var resourceToOpen = (nodeToOpen.attributes.data.resourceID) ? nodeToOpen.attributes.data.resourceID : nodeToOpen.attributes.data.workspaceFolderID; @@ -119,8 +122,11 @@ //TODO: I think it must be a folder ID, depoends if this event is fired for an "open" reousrce click - _workspaceModel.openResourceInTree(resourceToOpen); + _workspaceModel.openFolderInTree(resourceToOpen); + }else{ + Debugger.log('nodeToOpen already has children in cache',Debugger.GEN,'onTreeNodeOpen','org.lamsfoundation.lams.WorkspaceController'); + } @@ -148,6 +154,117 @@ } + public function onDragComplete(evt:Object){ + Debugger.log('type::'+evt.type,Debugger.GEN,'onDragComplete','org.lamsfoundation.lams.WorkspaceController'); + var treeview = evt.target; + //_workspaceModel.setSelectedTreeNode(treeview.selectedNode); + + + + } + + + + /** + * Handles the events from the cut, copy, paste n delete buttons + * @usage + * @param e + * @return + */ + public function fileOperationRequest(e:Object){ + var tgt:String = new String(e.target); + var workspaceDialogue = getView().workspaceDialogue; + Debugger.log('type:'+e.type+',target:'+tgt,Debugger.GEN,'fileOperationRequest','org.lamsfoundation.lams.WorkspaceController'); + //get the selected node: + var snode = workspaceDialogue.treeview.selectedNode; + + //Number(snode.attributes.data.resourceID); + //check target for button name + /* TODO: Add cut implementation, for now just scrap it :-) + if(tgt.indexOf("cut_btn") != -1){ + _workspaceModel.setClipboardItem(snode,"CUT"); + //TODO: Be nice to dim the branch in the tree + + }else + */ + _global.breakpoint(); + if(tgt.indexOf("copy_btn") != -1){ + _workspaceModel.setClipboardItem(snode.attributes.data); + + }else if(tgt.indexOf("paste_btn") != -1){ + var itemToPaste = _workspaceModel.getClipboardItem(); + if(itemToPaste != null){ + //find out the selected folderID: + //get the selected node: + var snodeData = workspaceDialogue.treeview.selectedNode.attributes.data; + var selectedFolderID:Number; + //if its a folder then the resourceID is the selected folder ID, otherwise its the parent + if(snodeData.resourceType == "Folder"){ + selectedFolderID = snodeData.resourceID; + }else{ + selectedFolderID = snodeData.workspaceFolderID; + } + + _workspaceModel.folderIDPendingRefresh = selectedFolderID; + + Debugger.log('Selected (target) folder ID=:'+selectedFolderID,Debugger.GEN,'fileOperationRequest','org.lamsfoundation.lams.WorkspaceController'); + + + _workspaceModel.getWorkspace().requestCopyResource(itemToPaste.resourceID,selectedFolderID,itemToPaste.resourceType); + }else{ + //nothing to paste.. + } + + }else if(tgt.indexOf("delete_btn") != -1){ + //find out the selected folderID: + //get the selected node: + var snodeData = workspaceDialogue.treeview.selectedNode.attributes.data; + _workspaceModel.folderIDPendingRefresh = snodeData.workspaceFolderID; + _workspaceModel.getWorkspace().requestDeleteResource(snodeData.resourceID,snodeData.resourceType); + + }else if(tgt.indexOf("new_btn") != -1){ + //check we can create a folder here + var snodeData = workspaceDialogue.treeview.selectedNode.attributes.data; + if(snodeData != null){ + Dialog.createInputDialog('__Enter the new folder name__', '__OK__', '__Cancel__', Delegate.create(_workspaceController ,setNewFolderName),null); + }else{ + //no where to make new folder + } + + //_workspaceModel.getWorkspace().requestCreateFolder(); + + } + //get selected node from the tree + + //check its ok do do the operation + + //if so do the operation - sned to controller, balh balhblah + + //invalidate the cahe, re,load the data, refresh the tree + + + //TODO: integrate with key listener for canvas!! CTRL-C is handels by the canvas at the mo... need to set somethign in application.# + + } + + public function setNewFolderName(newName:String){ + Debugger.log('newName:'+newName,Debugger.GEN,'setNewFolderName','org.lamsfoundation.lams.WorkspaceController'); + var workspaceDialogue = getView().workspaceDialogue; + var snodeData = workspaceDialogue.treeview.selectedNode.attributes.data; + var selectedFolderID:Number; + //if its a folder then the resourceID is the selected folder ID, otherwise its the parent + if(snodeData.resourceType == "Folder"){ + selectedFolderID = snodeData.resourceID; + }else{ + selectedFolderID = snodeData.workspaceFolderID; + } + _workspaceModel.folderIDPendingRefresh = selectedFolderID; + //TODO: Validate is allowed name + _workspaceModel.getWorkspace().requestNewFolder(selectedFolderID,newName); + } + + + //override the super version public function getView(){ var v = super.getView(); Index: lams_common/src/flash/org/lamsfoundation/lams/common/ws/WorkspaceDialog.as =================================================================== diff -u -rab7a8155c86c7f5c118ed165e1413c899a671aa8 -r013ffab327d1ae71d19c5fca8558145955d156d7 --- lams_common/src/flash/org/lamsfoundation/lams/common/ws/WorkspaceDialog.as (.../WorkspaceDialog.as) (revision ab7a8155c86c7f5c118ed165e1413c899a671aa8) +++ lams_common/src/flash/org/lamsfoundation/lams/common/ws/WorkspaceDialog.as (.../WorkspaceDialog.as) (revision 013ffab327d1ae71d19c5fca8558145955d156d7) @@ -7,6 +7,7 @@ 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 */ @@ -21,15 +22,21 @@ private var cancel_btn:Button; private var panel:MovieClip; //The underlaying panel base - private var location_btn:Button; - private var properties_btn:Button; + private var switchView_tab:TabBar; //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; + //properties private var description_lbl:Label; @@ -45,6 +52,7 @@ private var _workspaceView:WorkspaceView; private var _workspaceModel:WorkspaceModel; + private var _workspaceController:WorkspaceController; //Dimensions for resizing @@ -90,12 +98,16 @@ //Set the container reference Debugger.log('container=' + _container,Debugger.GEN,'init','org.lamsfoundation.lams.WorkspaceDialog'); - //Set the text on the labels + //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 //Set the text for buttons - location_btn.label = Dictionary.getValue('ws_dlg_location_button'); - properties_btn.label = Dictionary.getValue('ws_dlg_properties_button'); ok_btn.label = Dictionary.getValue('ws_dlg_ok_button'); cancel_btn.label = Dictionary.getValue('ws_dlg_cancel_button'); @@ -108,11 +120,7 @@ Debugger.log('ok_btn.tabIndex: '+ok_btn.tabIndex,Debugger.GEN,'init','org.lamsfoundation.lams.WorkspaceDialog'); - //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)); - location_btn.addEventListener('click',Delegate.create(this, showLocationTab)); - properties_btn.addEventListener('click',Delegate.create(this, showPropertiesTab)); + //Tie parent click event (generated on clicking close button) to this instance _container.addEventListener('click',this); //Register for LFWindow size events @@ -132,8 +140,8 @@ themeManager.addEventListener('themeChanged',this); //TODO: Make setStyles more efficient //setStyles(); - - //Fire contentLoaded event, this is required by all dialogs so that creator of LFWindow can know content loaded + treeview = location_dnd.getTree(); + //Fire contentLoaded event, this is required by all dialogs so that creator of LFWindow can know content loaded _container.contentLoaded(); } @@ -144,10 +152,29 @@ */ public function setUpContent():Void{ - //register to recive updates form the model WorkspaceModel(_workspaceView.getModel()).addEventListener('viewUpdate',this); + Debugger.log('_workspaceView:'+_workspaceView,Debugger.GEN,'setUpTreeview','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,'setUpTreeview','org.lamsfoundation.lams.common.ws.WorkspaceDialog'); + + + //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)); + cut_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)); + + //Set up the treeview setUpTreeview(); @@ -169,11 +196,19 @@ switch (event.updateType){ case 'REFRESH_TREE' : - refreshTree(event.data,wm); + refreshTree(wm); break; + case 'UPDATE_CHILD_FOLDER' : + updateChildFolderBranches(event.data,wm); case 'ITEM_SELECTED' : itemSelected(event.data,wm); break; + case 'OPEN_FOLDER' : + openFolder(event.data, wm); + break; + case 'REFRESH_FOLDER' : + refreshFolder(event.data, wm); + break; case 'SHOW_TAB' : showTab(event.data,wm); break; @@ -183,8 +218,18 @@ } - private function refreshTree(changedNode:XMLNode,wm:WorkspaceModel){ - Debugger.log('Refreshing tree....:' ,Debugger.GEN,'refreshTree','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); @@ -196,10 +241,70 @@ } } } - - treeview.refresh(); + + openFolder(changedNode); } + private function refreshTree(){ + Debugger.log('Refreshing tree....:' ,Debugger.GEN,'refreshTree','org.lamsfoundation.lams.ws.WorkspaceDialog'); + + + treeview.refresh();// this is USELESS + + //var oBackupDP = treeview.dataProvider; + //treeview.dataProvider = null; // clear + //treeview.dataProvider = oBackupDP; + + //treeview.setIsOpen(treeview.getNodeDisplayedAt(0),false); + //treeview.setIsOpen(treeview.getNodeDisplayedAt(0),true); + + } + + /** + * Just opens the fodler node - DOES NOT FIRE EVENT - so is used after updatting the child folder + * @usage + * @param nodeToOpen + * @param wm + * @return + */ + private function openFolder(nodeToOpen:XMLNode, wm:WorkspaceModel){ + Debugger.log('openFolder:'+nodeToOpen ,Debugger.GEN,'openFolder','org.lamsfoundation.lams.ws.WorkspaceDialog'); + //open the node + treeview.setIsOpen(nodeToOpen,true); + refreshTree(); + + } + /** + * Closes folder, then sends openEvent to controller + * @usage + * @param nodeToOpen + * @param wm + * @return + */ + private function refreshFolder(nodeToOpen:XMLNode, wm:WorkspaceModel){ + Debugger.log('refreshFolder:'+nodeToOpen ,Debugger.GEN,'refreshFolder','org.lamsfoundation.lams.ws.WorkspaceDialog'); + //close the node + treeview.setIsOpen(nodeToOpen,false); + /* + for(var i=0; i