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