text: /*!
   * Ext JS Library 3.3.1
   * Copyright(c) 2006-2014 Sencha Inc.
   * licensing@sencha.com
   * http://www.sencha.com/license
   */
  Ext.Desktop = function(app) {
      this.taskbar = new Ext.ux.TaskBar(app);
      this.xTickSize = this.yTickSize = 1;
      var taskbar = this.taskbar;
  
      var desktopEl = Ext.get('x-desktop');
      var taskbarEl = Ext.get('ux-taskbar');
      var shortcuts = Ext.get('x-shortcuts');
  
      var windows = new Ext.WindowGroup();
      var activeWindow;
  
      function minimizeWin(win) {
          win.minimized = true;
          win.hide();
      }
  
      function markActive(win) {
          if (activeWindow && activeWindow != win) {
              markInactive(activeWindow);
          }
          taskbar.setActiveButton(win.taskButton);
          activeWindow = win;
          Ext.fly(win.taskButton.el).addClass('active-win');
          win.minimized = false;
      }
  
      function markInactive(win) {
          if (win == activeWindow) {
              activeWindow = null;
              Ext.fly(win.taskButton.el).removeClass('active-win');
          }
      }
  
      function removeWin(win) {
          taskbar.removeTaskButton(win.taskButton);
          layout();
      }
  
      function layout() {
          desktopEl.setHeight(Ext.lib.Dom.getViewHeight() - taskbarEl.getHeight());
      }
      Ext.on('resize', layout);
  
      this.layout = layout;
  
      this.createWindow = function(config, cls) {
          var win = new(cls || Ext.Window)(
          Ext.applyIf(config || {},
          {
              renderTo: desktopEl,
              manager: windows,
              minimizable: true,
              maximizable: true
          })
          );
          win.dd.xTickSize = this.xTickSize;
          win.dd.yTickSize = this.yTickSize;
          if (win.resizer) {
              win.resizer.widthIncrement = this.xTickSize;
              win.resizer.heightIncrement = this.yTickSize;
          }
          win.render(desktopEl);
          win.taskButton = taskbar.addTaskButton(win);
  
          win.cmenu = new Ext.menu.Menu({
              items: [
  
              ]
          });
  
          win.animateTarget = win.taskButton.el;
  
          win.on({
              'activate': {
                  fn: markActive
              },
              'beforeshow': {
                  fn: markActive
              },
              'deactivate': {
                  fn: markInactive
              },
              'minimize': {
                  fn: minimizeWin
              },
              'close': {
                  fn: removeWin
              }
          });
  
          layout();
          return win;
      };
  
      this.getManager = function() {
          return windows;
      };
  
      this.getWindow = function(id) {
          return windows.get(id);
      };
  
      this.getWinWidth = function() {
          var width = Ext.lib.Dom.getViewWidth();
          return width < 200 ? 200: width;
      };
  
      this.getWinHeight = function() {
          var height = (Ext.lib.Dom.getViewHeight() - taskbarEl.getHeight());
          return height < 100 ? 100: height;
      };
  
      this.getWinX = function(width) {
          return (Ext.lib.Dom.getViewWidth() - width) / 2;
      };
  
      this.getWinY = function(height) {
          return (Ext.lib.Dom.getViewHeight() - taskbarEl.getHeight() - height) / 2;
      };
  
      this.setTickSize = function(xTickSize, yTickSize) {
          this.xTickSize = xTickSize;
          if (arguments.length == 1) {
              this.yTickSize = xTickSize;
          } else {
              this.yTickSize = yTickSize;
          }
          windows.each(function(win) {
              win.dd.xTickSize = this.xTickSize;
              win.dd.yTickSize = this.yTickSize;
              win.resizer.widthIncrement = this.xTickSize;
              win.resizer.heightIncrement = this.yTickSize;
          },
          this);
      };
  
      this.cascade = function() {
          var x = 0,
          y = 0;
          windows.each(function(win) {
              if (win.isVisible() && !win.maximized) {
                  win.setPosition(x, y);
                  x += 20;
                  y += 20;
              }
          },
          this);
      };
  
      this.tile = function() {
          var availWidth = desktopEl.getWidth(true);
          var x = this.xTickSize;
          var y = this.yTickSize;
          var nextY = y;
          windows.each(function(win) {
              if (win.isVisible() && !win.maximized) {
                  var w = win.el.getWidth();
  
                  //              Wrap to next row if we are not at the line start and this Window will go off the end
                  if ((x > this.xTickSize) && (x + w > availWidth)) {
                      x = this.xTickSize;
                      y = nextY;
                  }
  
                  win.setPosition(x, y);
                  x += w + this.xTickSize;
                  nextY = Math.max(nextY, y + win.el.getHeight() + this.yTickSize);
              }
          },
          this);
      };
  
      this.contextMenu = new Ext.menu.Menu({
          items: [{
              text: 'Tile',
              handler: this.tile,
              scope: this
          },
          {
              text: 'Cascade',
              handler: this.cascade,
              scope: this
          }]
      });
      desktopEl.on('contextmenu',
          function(e) {
              e.stopEvent();
              this.contextMenu.showAt(e.getXY());
          },
          this);
  
      layout();
  
      if (shortcuts) {
          shortcuts.on('click',
          function(e, t) {
              t = e.getTarget('dt', shortcuts);
              if (t) {
                  e.stopEvent();
                  var module = app.getModule(t.id.replace('-shortcut', ''));
                  if (module) {
                      module.createWindow();
                  }
              }
          });
      }
  };
  