]> git.argeo.org Git - gpl/argeo-slc.git/blobdiff - org.argeo.slc.webapp/src/main/webapp/argeo-ria-src/class/org/argeo/ria/Application.js
Make modal window optionally "persistent" (not destroied when hidden, and accumulate...
[gpl/argeo-slc.git] / org.argeo.slc.webapp / src / main / webapp / argeo-ria-src / class / org / argeo / ria / Application.js
index ce299c444ea7ef0404c887f17a99aface1e9eb8b..a1e5901f18802149bf3ac692af8ec7ea8e71c8ab 100644 (file)
 qx.Class.define("org.argeo.ria.Application",\r
 {\r
   extend : qx.application.Standalone,\r
-  settings : {\r
-       //"slc.Perspective" : "org.argeo.ria.custom.Perspective"\r
+  \r
+  statics : {\r
+       INSTANCE : null \r
   },\r
   \r
-  /*\r
-  *****************************************************************************\r
-     MEMBERS\r
-  *****************************************************************************\r
-  */\r
+  properties : {\r
+       /**\r
+        * Available perspective detected in the current compilation.\r
+        */\r
+       perspectives : {\r
+               check : "Map",\r
+               init : {}\r
+       },\r
+       /**\r
+        * Currently layouted perspective label\r
+        */\r
+       activePerspectiveName : {\r
+               check : "String",\r
+               init : ""\r
+       },\r
+       /**\r
+        *  Currently layouted perspective.\r
+        */\r
+       activePerspective : {\r
+               init : null\r
+       },\r
+       /**\r
+        * Basic command associated to the application, applicable to all perspectives.\r
+        */\r
+       commandsDefinitions : {\r
+               init : {\r
+                       "stop" : {\r
+                               label           : "Stop", \r
+                               icon            : "resource/slc/process-stop.png",\r
+                               shortcut        : "Control+s",\r
+                               enabled         : false,\r
+                               menu            : null,\r
+                               toolbar         : "list",\r
+                               callback        : function(e){},\r
+                               command         : null\r
+                       },\r
+                       "switchperspective" : {\r
+                               label           : "Switch Perspective", \r
+                               icon            : "resource/slc/view-pane-tree.png",\r
+                               shortcut        : "",\r
+                               enabled         : true,\r
+                               menu            : "View",\r
+                               toolbar         : false,\r
+                               submenu         : [],\r
+                               submenuCallback : function(commandId){\r
+                                       // Defer execution to assure that the submenu is closed \r
+                                       // before it is rebuilt.\r
+                                       qx.event.Timer.once(function(){\r
+                                               org.argeo.ria.Application.INSTANCE.loadPerspective(commandId);\r
+                                       }, this, 10);                                   \r
+                               },\r
+                               callback        : function(e){},\r
+                               command         : null                                  \r
+                       },                      \r
+                       "log" : {\r
+                               label           : "Show Console", \r
+                               icon            : "resource/slc/help-contents.png",\r
+                               shortcut        : "",\r
+                               enabled         : true,\r
+                               menu            : "View",\r
+                               menuPosition: "last",\r
+                               toolbar         : false,\r
+                               callback        : function(e){                                          \r
+                                       org.argeo.ria.components.Logger.getInstance().toggle();\r
+                               }, \r
+                               command         : null\r
+                       },\r
+                       "help" : {\r
+                               label           : "About...", \r
+                               icon            : "resource/slc/help-about.png",\r
+                               shortcut        : "Control+h",\r
+                               enabled         : true,\r
+                               menu            : "View",\r
+                               toolbar         : false,\r
+                               callback        : function(e){\r
+                                       var win = new org.argeo.ria.components.Modal("About SLC", null, "SLC is a product from Argeo.");\r
+                                       win.attachAndShow();\r
+                               }, \r
+                               command         : null\r
+                       }\r
+               }\r
+       }\r
+  },\r
 \r
   members :\r
   {\r
@@ -40,11 +119,22 @@ qx.Class.define("org.argeo.ria.Application",
     {\r
       // Call super class\r
       this.base(arguments);\r
+      this.self(arguments).INSTANCE = this;\r
       this.views = {};\r
       \r
       var viewsManager = org.argeo.ria.components.ViewsManager.getInstance();\r
       viewsManager.setApplicationRoot(this.getRoot());\r
-      \r
+     \r
+      /*\r
+      var appli = this;\r
+      qx.bom.Event.addNativeListener(window, "unload", function(){\r
+       // TODO : Close perspective if one is open.     \r
+               if(appli.getActivePerspective()){\r
+                       alert(appli.getActivePerspective());\r
+                       appli.getActivePerspective().remove(org.argeo.ria.components.ViewsManager.getInstance());\r
+               } \r
+         });\r
+      */\r
       // Enable logging in debug variant\r
       if (qx.core.Variant.isSet("qx.debug", "on"))\r
       {\r
@@ -60,11 +150,43 @@ qx.Class.define("org.argeo.ria.Application",
       var container = new qx.ui.container.Composite(layout);\r
       viewsManager.setViewPanesContainer(container);\r
       // Document is the application root      \r
-      this.getRoot().add(container, {left:0,right:0,top:0,bottom:0});      \r
+      this.getRoot().add(container, {left:0,right:0,top:0,bottom:0});\r
+      \r
+      // Find available perspectives\r
+      var allPerspectives = {};\r
+      for(var key in qx.Bootstrap.$$registry){\r
+       if(qx.Class.hasInterface(qx.Bootstrap.$$registry[key], org.argeo.ria.components.IPerspective)){\r
+               allPerspectives[key] = qx.Bootstrap.$$registry[key];\r
+       }\r
+      }\r
+      var perspectiveNumber = qx.lang.Object.getLength(allPerspectives);\r
+      if(!perspectiveNumber){\r
+       this.error("Cannot find a perspective for startup!");\r
+       return;\r
+      }\r
+      this.setPerspectives(allPerspectives);\r
+      // Choose startup perspective, delete switch menu if only one perspective.\r
+      if(perspectiveNumber <= 1){\r
+                delete this.getCommandsDefinitions()["switchperspective"];\r
+                this.setActivePerspectiveName(qx.lang.Object.getKeys(allPerspectives)[0]);\r
+      }\r
+      else{\r
+       var startupSetting;\r
+       try{\r
+               startupSetting = qx.core.Setting.get("ria.StartupPerspective");\r
+       }catch(e){}\r
+       if(startupSetting && allPerspectives[startupSetting]){\r
+               this.setActivePerspectiveName(startupSetting);\r
+       }else{\r
+               this.setActivePerspectiveName(qx.lang.Object.getKeys(allPerspectives)[0]);\r
+       }\r
+       this.rebuildPerspectiveMenus();\r
+      }\r
          \r
       var menuBar = new qx.ui.menubar.MenuBar();\r
       var toolbar = new qx.ui.toolbar.ToolBar();\r
       var commandManager = org.argeo.ria.event.CommandsManager.getInstance();\r
+      commandManager.init(this.getCommandsDefinitions());\r
       commandManager.createCommands();\r
       commandManager.registerMenuBar(menuBar);\r
       commandManager.registerToolBar(toolbar);\r
@@ -78,22 +200,78 @@ qx.Class.define("org.argeo.ria.Application",
       container.add(menuBar);\r
       container.add(toolbar);      \r
 \r
-      /**\r
-       * Call GuiLoader to load default perspective and associated views.\r
-       */\r
-      var perspectiveClassName  = qx.core.Setting.get("ria.Perspective")\r
-      if(!perspectiveClassName){\r
-       this.error("Cannot find default perspective setting ! Please check your config.json file! (CUSTOM_PERSPECTIVE, line 23).");\r
-       return;\r
-      }\r
-      var perspectiveClass = qx.Class.getByName(perspectiveClassName);\r
-      if(!perspectiveClass){\r
-       this.error("Cannot find class for default perspective ("+perspectiveClassName+"). Please check your config.json file! (CUSTOM_PERSPECTIVE, line 23).");\r
-       return;\r
-      }\r
-      var perspective = new perspectiveClass;\r
-      perspective.initViewPanes(viewsManager);\r
-      perspective.initViews(viewsManager);      \r
+      this.loadPerspective();\r
+    },\r
+    \r
+    /**\r
+     * Load a given perspective by its name.\r
+     * @param perspectiveName {String} Perspective to load\r
+     */\r
+    loadPerspective : function(perspectiveName){\r
+       if(perspectiveName){\r
+               this.setActivePerspectiveName(perspectiveName);\r
+               this.rebuildPerspectiveMenus();\r
+       }else{\r
+               perspectiveName = this.getActivePerspectiveName();\r
+       }\r
+               var viewsManager = org.argeo.ria.components.ViewsManager.getInstance();\r
+               if(this.getActivePerspective()){\r
+                       this.getActivePerspective().remove(viewsManager);\r
+               }\r
+       var allPerspectives = this.getPerspectives();           \r
+               var perspectiveClass = allPerspectives[perspectiveName];\r
+               if(!perspectiveClass){\r
+                       this.error("Cannot find class for startup perspective : "+perspectiveName);\r
+                       return;\r
+               }\r
+               var perspective = new perspectiveClass;\r
+               perspective.initViewPanes(viewsManager);\r
+               perspective.initViews(viewsManager);\r
+               this.setActivePerspective(perspective);\r
+    },\r
+    \r
+    /**\r
+     * After switching perspective, call this function to rebuild menu with the right selected.\r
+     */\r
+    rebuildPerspectiveMenus : function(){\r
+            var switchCommand = this.getCommandsDefinitions()["switchperspective"];\r
+            switchCommand.submenu = [];\r
+            var allPerspectives = this.getPerspectives();\r
+            for(var key in allPerspectives){\r
+               switchCommand.submenu.push({\r
+                       "label":(allPerspectives[key].LABEL || key)+(key==this.getActivePerspectiveName()?" (current)":""),\r
+                       "icon" :(allPerspectives[key].ICON || null),\r
+                       "commandId":key,\r
+                       "disabled" : (key==this.getActivePerspectiveName()?true:false)\r
+               });\r
+            }\r
+               if(switchCommand.command){ // Command already created : force reload\r
+                       switchCommand.command.clearMenus();\r
+                       switchCommand.command.setMenu(switchCommand.submenu);\r
+               }\r
+    },\r
+\r
+    /**\r
+     * Specific action of calling an external URL without triggering the "close()" method\r
+     * of Application.\r
+     * @param hrefValue {String} A download url that should reply with specific "attachment" header to avoid leaving the application.\r
+     */\r
+    javascriptDownloadLocation: function(hrefValue){\r
+       this.interruptClose = true;\r
+       document.location.href = hrefValue;\r
+       this.interruptClose = false;\r
+    },\r
+    \r
+    /**\r
+     * Called at Application ending (closing the browser).\r
+     */\r
+    close : function(){\r
+       if(this.interruptClose) return ;        \r
+               if(this.getActivePerspective()){\r
+                       this.getActivePerspective().remove(org.argeo.ria.components.ViewsManager.getInstance());\r
+               } \r
+               this.base(arguments);\r
+\r
     }\r
                \r
   }\r