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

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. /**
  9.  * @class Ext.ux.StartMenu
  10.  * @extends Ext.menu.Menu
  11.  * A start menu object.
  12.  * @constructor
  13.  * Creates a new StartMenu
  14.  * @param {Object} config Configuration options
  15.  *
  16.  * SAMPLE USAGE:
  17.  *
  18.  * this.startMenu = new Ext.ux.StartMenu({
  19.  * iconCls: 'user',
  20.  * height: 300,
  21.  * shadow: true,
  22.  * title: get_cookie('memberName'),
  23.  * toolPanelWidth: 110,
  24.  * width: 300
  25.  * });
  26.  *
  27.  * this.startMenu.add({
  28.  * text: 'Grid Window',
  29.  * iconCls:'icon-grid',
  30.  * handler : this.createWindow,
  31.  * scope: this
  32.  * });
  33.  *
  34.  * this.startMenu.addTool({
  35.  * text:'Logout',
  36.  * iconCls:'logout',
  37.  * handler:function(){ window.location = "logout.php"; },
  38.  * scope:this
  39.  * });
  40.  */
  41. Ext.namespace("Ext.ux");
  42. Ext.ux.StartMenu = function(config){
  43. Ext.ux.StartMenu.superclass.constructor.call(this, config);
  44.     
  45.     var tools = this.toolItems;
  46.     this.toolItems = new Ext.util.MixedCollection();
  47.     if(tools){
  48.         this.addTool.apply(this, tools);
  49.     }
  50. };
  51. Ext.extend(Ext.ux.StartMenu, Ext.menu.Menu, {
  52. height : 300,
  53. toolPanelWidth : 100,
  54. width : 300,
  55.     // private
  56.     render : function(){
  57.         if(this.el){
  58.             return;
  59.         }
  60.         var el = this.el = new Ext.Layer({
  61.             cls: "x-menu ux-start-menu",
  62.             shadow:this.shadow,
  63.             constrain: false,
  64.             parentEl: this.parentEl || document.body,
  65.             zindex:15000
  66.         });
  67.         
  68.         var header = el.createChild({
  69.          tag: "div" /*,
  70.          cls: "x-window-header x-unselectable x-panel-icon "//+this.iconCls */
  71.         });
  72.         header.setStyle('padding', '7px 0 0 0');
  73.         
  74. this.header = header;
  75. /* Don't create header text span tag.
  76.  * Can be uncommented.
  77. var headerText = header.createChild({
  78. tag: "span",
  79. cls: "x-window-header-text"
  80. }); */
  81. var tl = header.wrap({
  82. cls: "ux-start-menu-tl"
  83. });
  84. var tr = header.wrap({
  85. cls: "ux-start-menu-tr"
  86. });
  87. var tc = header.wrap({
  88. cls: "ux-start-menu-tc"
  89. });
  90. this.menuBWrap = el.createChild({
  91. tag: "div",
  92. cls: "ux-start-menu-body x-border-layout-ct ux-start-menu-body"
  93. });
  94. var ml = this.menuBWrap.wrap({
  95. cls: "ux-start-menu-ml"
  96. });
  97. var mc = this.menuBWrap.wrap({
  98. cls: "ux-start-menu-mc ux-start-menu-bwrap"
  99. });
  100. this.menuPanel = this.menuBWrap.createChild({
  101. tag: "div",
  102. cls: "x-panel x-border-panel ux-start-menu-apps-panel opaque"
  103. });
  104. this.toolsPanel = this.menuBWrap.createChild({
  105. tag: "div",
  106. cls: "x-panel x-border-panel ux-start-menu-tools-panel"
  107. });
  108. var bwrap = ml.wrap({cls: "x-window-bwrap"});
  109. var bc = bwrap.createChild({
  110. tag: "div",
  111. cls: "ux-start-menu-bc"
  112. });
  113. var bl = bc.wrap({
  114. cls: "ux-start-menu-bl x-panel-nofooter"
  115. });
  116. var br = bc.wrap({
  117. cls: "ux-start-menu-br"
  118. });
  119. bc.setStyle({
  120. height: '0px',
  121. padding: '0 0 6px 0'
  122. });
  123.         this.keyNav = new Ext.menu.MenuNav(this);
  124.         if(this.plain){
  125.             el.addClass("x-menu-plain");
  126.         }
  127.         if(this.cls){
  128.             el.addClass(this.cls);
  129.         }
  130.         // generic focus element
  131.         this.focusEl = el.createChild({
  132.             tag: "a",
  133.             cls: "x-menu-focus",
  134.             href: "#",
  135.             onclick: "return false;",
  136.             tabIndex:"-1"
  137.         });
  138.         
  139.         var ul = this.menuPanel.createChild({
  140.          tag: "ul",
  141.          cls: "x-menu-list"});
  142.         var toolsUl = this.toolsPanel.createChild({
  143.          tag: "ul",
  144.          cls: "x-menu-list"
  145.         });
  146.         
  147.         var ulListeners = {
  148.          "click": {
  149.          fn: this.onClick,
  150.          scope: this
  151.          },
  152.          "mouseover": {
  153.          fn: this.onMouseOver,
  154.          scope: this
  155.          },
  156.          "mouseout": {
  157.          fn: this.onMouseOut,
  158.          scope: this
  159.          }
  160.         };
  161.         
  162.         ul.on(ulListeners);
  163.         
  164.         this.items.each(
  165.          function(item){
  166.             var li = document.createElement("li");
  167.             li.className = "x-menu-list-item";
  168.             ul.dom.appendChild(li);
  169.             item.render(li, this);
  170.         }, this);
  171.         this.ul = ul;
  172.         this.autoWidth();
  173.         toolsUl.on(ulListeners);
  174.         
  175.         this.toolItems.each(
  176.          function(item){
  177.             var li = document.createElement("li");
  178.             li.className = "x-menu-list-item";
  179.             toolsUl.dom.appendChild(li);
  180.             item.render(li, this);
  181.         }, this);
  182.         
  183.         this.toolsUl = toolsUl;
  184.         this.autoWidth();
  185.              
  186.         this.menuBWrap.setStyle('position', 'relative');  
  187.         this.menuBWrap.setHeight(this.height);
  188.         
  189.         this.menuPanel.setStyle({
  190.          padding: '2px',
  191.          position: 'absolute',
  192.          overflow: 'auto'
  193.         });
  194.         
  195.         this.toolsPanel.setStyle({
  196.          padding: '2px 4px 2px 2px',
  197.          position: 'absolute',
  198.          overflow: 'auto'
  199.         });
  200.         
  201.         this.setTitle(this.title);
  202.     },
  203.     
  204.     // private
  205.     findTargetItem : function(e){
  206.         var t = e.getTarget(".x-menu-list-item", this.ul,  true);
  207.         if(t && t.menuItemId){
  208.          if(this.items.get(t.menuItemId)){
  209.              return this.items.get(t.menuItemId);
  210.             }else{
  211.              return this.toolItems.get(t.menuItemId);
  212.             }
  213.         }
  214.     },
  215.     /**
  216.      * Displays this menu relative to another element
  217.      * @param {Mixed} element The element to align to
  218.      * @param {String} position (optional) The {@link Ext.Element#alignTo} anchor position to use in aligning to
  219.      * the element (defaults to this.defaultAlign)
  220.      * @param {Ext.ux.StartMenu} parentMenu (optional) This menu's parent menu, if applicable (defaults to undefined)
  221.      */
  222.     show : function(el, pos, parentMenu){
  223.         this.parentMenu = parentMenu;
  224.         if(!this.el){
  225.             this.render();
  226.         }
  227.         this.fireEvent("beforeshow", this);
  228.         this.showAt(this.el.getAlignToXY(el, pos || this.defaultAlign), parentMenu, false);
  229.         
  230.         var tPanelWidth = this.toolPanelWidth;      
  231.         var box = this.menuBWrap.getBox();
  232.         this.menuPanel.setWidth(box.width-tPanelWidth);
  233.         this.menuPanel.setHeight(box.height);
  234.         
  235.         this.toolsPanel.setWidth(tPanelWidth);
  236.         this.toolsPanel.setX(box.x+box.width-tPanelWidth);
  237.         this.toolsPanel.setHeight(box.height);
  238.     },
  239.     
  240.     addTool : function(){
  241.         var a = arguments, l = a.length, item;
  242.         for(var i = 0; i < l; i++){
  243.             var el = a[i];
  244.             if(el.render){ // some kind of Item
  245.                 item = this.addToolItem(el);
  246.             }else if(typeof el == "string"){ // string
  247.                 if(el == "separator" || el == "-"){
  248.                     item = this.addToolSeparator();
  249.                 }else{
  250.                     item = this.addText(el);
  251.                 }
  252.             }else if(el.tagName || el.el){ // element
  253.                 item = this.addElement(el);
  254.             }else if(typeof el == "object"){ // must be menu item config?
  255.                 item = this.addToolMenuItem(el);
  256.             }
  257.         }
  258.         return item;
  259.     },
  260.     
  261.     /**
  262.      * Adds a separator bar to the Tools
  263.      * @return {Ext.menu.Item} The menu item that was added
  264.      */
  265.     addToolSeparator : function(){
  266.         return this.addToolItem(new Ext.menu.Separator({itemCls: 'ux-toolmenu-sep'}));
  267.     },
  268.     addToolItem : function(item){
  269.         this.toolItems.add(item);
  270.         if(this.toolsUl){
  271.             var li = document.createElement("li");
  272.             li.className = "x-menu-list-item";
  273.             this.toolsUl.dom.appendChild(li);
  274.             item.render(li, this);
  275.             this.delayAutoWidth();
  276.         }
  277.         return item;
  278.     },
  279.     addToolMenuItem : function(config){
  280.         if(!(config instanceof Ext.menu.Item)){
  281.             if(typeof config.checked == "boolean"){ // must be check menu item config?
  282.                 config = new Ext.menu.CheckItem(config);
  283.             }else{
  284.                 config = new Ext.menu.Item(config);
  285.                 //config = new Ext.menu.Adapter(this.getToolButton(config), {canActivate:true});
  286.             }
  287.         }
  288.         return this.addToolItem(config);
  289.     },
  290.     
  291.     setTitle : function(title, iconCls){
  292.         this.title = title;
  293.         if(this.header.child('span')){
  294.          this.header.child('span').update(title);
  295.         }
  296.         return this;
  297.     },
  298.     
  299.     getToolButton : function(config){
  300.      var btn = new Ext.Button({
  301. handler: config.handler,
  302. //iconCls: config.iconCls,
  303. minWidth: this.toolPanelWidth-10,
  304. scope: config.scope,
  305. text: config.text
  306. });
  307.      return btn;
  308.     }
  309. });