MainPanel = function(){ this.preview = new Ext.Panel({ id: 'preview', region: 'south', cls:'preview', autoScroll: true, listeners: FeedViewer.LinkInterceptor, tbar: [{ id:'tab', text: 'View in New Tab', iconCls: 'new-tab', disabled:true, handler : this.openTab, scope: this }, '-', { id:'win', text: 'Go to Post', iconCls: 'new-win', disabled:true, scope: this, handler : function(){ window.open(this.gsm.getSelected().data.link); } }], clear: function(){ this.body.update(''); var items = this.topToolbar.items; items.get('tab').disable(); items.get('win').disable(); } }); this.grid = new FeedGrid(this, { tbar:[{ text:'Open All', tooltip: {title:'Open All',text:'Opens all item in tabs'}, iconCls: 'tabs', handler: this.openAll, scope:this }, '-', { split:true, text:'Reading Pane', tooltip: {title:'Reading Pane',text:'Show, move or hide the Reading Pane'}, iconCls: 'preview-bottom', handler: this.movePreview.createDelegate(this, []), menu:{ id:'reading-menu', cls:'reading-menu', width:100, items: [{ text:'Bottom', checked:true, group:'rp-group', checkHandler:this.movePreview, scope:this, iconCls:'preview-bottom' },{ text:'Right', checked:false, group:'rp-group', checkHandler:this.movePreview, scope:this, iconCls:'preview-right' },{ text:'Hide', checked:false, group:'rp-group', checkHandler:this.movePreview, scope:this, iconCls:'preview-hide' }] } }, '-', { pressed: true, enableToggle:true, text:'Summary', tooltip: {title:'Post Summary',text:'View a short summary of each item in the list'}, iconCls: 'summary', scope:this, toggleHandler: function(btn, pressed){ this.grid.togglePreview(pressed); } }] }); MainPanel.superclass.constructor.call(this, { id:'main-tabs', activeTab:0, region:'center', margins:'0 5 5 0', resizeTabs:true, tabWidth:150, minTabWidth: 120, enableTabScroll: true, plugins: new Ext.ux.TabCloseMenu(), items: { id:'main-view', layout:'border', title:'Loading...', hideMode:'offsets', items:[ this.grid, { id:'bottom-preview', layout:'fit', items:this.preview, height: 250, split: true, border:false, region:'south' }, { id:'right-preview', layout:'fit', border:false, region:'east', width:350, split: true, hidden:true }] } }); this.gsm = this.grid.getSelectionModel(); this.gsm.on('rowselect', function(sm, index, record){ FeedViewer.getTemplate().overwrite(this.preview.body, record.data); var items = this.preview.topToolbar.items; items.get('tab').enable(); items.get('win').enable(); }, this, {buffer:250}); this.grid.store.on('beforeload', this.preview.clear, this.preview); this.grid.store.on('load', this.gsm.selectFirstRow, this.gsm); this.grid.on('rowdblclick', this.openTab, this); }; Ext.extend(MainPanel, Ext.TabPanel, { loadFeed : function(feed){ this.grid.loadFeed(feed.url); Ext.getCmp('main-view').setTitle(feed.text); }, movePreview : function(m, pressed){ if(!m){ // cycle if not a menu item click var items = Ext.menu.MenuMgr.get('reading-menu').items.items; var b = items[0], r = items[1], h = items[2]; if(b.checked){ r.setChecked(true); }else if(r.checked){ h.setChecked(true); }else if(h.checked){ b.setChecked(true); } return; } if(pressed){ var preview = this.preview; var right = Ext.getCmp('right-preview'); var bot = Ext.getCmp('bottom-preview'); var btn = this.grid.getTopToolbar().items.get(2); switch(m.text){ case 'Bottom': right.hide(); bot.add(preview); bot.show(); bot.ownerCt.doLayout(); btn.setIconClass('preview-bottom'); break; case 'Right': bot.hide(); right.add(preview); right.show(); right.ownerCt.doLayout(); btn.setIconClass('preview-right'); break; case 'Hide': preview.ownerCt.hide(); preview.ownerCt.ownerCt.doLayout(); btn.setIconClass('preview-hide'); break; } } }, openTab : function(record){ record = (record && record.data) ? record : this.gsm.getSelected(); var d = record.data; var id = !d.link ? Ext.id() : d.link.replace(/[^A-Z0-9-_]/gi, ''); var tab; if(!(tab = this.getItem(id))){ tab = new Ext.Panel({ id: id, cls:'preview single-preview', title: d.title, tabTip: d.title, html: FeedViewer.getTemplate().apply(d), closable:true, listeners: FeedViewer.LinkInterceptor, autoScroll:true, border:true, tbar: [{ text: 'Go to Post', iconCls: 'new-win', handler : function(){ window.open(d.link); } }] }); this.add(tab); } this.setActiveTab(tab); }, openAll : function(){ this.beginUpdate(); this.grid.store.data.each(this.openTab, this); this.endUpdate(); } }); Ext.reg('appmainpanel', MainPanel);