PageRenderTime 86ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 1ms

/CMISSpacesAir/src/org/integratedsemantics/cmisspacesair/view/main/CMISSpacesAirViewBase.as

http://cmisspaces.googlecode.com/
ActionScript | 827 lines | 501 code | 84 blank | 242 comment | 72 complexity | 9b7cb370fa7920a5dabfc41354a3c950 MD5 | raw file
  1. package org.integratedsemantics.cmisspacesair.view.main
  2. {
  3. import flash.desktop.Clipboard;
  4. import flash.desktop.ClipboardFormats;
  5. import flash.desktop.NativeDragActions;
  6. import flash.desktop.NativeDragManager;
  7. import flash.events.MouseEvent;
  8. import flash.events.NativeDragEvent;
  9. import flash.filesystem.File;
  10. import flash.filesystem.FileMode;
  11. import flash.filesystem.FileStream;
  12. import mx.events.FlexEvent;
  13. import mx.managers.DragManager;
  14. import mx.managers.PopUpManager;
  15. import mx.rpc.Responder;
  16. import org.integratedsemantics.cmisspaces.presmodel.main.CMISSpacesPresModel;
  17. import org.integratedsemantics.cmisspaces.view.main.CMISSpacesViewBase;
  18. import org.integratedsemantics.cmisspacesair.control.command.UploadAir;
  19. import org.integratedsemantics.cmisspacesair.util.DownloadToTempFiles;
  20. import org.integratedsemantics.flexspaces.control.event.ui.*;
  21. import org.integratedsemantics.flexspaces.model.folder.Folder;
  22. import org.integratedsemantics.flexspaces.model.folder.Node;
  23. import org.integratedsemantics.flexspaces.model.repo.IRepoNode;
  24. import org.integratedsemantics.flexspaces.presmodel.folderview.FolderViewPresModel;
  25. import org.integratedsemantics.flexspaces.presmodel.main.FlexSpacesPresModel;
  26. import org.integratedsemantics.flexspaces.presmodel.upload.UploadStatusPresModel;
  27. import org.integratedsemantics.flexspaces.view.folderview.FolderViewBase;
  28. import org.integratedsemantics.flexspaces.view.menu.event.MenuConfiguredEvent;
  29. import org.integratedsemantics.flexspaces.view.upload.UploadStatusView;
  30. import org.integratedsemantics.flexspacesair.control.event.*;
  31. import org.integratedsemantics.flexspacesair.presmodel.create.CreateHtmlPresModel;
  32. import org.integratedsemantics.flexspacesair.presmodel.create.CreateTextPresModel;
  33. import org.integratedsemantics.flexspacesair.presmodel.create.CreateXmlPresModel;
  34. import org.integratedsemantics.flexspacesair.presmodel.localfiles.LocalFilesBrowserPresModel;
  35. import org.integratedsemantics.flexspacesair.util.AirOfflineUtil;
  36. import org.integratedsemantics.flexspacesair.view.create.html.CreateHtmlView;
  37. import org.integratedsemantics.flexspacesair.view.create.text.CreateTextView;
  38. import org.integratedsemantics.flexspacesair.view.create.xml.CreateXmlView;
  39. import org.integratedsemantics.flexspacesair.view.localfiles.LocalFilesBrowserView;
  40. public class CMISSpacesAirViewBase extends CMISSpacesViewBase
  41. {
  42. // local files browser
  43. protected var localFilesView:LocalFilesBrowserView;
  44. // create html content dialog (keep after first use to avoid recreation errors with
  45. // tinymce and webkit html air control)
  46. protected var createHtmlView:CreateHtmlView;
  47. protected var createHtmlPresModel:CreateHtmlPresModel;
  48. protected var shareTabIndex:int = -1;
  49. public function CMISSpacesAirViewBase()
  50. {
  51. super();
  52. }
  53. [Bindable]
  54. public function get cmisSpacesAirPresModel():CMISSpacesPresModel
  55. {
  56. return this.flexSpacesPresModel as CMISSpacesPresModel;
  57. }
  58. public function set cmisSpacesAirPresModel(cmisSpacesAirPresModel:CMISSpacesPresModel):void
  59. {
  60. this.flexSpacesPresModel = cmisSpacesAirPresModel;
  61. }
  62. [Bindable]
  63. public function get flexSpacesAirPresModel():FlexSpacesPresModel
  64. {
  65. return this.flexSpacesPresModel;
  66. }
  67. public function set flexSpacesAirPresModel(flexSpacesAirPresModel:FlexSpacesPresModel):void
  68. {
  69. this.flexSpacesPresModel = flexSpacesAirPresModel;
  70. }
  71. /**
  72. * Handle creation complete with doc library
  73. *
  74. */
  75. override protected function onRepoBrowserCreated(event:FlexEvent):void
  76. {
  77. trace("CMISSpacesAirViewBase onRepoBrowserCreated");
  78. super.onRepoBrowserCreated(event);
  79. //Native Drag-and-drop listeners
  80. if (flexSpacesAirPresModel.showDocLib == true)
  81. {
  82. var folderView1:FolderViewBase = browserView.fileView1;
  83. folderView1.addEventListener(NativeDragEvent.NATIVE_DRAG_ENTER,onDragIn1);
  84. folderView1.addEventListener(NativeDragEvent.NATIVE_DRAG_OVER,onDragOver);
  85. folderView1.addEventListener(NativeDragEvent.NATIVE_DRAG_DROP,onDrop1);
  86. folderView1.addEventListener(NativeDragEvent.NATIVE_DRAG_START, onDragOut1);
  87. var folderView2:FolderViewBase = browserView.fileView2;
  88. if (folderView2 != null)
  89. {
  90. folderView2.addEventListener(NativeDragEvent.NATIVE_DRAG_ENTER,onDragIn2);
  91. folderView2.addEventListener(NativeDragEvent.NATIVE_DRAG_OVER,onDragOver);
  92. folderView2.addEventListener(NativeDragEvent.NATIVE_DRAG_DROP,onDrop2);
  93. folderView2.addEventListener(NativeDragEvent.NATIVE_DRAG_START, onDragOut2);
  94. }
  95. }
  96. }
  97. /**
  98. * After menu bar is configured, init state of menus beyond what is in config file
  99. *
  100. * @param event menu configured event
  101. *
  102. */
  103. override protected function onMainMenuConfigured(event:MenuConfiguredEvent):void
  104. {
  105. super.onMainMenuConfigured(event);
  106. // enable paste right away if user has copied files to native external clipboard
  107. // before starting flexspacesair
  108. var enablePaste:Boolean = formatToPaste();
  109. mainMenu.enableMenuItem("edit", "paste", enablePaste);
  110. if (this.toolbar1 != null)
  111. {
  112. this.pasteBtn.enabled = enablePaste;
  113. }
  114. // TODO: also need to add check for formatToPaste when switching/activating the flexpacesair window
  115. // for now have to switch tabs or select nodes for the paste menu enabling to be updated
  116. }
  117. //
  118. // Native Clipboard Handling
  119. //
  120. /**
  121. * Cut selected node items to internal clipboard (not removed (moved) until paste)
  122. * Override to add flexspaces format flag to native clipboard
  123. *
  124. * @param selectedItems selected nodes
  125. *
  126. */
  127. override public function cutNodes(selectedItems:Array):void
  128. {
  129. var event:AirClipboardUIEvent = new AirClipboardUIEvent(AirClipboardUIEvent.AIR_CLIPBOARD_CUT, null, this, selectedItems);
  130. event.dispatch();
  131. // enable paste menu
  132. var tabIndex:int = tabNav.selectedIndex;
  133. if ((tabIndex == docLibTabIndex) || (tabIndex == wcmTabIndex))
  134. {
  135. if (mainMenu != null)
  136. {
  137. mainMenu.enableMenuItem("edit", "paste", true);
  138. }
  139. if (pasteBtn != null)
  140. {
  141. pasteBtn.enabled = true;
  142. }
  143. }
  144. }
  145. /**
  146. * Copy selected node items to internal clipboard
  147. * Override to add flexspaces format flag to native clipboard
  148. *
  149. * @param selectedItems selected nodes
  150. *
  151. */
  152. override public function copyNodes(selectedItems:Array):void
  153. {
  154. var event:AirClipboardUIEvent = new AirClipboardUIEvent(AirClipboardUIEvent.AIR_CLIPBOARD_COPY, null, this, selectedItems);
  155. event.dispatch();
  156. // enable paste menu
  157. var tabIndex:int = tabNav.selectedIndex;
  158. if ((tabIndex == docLibTabIndex) || (tabIndex == wcmTabIndex))
  159. {
  160. if (mainMenu != null)
  161. {
  162. mainMenu.enableMenuItem("edit", "paste", true);
  163. }
  164. if (pasteBtn != null)
  165. {
  166. pasteBtn.enabled = true;
  167. }
  168. }
  169. }
  170. /**
  171. * Paste node items from internal clipboard
  172. * or files from native clipboard
  173. *
  174. */
  175. public function pasteNodes():void
  176. {
  177. var responder:Responder = new Responder(flexSpacesAirPresModel.onResultAction, flexSpacesAirPresModel.onFaultAction);
  178. var event:AirClipboardUIEvent = new AirClipboardUIEvent(AirClipboardUIEvent.AIR_CLIPBOARD_PASTE, responder, this, null, redraw);
  179. event.dispatch();
  180. }
  181. //
  182. // AIR View Doc (Automatic Make Available Offline, Webkit tab)
  183. //
  184. /**
  185. * View a document node in tab if webkit html browser supports
  186. * format, otherwise view in separate window
  187. *
  188. * Currently this downloads local copy first, thus doing
  189. * an automatic make available offline for viewed files
  190. *
  191. * @param selectedItem selected node
  192. *
  193. */
  194. override protected function viewNode(selectedItem:Object):void
  195. {
  196. var event:AirViewNodeUIEvent = new AirViewNodeUIEvent(AirViewNodeUIEvent.AIR_VIEW_NODE, null, selectedItem, tabNav);
  197. event.dispatch();
  198. }
  199. //
  200. // Native Drag Drop
  201. //
  202. /**
  203. * Native drag in event handler for folder list 1
  204. *
  205. * @param event native drag event
  206. *
  207. */
  208. protected function onDragIn1(event:NativeDragEvent):void
  209. {
  210. onDragIn(event, browserView.fileView1);
  211. }
  212. /**
  213. * Native drag in event handler for folder list 2
  214. *
  215. * @param event native drag event
  216. *
  217. */
  218. protected function onDragIn2(event:NativeDragEvent):void
  219. {
  220. onDragIn(event, browserView.fileView2);
  221. }
  222. /**
  223. * Native drag out event handler for folder list 1
  224. *
  225. * @param event native drag event
  226. *
  227. */
  228. protected function onDragOut1(event:NativeDragEvent):void
  229. {
  230. onDragOut(event, browserView.fileView1);
  231. }
  232. /**
  233. * Native drag out event handler for folder list 2
  234. *
  235. * @param event native drag event
  236. *
  237. */
  238. protected function onDragOut2(event:NativeDragEvent):void
  239. {
  240. onDragOut(event, browserView.fileView2);
  241. }
  242. /**
  243. * On drag-in, check the data formats. If it is a supported format,
  244. * tell the Native Drag Manager that the component can take the drop.
  245. *
  246. * @param event native drag event
  247. * @param targetFolderView target folder view
  248. *
  249. */
  250. protected function onDragIn(event:NativeDragEvent, targetFolderView:FolderViewBase):void
  251. {
  252. //trace("Drag enter event.");
  253. var transferable:Clipboard = event.clipboard;
  254. if (transferable.hasFormat(ClipboardFormats.FILE_LIST_FORMAT) ||
  255. transferable.hasFormat("items") )
  256. {
  257. NativeDragManager.acceptDragDrop(targetFolderView);
  258. NativeDragManager.dropAction = NativeDragActions.COPY
  259. }
  260. else
  261. {
  262. //trace("Unrecognized format");
  263. }
  264. }
  265. /**
  266. * Native drag over event
  267. *
  268. * @param event native drag event
  269. */
  270. protected function onDragOver(event:NativeDragEvent):void
  271. {
  272. if (event.clipboard.hasFormat(ClipboardFormats.FILE_LIST_FORMAT) ||
  273. event.clipboard.hasFormat("items"))
  274. {
  275. if (event.shiftKey == true)
  276. {
  277. NativeDragManager.dropAction = NativeDragActions.MOVE;
  278. }
  279. else
  280. {
  281. NativeDragManager.dropAction = NativeDragActions.COPY;
  282. }
  283. }
  284. }
  285. /**
  286. * Native on drop event handler for folder list 1
  287. *
  288. * @param event native drag event
  289. *
  290. */
  291. protected function onDrop1(event:NativeDragEvent):void
  292. {
  293. onDrop(event, browserView.fileView1);
  294. }
  295. /**
  296. * Native on drop event handler for folder list 2
  297. *
  298. * @param event native drag event
  299. *
  300. */
  301. protected function onDrop2(event:NativeDragEvent):void
  302. {
  303. onDrop(event, browserView.fileView2);
  304. }
  305. /**
  306. * Handler for onDrop event
  307. *
  308. * @param event native drag event
  309. * @param targetFolderView target folder view
  310. */
  311. protected function onDrop(event:NativeDragEvent, targetFolderView:FolderViewBase):void
  312. {
  313. //trace("Drag drop event.");
  314. var data:Clipboard = event.clipboard;
  315. if (data.hasFormat(ClipboardFormats.FILE_LIST_FORMAT))
  316. {
  317. var dropfiles:Array = data.getData(ClipboardFormats.FILE_LIST_FORMAT) as Array;
  318. var uploadStatusView:UploadStatusView = UploadStatusView(PopUpManager.createPopUp(this, UploadStatusView, false));
  319. var uploadStatusPresModel:UploadStatusPresModel = new UploadStatusPresModel(dropfiles);
  320. uploadStatusView.uploadStatusPresModel = uploadStatusPresModel;
  321. for each (var file:File in dropfiles)
  322. {
  323. var uploadAir:UploadAir = new UploadAir(uploadStatusView);
  324. uploadAir.uploadAir(file, targetFolderView.folderViewPresModel.currentFolderNode, redraw);
  325. }
  326. }
  327. else if (data.hasFormat("items"))
  328. {
  329. var action:String = DragManager.COPY;
  330. if (event.shiftKey == true)
  331. {
  332. action = DragManager.MOVE;
  333. }
  334. var dropItems:Array = data.getData("items") as Array;
  335. onDropItems(targetFolderView.folderViewPresModel, action, dropItems);
  336. }
  337. }
  338. /**
  339. * Handle dropping internal node items or
  340. * external files from desktop into flexspacesair
  341. *
  342. * @param targetFolderList target folder view
  343. * @param action move ar copy
  344. * @param items items to drop
  345. *
  346. */
  347. override protected function onDropItems(targetFolderList:FolderViewPresModel, action:String, items:Array):void
  348. {
  349. for each (var item:Object in items)
  350. {
  351. if (item is File)
  352. {
  353. var file:File = item as File;
  354. var uploadAir:UploadAir = new UploadAir();
  355. uploadAir.uploadAir(file, targetFolderList.currentFolderNode, redraw);
  356. }
  357. else if (item is Node)
  358. {
  359. var items2:Array = new Array;
  360. items2.push(item);
  361. super.onDropItems(targetFolderList, action, items2);
  362. }
  363. }
  364. }
  365. /**
  366. * On drag-out, setup formats with NativeDragManager to drag file(s) to desktop
  367. *
  368. * @param event native drag event
  369. * @param sourceFolderView source folder view
  370. *
  371. */
  372. protected function onDragOut(event:NativeDragEvent, sourceFolderView:FolderViewBase):void
  373. {
  374. trace("Native Drag start event.");
  375. var clipboard:Clipboard = event.clipboard;
  376. clipboard.setDataHandler(ClipboardFormats.FILE_LIST_FORMAT, getDragOutFiles);
  377. }
  378. private function getDragOutFiles():Array
  379. {
  380. var downloadUtil:DownloadToTempFiles = new DownloadToTempFiles();
  381. var selectedItems:Array = flexSpacesPresModel.selectedItems;
  382. var fileArray:Array = downloadUtil.download(selectedItems);
  383. return fileArray;
  384. }
  385. //
  386. // Menu Handlers
  387. //
  388. /**
  389. * Switch on menu data to method for both main menu bar
  390. * and context menus
  391. *
  392. * @param data menu command
  393. *
  394. */
  395. override protected function handleBothKindsOfMenus(data:String):void
  396. {
  397. var selectedItem:Object = flexSpacesPresModel.selectedItem;
  398. var selectedItems:Array = flexSpacesPresModel.selectedItems;
  399. switch(data)
  400. {
  401. case 'paste':
  402. pasteNodes();
  403. break;
  404. case 'view':
  405. viewNode(selectedItem);
  406. break;
  407. case 'download':
  408. downloadFile(selectedItem);
  409. break;
  410. case 'edit':
  411. downloadFile(selectedItem);
  412. break;
  413. case "localfiles":
  414. showHideLocalFilesBrowser();
  415. break;
  416. case "availoffline":
  417. makeAvailOffline();
  418. break;
  419. case "offlineupload":
  420. offlineUpload(false);
  421. break;
  422. case "offlinecheckin":
  423. offlineUpload(true);
  424. break;
  425. case "createtext":
  426. createText();
  427. break;
  428. case "createxml":
  429. createXML();
  430. break;
  431. case "createhtml":
  432. createHTML();
  433. break;
  434. default:
  435. super.handleBothKindsOfMenus(data);
  436. break;
  437. }
  438. }
  439. /**
  440. * Toggle showing local files browser pane
  441. *
  442. */
  443. protected function showHideLocalFilesBrowser():void
  444. {
  445. if ( (localFilesView != null) && (localFilesView.visible == true) )
  446. {
  447. localFilesView.visible = false;
  448. localFilesView.includeInLayout = false;
  449. this.flexspacesviews.percentHeight = 100;
  450. }
  451. else
  452. {
  453. if (localFilesView == null)
  454. {
  455. this.localFilesView = new LocalFilesBrowserView();
  456. localFilesView.percentWidth = 100;
  457. localFilesView.percentHeight = 20;
  458. this.addChild(localFilesView);
  459. var localFilesPresModel:LocalFilesBrowserPresModel = new LocalFilesBrowserPresModel();
  460. localFilesView.presModel = localFilesPresModel;
  461. }
  462. localFilesView.visible = true;
  463. localFilesView.includeInLayout = true;
  464. this.flexspacesviews.percentHeight = 80;
  465. localFilesView.percentHeight = 20;
  466. }
  467. this.invalidateDisplayList();
  468. }
  469. //
  470. // Make Available Offline support
  471. //
  472. /**
  473. * Make multiple selection of files and folders available offline
  474. *
  475. * Note: selected folders themselves are made offline, not their contents
  476. *
  477. * Nodes are made available offline by downloading them without a download dialog
  478. * to the flexpaces area in documents folder within folders mirroring the
  479. * repository folder / filenames.
  480. *
  481. */
  482. protected function makeAvailOffline():void
  483. {
  484. var selectedItems:Array = flexSpacesAirPresModel.selectedItems;
  485. var event:AirMakeAvailOfflineUIEvent = new AirMakeAvailOfflineUIEvent(AirMakeAvailOfflineUIEvent.AIR_MAKE_AVAIL_OFFLINE, null, selectedItems, this);
  486. event.dispatch();
  487. }
  488. //
  489. // Offline Upload: without browse dialog to existing repository doc
  490. //
  491. /**
  492. * Upload file (without file chooser dialog) from standard local flexspaces documents area
  493. * in local folder path / file name mirroring repository path / filename into an existing
  494. * document in the repository
  495. *
  496. * @param checkin whether to checkin also
  497. *
  498. */
  499. protected function offlineUpload(checkin:Boolean):void
  500. {
  501. var selectedItem:Object = flexSpacesAirPresModel.selectedItem;
  502. var event:AirOfflineUploadUIEvent = new AirOfflineUploadUIEvent(AirOfflineUploadUIEvent.AIR_OFFLINE_UPLOAD, null, selectedItem, checkin, this, redraw);
  503. event.dispatch();
  504. }
  505. //
  506. // Special AIR handling for Download File
  507. //
  508. /**
  509. * Download a selected document to local system with a download dialog
  510. * Overriden to pass air mode flag to download ui command event
  511. *
  512. * @param selectedItem selected node item
  513. *
  514. */
  515. protected function downloadFile(selectedItem:Object):void
  516. {
  517. var event:DownloadUIEvent = new DownloadUIEvent(DownloadUIEvent.DOWNLOAD_UI, null, selectedItem, this, true);
  518. event.dispatch();
  519. }
  520. //
  521. // Create HTML, XML, Text Content Dialogs
  522. //
  523. /**
  524. * Display the create text content dialog
  525. *
  526. */
  527. protected function createText():void
  528. {
  529. var createTextView:CreateTextView = CreateTextView(PopUpManager.createPopUp(this, CreateTextView, false));
  530. var createTextPresModel:CreateTextPresModel = new CreateTextPresModel();
  531. createTextView.presModel = createTextPresModel;
  532. createTextView.onComplete = createContentDialogComplete;
  533. }
  534. /**
  535. * Display the create xml content dialog
  536. *
  537. */
  538. protected function createXML():void
  539. {
  540. var createXmlView:CreateXmlView = CreateXmlView(PopUpManager.createPopUp(this, CreateXmlView, false));
  541. var createXmlPresModel:CreateXmlPresModel = new CreateXmlPresModel();
  542. createXmlView.presModel = createXmlPresModel;
  543. createXmlView.onComplete = createContentDialogComplete
  544. }
  545. /**
  546. * Display the create html content dialog
  547. * Note: dialog is saved and reused after first time to avoid recreation problems with tinymce files
  548. *
  549. */
  550. protected function createHTML():void
  551. {
  552. if (this.createHtmlView == null)
  553. {
  554. createHtmlView = CreateHtmlView(PopUpManager.createPopUp(this, CreateHtmlView, false));
  555. createHtmlPresModel = new CreateHtmlPresModel();
  556. createHtmlView.presModel = createHtmlPresModel;
  557. createHtmlView.onComplete = createContentDialogComplete;
  558. }
  559. else
  560. {
  561. PopUpManager.addPopUp(createHtmlView, this);
  562. createHtmlView.setContent("");
  563. }
  564. }
  565. /**
  566. * On ok from create content dialogs, upload local file with content to a new
  567. * document in repository
  568. *
  569. * @param filename filename chosen for file
  570. * @param content content for file
  571. *
  572. */
  573. protected function createContentDialogComplete(filename:String, content:String):void
  574. {
  575. if (flexSpacesAirPresModel.currentNodeList is Folder)
  576. {
  577. var folder:Folder = flexSpacesAirPresModel.currentNodeList as Folder;
  578. var parentNode:IRepoNode = folder.folderNode;
  579. var localDir:File = AirOfflineUtil.makeOfflineDirForPath(folder.currentPath);
  580. var file:File = localDir.resolvePath(filename);
  581. var stream:FileStream = new FileStream();
  582. stream.open(file, FileMode.WRITE);
  583. stream.writeUTFBytes(content);
  584. stream.close();
  585. var uploadAir:UploadAir = new UploadAir();
  586. uploadAir.uploadAir(file, parentNode, redraw);
  587. }
  588. }
  589. //
  590. // Menu Enabling / Disabling
  591. //
  592. /**
  593. * Enable / Disable menus after a node is selected
  594. *
  595. * @param selectedItem node selected
  596. *
  597. */
  598. override protected function enableMenusAfterSelection(selectedItem:Object):void
  599. {
  600. super.enableMenusAfterSelection(selectedItem);
  601. var tabIndex:int = tabNav.selectedIndex;
  602. if ((selectedItem != null) && (mainMenu.configurationDone == true))
  603. {
  604. var createChildrenPermission:Boolean = false;
  605. if ( (flexSpacesAirPresModel.currentNodeList != null) && (flexSpacesAirPresModel.currentNodeList is Folder))
  606. {
  607. var folder:Folder = flexSpacesAirPresModel.currentNodeList as Folder;
  608. var parentNode:Node = folder.folderNode;
  609. if (parentNode != null)
  610. {
  611. createChildrenPermission = parentNode.createChildrenPermission;
  612. }
  613. }
  614. var enablePaste:Boolean = createChildrenPermission && formatToPaste();
  615. var node:Node = selectedItem as Node;
  616. var readPermission:Boolean = node.readPermission;
  617. var writePermission:Boolean = node.writePermission;
  618. var deletePermission:Boolean = node.deletePermission;
  619. // view specific
  620. switch(tabIndex)
  621. {
  622. case docLibTabIndex:
  623. // paste
  624. mainMenu.enableMenuItem("edit", "paste", enablePaste);
  625. browserView.enableContextMenuItem("paste", enablePaste, true);
  626. this.pasteBtn.enabled = enablePaste;
  627. // make avail offline, offline upload
  628. mainMenu.enableMenuItem("tools", "availoffline", readPermission);
  629. mainMenu.enableMenuItem("tools", "offlineupload", writePermission);
  630. break;
  631. case searchTabIndex:
  632. // make avail offline, offline upload
  633. mainMenu.enableMenuItem("tools", "availoffline", false);
  634. mainMenu.enableMenuItem("tools", "offlineupload", false);
  635. break;
  636. }
  637. }
  638. }
  639. /**
  640. * Enable / Disable menus after view switch with tabs
  641. *
  642. * @param tabIndex index of tab switched to
  643. *
  644. */
  645. override protected function enableMenusAfterTabChange(tabIndex:int):void
  646. {
  647. super.enableMenusAfterTabChange(tabIndex);
  648. if (mainMenu.configurationDone == true)
  649. {
  650. // make avail offline, offline upload
  651. mainMenu.enableMenuItem("tools", "availoffline", false);
  652. mainMenu.enableMenuItem("tools", "offlineupload", false);
  653. var createChildrenPermission:Boolean = false;
  654. if ( (flexSpacesAirPresModel.currentNodeList != null) && (flexSpacesAirPresModel.currentNodeList is Folder))
  655. {
  656. var folder:Folder = flexSpacesAirPresModel.currentNodeList as Folder;
  657. var parentNode:Node = folder.folderNode;
  658. if (parentNode != null)
  659. {
  660. createChildrenPermission = parentNode.createChildrenPermission;
  661. }
  662. }
  663. var enablePaste:Boolean = createChildrenPermission && formatToPaste();
  664. switch(tabIndex)
  665. {
  666. case docLibTabIndex:
  667. // create content
  668. mainMenu.enableMenuItem("file", "createcontent", createChildrenPermission);
  669. // paste
  670. mainMenu.enableMenuItem("edit", "paste", enablePaste);
  671. browserView.enableContextMenuItem("paste", enablePaste, true);
  672. this.pasteBtn.enabled = enablePaste;
  673. break;
  674. case searchTabIndex:
  675. // create content
  676. mainMenu.enableMenuItem("file", "createcontent", false);
  677. break;
  678. }
  679. }
  680. }
  681. /**
  682. * Determine if there is something that can be pasted into flexspacesair
  683. * Either node items on the internal clipboard or files on the native
  684. * external clipboard
  685. *
  686. * @return true if have a format to paste
  687. *
  688. */
  689. protected function formatToPaste():Boolean
  690. {
  691. var data:Clipboard = Clipboard.generalClipboard;
  692. if ( data.hasFormat(ClipboardFormats.FILE_LIST_FORMAT) || data.hasFormat(FlexSpacesPresModel.FLEXSPACES_FORMAT) )
  693. {
  694. return true;
  695. }
  696. else
  697. {
  698. return false;
  699. }
  700. }
  701. protected function offlineEdit():void
  702. {
  703. var selectedItem:Object = flexSpacesAirPresModel.selectedItem;
  704. var event:AirOfflineEditUIEvent = new AirOfflineEditUIEvent(AirOfflineEditUIEvent.AIR_OFFLINE_EDIT, null, selectedItem, tabNav);
  705. event.dispatch();
  706. }
  707. override protected function onEditBtn(event:MouseEvent):void
  708. {
  709. if (model.appConfig.useLessStepsEdit == true)
  710. {
  711. offlineEdit();
  712. }
  713. else
  714. {
  715. var selectedItem:Object = flexSpacesAirPresModel.selectedItem;
  716. downloadFile(selectedItem);
  717. }
  718. }
  719. override protected function onUpdateBtn(event:MouseEvent):void
  720. {
  721. if (model.appConfig.useLessStepsEdit == true)
  722. {
  723. offlineUpload(false);
  724. }
  725. else
  726. {
  727. var selectedItem:Object = flexSpacesAirPresModel.selectedItem;
  728. flexSpacesAirPresModel.updateNode(selectedItem, this);
  729. }
  730. }
  731. /**
  732. * Handle paste toolbar button with special air native paste from desktop/folder
  733. * or from a cut/copy from inside flexspaces
  734. *
  735. * @param event click event
  736. *
  737. */
  738. override protected function onPasteBtn(event:MouseEvent):void
  739. {
  740. pasteNodes();
  741. }
  742. }
  743. }