/*
@version $Id: manager.js 156 2009-11-09 08:17:11Z roosit $
@copyright Copyright (C) 2008 Abricos All rights reserved.
@license http://www.gnu.org/copyleft/gpl.html GNU/GPL, see LICENSE.php
*/
/**
* @module Webos
* @namespace Brick.mod.webos
*/
var Component = new Brick.Component();
Component.requires = {
yahoo: ['dom', 'dragdrop', 'resize'],
mod:[
{name: 'webos', files: ['api.js']},
{name: 'sys', files: ['container.js', 'permission.js']}
]
};
Component.entryPoint = function(){
var Dom = YAHOO.util.Dom,
E = YAHOO.util.Event,
L = YAHOO.lang;
var __selfCT = this;
var NS = this.namespace,
TMG = this.template,
TM = TMG.get(),
T = TM.data,
TId = TM.idManager;
(function(){
var BrickPanel = Brick.widget.Panel;
var Panel = function(config){
config = config || {};
if (config.modal){
config.parentNode = document.body;
}else{
config.parentNode = NS.Workspace.instance.container;
}
Panel.superclass.constructor.call(this, config);
};
Panel.STATE_NORMAL = 0;
Panel.STATE_MAXIMIZED = 1;
Panel.STATE_MINIMIZED = 2;
YAHOO.extend(Panel, BrickPanel, {
init: function(el, config){
Panel.superclass.init.call(this, el, config);
if (!config.modal){
NS.Workspace.instance.registerPanel(this);
}
}
});
Panel.showPanel = BrickPanel.showPanel;
NS.Panel = Panel;
Brick.widget.Panel = Panel;
})();
(function(){
var ApplicationManager = new (function(){
var apps = [];
// зарегистрировать приложение
this.register = function(app){
apps[apps.length] = app;
};
this.each = function(func){
for (var i=0;i<apps.length;i++){
if (func(apps[i])){
return apps[i];
}
}
return null;
};
// Автозагрузка
var startup = [];
this.startupRegister = function(func){
startup[startup.length] = func;
};
this.startupEach = function(func){
for (var i=0;i<startup.length;i++){
func(startup[i]);
}
};
});
NS.ApplicationManager = ApplicationManager;
})();
(function(){
var LW = 80, LH = 80, DX = 20, DY = 20;
var Workspace = function(){
var container = Dom.get("workspace");
this.init(container);
};
Workspace.instance = null;
Workspace.prototype = {
_panels: {},
init: function(container){
Workspace.instance = this;
this.labels = {};
this.container = container;
this.panelManager = new YAHOO.widget.OverlayManager();
var __self = this;
Brick.Permission.load(function(){
__self._initApplication();
});
var __self = this;
E.on(window, "resize", function(event){
__self._setWorkspaceSize();
});
},
_initApplication: function(){
this._setWorkspaceSize();
var list = [];
// сформировать список модулей имеющих компонент 'app' в наличие
for (var m in Brick.Modules){
if (Brick.componentExists(m, 'app') && !Brick.componentLoaded(m, 'app')){
list[list.length] = {name: m, files:['app.js']};
}
}
var __self = this;
if (list.length > 0){
Brick.Loader.add({
mod: list,
onSuccess: function() {
__self.renderDesktopLabels();
}
});
}else{
__self.renderDesktopLabels();
}
},
_setWorkspaceSize: function(){
var r = Dom.getClientRegion();
var el = this.container;
Dom.setStyle(el, "width", r.width);
Dom.setStyle(el, "height", r.height);
},
renderDesktopLabels: function(){
var __self = this;
NS.ApplicationManager.each(function(app){
if (!__self.labelExist(app.getId())){
var label = new NS.DesktopLabel(app);
__self.addLabel(label);
}
});
// startup
NS.ApplicationManager.startupEach(function(startup){
startup();
});
},
labelExist: function(labelName){
if (this.labels[labelName]){
return true;
}
return false;
},
addLabel: function(label){
if (this.labelExist(label.getId())){
return;
}
label.buildLabel(this, DX, DX);
this.labels[label.getId()] = label;
this.orderLabelPosition();
},
orderLabelPosition: function(){
var x = DX, y = DY;
for (var n in this.labels){
var lbl = this.labels[n];
lbl.setPositionLabel(x, y);
y += DX+LH;
}
},
registerPanel: function(panel){
var pnls = this._panels;
for (var n in pnls){
var pnl = pnls[n];
if (pnl.isClosePanel){
try{
pnl.destroy();
}catch(ex){
};
delete pnls[n];
}
}
this._panels[panel.globalId] = panel;
this.panelManager.register(panel);
}
};
NS.Workspace = Workspace;
})();
(function(){
var globalId = 1;
var DesktopLabel = function(app){
this.initLabel(app);
};
YAHOO.extend(DesktopLabel, YAHOO.util.DD, {
_TM: null,
_T: null,
_TId: null,
initLabel: function(app){
this.app = app;
var tm = TMG.get(globalId++, 'label');
this._T = tm.data;
this._TId = tm.idManager;
this._TM = tm;
},
getId: function(){
return this.app.getId();
},
buildLabel: function(workspace){
var app = this.app;
var div = document.createElement('DIV');
div.innerHTML = this._TM.replace('label', {
'name': app.name,
'icon': app.icon,
'title': app.getTitle()
});
var el = div.childNodes[0];
el.style.display = 'none';
div.removeChild(el);
workspace.container.appendChild(el);
this.element = el;
el.style.display = '';
// call DragDrop.init method
this.init(this.element, '', {});
E.on(el, 'click', this.onClickLabel, this, true);
this._ddmove = false;
},
onClickLabel: function(){
if (this._ddmove){
this._ddmove = false;
return;
}
this.app.fireEntryPoint();
},
setPositionLabel: function(left, top){
var el = this.element;
el.style.left = left+'px';
el.style.top = top+'px';
},
startDrag: function(x, y){
var el = this.getEl();
Dom.setStyle(el, "opacity", 0.2);
var style = el.style;
this.origZ = style.zIndex;
style.zIndex = 999;
this.origCursor = style.cursor;
style.cursor = 'move';
},
endDrag: function(e) {
var el = this.getEl();
Dom.setStyle(el, "opacity", 1);
var style = el.style;
style.zIndex = this.origZ;
style.cursor = this.origCursor;
this._ddmove = true;
}
});
NS.DesktopLabel = DesktopLabel;
})();
(function(){
/**
* Приложение WebOS.
*
* @class Application
* @constructor
* @param {String} moduleName Имя модуля которому пренадлежит приложение.
* @param {String} name Имя приложения
*/
var Application = function(moduleName, name){
name = name || moduleName;
/**
* Имя модуля.
* @property moduleName
* @type String
*/
this.moduleName = moduleName;
/**
* Имя приложения
* @property name
* @type String
* @default <i>moduleName</i>
*/
this.name = name;
/**
* Надпись ярлыка.
* @property title
* @type String
*/
this.title = '';
/**
* Идентификатор надписи в менеджере фраз. Например: "mod.user.cp.title"
* @property titleId
* @type String
* @default mod.<i>moduleName</i>.cp.title
*/
this.titleId = "mod."+moduleName+'.app.title';
/**
* Путь к иконке
* @property icon
* @type String
* @default modules/user/css/images/cp_icon_default.gif
*/
this.icon = "";
/**
* Компонент этого модуля, который должен быть загружен,
* когда будет клик по ярлыку приложения.<br>
* Установите значение пустым, если подгрузка компонента ненужна.
* @property entryComponent
* @type String
*/
this.entryComponent = '';
/**
* Точка входа (функция), которая будет выполнена по клику на ярлык.
* @property entryPoint
* @type String | Function
*/
this.entryPoint = null;
/**
* Получить надпись.
*
* @method getTitle
* @return {String}
*/
this.getTitle = function(){
var phrase = Brick.util.Language.getc(this.titleId);
if (L.isString(phrase)){
return phrase;
}
return this.title != '' ? this.title : this.name;
};
/**
* Получить идентификатор.
*
* @method getId
* @return {String}
*/
this.getId = function(){
return this.moduleName+'_'+this.name;
};
/**
* Пользователь запустил приложение, необходимо выполнить
* функцию указанную в entryPoint. Если указан entryComponent,
* то необходимо его подгрузить перед выполнением функции.
*
* @method fireEntryPoint
*/
this.fireEntryPoint = function(){
var __self = this;
var fire = function(){
var fn;
if (L.isFunction(__self.entryPoint)){
fn = __self.entryPoint;
}else{
fn = Brick.convertToObject(__self.entryPoint);
}
if (L.isFunction(fn)){
fn();
}
};
if (this.entryComponent != ''){
if (!Brick.componentLoaded(this.moduleName, this.entryComponent)){
Brick.Component.API.fireFunction(this.moduleName, this.entryComponent, function(){
fire();
});
}else{
fire();
}
}else{
fire();
}
};
};
NS.Application = Application;
})();
(function(){
})();
};