TaskBar.js
上传用户:snow1005
上传日期:2015-11-10
资源大小:3151k
文件大小:19k
源码类别:

Ajax

开发平台:

JavaScript

  1. /*
  2.  * qWikiOffice Desktop 0.8.1
  3.  * Copyright(c) 2007-2008, Integrated Technologies, Inc.
  4.  * licensing@qwikioffice.com
  5.  * 
  6.  * http://www.qwikioffice.com/license
  7.  */
  8. Ext.namespace("Ext.ux");
  9. /**
  10.  * @class Ext.ux.TaskBar
  11.  * @extends Ext.util.Observable
  12.  */
  13. Ext.ux.TaskBar = function(app){
  14.     this.app = app;
  15.     this.init();
  16. }
  17. Ext.extend(Ext.ux.TaskBar, Ext.util.Observable, {
  18.     init : function(){
  19. this.startMenu = new Ext.ux.StartMenu(Ext.apply({
  20. iconCls: 'user',
  21. height: 300,
  22. shadow: true,
  23. title: 'Todd Murdock',
  24. width: 300
  25. }, this.app.startConfig));
  26. this.startButton = new Ext.Button({
  27.             text: 'Start',
  28.             id: 'ux-startbutton',
  29.             iconCls: 'start',
  30.             menu: this.startMenu,
  31.             menuAlign: 'bl-tl',
  32.             renderTo: 'ux-taskbar-start'
  33.         });
  34.         
  35.         var startWidth = Ext.get('ux-startbutton').getWidth() + 10;
  36.         
  37.         var sbBox = new Ext.BoxComponent({
  38. el: 'ux-taskbar-start',
  39.         id: 'TaskBarStart',
  40.         minWidth: startWidth,
  41. region:'west',
  42. split: false,
  43. width: startWidth
  44. });
  45. this.quickStartPanel = new Ext.ux.QuickStartPanel({
  46. el: 'ux-quickstart-panel',
  47.         id: 'TaskBarQuickStart',
  48.         minWidth: 60,
  49. region:'west',
  50. split: true,
  51. width: 94
  52. });
  53. this.taskButtonPanel = new Ext.ux.TaskButtonsPanel({
  54. el: 'ux-taskbuttons-panel',
  55. id: 'TaskBarButtons',
  56. region:'center'
  57. });
  58. /* this.trayPanel = new Ext.ux.QuickStartPanel({ // Todo: make the system tray
  59. el: 'ux-systemtray-panel',
  60.         id: 'TaskBarSystemTray',
  61.         minWidth: 100,
  62. region:'east',
  63. split: true,
  64. width: 180
  65. }); */
  66. var panelWrap = new Ext.Container({
  67. el: 'ux-taskbar-panel-wrap',
  68. items: [this.quickStartPanel,this.taskButtonPanel],
  69. layout: 'border',
  70. region: 'center'
  71. });
  72.         var container = new Ext.ux.TaskBarContainer({
  73. el: 'ux-taskbar',
  74. layout: 'border',
  75. items: [sbBox,panelWrap]
  76. });
  77. this.el = container.el;
  78. return this;
  79.     },
  80.     
  81. setActiveButton : function(btn){
  82. this.taskButtonPanel.setActiveButton(btn);
  83. }
  84. });
  85. /**
  86.  * @class Ext.ux.TaskBarContainer
  87.  * @extends Ext.Container
  88.  */
  89. Ext.ux.TaskBarContainer = Ext.extend(Ext.Container, {
  90.     initComponent : function() {
  91.         Ext.ux.TaskBarContainer.superclass.initComponent.call(this);
  92.         
  93.         this.el = Ext.get(this.el) || Ext.getBody();
  94.         this.el.setHeight = Ext.emptyFn;
  95.         this.el.setWidth = Ext.emptyFn;
  96.         this.el.setSize = Ext.emptyFn;
  97.         this.el.setStyle({
  98.             overflow:'hidden',
  99.             margin:'0',
  100.             border:'0 none'
  101.         });
  102.         this.el.dom.scroll = 'no';
  103.         this.allowDomMove = false;
  104.         this.autoWidth = true;
  105.         this.autoHeight = true;
  106.         Ext.EventManager.onWindowResize(this.fireResize, this);
  107.         this.renderTo = this.el;
  108.     },
  109.     fireResize : function(w, h){
  110.         this.fireEvent('resize', this, w, h, w, h);
  111.     }
  112. });
  113. /**
  114.  * @class Ext.ux.TaskButtonsPanel
  115.  * @extends Ext.BoxComponent
  116.  */
  117. Ext.ux.TaskButtonsPanel = Ext.extend(Ext.BoxComponent, {
  118. activeButton: null,
  119. enableScroll: true,
  120. scrollIncrement: 0,
  121.     scrollRepeatInterval: 400,
  122.     scrollDuration: .35,
  123.     animScroll: true,
  124.     resizeButtons: true,
  125.     buttonWidth: 168,
  126.     minButtonWidth: 118,
  127.     buttonMargin: 2,
  128.     buttonWidthSet: false,
  129. initComponent : function() {
  130.         Ext.ux.TaskButtonsPanel.superclass.initComponent.call(this);
  131.         this.on('resize', this.delegateUpdates);
  132.         this.items = [];
  133.         
  134.         this.stripWrap = Ext.get(this.el).createChild({
  135.          cls: 'ux-taskbuttons-strip-wrap',
  136.          cn: {
  137.              tag:'ul', cls:'ux-taskbuttons-strip'
  138.             }
  139. });
  140.         this.stripSpacer = Ext.get(this.el).createChild({
  141.          cls:'ux-taskbuttons-strip-spacer'
  142.         });
  143.         this.strip = new Ext.Element(this.stripWrap.dom.firstChild);
  144.         
  145.         this.edge = this.strip.createChild({
  146.          tag:'li',
  147.          cls:'ux-taskbuttons-edge'
  148.         });
  149.         this.strip.createChild({
  150.          cls:'x-clear'
  151.         });
  152. },
  153. add : function(win){
  154. var li = this.strip.createChild({tag:'li'}, this.edge); // insert before the edge
  155.         var btn = new Ext.ux.TaskBar.TaskButton(win, li);
  156. this.items.push(btn);
  157. if(!this.buttonWidthSet){
  158. this.lastButtonWidth = btn.container.getWidth();
  159. }
  160. this.setActiveButton(btn);
  161. return btn;
  162. },
  163. remove : function(btn){
  164. var li = document.getElementById(btn.container.id);
  165. btn.destroy();
  166. li.parentNode.removeChild(li);
  167. var s = [];
  168. for(var i = 0, len = this.items.length; i < len; i++) {
  169. if(this.items[i] != btn){
  170. s.push(this.items[i]);
  171. }
  172. }
  173. this.items = s;
  174. this.delegateUpdates();
  175. },
  176. setActiveButton : function(btn){
  177. this.activeButton = btn;
  178. this.delegateUpdates();
  179. },
  180. delegateUpdates : function(){
  181. /*if(this.suspendUpdates){
  182.             return;
  183.         }*/
  184.         if(this.resizeButtons && this.rendered){
  185.             this.autoSize();
  186.         }
  187.         if(this.enableScroll && this.rendered){
  188.             this.autoScroll();
  189.         }
  190.     },
  191.     
  192.     autoSize : function(){
  193.         var count = this.items.length;
  194.         var ow = this.el.dom.offsetWidth;
  195.         var aw = this.el.dom.clientWidth;
  196.         if(!this.resizeButtons || count < 1 || !aw){ // !aw for display:none
  197.             return;
  198.         }
  199.         
  200.         var each = Math.max(Math.min(Math.floor((aw-4) / count) - this.buttonMargin, this.buttonWidth), this.minButtonWidth); // -4 for float errors in IE
  201.         var btns = this.stripWrap.dom.getElementsByTagName('button');
  202.         
  203.         this.lastButtonWidth = Ext.get(btns[0].id).findParent('li').offsetWidth;
  204.         
  205.         for(var i = 0, len = btns.length; i < len; i++) {            
  206.             var btn = btns[i];
  207.             
  208.             var tw = Ext.get(btns[i].id).findParent('li').offsetWidth;
  209.             var iw = btn.offsetWidth;
  210.             
  211.             btn.style.width = (each - (tw-iw)) + 'px';
  212.         }
  213.     },
  214.     
  215.     autoScroll : function(){
  216.      var count = this.items.length;
  217.         var ow = this.el.dom.offsetWidth;
  218.         var tw = this.el.dom.clientWidth;
  219.         
  220.         var wrap = this.stripWrap;
  221.         var cw = wrap.dom.offsetWidth;
  222.         var pos = this.getScrollPos();
  223.         var l = this.edge.getOffsetsTo(this.stripWrap)[0] + pos;
  224.         
  225.         if(!this.enableScroll || count < 1 || cw < 20){ // 20 to prevent display:none issues
  226.             return;
  227.         }
  228.         
  229.         wrap.setWidth(tw); // moved to here because of problem in Safari
  230.         
  231.         if(l <= tw){
  232.             wrap.dom.scrollLeft = 0;
  233.             //wrap.setWidth(tw); moved from here because of problem in Safari
  234.             if(this.scrolling){
  235.                 this.scrolling = false;
  236.                 this.el.removeClass('x-taskbuttons-scrolling');
  237.                 this.scrollLeft.hide();
  238.                 this.scrollRight.hide();
  239.             }
  240.         }else{
  241.             if(!this.scrolling){
  242.                 this.el.addClass('x-taskbuttons-scrolling');
  243.             }
  244.             tw -= wrap.getMargins('lr');
  245.             wrap.setWidth(tw > 20 ? tw : 20);
  246.             if(!this.scrolling){
  247.                 if(!this.scrollLeft){
  248.                     this.createScrollers();
  249.                 }else{
  250.                     this.scrollLeft.show();
  251.                     this.scrollRight.show();
  252.                 }
  253.             }
  254.             this.scrolling = true;
  255.             if(pos > (l-tw)){ // ensure it stays within bounds
  256.                 wrap.dom.scrollLeft = l-tw;
  257.             }else{ // otherwise, make sure the active button is still visible
  258. this.scrollToButton(this.activeButton, true); // true to animate
  259.             }
  260.             this.updateScrollButtons();
  261.         }
  262.     },
  263.     createScrollers : function(){
  264.         var h = this.el.dom.offsetHeight; //var h = this.stripWrap.dom.offsetHeight;
  265.         // left
  266.         var sl = this.el.insertFirst({
  267.             cls:'ux-taskbuttons-scroller-left'
  268.         });
  269.         sl.setHeight(h);
  270.         sl.addClassOnOver('ux-taskbuttons-scroller-left-over');
  271.         this.leftRepeater = new Ext.util.ClickRepeater(sl, {
  272.             interval : this.scrollRepeatInterval,
  273.             handler: this.onScrollLeft,
  274.             scope: this
  275.         });
  276.         this.scrollLeft = sl;
  277.         // right
  278.         var sr = this.el.insertFirst({
  279.             cls:'ux-taskbuttons-scroller-right'
  280.         });
  281.         sr.setHeight(h);
  282.         sr.addClassOnOver('ux-taskbuttons-scroller-right-over');
  283.         this.rightRepeater = new Ext.util.ClickRepeater(sr, {
  284.             interval : this.scrollRepeatInterval,
  285.             handler: this.onScrollRight,
  286.             scope: this
  287.         });
  288.         this.scrollRight = sr;
  289.     },
  290.     
  291.     getScrollWidth : function(){
  292.         return this.edge.getOffsetsTo(this.stripWrap)[0] + this.getScrollPos();
  293.     },
  294.     getScrollPos : function(){
  295.         return parseInt(this.stripWrap.dom.scrollLeft, 10) || 0;
  296.     },
  297.     getScrollArea : function(){
  298.         return parseInt(this.stripWrap.dom.clientWidth, 10) || 0;
  299.     },
  300.     getScrollAnim : function(){
  301.         return {
  302.          duration: this.scrollDuration,
  303.          callback: this.updateScrollButtons,
  304.          scope: this
  305.         };
  306.     },
  307.     getScrollIncrement : function(){
  308.      return (this.scrollIncrement || this.lastButtonWidth+2);
  309.     },
  310.     
  311.     /* getBtnEl : function(item){
  312.         return document.getElementById(item.id);
  313.     }, */
  314.     
  315.     scrollToButton : function(item, animate){
  316.      item = item.el.dom.parentNode; // li
  317.         if(!item){ return; }
  318.         var el = item; //this.getBtnEl(item);
  319.         var pos = this.getScrollPos(), area = this.getScrollArea();
  320.         var left = Ext.fly(el).getOffsetsTo(this.stripWrap)[0] + pos;
  321.         var right = left + el.offsetWidth;
  322.         if(left < pos){
  323.             this.scrollTo(left, animate);
  324.         }else if(right > (pos + area)){
  325.             this.scrollTo(right - area, animate);
  326.         }
  327.     },
  328.     
  329.     scrollTo : function(pos, animate){
  330.         this.stripWrap.scrollTo('left', pos, animate ? this.getScrollAnim() : false);
  331.         if(!animate){
  332.             this.updateScrollButtons();
  333.         }
  334.     },
  335.     
  336.     onScrollRight : function(){
  337.         var sw = this.getScrollWidth()-this.getScrollArea();
  338.         var pos = this.getScrollPos();
  339.         var s = Math.min(sw, pos + this.getScrollIncrement());
  340.         if(s != pos){
  341.          this.scrollTo(s, this.animScroll);
  342.         }        
  343.     },
  344.     onScrollLeft : function(){
  345.         var pos = this.getScrollPos();
  346.         var s = Math.max(0, pos - this.getScrollIncrement());
  347.         if(s != pos){
  348.             this.scrollTo(s, this.animScroll);
  349.         }
  350.     },
  351.     
  352.     updateScrollButtons : function(){
  353.         var pos = this.getScrollPos();
  354.         this.scrollLeft[pos == 0 ? 'addClass' : 'removeClass']('ux-taskbuttons-scroller-left-disabled');
  355.         this.scrollRight[pos >= (this.getScrollWidth()-this.getScrollArea()) ? 'addClass' : 'removeClass']('ux-taskbuttons-scroller-right-disabled');
  356.     }
  357. });
  358. /**
  359.  * @class Ext.ux.TaskBar.TaskButton
  360.  * @extends Ext.Button
  361.  */
  362. Ext.ux.TaskBar.TaskButton = function(win, el){
  363. this.win = win;
  364.     Ext.ux.TaskBar.TaskButton.superclass.constructor.call(this, {
  365.         iconCls: win.iconCls,
  366.         text: Ext.util.Format.ellipsis(win.title, 12),
  367.         tooltip: win.taskbuttonTooltip || win.title,
  368.         renderTo: el,
  369.         handler : function(){
  370.             if(win.minimized || win.hidden){
  371.                 win.show();
  372.             }else if(win == win.manager.getActive()){
  373.                 win.minimize();
  374.             }else{
  375.                 win.toFront();
  376.             }
  377.         },
  378.         clickEvent:'mousedown'
  379.     });
  380. };
  381. Ext.extend(Ext.ux.TaskBar.TaskButton, Ext.Button, {
  382.     onRender : function(){
  383.         Ext.ux.TaskBar.TaskButton.superclass.onRender.apply(this, arguments);
  384.         this.cmenu = new Ext.menu.Menu({
  385.             items: [{
  386.              id: 'restore',
  387.                 text: 'Restore',
  388.                 handler: function(){
  389.                     if(!this.win.isVisible()){
  390.                         this.win.show();
  391.                     }else{
  392.                         this.win.restore();
  393.                     }
  394.                 },
  395.                 scope: this
  396.             },{
  397.                 id: 'minimize',
  398.                 text: 'Minimize',
  399.                 handler: this.win.minimize,
  400.                 scope: this.win
  401.             },{
  402.                 id: 'maximize',
  403.                 text: 'Maximize',
  404.                 handler: this.win.maximize,
  405.                 scope: this.win
  406.             }, '-', {
  407.                 id: 'close',
  408.                 text: 'Close',
  409.                 handler: this.closeWin.createDelegate(this, this.win, true),
  410.                 scope: this.win
  411.             }]
  412.         });
  413.         this.cmenu.on('beforeshow', function(){
  414.             var items = this.cmenu.items.items;
  415.             var w = this.win;
  416.             items[0].setDisabled(w.maximized !== true && w.hidden !== true);
  417.             items[1].setDisabled(w.minimized === true);
  418.             items[2].setDisabled(w.maximized === true || w.hidden === true);
  419. items[2].setDisabled(w.maximizable === false);
  420. items[3].setDisabled(w.closable === false);
  421.         }, this);
  422.         this.el.on('contextmenu', function(e){
  423.          e.stopEvent();
  424.             if(!this.cmenu.el){
  425.                 this.cmenu.render();
  426.             }
  427.             var xy = e.getXY();
  428.             xy[1] -= this.cmenu.el.getHeight();
  429.             this.cmenu.showAt(xy);
  430.         }, this);
  431.     },
  432.     
  433.     closeWin : function(cMenu, e, win){
  434. if(!win.isVisible()){
  435. win.show();
  436. }else{
  437. win.restore();
  438. }
  439. win.close();
  440. },
  441. /**
  442.  * override so autoWidth() is not called
  443.      * @param {String} text The text for the button
  444.      */
  445.     setText : function(text){
  446. if(text){
  447. this.text = text;
  448. if(this.el){
  449. this.el.child("td.x-btn-center " + this.buttonSelector).update(Ext.util.Format.ellipsis(text, 12));
  450. }
  451. }
  452.     },
  453.     
  454.     /**
  455.      * @param {String/Object} tooltip The tooltip for the button - can be a string or QuickTips config object
  456.      */
  457.     setTooltip : function(text){
  458.      if(text){
  459.      this.tooltip = text;
  460.          var btnEl = this.el.child(this.buttonSelector);
  461.          Ext.QuickTips.unregister(btnEl.id);
  462.         
  463.             if(typeof this.tooltip == 'object'){                
  464.                 Ext.QuickTips.register(Ext.apply({
  465.                       target: btnEl.id
  466.                 }, this.tooltip));
  467.             } else {
  468.              btnEl.dom[this.tooltipType] = this.tooltip;
  469.             }
  470.         }
  471.     }
  472. });
  473. /**
  474.  * @class Ext.ux.QuickStartPanel
  475.  * @extends Ext.BoxComponent
  476.  */
  477. Ext.ux.QuickStartPanel = Ext.extend(Ext.BoxComponent, {
  478. enableMenu: true,
  479. initComponent : function(){
  480.         Ext.ux.QuickStartPanel.superclass.initComponent.call(this);
  481.         
  482.         this.on('resize', this.delegateUpdates);
  483.         
  484.         this.menu = new Ext.menu.Menu();
  485.         
  486.         this.items = [];
  487.         
  488.         this.stripWrap = Ext.get(this.el).createChild({
  489.          cls: 'ux-quickstart-strip-wrap',
  490.          cn: {tag:'ul', cls:'ux-quickstart-strip'}
  491. });
  492.         this.stripSpacer = Ext.get(this.el).createChild({
  493.          cls:'ux-quickstart-strip-spacer'
  494.         });
  495.         
  496.         this.strip = new Ext.Element(this.stripWrap.dom.firstChild);
  497.         
  498.         this.edge = this.strip.createChild({
  499.          tag:'li',
  500.          cls:'ux-quickstart-edge'
  501.         });
  502.         
  503.         this.strip.createChild({
  504.          cls:'x-clear'
  505.         });
  506. },
  507. add : function(config){
  508. var li = this.strip.createChild({tag:'li'}, this.edge); // insert before the edge
  509.         
  510. var btn = new Ext.Button(Ext.apply(config, {
  511. cls:'x-btn-icon',
  512. menuText: config.text,
  513. renderTo: li,
  514. text: '' // do not display text
  515. }));
  516.         
  517. this.items.push(btn);
  518. this.delegateUpdates();
  519. return btn;
  520. },
  521. remove : function(btn){
  522. var li = document.getElementById(btn.container.id);
  523. btn.destroy();
  524. li.parentNode.removeChild(li);
  525. var s = [];
  526. for(var i = 0, len = this.items.length; i < len; i++) {
  527. if(this.items[i] != btn){
  528. s.push(this.items[i]);
  529. }
  530. }
  531. this.items = s;
  532. this.delegateUpdates();
  533. },
  534. menuAdd : function(config){
  535. this.menu.add(config);
  536. },
  537. delegateUpdates : function(){
  538.         if(this.enableMenu && this.rendered){
  539.          this.showButtons();
  540.          this.clearMenu();
  541.             this.autoMenu();
  542.         }
  543.     },
  544.     
  545.     showButtons : function(){
  546.      var count = this.items.length;
  547.     
  548.      for(var i = 0; i < count; i++){
  549. this.items[i].show(); 
  550. }
  551.     },
  552.     
  553.     clearMenu : function(){
  554.      this.menu.removeAll();
  555.     },
  556. autoMenu : function(){
  557.      var count = this.items.length;
  558.         var ow = this.el.dom.offsetWidth;
  559.         var tw = this.el.dom.clientWidth;
  560.         
  561.         var wrap = this.stripWrap;
  562.         var cw = wrap.dom.offsetWidth;
  563.         var l = this.edge.getOffsetsTo(this.stripWrap)[0];
  564.         
  565.         if(!this.enableMenu || count < 1 || cw < 20){ // 20 to prevent display:none issues
  566.             return;
  567.         }
  568.         
  569.         wrap.setWidth(tw);
  570.         
  571.         if(l <= tw){
  572.             if(this.showingMenu){
  573.                 this.showingMenu = false;
  574.                 this.menuButton.hide();
  575.             }
  576.         }else{
  577.          tw -= wrap.getMargins('lr');
  578.             
  579.             wrap.setWidth(tw > 20 ? tw : 20);
  580.             
  581.             if(!this.showingMenu){
  582.                 if(!this.menuButton){
  583.                     this.createMenuButton();
  584.                 }else{
  585.                     this.menuButton.show();
  586.                 }
  587.             }
  588.             
  589.             mo = this.getMenuButtonPos();
  590.             
  591.             for(var i = count-1; i >= 0; i--){
  592.              var bo = this.items[i].el.dom.offsetLeft + this.items[i].el.dom.offsetWidth;
  593.             
  594.              if(bo > mo){
  595.              this.items[i].hide();
  596.              var ic = this.items[i].initialConfig,
  597.              config = {
  598.              iconCls: ic.iconCls,
  599.              handler: ic.handler,
  600.              scope: ic.scope,
  601.              text: ic.menuText
  602.              };
  603.             
  604.              this.menuAdd(config);
  605.              }else{
  606.              this.items[i].show();
  607.              }
  608.             }
  609.             
  610.             this.showingMenu = true;
  611.         }
  612.     },
  613.     
  614.     createMenuButton : function(){
  615.     
  616.         var h = this.el.dom.offsetHeight;
  617.         var mb = this.el.insertFirst({
  618.             cls:'ux-quickstart-menubutton-wrap'
  619.         });
  620.         
  621.         mb.setHeight(h);
  622.         
  623.         var btn = new Ext.Button({
  624.          cls:'x-btn-icon',
  625.          id: 'ux-quickstart-menubutton',
  626.          menu: this.menu,
  627.          renderTo: mb
  628.         });
  629.         
  630.         mb.setWidth(Ext.get('ux-quickstart-menubutton').getWidth());
  631.         
  632.         this.menuButton = mb;
  633.     },
  634.     
  635.     getMenuButtonPos : function(){
  636.      return this.menuButton.dom.offsetLeft;
  637.     }
  638. });