StartMenu.js
上传用户:shuoshiled
上传日期:2018-01-28
资源大小:10124k
文件大小:7k
源码类别:

中间件编程

开发平台:

JavaScript

  1. /*!  * Ext JS Library 3.0.0  * Copyright(c) 2006-2009 Ext JS, LLC  * licensing@extjs.com  * http://www.extjs.com/license  */ /**
  2.  * @class Ext.ux.StartMenu
  3.  * @extends Ext.menu.Menu
  4.  * A start menu object.
  5.  * @constructor
  6.  * Creates a new StartMenu
  7.  * @param {Object} config Configuration options
  8.  *
  9.  * SAMPLE USAGE:
  10.  *
  11.  * this.startMenu = new Ext.ux.StartMenu({
  12.  * iconCls: 'user',
  13.  * height: 300,
  14.  * shadow: true,
  15.  * title: get_cookie('memberName'),
  16.  * width: 300
  17.  * });
  18.  *
  19.  * this.startMenu.add({
  20.  * text: 'Grid Window',
  21.  * iconCls:'icon-grid',
  22.  * handler : this.createWindow,
  23.  * scope: this
  24.  * });
  25.  *
  26.  * this.startMenu.addTool({
  27.  * text:'Logout',
  28.  * iconCls:'logout',
  29.  * handler:function(){ window.location = "logout.php"; },
  30.  * scope:this
  31.  * });
  32.  */
  33. Ext.namespace("Ext.ux");
  34. Ext.ux.StartMenu = Ext.extend(Ext.menu.Menu, {
  35.     initComponent: function(config) {
  36.      Ext.ux.StartMenu.superclass.initComponent.call(this, config);
  37.         var tools = this.toolItems;
  38.         this.toolItems = new Ext.util.MixedCollection();
  39.         if(tools){
  40.             this.addTool.apply(this, tools);
  41.         }
  42.     },
  43.     // private
  44.     onRender : function(ct, position){
  45.         Ext.ux.StartMenu.superclass.onRender.call(this, ct, position);
  46.         var el = this.el.addClass('ux-start-menu');
  47.         var header = el.createChild({
  48.          tag: "div",
  49.          cls: "x-window-header x-unselectable x-panel-icon "+this.iconCls
  50.         });
  51. this.header = header;
  52. var headerText = header.createChild({
  53. tag: "span",
  54. cls: "x-window-header-text"
  55. });
  56. var tl = header.wrap({
  57. cls: "ux-start-menu-tl"
  58. });
  59. var tr = header.wrap({
  60. cls: "ux-start-menu-tr"
  61. });
  62. var tc = header.wrap({
  63. cls: "ux-start-menu-tc"
  64. });
  65. this.menuBWrap = el.createChild({
  66. tag: "div",
  67. cls: "x-window-body x-border-layout-ct ux-start-menu-body"
  68. });
  69. var ml = this.menuBWrap.wrap({
  70. cls: "ux-start-menu-ml"
  71. });
  72. var mc = this.menuBWrap.wrap({
  73. cls: "x-window-mc ux-start-menu-bwrap"
  74. });
  75. this.menuPanel = this.menuBWrap.createChild({
  76. tag: "div",
  77. cls: "x-panel x-border-panel ux-start-menu-apps-panel"
  78. });
  79. this.toolsPanel = this.menuBWrap.createChild({
  80. tag: "div",
  81. cls: "x-panel x-border-panel ux-start-menu-tools-panel"
  82. });
  83. var bwrap = ml.wrap({cls: "x-window-bwrap"});
  84. var bc = bwrap.createChild({
  85. tag: "div",
  86. cls: "ux-start-menu-bc"
  87. });
  88. var bl = bc.wrap({
  89. cls: "ux-start-menu-bl x-panel-nofooter"
  90. });
  91. var br = bc.wrap({
  92. cls: "ux-start-menu-br"
  93. });
  94.         this.ul.appendTo(this.menuPanel);
  95.         var toolsUl = this.toolsPanel.createChild({
  96.          tag: "ul",
  97.          cls: "x-menu-list"
  98.         });
  99.         this.mon(toolsUl, 'click', this.onClick, this);
  100.         this.mon(toolsUl, 'mouseover', this.onMouseOver, this);
  101.         this.mon(toolsUl, 'mouseout', this.onMouseOut, this);
  102.         this.items.each(function(item){
  103.             item.parentMenu = this;
  104.         }, this);
  105.         this.toolItems.each(
  106.          function(item){
  107.             var li = document.createElement("li");
  108.             li.className = "x-menu-list-item";
  109.             toolsUl.dom.appendChild(li);
  110.             item.render(li);
  111.                 item.parentMenu = this;
  112.         }, this);
  113.         this.toolsUl = toolsUl;
  114.         this.menuBWrap.setStyle('position', 'relative');
  115.         this.menuBWrap.setHeight(this.height - 28);
  116.         this.menuPanel.setStyle({
  117.          padding: '2px',
  118.          position: 'absolute',
  119.          overflow: 'auto'
  120.         });
  121.         this.toolsPanel.setStyle({
  122.          padding: '2px 4px 2px 2px',
  123.          position: 'absolute',
  124.          overflow: 'auto'
  125.         });
  126.         this.setTitle(this.title);
  127.     },
  128.     // private
  129.     findTargetItem : function(e){
  130.         var t = e.getTarget(".x-menu-list-item", this.ul,  true);
  131.         if(t && t.menuItemId){
  132.          if(this.items.get(t.menuItemId)){
  133.              return this.items.get(t.menuItemId);
  134.             }else{
  135.              return this.toolItems.get(t.menuItemId);
  136.             }
  137.         }
  138.     },
  139.     /**
  140.      * Displays this menu relative to another element
  141.      * @param {Mixed} element The element to align to
  142.      * @param {String} position (optional) The {@link Ext.Element#alignTo} anchor position to use in aligning to
  143.      * the element (defaults to this.defaultAlign)
  144.      * @param {Ext.ux.StartMenu} parentMenu (optional) This menu's parent menu, if applicable (defaults to undefined)
  145.      */
  146.     show : function(el, pos, parentMenu){
  147.         this.parentMenu = parentMenu;
  148.         if(!this.el){
  149.             this.render();
  150.         }
  151.         this.fireEvent("beforeshow", this);
  152.         this.showAt(this.el.getAlignToXY(el, pos || this.defaultAlign), parentMenu, false);
  153.         var tPanelWidth = 100;
  154.         var box = this.menuBWrap.getBox();
  155.         this.menuPanel.setWidth(box.width-tPanelWidth);
  156.         this.menuPanel.setHeight(box.height);
  157.         this.toolsPanel.setWidth(tPanelWidth);
  158.         this.toolsPanel.setX(box.x+box.width-tPanelWidth);
  159.         this.toolsPanel.setHeight(box.height);
  160.     },
  161.     addTool : function(){
  162.         var a = arguments, l = a.length, item;
  163.         for(var i = 0; i < l; i++){
  164.             var el = a[i];
  165.             if(el.render){ // some kind of Item
  166.                 item = this.addToolItem(el);
  167.             }else if(typeof el == "string"){ // string
  168.                 if(el == "separator" || el == "-"){
  169.                     item = this.addToolSeparator();
  170.                 }else{
  171.                     item = this.addText(el);
  172.                 }
  173.             }else if(el.tagName || el.el){ // element
  174.                 item = this.addElement(el);
  175.             }else if(typeof el == "object"){ // must be menu item config?
  176.                 item = this.addToolMenuItem(el);
  177.             }
  178.         }
  179.         return item;
  180.     },
  181.     /**
  182.      * Adds a separator bar to the Tools
  183.      * @return {Ext.menu.Item} The menu item that was added
  184.      */
  185.     addToolSeparator : function(){
  186.         return this.addToolItem(new Ext.menu.Separator({itemCls: 'ux-toolmenu-sep'}));
  187.     },
  188.     addToolItem : function(item){
  189.         this.toolItems.add(item);
  190.         if(this.ul){
  191.             var li = document.createElement("li");
  192.             li.className = "x-menu-list-item";
  193.             this.ul.dom.appendChild(li);
  194.             item.render(li, this);
  195.             this.delayAutoWidth();
  196.         }
  197.         return item;
  198.     },
  199.     addToolMenuItem : function(config){
  200.         if(!(config instanceof Ext.menu.Item)){
  201.             if(typeof config.checked == "boolean"){ // must be check menu item config?
  202.                 config = new Ext.menu.CheckItem(config);
  203.             }else{
  204.                 config = new Ext.menu.Item(config);
  205.             }
  206.         }
  207.         return this.addToolItem(config);
  208.     },
  209.     setTitle : function(title, iconCls){
  210.         this.title = title;
  211.         this.header.child('span').update(title);
  212.         return this;
  213.     }
  214. });