radio/libjs/wModel/page.js
2018-08-05 00:48:17 +03:00

164 lines
5.0 KiB
JavaScript

"use strict";
var Model = require("./model");
var AbstractMap = require("../wContainer/abstractmap");
var Vocabulary = require("../wType/vocabulary");
var Vector = require("../wType/vector");
var Address = require("../wType/address");
var String = require("../wType/string");
var UInt64 = require("../wType/uint64");
var ContentMap = AbstractMap.template(Address, Vocabulary);
var Page = Model.inherit({
"className": "Page",
"constructor": function(address, name) {
Model.fn.constructor.call(this, address);
this._data = new ContentMap(true);
this.name = name.toLowerCase();
this.urlAddress = [this.name];
this._hasParentReporter = false;
this._pr = undefined;
this._childPages = {};
this.addHandler("get");
this.addHandler("ping");
this.addProperty("backgroundColor", "mainColor");
this.addProperty("color", "mainFontColor");
},
"destructor": function() {
this._data.destructor();
Model.fn.destructor.call(this);
},
"addItem": function(model, row, col, rowspan, colspan, aligment, viewType, viewOptions) {
Model.fn.addModel.call(this, model);
var vc = new Vocabulary();
viewOptions = viewOptions || new Vocabulary();
viewType = viewType || new UInt64(Page.getModelTypeId(model))
vc.insert("type", new UInt64(Page.getModelTypeId(model)));
vc.insert("row", new UInt64(row || 0));
vc.insert("col", new UInt64(col || 0));
vc.insert("rowspan", new UInt64(rowspan || 1));
vc.insert("colspan", new UInt64(colspan || 1));
vc.insert("aligment", new UInt64(aligment || Page.Aligment.LeftTop));
vc.insert("viewOptions", viewOptions);
vc.insert("viewType", viewType);
this._data.insert(model.getAddress(), vc);
var evc = vc.clone();
evc.insert("address", model.getAddress());
this.broadcast(evc, "addItem");
},
"addPage": function(page) {
this.addModel(page);
var addr = this.urlAddress.slice();
addr.push(page.name);
page.setUrlAddress(addr)
page.on("newPage", this._onNewPage, this);
page.on("removePage", this._onRemovePage, this);
this._childPages[page.name] = page;
this.trigger("newPage", page);
},
"clear": function() {
this._data.clear();
this.broadcast(new Vocabulary(), "clear");
},
"getChildPage": function(name) {
return this._childPages[name];
},
"_h_get": function(ev) {
var data = new Vocabulary();
var vector = new Vector();
var itr = this._data.begin();
var end = this._data.end();
for (; !itr["=="](end); itr["++"]()) {
var pair = itr["*"]();
var vc = pair.second.clone();
vc.insert("address", pair.first.clone());
vector.push(vc);
}
data.insert("name", new String(this.name));
data.insert("data", vector);
this.response(data, "get", ev);
},
"_h_ping": function(ev) {
this.trigger("serviceMessage", "page " + this._address.toString() + " got pinged", 0);
},
"_h_subscribe": function(ev) {
Model.fn._h_subscribe.call(this, ev);
this._h_get(ev);
},
"_onNewPage": function(page) {
this.trigger("newPage", page);
},
"_onRemovePage": function(page) {
this.trigger("removePage", page);
},
"removeItem": function(model) {
Model.fn.removeModel.call(this, model);
var addr = model.getAddress();
var itr = this._data.find(addr);
this._data.erase(itr);
var vc = new Vocabulary();
vc.insert("address", addr);
this.broadcast(vc, "removeItem");
},
"removePage": function(page) {
Model.fn.removeModel.call(this, page);
delete this._childPages[page.name];
page.off("newPage", this._onNewPage, this);
page.off("removePage", this._onRemovePage, this);
this.trigger("removePage", page);
},
"setParentReporter": function(pr) {
if (this._hasParentReporter) {
throw new Error("An attempt to set parent reporter to page while another one already exists");
}
this._pr = pr;
this._hasParentReporter = true;
},
"setUrlAddress": function(address) {
this.urlAddress = address;
},
"unsetParentReporter": function() {
if (!this._hasParentReporter) {
throw new Error("An attempt to unset parent reporter from page which doesn't have one");
}
delete this._pr;
this._hasParentReporter = false;
}
});
Page.Aligment = {
"LeftTop": 1,
"LeftCenter": 4,
"LeftBottom": 7,
"CenterTop": 2,
"CenterCenter": 5,
"CenterBottom": 8,
"RightTop": 3,
"RightCenter": 6,
"RightBottom": 9
};
module.exports = Page;