]> git.proxmox.com Git - extjs.git/blame - extjs/examples/classic/sandbox/js/TaskBar.js
add extjs 6.0.1 sources
[extjs.git] / extjs / examples / classic / sandbox / js / TaskBar.js
CommitLineData
6527f429
DM
1/*!\r
2 * Ext JS Library 3.3.1\r
3 * Copyright(c) 2006-2014 Sencha Inc.\r
4 * licensing@sencha.com\r
5 * http://www.sencha.com/license\r
6 */\r
7/**\r
8 * @class Ext.ux.TaskBar\r
9 * @extends Ext.util.Observable\r
10 */\r
11Ext.ux.TaskBar = function(app){\r
12 this.app = app;\r
13 this.init();\r
14};\r
15\r
16Ext.extend(Ext.ux.TaskBar, Ext.util.Observable, {\r
17 init : function(){\r
18 this.startMenu = new Ext.ux.StartMenu(Ext.apply({\r
19 iconCls: 'user',\r
20 height: 300,\r
21 shadow: true,\r
22 title: 'Tommy Maintz',\r
23 width: 300\r
24 }, this.app.startConfig));\r
25\r
26 this.startBtn = new Ext.Button({\r
27 text: 'Start',\r
28 id: 'ux-startbutton',\r
29 iconCls:'start',\r
30 menu: this.startMenu,\r
31 menuAlign: 'bl-tl',\r
32 renderTo: 'ux-taskbar-start',\r
33 clickEvent: 'mousedown',\r
34 template: new Ext.Template(\r
35 '<table cellspacing="0" class="x-btn"><tbody class="{1}"><tr>',\r
36 '<td class="ux-startbutton-left"><i>&#160;</i></td>',\r
37 '<td class="ux-startbutton-center"><em class="{2} unselectable="on">',\r
38 '<button class="x-btn-text" type="{0}" style="height:30px;"></button>',\r
39 '</em></td>',\r
40 '<td class="ux-startbutton-right"><i>&#160;</i></td>',\r
41 '</tr></tbody></table>')\r
42 });\r
43\r
44 var width = this.startBtn.getEl().getWidth()+10;\r
45\r
46 var sbBox = new Ext.BoxComponent({\r
47 el: 'ux-taskbar-start',\r
48 id: 'TaskBarStart',\r
49 minWidth: width,\r
50 region:'west',\r
51 split: true,\r
52 width: width\r
53 });\r
54\r
55 this.tbPanel = new Ext.ux.TaskButtonsPanel({\r
56 el: 'ux-taskbuttons-panel',\r
57 id: 'TaskBarButtons',\r
58 region:'center'\r
59 });\r
60\r
61 var container = new Ext.ux.TaskBarContainer({\r
62 el: 'ux-taskbar',\r
63 layout: 'border',\r
64 items: [sbBox,this.tbPanel]\r
65 });\r
66\r
67 return this;\r
68 },\r
69\r
70 addTaskButton : function(win){\r
71 return this.tbPanel.addButton(win, 'ux-taskbuttons-panel');\r
72 },\r
73\r
74 removeTaskButton : function(btn){\r
75 this.tbPanel.removeButton(btn);\r
76 },\r
77\r
78 setActiveButton : function(btn){\r
79 this.tbPanel.setActiveButton(btn);\r
80 }\r
81});\r
82\r
83\r
84\r
85/**\r
86 * @class Ext.ux.TaskBarContainer\r
87 * @extends Ext.Container\r
88 */\r
89Ext.ux.TaskBarContainer = Ext.extend(Ext.Container, {\r
90 initComponent : function() {\r
91 Ext.ux.TaskBarContainer.superclass.initComponent.call(this);\r
92\r
93 this.el = Ext.get(this.el) || Ext.getBody();\r
94 this.el.setHeight = Ext.emptyFn;\r
95 this.el.setWidth = Ext.emptyFn;\r
96 this.el.setSize = Ext.emptyFn;\r
97 this.el.setStyle({\r
98 overflow:'hidden',\r
99 margin:'0',\r
100 border:'0 none'\r
101 });\r
102 this.el.dom.scroll = 'no';\r
103 this.allowDomMove = false;\r
104 this.autoWidth = true;\r
105 this.autoHeight = true;\r
106 Ext.on('resize', this.fireResize, this);\r
107 this.renderTo = this.el;\r
108 },\r
109\r
110 fireResize : function(w, h){\r
111 this.onResize(w, h, w, h);\r
112 this.fireEvent('resize', this, w, h, w, h);\r
113 }\r
114});\r
115\r
116\r
117\r
118/**\r
119 * @class Ext.ux.TaskButtonsPanel\r
120 * @extends Ext.BoxComponent\r
121 */\r
122Ext.ux.TaskButtonsPanel = Ext.extend(Ext.BoxComponent, {\r
123 activeButton: null,\r
124 enableScroll: true,\r
125 scrollIncrement: 0,\r
126 scrollRepeatInterval: 400,\r
127 scrollDuration: .35,\r
128 animScroll: true,\r
129 resizeButtons: true,\r
130 buttonWidth: 168,\r
131 minButtonWidth: 118,\r
132 buttonMargin: 2,\r
133 buttonWidthSet: false,\r
134\r
135 initComponent : function() {\r
136 Ext.ux.TaskButtonsPanel.superclass.initComponent.call(this);\r
137 this.on('resize', this.delegateUpdates);\r
138 this.items = [];\r
139\r
140 this.stripWrap = Ext.get(this.el).createChild({\r
141 cls: 'ux-taskbuttons-strip-wrap',\r
142 cn: {\r
143 tag:'ul', cls:'ux-taskbuttons-strip'\r
144 }\r
145 });\r
146 this.stripSpacer = Ext.get(this.el).createChild({\r
147 cls:'ux-taskbuttons-strip-spacer'\r
148 });\r
149 this.strip = new Ext.Element(this.stripWrap.dom.firstChild);\r
150\r
151 this.edge = this.strip.createChild({\r
152 tag:'li',\r
153 cls:'ux-taskbuttons-edge'\r
154 });\r
155 this.strip.createChild({\r
156 cls:'x-clear'\r
157 });\r
158 },\r
159\r
160 addButton : function(win){\r
161 var li = this.strip.createChild({tag:'li'}, this.edge); // insert before the edge\r
162 var btn = new Ext.ux.TaskBar.TaskButton(win, li);\r
163\r
164 this.items.push(btn);\r
165\r
166 if(!this.buttonWidthSet){\r
167 this.lastButtonWidth = btn.container.getWidth();\r
168 }\r
169\r
170 this.setActiveButton(btn);\r
171 return btn;\r
172 },\r
173\r
174 removeButton : function(btn){\r
175 var li = document.getElementById(btn.container.id);\r
176 btn.destroy();\r
177 li.parentNode.removeChild(li);\r
178\r
179 var s = [];\r
180 for(var i = 0, len = this.items.length; i < len; i++) {\r
181 if(this.items[i] != btn){\r
182 s.push(this.items[i]);\r
183 }\r
184 }\r
185 this.items = s;\r
186\r
187 this.delegateUpdates();\r
188 },\r
189\r
190 setActiveButton : function(btn){\r
191 this.activeButton = btn;\r
192 this.delegateUpdates();\r
193 },\r
194\r
195 delegateUpdates : function(){\r
196 /*if(this.suspendUpdates){\r
197 return;\r
198 }*/\r
199 if(this.resizeButtons && this.rendered){\r
200 this.autoSize();\r
201 }\r
202 if(this.enableScroll && this.rendered){\r
203 this.autoScroll();\r
204 }\r
205 },\r
206\r
207 autoSize : function(){\r
208 var count = this.items.length;\r
209 var ow = this.el.dom.offsetWidth;\r
210 var aw = this.el.dom.clientWidth;\r
211\r
212 if(!this.resizeButtons || count < 1 || !aw){ // !aw for display:none\r
213 return;\r
214 }\r
215\r
216 var each = Math.max(Math.min(Math.floor((aw-4) / count) - this.buttonMargin, this.buttonWidth), this.minButtonWidth); // -4 for float errors in IE\r
217 var btns = this.stripWrap.dom.getElementsByTagName('button');\r
218\r
219 this.lastButtonWidth = Ext.get(btns[0].id).findParent('li').offsetWidth;\r
220\r
221 for(var i = 0, len = btns.length; i < len; i++) {\r
222 var btn = btns[i];\r
223\r
224 var tw = Ext.get(btns[i].id).findParent('li').offsetWidth;\r
225 var iw = btn.offsetWidth;\r
226\r
227 btn.style.width = (each - (tw-iw)) + 'px';\r
228 }\r
229 },\r
230\r
231 autoScroll : function(){\r
232 var count = this.items.length;\r
233 var ow = this.el.dom.offsetWidth;\r
234 var tw = this.el.dom.clientWidth;\r
235\r
236 var wrap = this.stripWrap;\r
237 var cw = wrap.dom.offsetWidth;\r
238 var pos = this.getScrollPos();\r
239 var l = this.edge.getOffsetsTo(this.stripWrap)[0] + pos;\r
240\r
241 if(!this.enableScroll || count < 1 || cw < 20){ // 20 to prevent display:none issues\r
242 return;\r
243 }\r
244\r
245 wrap.setWidth(tw); // moved to here because of problem in Safari\r
246\r
247 if(l <= tw){\r
248 wrap.dom.scrollLeft = 0;\r
249 //wrap.setWidth(tw); moved from here because of problem in Safari\r
250 if(this.scrolling){\r
251 this.scrolling = false;\r
252 this.el.removeClass('x-taskbuttons-scrolling');\r
253 this.scrollLeft.hide();\r
254 this.scrollRight.hide();\r
255 }\r
256 }else{\r
257 if(!this.scrolling){\r
258 this.el.addClass('x-taskbuttons-scrolling');\r
259 }\r
260 tw -= wrap.getMargins('lr');\r
261 wrap.setWidth(tw > 20 ? tw : 20);\r
262 if(!this.scrolling){\r
263 if(!this.scrollLeft){\r
264 this.createScrollers();\r
265 }else{\r
266 this.scrollLeft.show();\r
267 this.scrollRight.show();\r
268 }\r
269 }\r
270 this.scrolling = true;\r
271 if(pos > (l-tw)){ // ensure it stays within bounds\r
272 wrap.dom.scrollLeft = l-tw;\r
273 }else{ // otherwise, make sure the active button is still visible\r
274 this.scrollToButton(this.activeButton, true); // true to animate\r
275 }\r
276 this.updateScrollButtons();\r
277 }\r
278 },\r
279\r
280 createScrollers : function(){\r
281 var h = this.el.dom.offsetHeight; //var h = this.stripWrap.dom.offsetHeight;\r
282\r
283 // left\r
284 var sl = this.el.insertFirst({\r
285 cls:'ux-taskbuttons-scroller-left'\r
286 });\r
287 sl.setHeight(h);\r
288 sl.addClassOnOver('ux-taskbuttons-scroller-left-over');\r
289 this.leftRepeater = new Ext.util.ClickRepeater(sl, {\r
290 interval : this.scrollRepeatInterval,\r
291 handler: this.onScrollLeft,\r
292 scope: this\r
293 });\r
294 this.scrollLeft = sl;\r
295\r
296 // right\r
297 var sr = this.el.insertFirst({\r
298 cls:'ux-taskbuttons-scroller-right'\r
299 });\r
300 sr.setHeight(h);\r
301 sr.addClassOnOver('ux-taskbuttons-scroller-right-over');\r
302 this.rightRepeater = new Ext.util.ClickRepeater(sr, {\r
303 interval : this.scrollRepeatInterval,\r
304 handler: this.onScrollRight,\r
305 scope: this\r
306 });\r
307 this.scrollRight = sr;\r
308 },\r
309\r
310 getScrollWidth : function(){\r
311 return this.edge.getOffsetsTo(this.stripWrap)[0] + this.getScrollPos();\r
312 },\r
313\r
314 getScrollPos : function(){\r
315 return parseInt(this.stripWrap.dom.scrollLeft, 10) || 0;\r
316 },\r
317\r
318 getScrollArea : function(){\r
319 return parseInt(this.stripWrap.dom.clientWidth, 10) || 0;\r
320 },\r
321\r
322 getScrollAnim : function(){\r
323 return {\r
324 duration: this.scrollDuration,\r
325 callback: this.updateScrollButtons,\r
326 scope: this\r
327 };\r
328 },\r
329\r
330 getScrollIncrement : function(){\r
331 return (this.scrollIncrement || this.lastButtonWidth+2);\r
332 },\r
333\r
334 /* getBtnEl : function(item){\r
335 return document.getElementById(item.id);\r
336 }, */\r
337\r
338 scrollToButton : function(item, animate){\r
339 item = item.el.dom.parentNode; // li\r
340 if(!item){ return; }\r
341 var el = item; //this.getBtnEl(item);\r
342 var pos = this.getScrollPos(), area = this.getScrollArea();\r
343 var left = Ext.fly(el).getOffsetsTo(this.stripWrap)[0] + pos;\r
344 var right = left + el.offsetWidth;\r
345 if(left < pos){\r
346 this.scrollTo(left, animate);\r
347 }else if(right > (pos + area)){\r
348 this.scrollTo(right - area, animate);\r
349 }\r
350 },\r
351\r
352 scrollTo : function(pos, animate){\r
353 this.stripWrap.scrollTo('left', pos, animate ? this.getScrollAnim() : false);\r
354 if(!animate){\r
355 this.updateScrollButtons();\r
356 }\r
357 },\r
358\r
359 onScrollRight : function(){\r
360 var sw = this.getScrollWidth()-this.getScrollArea();\r
361 var pos = this.getScrollPos();\r
362 var s = Math.min(sw, pos + this.getScrollIncrement());\r
363 if(s != pos){\r
364 this.scrollTo(s, this.animScroll);\r
365 }\r
366 },\r
367\r
368 onScrollLeft : function(){\r
369 var pos = this.getScrollPos();\r
370 var s = Math.max(0, pos - this.getScrollIncrement());\r
371 if(s != pos){\r
372 this.scrollTo(s, this.animScroll);\r
373 }\r
374 },\r
375\r
376 updateScrollButtons : function(){\r
377 var pos = this.getScrollPos();\r
378 this.scrollLeft[pos == 0 ? 'addClass' : 'removeClass']('ux-taskbuttons-scroller-left-disabled');\r
379 this.scrollRight[pos >= (this.getScrollWidth()-this.getScrollArea()) ? 'addClass' : 'removeClass']('ux-taskbuttons-scroller-right-disabled');\r
380 }\r
381});\r
382\r
383\r
384\r
385/**\r
386 * @class Ext.ux.TaskBar.TaskButton\r
387 * @extends Ext.Button\r
388 */\r
389Ext.ux.TaskBar.TaskButton = function(win, el){\r
390 this.win = win;\r
391 Ext.ux.TaskBar.TaskButton.superclass.constructor.call(this, {\r
392 iconCls: win.iconCls,\r
393 text: Ext.util.Format.ellipsis(win.title, 12),\r
394 renderTo: el,\r
395 handler : function(){\r
396 if(win.minimized || win.hidden){\r
397 win.show();\r
398 }else if(win == win.manager.getActive()){\r
399 win.minimize();\r
400 }else{\r
401 win.toFront();\r
402 }\r
403 },\r
404 clickEvent:'mousedown',\r
405 template: new Ext.Template(\r
406 '<table cellspacing="0" class="x-btn {3}"><tbody><tr>',\r
407 '<td class="ux-taskbutton-left"><i>&#160;</i></td>',\r
408 '<td class="ux-taskbutton-center"><em class="{5} unselectable="on">',\r
409 '<button class="x-btn-text {2}" type="{1}" style="height:28px;">{0}</button>',\r
410 '</em></td>',\r
411 '<td class="ux-taskbutton-right"><i>&#160;</i></td>',\r
412 "</tr></tbody></table>")\r
413 });\r
414};\r
415\r
416Ext.extend(Ext.ux.TaskBar.TaskButton, Ext.Button, {\r
417 onRender : function(){\r
418 Ext.ux.TaskBar.TaskButton.superclass.onRender.apply(this, arguments);\r
419\r
420 this.cmenu = new Ext.menu.Menu({\r
421 items: [{\r
422 text: 'Restore',\r
423 handler: function(){\r
424 if(!this.win.isVisible()){\r
425 this.win.show();\r
426 }else{\r
427 this.win.restore();\r
428 }\r
429 },\r
430 scope: this\r
431 },{\r
432 text: 'Minimize',\r
433 handler: this.win.minimize,\r
434 scope: this.win\r
435 },{\r
436 text: 'Maximize',\r
437 handler: this.win.maximize,\r
438 scope: this.win\r
439 }, '-', {\r
440 text: 'Close',\r
441 handler: this.closeWin.createDelegate(this, this.win, true),\r
442 scope: this.win\r
443 }]\r
444 });\r
445\r
446 this.cmenu.on('beforeshow', function(){\r
447 var items = this.cmenu.items.items;\r
448 var w = this.win;\r
449 items[0].setDisabled(w.maximized !== true && w.hidden !== true);\r
450 items[1].setDisabled(w.minimized === true);\r
451 items[2].setDisabled(w.maximized === true || w.hidden === true);\r
452 }, this);\r
453\r
454 this.el.on('contextmenu', function(e){\r
455 e.stopEvent();\r
456 if(!this.cmenu.el){\r
457 this.cmenu.render();\r
458 }\r
459 var xy = e.getXY();\r
460 xy[1] -= this.cmenu.el.getHeight();\r
461 this.cmenu.showAt(xy);\r
462 }, this);\r
463 },\r
464\r
465 closeWin : function(cMenu, e, win){\r
466 if(!win.isVisible()){\r
467 win.show();\r
468 }else{\r
469 win.restore();\r
470 }\r
471 win.close();\r
472 }\r
473});