extjs-gpl
Version:
GPL licensed version of Sencha Ext JS
215 lines (186 loc) • 5.58 kB
JavaScript
/*!
* Ext JS Library 3.3.1
* Copyright(c) 2006-2014 Sencha Inc.
* licensing@sencha.com
* http://www.sencha.com/license
*/
Ext.Desktop = function(app) {
this.taskbar = new Ext.ux.TaskBar(app);
this.xTickSize = this.yTickSize = 1;
var taskbar = this.taskbar;
var desktopEl = Ext.get('x-desktop');
var taskbarEl = Ext.get('ux-taskbar');
var shortcuts = Ext.get('x-shortcuts');
var windows = new Ext.WindowGroup();
var activeWindow;
function minimizeWin(win) {
win.minimized = true;
win.hide();
}
function markActive(win) {
if (activeWindow && activeWindow != win) {
markInactive(activeWindow);
}
taskbar.setActiveButton(win.taskButton);
activeWindow = win;
Ext.fly(win.taskButton.el).addClass('active-win');
win.minimized = false;
}
function markInactive(win) {
if (win == activeWindow) {
activeWindow = null;
Ext.fly(win.taskButton.el).removeClass('active-win');
}
}
function removeWin(win) {
taskbar.removeTaskButton(win.taskButton);
layout();
}
function layout() {
desktopEl.setHeight(Ext.lib.Dom.getViewHeight() - taskbarEl.getHeight());
}
Ext.on('resize', layout);
this.layout = layout;
this.createWindow = function(config, cls) {
var win = new(cls || Ext.Window)(
Ext.applyIf(config || {},
{
renderTo: desktopEl,
manager: windows,
minimizable: true,
maximizable: true
})
);
win.dd.xTickSize = this.xTickSize;
win.dd.yTickSize = this.yTickSize;
if (win.resizer) {
win.resizer.widthIncrement = this.xTickSize;
win.resizer.heightIncrement = this.yTickSize;
}
win.render(desktopEl);
win.taskButton = taskbar.addTaskButton(win);
win.cmenu = new Ext.menu.Menu({
items: [
]
});
win.animateTarget = win.taskButton.el;
win.on({
'activate': {
fn: markActive
},
'beforeshow': {
fn: markActive
},
'deactivate': {
fn: markInactive
},
'minimize': {
fn: minimizeWin
},
'close': {
fn: removeWin
}
});
layout();
return win;
};
this.getManager = function() {
return windows;
};
this.getWindow = function(id) {
return windows.get(id);
};
this.getWinWidth = function() {
var width = Ext.lib.Dom.getViewWidth();
return width < 200 ? 200: width;
};
this.getWinHeight = function() {
var height = (Ext.lib.Dom.getViewHeight() - taskbarEl.getHeight());
return height < 100 ? 100: height;
};
this.getWinX = function(width) {
return (Ext.lib.Dom.getViewWidth() - width) / 2;
};
this.getWinY = function(height) {
return (Ext.lib.Dom.getViewHeight() - taskbarEl.getHeight() - height) / 2;
};
this.setTickSize = function(xTickSize, yTickSize) {
this.xTickSize = xTickSize;
if (arguments.length == 1) {
this.yTickSize = xTickSize;
} else {
this.yTickSize = yTickSize;
}
windows.each(function(win) {
win.dd.xTickSize = this.xTickSize;
win.dd.yTickSize = this.yTickSize;
win.resizer.widthIncrement = this.xTickSize;
win.resizer.heightIncrement = this.yTickSize;
},
this);
};
this.cascade = function() {
var x = 0,
y = 0;
windows.each(function(win) {
if (win.isVisible() && !win.maximized) {
win.setPosition(x, y);
x += 20;
y += 20;
}
},
this);
};
this.tile = function() {
var availWidth = desktopEl.getWidth(true);
var x = this.xTickSize;
var y = this.yTickSize;
var nextY = y;
windows.each(function(win) {
if (win.isVisible() && !win.maximized) {
var w = win.el.getWidth();
// Wrap to next row if we are not at the line start and this Window will go off the end
if ((x > this.xTickSize) && (x + w > availWidth)) {
x = this.xTickSize;
y = nextY;
}
win.setPosition(x, y);
x += w + this.xTickSize;
nextY = Math.max(nextY, y + win.el.getHeight() + this.yTickSize);
}
},
this);
};
this.contextMenu = new Ext.menu.Menu({
items: [{
text: 'Tile',
handler: this.tile,
scope: this
},
{
text: 'Cascade',
handler: this.cascade,
scope: this
}]
});
desktopEl.on('contextmenu',
function(e) {
e.stopEvent();
this.contextMenu.showAt(e.getXY());
},
this);
layout();
if (shortcuts) {
shortcuts.on('click',
function(e, t) {
t = e.getTarget('dt', shortcuts);
if (t) {
e.stopEvent();
var module = app.getModule(t.id.replace('-shortcut', ''));
if (module) {
module.createWindow();
}
}
});
}
};