aolists-webtop
Version:
Web interface for aoLists
478 lines (412 loc) • 14.9 kB
JavaScript
/*
* Ext JS Library 2.2.1
* Copyright(c) 2006-2009, Ext JS, LLC.
* licensing@extjs.com
*
* http://extjs.com/license
*/
/**
* @class Ext.ux.TaskBar
* @extends Ext.util.Observable
*/
Ext.ux.TaskBar = function (app) {
this.app = app;
this.init();
};
Ext.extend(Ext.ux.TaskBar, Ext.util.Observable, {
init: function () {
this.startMenu = new Ext.ux.StartMenu(Ext.apply({
iconCls: 'user',
height: 300,
shadow: true,
title: '???',
width: 300
}, this.app.startConfig));
this.startBtn = new Ext.Button({
text: 'Start',
id: 'ux-startbutton',
iconCls: 'start',
menu: this.startMenu,
menuAlign: 'bl-tl',
renderTo: 'ux-taskbar-start',
clickEvent: 'mousedown',
template: new Ext.Template(
'<table border="0" cellpadding="0" cellspacing="0" class="x-btn-wrap"><tbody><tr>',
'<td class="ux-startbutton-left"><i> </i></td><td class="ux-startbutton-center"><em unselectable="on"><button class="x-btn-text" type="{1}" style="height:30px;">{0}</button></em></td><td class="ux-startbutton-right"><i> </i></td>',
"</tr></tbody></table>")
});
var width = Ext.get('ux-startbutton').getWidth() + 10;
var sbBox = new Ext.BoxComponent({
el: 'ux-taskbar-start',
id: 'TaskBarStart',
minWidth: width,
region: 'west',
split: true,
width: width
});
this.tbPanel = new Ext.ux.TaskButtonsPanel({
el: 'ux-taskbuttons-panel',
id: 'TaskBarButtons',
region: 'center'
});
var container = new Ext.ux.TaskBarContainer({
el: 'ux-taskbar',
layout: 'border',
items: [sbBox, this.tbPanel]
});
return this;
},
addTaskButton: function (win) {
return this.tbPanel.addButton(win, 'ux-taskbuttons-panel');
},
removeTaskButton: function (btn) {
this.tbPanel.removeButton(btn);
},
clearTaskButtons: function () {
this.tbPanel.clearButtons();
},
setActiveButton: function (btn) {
this.tbPanel.setActiveButton(btn);
}
});
/**
* @class Ext.ux.TaskBarContainer
* @extends Ext.Container
*/
Ext.ux.TaskBarContainer = Ext.extend(Ext.Container, {
initComponent: function () {
Ext.ux.TaskBarContainer.superclass.initComponent.call(this);
this.el = Ext.get(this.el) || Ext.getBody();
this.el.setHeight = Ext.emptyFn;
this.el.setWidth = Ext.emptyFn;
this.el.setSize = Ext.emptyFn;
this.el.setStyle({
overflow: 'hidden',
margin: '0',
border: '0 none'
});
this.el.dom.scroll = 'no';
this.allowDomMove = false;
this.autoWidth = true;
this.autoHeight = true;
Ext.EventManager.onWindowResize(this.fireResize, this);
this.renderTo = this.el;
},
fireResize: function (w, h) {
this.fireEvent('resize', this, w, h, w, h);
}
});
/**
* @class Ext.ux.TaskButtonsPanel
* @extends Ext.BoxComponent
*/
Ext.ux.TaskButtonsPanel = Ext.extend(Ext.BoxComponent, {
activeButton: null,
enableScroll: true,
scrollIncrement: 0,
scrollRepeatInterval: 400,
scrollDuration: 0.35,
animScroll: true,
resizeButtons: true,
buttonWidth: 168,
minButtonWidth: 118,
buttonMargin: 2,
buttonWidthSet: false,
initComponent: function () {
Ext.ux.TaskButtonsPanel.superclass.initComponent.call(this);
this.on('resize', this.delegateUpdates);
this.items = [];
this.stripWrap = Ext.get(this.el).createChild({
cls: 'ux-taskbuttons-strip-wrap',
cn: {
tag: 'ul',
cls: 'ux-taskbuttons-strip'
}
});
this.stripSpacer = Ext.get(this.el).createChild({
cls: 'ux-taskbuttons-strip-spacer'
});
this.strip = new Ext.Element(this.stripWrap.dom.firstChild);
this.edge = this.strip.createChild({
tag: 'li',
cls: 'ux-taskbuttons-edge'
});
this.strip.createChild({
cls: 'x-clear'
});
},
addButton: function (win) {
var li = this.strip.createChild({
tag: 'li'
}, this.edge); // insert before the edge
var btn = new Ext.ux.TaskBar.TaskButton(win, li);
this.items.push(btn);
if (!this.buttonWidthSet) {
this.lastButtonWidth = btn.container.getWidth();
}
this.setActiveButton(btn);
return btn;
},
removeButton: function (btn) {
var li = document.getElementById(btn.container.id);
btn.destroy();
li.parentNode.removeChild(li);
var s = [];
for (var i = 0, len = this.items.length; i < len; i++) {
if (this.items[i] != btn) {
s.push(this.items[i]);
}
}
this.items = s;
this.delegateUpdates();
},
clearButtons: function () {
while (this.items.length > 0) {
this.removeButton(this.items[0]);
}
},
setActiveButton: function (btn) {
this.activeButton = btn;
this.delegateUpdates();
},
delegateUpdates: function () {
if (this.resizeButtons && this.rendered) {
this.autoSize();
}
if (this.enableScroll && this.rendered) {
this.autoScroll();
}
},
autoSize: function () {
var count = this.items.length;
var ow = this.el.dom.offsetWidth;
var aw = this.el.dom.clientWidth;
if (!this.resizeButtons || count < 1 || !aw) { // !aw for display:none
return;
}
var each = Math.max(Math.min(Math.floor((aw - 4) / count) - this.buttonMargin, this.buttonWidth), this.minButtonWidth); // -4 for float errors in IE
var btns = this.stripWrap.dom.getElementsByTagName('button');
this.lastButtonWidth = Ext.get(btns[0].id).findParent('li').offsetWidth;
for (var i = 0, len = btns.length; i < len; i++) {
var btn = btns[i];
var tw = Ext.get(btns[i].id).findParent('li').offsetWidth;
var iw = btn.offsetWidth;
btn.style.width = (each - (tw - iw)) + 'px';
}
},
autoScroll: function () {
var count = this.items.length;
var ow = this.el.dom.offsetWidth;
var tw = this.el.dom.clientWidth;
var wrap = this.stripWrap;
var cw = wrap.dom.offsetWidth;
var pos = this.getScrollPos();
var l = this.edge.getOffsetsTo(this.stripWrap)[0] + pos;
if (!this.enableScroll || count < 1 || cw < 20) { // 20 to prevent display:none issues
return;
}
wrap.setWidth(tw); // moved to here because of problem in Safari
if (l <= tw) {
wrap.dom.scrollLeft = 0;
//wrap.setWidth(tw); moved from here because of problem in Safari
if (this.scrolling) {
this.scrolling = false;
this.el.removeClass('x-taskbuttons-scrolling');
this.scrollLeft.hide();
this.scrollRight.hide();
}
} else {
if (!this.scrolling) {
this.el.addClass('x-taskbuttons-scrolling');
}
tw -= wrap.getMargins('lr');
wrap.setWidth(tw > 20 ? tw : 20);
if (!this.scrolling) {
if (!this.scrollLeft) {
this.createScrollers();
} else {
this.scrollLeft.show();
this.scrollRight.show();
}
}
this.scrolling = true;
if (pos > (l - tw)) { // ensure it stays within bounds
wrap.dom.scrollLeft = l - tw;
} else { // otherwise, make sure the active button is still visible
this.scrollToButton(this.activeButton, true); // true to animate
}
this.updateScrollButtons();
}
},
createScrollers: function () {
var h = this.el.dom.offsetHeight; //var h = this.stripWrap.dom.offsetHeight;
// left
var sl = this.el.insertFirst({
cls: 'ux-taskbuttons-scroller-left'
});
sl.setHeight(h);
sl.addClassOnOver('ux-taskbuttons-scroller-left-over');
this.leftRepeater = new Ext.util.ClickRepeater(sl, {
interval: this.scrollRepeatInterval,
handler: this.onScrollLeft,
scope: this
});
this.scrollLeft = sl;
// right
var sr = this.el.insertFirst({
cls: 'ux-taskbuttons-scroller-right'
});
sr.setHeight(h);
sr.addClassOnOver('ux-taskbuttons-scroller-right-over');
this.rightRepeater = new Ext.util.ClickRepeater(sr, {
interval: this.scrollRepeatInterval,
handler: this.onScrollRight,
scope: this
});
this.scrollRight = sr;
},
getScrollWidth: function () {
return this.edge.getOffsetsTo(this.stripWrap)[0] + this.getScrollPos();
},
getScrollPos: function () {
return parseInt(this.stripWrap.dom.scrollLeft, 10) || 0;
},
getScrollArea: function () {
return parseInt(this.stripWrap.dom.clientWidth, 10) || 0;
},
getScrollAnim: function () {
return {
duration: this.scrollDuration,
callback: this.updateScrollButtons,
scope: this
};
},
getScrollIncrement: function () {
return (this.scrollIncrement || this.lastButtonWidth + 2);
},
/* getBtnEl : function(item){
return document.getElementById(item.id);
}, */
scrollToButton: function (item, animate) {
item = item.el.dom.parentNode; // li
if (!item) {
return;
}
var el = item; //this.getBtnEl(item);
var pos = this.getScrollPos(),
area = this.getScrollArea();
var left = Ext.fly(el).getOffsetsTo(this.stripWrap)[0] + pos;
var right = left + el.offsetWidth;
if (left < pos) {
this.scrollTo(left, animate);
} else if (right > (pos + area)) {
this.scrollTo(right - area, animate);
}
},
scrollTo: function (pos, animate) {
this.stripWrap.scrollTo('left', pos, animate ? this.getScrollAnim() : false);
if (!animate) {
this.updateScrollButtons();
}
},
onScrollRight: function () {
var sw = this.getScrollWidth() - this.getScrollArea();
var pos = this.getScrollPos();
var s = Math.min(sw, pos + this.getScrollIncrement());
if (s != pos) {
this.scrollTo(s, this.animScroll);
}
},
onScrollLeft: function () {
var pos = this.getScrollPos();
var s = Math.max(0, pos - this.getScrollIncrement());
if (s != pos) {
this.scrollTo(s, this.animScroll);
}
},
updateScrollButtons: function () {
var pos = this.getScrollPos();
this.scrollLeft[pos === 0 ? 'addClass' : 'removeClass']('ux-taskbuttons-scroller-left-disabled');
this.scrollRight[pos >= (this.getScrollWidth() - this.getScrollArea()) ? 'addClass' : 'removeClass']('ux-taskbuttons-scroller-right-disabled');
}
});
/**
* @class Ext.ux.TaskBar.TaskButton
* @extends Ext.Button
*/
Ext.ux.TaskBar.TaskButton = function (win, el) {
this.win = win;
Ext.ux.TaskBar.TaskButton.superclass.constructor.call(this, {
iconCls: win.iconCls,
text: Ext.util.Format.ellipsis(win.title, 12),
renderTo: el,
handler: function () {
if (win.minimized || win.hidden) {
win.show();
} else if (win == win.manager.getActive()) {
win.minimize();
} else {
win.toFront();
}
},
clickEvent: 'mousedown',
template: new Ext.Template(
'<table border="0" cellpadding="0" cellspacing="0" class="x-btn-wrap"><tbody><tr>',
'<td class="ux-taskbutton-left"><i> </i></td><td class="ux-taskbutton-center"><em unselectable="on"><button class="x-btn-text" type="{1}" style="height:28px;">{0}</button></em></td><td class="ux-taskbutton-right"><i> </i></td>',
"</tr></tbody></table>")
});
};
Ext.extend(Ext.ux.TaskBar.TaskButton, Ext.Button, {
onRender: function () {
Ext.ux.TaskBar.TaskButton.superclass.onRender.apply(this, arguments);
this.cmenu = new Ext.menu.Menu({
items: [{
text: 'Restore',
handler: function () {
if (!this.win.isVisible()) {
this.win.show();
} else {
this.win.restore();
}
},
scope: this
}, {
text: 'Minimize',
handler: this.win.minimize,
scope: this.win
}, {
text: 'Maximize',
handler: this.win.maximize,
scope: this.win
}, '-', {
text: 'Close',
handler: this.closeWin.createDelegate(this, this.win, true),
scope: this.win
}]
});
this.cmenu.on('beforeshow', function () {
var items = this.cmenu.items.items;
var w = this.win;
items[0].setDisabled(w.maximized !== true && w.hidden !== true);
items[1].setDisabled(w.minimized === true);
items[2].setDisabled(w.maximized === true || w.hidden === true);
}, this);
this.el.on('contextmenu', function (e) {
e.stopEvent();
if (!this.cmenu.el) {
this.cmenu.render();
}
var xy = e.getXY();
xy[1] -= this.cmenu.el.getHeight();
this.cmenu.showAt(xy);
}, this);
},
closeWin: function (cMenu, e, win) {
if (!win.isVisible()) {
win.show();
} else {
win.restore();
}
win.close();
}
});