Upgrade to ExtJS 3.1.1 - Released 02/08/2010
[extjs.git] / examples / feed-viewer / MainPanel.js
1 /*!
2  * Ext JS Library 3.1.1
3  * Copyright(c) 2006-2010 Ext JS, LLC
4  * licensing@extjs.com
5  * http://www.extjs.com/license
6  */
7 MainPanel = function(){\r
8     this.preview = new Ext.Panel({\r
9         id: 'preview',\r
10         region: 'south',\r
11         cls:'preview',\r
12         autoScroll: true,\r
13         listeners: FeedViewer.LinkInterceptor,\r
14 \r
15         tbar: [{\r
16             id:'tab',\r
17             text: 'View in New Tab',\r
18             iconCls: 'new-tab',\r
19             disabled:true,\r
20             handler : this.openTab,\r
21             scope: this\r
22         },\r
23         '-',\r
24         {\r
25             id:'win',\r
26             text: 'Go to Post',\r
27             iconCls: 'new-win',\r
28             disabled:true,\r
29             scope: this,\r
30             handler : function(){\r
31                 window.open(this.gsm.getSelected().data.link);\r
32             }\r
33         }],\r
34 \r
35         clear: function(){\r
36             this.body.update('');\r
37             var items = this.topToolbar.items;\r
38             items.get('tab').disable();\r
39             items.get('win').disable();\r
40         }\r
41     });\r
42 \r
43     this.grid = new FeedGrid(this, {\r
44         tbar:[{\r
45             text:'Open All',\r
46             tooltip: {title:'Open All',text:'Opens all item in tabs'},\r
47             iconCls: 'tabs',\r
48             handler: this.openAll,\r
49             scope:this\r
50         },\r
51         '-',\r
52         {\r
53             split:true,\r
54             text:'Reading Pane',\r
55             tooltip: {title:'Reading Pane',text:'Show, move or hide the Reading Pane'},\r
56             iconCls: 'preview-bottom',\r
57             handler: this.movePreview.createDelegate(this, []),\r
58             menu:{\r
59                 id:'reading-menu',\r
60                 cls:'reading-menu',\r
61                 width:100,\r
62                 items: [{\r
63                     text:'Bottom',\r
64                     checked:true,\r
65                     group:'rp-group',\r
66                     checkHandler:this.movePreview,\r
67                     scope:this,\r
68                     iconCls:'preview-bottom'\r
69                 },{\r
70                     text:'Right',\r
71                     checked:false,\r
72                     group:'rp-group',\r
73                     checkHandler:this.movePreview,\r
74                     scope:this,\r
75                     iconCls:'preview-right'\r
76                 },{\r
77                     text:'Hide',\r
78                     checked:false,\r
79                     group:'rp-group',\r
80                     checkHandler:this.movePreview,\r
81                     scope:this,\r
82                     iconCls:'preview-hide'\r
83                 }]\r
84             }\r
85         },\r
86         '-',\r
87         {\r
88             pressed: true,\r
89             enableToggle:true,\r
90             text:'Summary',\r
91             tooltip: {title:'Post Summary',text:'View a short summary of each item in the list'},\r
92             iconCls: 'summary',\r
93             scope:this,\r
94             toggleHandler: function(btn, pressed){\r
95                 this.grid.togglePreview(pressed);\r
96             }\r
97         }]\r
98     });\r
99 \r
100     MainPanel.superclass.constructor.call(this, {\r
101         id:'main-tabs',\r
102         activeTab:0,\r
103         region:'center',\r
104         margins:'0 5 5 0',\r
105         resizeTabs:true,\r
106         tabWidth:150,\r
107         minTabWidth: 120,\r
108         enableTabScroll: true,\r
109         plugins: new Ext.ux.TabCloseMenu(),\r
110         items: {\r
111             id:'main-view',\r
112             layout:'border',\r
113             title:'Loading...',\r
114             hideMode:'offsets',\r
115             items:[\r
116                 this.grid, {\r
117                 id:'bottom-preview',\r
118                 layout:'fit',\r
119                 items:this.preview,\r
120                 height: 250,\r
121                 split: true,\r
122                 border:false,\r
123                 region:'south'\r
124             }, {\r
125                 id:'right-preview',\r
126                 layout:'fit',\r
127                 border:false,\r
128                 region:'east',\r
129                 width:350,\r
130                 split: true,\r
131                 hidden:true\r
132             }]\r
133         }\r
134     });\r
135 \r
136     this.gsm = this.grid.getSelectionModel();\r
137 \r
138     this.gsm.on('rowselect', function(sm, index, record){\r
139         FeedViewer.getTemplate().overwrite(this.preview.body, record.data);\r
140         var items = this.preview.topToolbar.items;\r
141         items.get('tab').enable();\r
142         items.get('win').enable();\r
143     }, this, {buffer:250});\r
144 \r
145     this.grid.store.on('beforeload', this.preview.clear, this.preview);\r
146     this.grid.store.on('load', this.gsm.selectFirstRow, this.gsm);\r
147 \r
148     this.grid.on('rowdblclick', this.openTab, this);\r
149 };\r
150 \r
151 Ext.extend(MainPanel, Ext.TabPanel, {\r
152 \r
153     loadFeed : function(feed){\r
154         this.grid.loadFeed(feed.url);\r
155         Ext.getCmp('main-view').setTitle(feed.text);\r
156     },\r
157 \r
158     movePreview : function(m, pressed){\r
159         if(!m){ // cycle if not a menu item click\r
160             var items = Ext.menu.MenuMgr.get('reading-menu').items.items;\r
161             var b = items[0], r = items[1], h = items[2];\r
162             if(b.checked){\r
163                 r.setChecked(true);\r
164             }else if(r.checked){\r
165                 h.setChecked(true);\r
166             }else if(h.checked){\r
167                 b.setChecked(true);\r
168             }\r
169             return;\r
170         }\r
171         if(pressed){\r
172             var preview = this.preview;\r
173             var right = Ext.getCmp('right-preview');\r
174             var bot = Ext.getCmp('bottom-preview');\r
175             var btn = this.grid.getTopToolbar().items.get(2);\r
176             switch(m.text){\r
177                 case 'Bottom':\r
178                     right.hide();\r
179                     bot.add(preview);\r
180                     bot.show();\r
181                     bot.ownerCt.doLayout();\r
182                     btn.setIconClass('preview-bottom');\r
183                     break;\r
184                 case 'Right':\r
185                     bot.hide();\r
186                     right.add(preview);\r
187                     right.show();\r
188                     right.ownerCt.doLayout();\r
189                     btn.setIconClass('preview-right');\r
190                     break;\r
191                 case 'Hide':\r
192                     preview.ownerCt.hide();\r
193                     preview.ownerCt.ownerCt.doLayout();\r
194                     btn.setIconClass('preview-hide');\r
195                     break;\r
196             }\r
197         }\r
198     },\r
199 \r
200     openTab : function(record){\r
201         record = (record && record.data) ? record : this.gsm.getSelected();\r
202         var d = record.data;\r
203         var id = !d.link ? Ext.id() : d.link.replace(/[^A-Z0-9-_]/gi, '');\r
204         var tab;\r
205         if(!(tab = this.getItem(id))){\r
206             tab = new Ext.Panel({\r
207                 id: id,\r
208                 cls:'preview single-preview',\r
209                 title: d.title,\r
210                 tabTip: d.title,\r
211                 html: FeedViewer.getTemplate().apply(d),\r
212                 closable:true,\r
213                 listeners: FeedViewer.LinkInterceptor,\r
214                 autoScroll:true,\r
215                 border:true,\r
216 \r
217                 tbar: [{\r
218                     text: 'Go to Post',\r
219                     iconCls: 'new-win',\r
220                     handler : function(){\r
221                         window.open(d.link);\r
222                     }\r
223                 }]\r
224             });\r
225             this.add(tab);\r
226         }\r
227         this.setActiveTab(tab);\r
228     },\r
229 \r
230     openAll : function(){\r
231         this.beginUpdate();\r
232         this.grid.store.data.each(this.openTab, this);\r
233         this.endUpdate();\r
234     }\r
235 });\r
236 \r
237 Ext.reg('appmainpanel', MainPanel);