fineui是帆软报表和BI产品线所使用的前端框架。
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

170 lines
5.1 KiB

/**
* 弹出层面板控制器, z-index在10w层级
*
* Created by GUY on 2015/6/24.
* @class
*/
BI.LayerController = BI.inherit(BI.Controller, {
_defaultConfig: function () {
return BI.extend(BI.LayerController.superclass._defaultConfig.apply(this, arguments), {
render: "body"
});
},
_init: function () {
BI.LayerController.superclass._init.apply(this, arguments);
this.layerManager = {};
this.layouts = {};
this.zindex = BI.zIndex_layer;
BI.Resizers.add("layerController" + BI.uniqueId(), BI.bind(this._resize, this));
},
_resize: function () {
BI.each(this.layouts, function (i, layer) {
if (layer.element.is(":visible")) {
layer.element.trigger("__resize__");
}
});
},
make: function (name, container, op, context) {
if (BI.isWidget(container)) {
op = op || {};
op.container = container;
} else {
context = op;
op = container;
}
return this.create(name, null, op, context);
},
create: function (name, from, op, context) {
if (this.has(name)) {
return this.get(name);
}
op || (op = {});
var offset = op.offset || {};
var w = from;
if (BI.isWidget(from)) {
w = from.element;
}
if (BI.isNotEmptyString(w)) {
w = BI.Widget._renderEngine.createElement(w);
}
if (this.has(name)) {
return this.get(name);
}
var widget = BI.createWidget((op.render || {}), BI.extend({
type: "bi.layout"
}, op), context);
var layout = BI.createWidget({
type: "bi.absolute",
invisible: true,
items: [{
el: widget,
left: 0,
right: 0,
top: 0,
bottom: 0
}]
}, context);
BI.createWidget({
type: "bi.absolute",
element: op.container || this.options.render,
items: [{
el: layout,
left: offset.left || 0,
right: offset.right || 0,
top: offset.top || 0,
bottom: offset.bottom || 0
}]
});
if (w) {
layout.element.addClass("bi-popup-view");
layout.element.css({
left: w.offset().left + (offset.left || 0),
top: w.offset().top + (offset.top || 0),
width: offset.width || (w.outerWidth() - (offset.left || 0) - (offset.right || 0)) || "",
height: offset.height || (w.outerHeight() - (offset.top || 0) - (offset.bottom || 0)) || ""
});
layout.element.on("__resize__", function () {
w.is(":visible") &&
layout.element.css({
left: w.offset().left + (offset.left || 0),
top: w.offset().top + (offset.top || 0),
width: offset.width || (w.outerWidth() - (offset.left || 0) - (offset.right || 0)) || "",
height: offset.height || (w.outerHeight() - (offset.top || 0) - (offset.bottom || 0)) || ""
});
});
}
this.add(name, widget, layout);
return widget;
},
hide: function (name, callback) {
if (!this.has(name)) {
return this;
}
this._getLayout(name).invisible();
this._getLayout(name).element.hide(0, callback);
return this;
},
show: function (name, callback) {
if (!this.has(name)) {
return this;
}
this._getLayout(name).visible();
this._getLayout(name).element.css("z-index", this.zindex++).show(0, callback).trigger("__resize__");
return this;
},
isVisible: function (name) {
return this.has(name) && this._getLayout(name).isVisible();
},
add: function (name, layer, layout) {
if (this.has(name)) {
throw new Error("name is already exist");
}
layout.setVisible(false);
this.layerManager[name] = layer;
this.layouts[name] = layout;
layout.element.css("z-index", this.zindex++);
return this;
},
_getLayout: function (name) {
return this.layouts[name];
},
get: function (name) {
return this.layerManager[name];
},
has: function (name) {
return this.layerManager[name] != null;
},
remove: function (name) {
if (!this.has(name)) {
return this;
}
this.layerManager[name].destroy();
this.layouts[name].destroy();
delete this.layerManager[name];
delete this.layouts[name];
return this;
},
removeAll: function () {
var self = this;
BI.each(BI.keys(this.layerManager), function (index, name) {
self.layerManager[name].destroy();
self.layouts[name].destroy();
});
this.layerManager = {};
this.layouts = {};
return this;
}
});