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

中间件编程

开发平台:

JavaScript

  1. /*!
  2.  * Ext JS Library 3.0.0
  3.  * Copyright(c) 2006-2009 Ext JS, LLC
  4.  * licensing@extjs.com
  5.  * http://www.extjs.com/license
  6.  */
  7. Ext.BLANK_IMAGE_URL = 'resources/s.gif';
  8. Docs = {};
  9. ApiPanel = function() {
  10.     ApiPanel.superclass.constructor.call(this, {
  11.         id:'api-tree',
  12.         region:'west',
  13.         split:true,
  14.         width: 280,
  15.         minSize: 175,
  16.         maxSize: 500,
  17.         collapsible: true,
  18.         margins:'0 0 5 5',
  19.         cmargins:'0 0 0 0',
  20.         rootVisible:false,
  21.         lines:false,
  22.         autoScroll:true,
  23.         animCollapse:false,
  24.         animate: false,
  25.         collapseMode:'mini',
  26.         loader: new Ext.tree.TreeLoader({
  27. preloadChildren: true,
  28. clearOnLoad: false
  29. }),
  30.         root: new Ext.tree.AsyncTreeNode({
  31.             text:'Ext JS',
  32.             id:'root',
  33.             expanded:true,
  34.             children:[Docs.classData]
  35.          }),
  36.         collapseFirst:false
  37.     });
  38.     // no longer needed!
  39.     //new Ext.tree.TreeSorter(this, {folderSort:true,leafAttr:'isClass'});
  40.     this.getSelectionModel().on('beforeselect', function(sm, node){
  41.         return node.isLeaf();
  42.     });
  43. };
  44. Ext.extend(ApiPanel, Ext.tree.TreePanel, {
  45.     selectClass : function(cls){
  46.         if(cls){
  47.             var parts = cls.split('.');
  48.             var last = parts.length-1;
  49.             var res = [];
  50.             var pkg = [];
  51.             for(var i = 0; i < last; i++){ // things get nasty - static classes can have .
  52.                 var p = parts[i];
  53.                 var fc = p.charAt(0);
  54.                 var staticCls = fc.toUpperCase() == fc;
  55.                 if(p == 'Ext' || !staticCls){
  56.                     pkg.push(p);
  57.                     res[i] = 'pkg-'+pkg.join('.');
  58.                 }else if(staticCls){
  59.                     --last;
  60.                     res.splice(i, 1);
  61.                 }
  62.             }
  63.             res[last] = cls;
  64.             this.selectPath('/root/apidocs/'+res.join('/'));
  65.         }
  66.     }
  67. });
  68. DocPanel = Ext.extend(Ext.Panel, {
  69.     closable: true,
  70.     autoScroll:true,
  71.     initComponent : function(){
  72.         var ps = this.cclass.split('.');
  73.         this.title = ps[ps.length-1];
  74.         DocPanel.superclass.initComponent.call(this);
  75.     },
  76.     scrollToMember : function(member){
  77.         var el = Ext.fly(this.cclass + '-' + member);
  78.         if(el){
  79.             var top = (el.getOffsetsTo(this.body)[1]) + this.body.dom.scrollTop;
  80.             this.body.scrollTo('top', top-25, {duration:.75, callback: this.hlMember.createDelegate(this, [member])});
  81.         }
  82.     },
  83. scrollToSection : function(id){
  84. var el = Ext.getDom(id);
  85. if(el){
  86. var top = (Ext.fly(el).getOffsetsTo(this.body)[1]) + this.body.dom.scrollTop;
  87. this.body.scrollTo('top', top-25, {duration:.5, callback: function(){
  88.                 Ext.fly(el).next('h2').pause(.2).highlight('#8DB2E3', {attr:'color'});
  89.             }});
  90.         }
  91. },
  92.     hlMember : function(member){
  93.         var el = Ext.fly(this.cclass + '-' + member);
  94.         if(el){
  95.             el.up('tr').highlight('#cadaf9');
  96.         }
  97.     }
  98. });
  99. MainPanel = function(){
  100. this.searchStore = new Ext.data.Store({
  101.         proxy: new Ext.data.ScriptTagProxy({
  102.             url: 'http://extjs.com/playpen/api.php'
  103.         }),
  104.         reader: new Ext.data.JsonReader({
  105.             root: 'data'
  106.         }, 
  107. ['cls', 'member', 'type', 'doc']
  108. ),
  109. baseParams: {},
  110.         listeners: {
  111.             'beforeload' : function(){
  112.                 this.baseParams.qt = Ext.getCmp('search-type').getValue();
  113.             }
  114.         }
  115.     }); 
  116.     MainPanel.superclass.constructor.call(this, {
  117.         id:'doc-body',
  118.         region:'center',
  119.         margins:'0 5 5 0',
  120.         resizeTabs: true,
  121.         minTabWidth: 135,
  122.         tabWidth: 135,
  123.         plugins: new Ext.ux.TabCloseMenu(),
  124.         enableTabScroll: true,
  125.         activeTab: 0,
  126.         items: {
  127.             id:'welcome-panel',
  128.             title: 'API Home',
  129.             autoLoad: {url: 'welcome.html', callback: this.initSearch, scope: this},
  130.             iconCls:'icon-docs',
  131.             autoScroll: true,
  132. tbar: [
  133. 'Search: ', ' ',
  134.                 new Ext.ux.SelectBox({
  135.                     listClass:'x-combo-list-small',
  136.                     width:90,
  137.                     value:'Starts with',
  138.                     id:'search-type',
  139.                     store: new Ext.data.SimpleStore({
  140.                         fields: ['text'],
  141.                         expandData: true,
  142.                         data : ['Starts with', 'Ends with', 'Any match']
  143.                     }),
  144.                     displayField: 'text'
  145.                 }), ' ',
  146.                 new Ext.app.SearchField({
  147.                 width:240,
  148. store: this.searchStore,
  149. paramName: 'q'
  150.             })
  151.             ]
  152.         }
  153.     });
  154. };
  155. Ext.extend(MainPanel, Ext.TabPanel, {
  156.     initEvents : function(){
  157.         MainPanel.superclass.initEvents.call(this);
  158.         this.body.on('click', this.onClick, this);
  159.     },
  160.     onClick: function(e, target){
  161.         if(target = e.getTarget('a:not(.exi)', 3)){
  162.             var cls = Ext.fly(target).getAttributeNS('ext', 'cls');
  163.             e.stopEvent();
  164.             if(cls){
  165.                 var member = Ext.fly(target).getAttributeNS('ext', 'member');
  166.                 this.loadClass(target.href, cls, member);
  167.             }else if(target.className == 'inner-link'){
  168.                 this.getActiveTab().scrollToSection(target.href.split('#')[1]);
  169.             }else{
  170.                 window.open(target.href);
  171.             }
  172.         }else if(target = e.getTarget('.micon', 2)){
  173.             e.stopEvent();
  174.             var tr = Ext.fly(target.parentNode);
  175.             if(tr.hasClass('expandable')){
  176.                 tr.toggleClass('expanded');
  177.             }
  178.         }
  179.     },
  180.     loadClass : function(href, cls, member){
  181.         var id = 'docs-' + cls;
  182.         var tab = this.getComponent(id);
  183.         if(tab){
  184.             this.setActiveTab(tab);
  185.             if(member){
  186.                 tab.scrollToMember(member);
  187.             }
  188.         }else{
  189.             var autoLoad = {url: href};
  190.             if(member){
  191.                 autoLoad.callback = function(){
  192.                     Ext.getCmp(id).scrollToMember(member);
  193.                 }
  194.             }
  195.             var p = this.add(new DocPanel({
  196.                 id: id,
  197.                 cclass : cls,
  198.                 autoLoad: autoLoad,
  199.                 iconCls: Docs.icons[cls]
  200.             }));
  201.             this.setActiveTab(p);
  202.         }
  203.     },
  204. initSearch : function(){
  205. // Custom rendering Template for the View
  206.     var resultTpl = new Ext.XTemplate(
  207.         '<tpl for=".">',
  208.         '<div class="search-item">',
  209.             '<a class="member" ext:cls="{cls}" ext:member="{member}" href="output/{cls}.html">',
  210. '<img src="resources/images/default/s.gif" class="item-icon icon-{type}"/>{member}',
  211. '</a> ',
  212. '<a class="cls" ext:cls="{cls}" href="output/{cls}.html">{cls}</a>',
  213.             '<p>{doc}</p>',
  214.         '</div></tpl>'
  215.     );
  216. var p = new Ext.DataView({
  217.             applyTo: 'search',
  218. tpl: resultTpl,
  219. loadingText:'Searching...',
  220.             store: this.searchStore,
  221.             itemSelector: 'div.search-item',
  222. emptyText: '<h3>Use the search field above to search the Ext API for classes, properties, config options, methods and events.</h3>'
  223.         });
  224. },
  225. doSearch : function(e){
  226. var k = e.getKey();
  227. if(!e.isSpecialKey()){
  228. var text = e.target.value;
  229. if(!text){
  230. this.searchStore.baseParams.q = '';
  231. this.searchStore.removeAll();
  232. }else{
  233. this.searchStore.baseParams.q = text;
  234. this.searchStore.reload();
  235. }
  236. }
  237. }
  238. });
  239. Ext.onReady(function(){
  240.     Ext.QuickTips.init();
  241.     var api = new ApiPanel();
  242.     var mainPanel = new MainPanel();
  243.     api.on('click', function(node, e){
  244.          if(node.isLeaf()){
  245.             e.stopEvent();
  246.             mainPanel.loadClass(node.attributes.href, node.id);
  247.          }
  248.     });
  249.     mainPanel.on('tabchange', function(tp, tab){
  250.         api.selectClass(tab.cclass); 
  251.     });
  252.     var hd = new Ext.Panel({
  253.         border: false,
  254.         layout:'anchor',
  255.         region:'north',
  256.         cls: 'docs-header',
  257.         height:60,
  258.         items: [{
  259.             xtype:'box',
  260.             el:'header',
  261.             border:false,
  262.             anchor: 'none -25'
  263.         },
  264.         new Ext.Toolbar({
  265.             cls:'top-toolbar',
  266.             items:[ ' ',
  267. new Ext.form.TextField({
  268. width: 200,
  269. emptyText:'Find a Class',
  270. listeners:{
  271. render: function(f){
  272. f.el.on('keydown', filterTree, f, {buffer: 350});
  273. }
  274. }
  275. }), ' ', ' ',
  276. {
  277.                 iconCls: 'icon-expand-all',
  278. tooltip: 'Expand All',
  279.                 handler: function(){ api.root.expand(true); }
  280.             }, '-', {
  281.                 iconCls: 'icon-collapse-all',
  282.                 tooltip: 'Collapse All',
  283.                 handler: function(){ api.root.collapse(true); }
  284.             }, '->', {
  285.                 tooltip:'Hide Inherited Members',
  286.                 iconCls: 'icon-hide-inherited',
  287.                 enableToggle: true,
  288.                 toggleHandler : function(b, pressed){
  289.                      mainPanel[pressed ? 'addClass' : 'removeClass']('hide-inherited');
  290.                 }
  291.             }, '-', {
  292.                 tooltip:'Expand All Members',
  293.                 iconCls: 'icon-expand-members',
  294.                 enableToggle: true,
  295.                 toggleHandler : function(b, pressed){
  296.                     mainPanel[pressed ? 'addClass' : 'removeClass']('full-details');
  297.                 }
  298.             }]
  299.         })]
  300.     })
  301.     var viewport = new Ext.Viewport({
  302.         layout:'border',
  303.         items:[ hd, api, mainPanel ]
  304.     });
  305.     api.expandPath('/root/apidocs');
  306.     // allow for link in
  307.     var page = window.location.href.split('?')[1];
  308.     if(page){
  309.         var ps = Ext.urlDecode(page);
  310.         var cls = ps['class'];
  311.         mainPanel.loadClass('output/' + cls + '.html', cls, ps.member);
  312.     }
  313.     
  314.     viewport.doLayout();
  315. setTimeout(function(){
  316.         Ext.get('loading').remove();
  317.         Ext.get('loading-mask').fadeOut({remove:true});
  318.     }, 250);
  319. var filter = new Ext.tree.TreeFilter(api, {
  320. clearBlank: true,
  321. autoClear: true
  322. });
  323. var hiddenPkgs = [];
  324. function filterTree(e){
  325. var text = e.target.value;
  326. Ext.each(hiddenPkgs, function(n){
  327. n.ui.show();
  328. });
  329. if(!text){
  330. filter.clear();
  331. return;
  332. }
  333. api.expandAll();
  334. var re = new RegExp('^' + Ext.escapeRe(text), 'i');
  335. filter.filterBy(function(n){
  336. return !n.attributes.isClass || re.test(n.text);
  337. });
  338. // hide empty packages that weren't filtered
  339. hiddenPkgs = [];
  340. api.root.cascade(function(n){
  341. if(!n.attributes.isClass && n.ui.ctNode.offsetHeight < 3){
  342. n.ui.hide();
  343. hiddenPkgs.push(n);
  344. }
  345. });
  346. }
  347. });
  348. Ext.app.SearchField = Ext.extend(Ext.form.TwinTriggerField, {
  349.     initComponent : function(){
  350.         if(!this.store.baseParams){
  351. this.store.baseParams = {};
  352. }
  353. Ext.app.SearchField.superclass.initComponent.call(this);
  354. this.on('specialkey', function(f, e){
  355.             if(e.getKey() == e.ENTER){
  356.                 this.onTrigger2Click();
  357.             }
  358.         }, this);
  359.     },
  360.     validationEvent:false,
  361.     validateOnBlur:false,
  362.     trigger1Class:'x-form-clear-trigger',
  363.     trigger2Class:'x-form-search-trigger',
  364.     hideTrigger1:true,
  365.     width:180,
  366.     hasSearch : false,
  367.     paramName : 'query',
  368.     onTrigger1Click : function(){
  369.         if(this.hasSearch){
  370.             this.store.baseParams[this.paramName] = '';
  371. this.store.removeAll();
  372. this.el.dom.value = '';
  373.             this.triggers[0].hide();
  374.             this.hasSearch = false;
  375. this.focus();
  376.         }
  377.     },
  378.     onTrigger2Click : function(){
  379.         var v = this.getRawValue();
  380.         if(v.length < 1){
  381.             this.onTrigger1Click();
  382.             return;
  383.         }
  384. if(v.length < 2){
  385. Ext.Msg.alert('Invalid Search', 'You must enter a minimum of 2 characters to search the API');
  386. return;
  387. }
  388. this.store.baseParams[this.paramName] = v;
  389.         var o = {start: 0};
  390.         this.store.reload({params:o});
  391.         this.hasSearch = true;
  392.         this.triggers[0].show();
  393. this.focus();
  394.     }
  395. });
  396. /**
  397.  * Makes a ComboBox more closely mimic an HTML SELECT.  Supports clicking and dragging
  398.  * through the list, with item selection occurring when the mouse button is released.
  399.  * When used will automatically set {@link #editable} to false and call {@link Ext.Element#unselectable}
  400.  * on inner elements.  Re-enabling editable after calling this will NOT work.
  401.  *
  402.  * @author Corey Gilmore
  403.  * http://extjs.com/forum/showthread.php?t=6392
  404.  *
  405.  * @history 2007-07-08 jvs
  406.  * Slight mods for Ext 2.0
  407.  */
  408. Ext.ux.SelectBox = function(config){
  409. this.searchResetDelay = 1000;
  410. config = config || {};
  411. config = Ext.apply(config || {}, {
  412. editable: false,
  413. forceSelection: true,
  414. rowHeight: false,
  415. lastSearchTerm: false,
  416.         triggerAction: 'all',
  417.         mode: 'local'
  418.     });
  419. Ext.ux.SelectBox.superclass.constructor.apply(this, arguments);
  420. this.lastSelectedIndex = this.selectedIndex || 0;
  421. };
  422. Ext.extend(Ext.ux.SelectBox, Ext.form.ComboBox, {
  423.     lazyInit: false,
  424. initEvents : function(){
  425. Ext.ux.SelectBox.superclass.initEvents.apply(this, arguments);
  426. // you need to use keypress to capture upper/lower case and shift+key, but it doesn't work in IE
  427. this.el.on('keydown', this.keySearch, this, true);
  428. this.cshTask = new Ext.util.DelayedTask(this.clearSearchHistory, this);
  429. },
  430. keySearch : function(e, target, options) {
  431. var raw = e.getKey();
  432. var key = String.fromCharCode(raw);
  433. var startIndex = 0;
  434. if( !this.store.getCount() ) {
  435. return;
  436. }
  437. switch(raw) {
  438. case Ext.EventObject.HOME:
  439. e.stopEvent();
  440. this.selectFirst();
  441. return;
  442. case Ext.EventObject.END:
  443. e.stopEvent();
  444. this.selectLast();
  445. return;
  446. case Ext.EventObject.PAGEDOWN:
  447. this.selectNextPage();
  448. e.stopEvent();
  449. return;
  450. case Ext.EventObject.PAGEUP:
  451. this.selectPrevPage();
  452. e.stopEvent();
  453. return;
  454. }
  455. // skip special keys other than the shift key
  456. if( (e.hasModifier() && !e.shiftKey) || e.isNavKeyPress() || e.isSpecialKey() ) {
  457. return;
  458. }
  459. if( this.lastSearchTerm == key ) {
  460. startIndex = this.lastSelectedIndex;
  461. }
  462. this.search(this.displayField, key, startIndex);
  463. this.cshTask.delay(this.searchResetDelay);
  464. },
  465. onRender : function(ct, position) {
  466. this.store.on('load', this.calcRowsPerPage, this);
  467. Ext.ux.SelectBox.superclass.onRender.apply(this, arguments);
  468. if( this.mode == 'local' ) {
  469. this.calcRowsPerPage();
  470. }
  471. },
  472. onSelect : function(record, index, skipCollapse){
  473. if(this.fireEvent('beforeselect', this, record, index) !== false){
  474. this.setValue(record.data[this.valueField || this.displayField]);
  475. if( !skipCollapse ) {
  476. this.collapse();
  477. }
  478. this.lastSelectedIndex = index + 1;
  479. this.fireEvent('select', this, record, index);
  480. }
  481. },
  482. render : function(ct) {
  483. Ext.ux.SelectBox.superclass.render.apply(this, arguments);
  484. if( Ext.isSafari ) {
  485. this.el.swallowEvent('mousedown', true);
  486. }
  487. this.el.unselectable();
  488. this.innerList.unselectable();
  489. this.trigger.unselectable();
  490. this.innerList.on('mouseup', function(e, target, options) {
  491. if( target.id && target.id == this.innerList.id ) {
  492. return;
  493. }
  494. this.onViewClick();
  495. }, this);
  496. this.innerList.on('mouseover', function(e, target, options) {
  497. if( target.id && target.id == this.innerList.id ) {
  498. return;
  499. }
  500. this.lastSelectedIndex = this.view.getSelectedIndexes()[0] + 1;
  501. this.cshTask.delay(this.searchResetDelay);
  502. }, this);
  503. this.trigger.un('click', this.onTriggerClick, this);
  504. this.trigger.on('mousedown', function(e, target, options) {
  505. e.preventDefault();
  506. this.onTriggerClick();
  507. }, this);
  508. this.on('collapse', function(e, target, options) {
  509. Ext.getDoc().un('mouseup', this.collapseIf, this);
  510. }, this, true);
  511. this.on('expand', function(e, target, options) {
  512. Ext.getDoc().on('mouseup', this.collapseIf, this);
  513. }, this, true);
  514. },
  515. clearSearchHistory : function() {
  516. this.lastSelectedIndex = 0;
  517. this.lastSearchTerm = false;
  518. },
  519. selectFirst : function() {
  520. this.focusAndSelect(this.store.data.first());
  521. },
  522. selectLast : function() {
  523. this.focusAndSelect(this.store.data.last());
  524. },
  525. selectPrevPage : function() {
  526. if( !this.rowHeight ) {
  527. return;
  528. }
  529. var index = Math.max(this.selectedIndex-this.rowsPerPage, 0);
  530. this.focusAndSelect(this.store.getAt(index));
  531. },
  532. selectNextPage : function() {
  533. if( !this.rowHeight ) {
  534. return;
  535. }
  536. var index = Math.min(this.selectedIndex+this.rowsPerPage, this.store.getCount() - 1);
  537. this.focusAndSelect(this.store.getAt(index));
  538. },
  539. search : function(field, value, startIndex) {
  540. field = field || this.displayField;
  541. this.lastSearchTerm = value;
  542. var index = this.store.find.apply(this.store, arguments);
  543. if( index !== -1 ) {
  544. this.focusAndSelect(index);
  545. }
  546. },
  547. focusAndSelect : function(record) {
  548. var index = typeof record === 'number' ? record : this.store.indexOf(record);
  549. this.select(index, this.isExpanded());
  550. this.onSelect(this.store.getAt(record), index, this.isExpanded());
  551. },
  552. calcRowsPerPage : function() {
  553. if( this.store.getCount() ) {
  554. this.rowHeight = Ext.fly(this.view.getNode(0)).getHeight();
  555. this.rowsPerPage = this.maxHeight / this.rowHeight;
  556. } else {
  557. this.rowHeight = false;
  558. }
  559. }
  560. });
  561. Ext.Ajax.on('requestcomplete', function(ajax, xhr, o){
  562.     if(typeof urchinTracker == 'function' && o && o.url){
  563.         urchinTracker(o.url);
  564.     }
  565. });