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.
 
 
 

299 lines
9.2 KiB

/**
* 自适应布局
*
* 1、resize
* 2、吸附
* 3、当前组件在最上方
* 4、可以撤销
* 5、上下之间插入组件
*
* Created by GUY on 2016/2/23.
* @class BI.AdaptiveArrangement
* @extends BI.Widget
*/
BI.AdaptiveArrangement = BI.inherit(BI.Widget, {
_defaultConfig: function () {
return BI.extend(BI.AdaptiveArrangement.superclass._defaultConfig.apply(this, arguments), {
baseCls: "bi-adaptive-arrangement",
resizable: true,
layoutType: BI.Arrangement.LAYOUT_TYPE.FREE,
items: []
});
},
_init: function () {
BI.AdaptiveArrangement.superclass._init.apply(this, arguments);
var self = this, o = this.options;
this.arrangement = BI.createWidget({
type: "bi.arrangement",
element: this,
layoutType: o.layoutType,
items: o.items
});
this.arrangement.on(BI.Arrangement.EVENT_SCROLL, function () {
self.fireEvent(BI.AdaptiveArrangement.EVENT_SCROLL, arguments);
});
this.zIndex = 0;
BI.each(o.items, function (i, item) {
self._initResizable(item.el);
});
$(document).mousedown(function (e) {
BI.each(self.getAllRegions(), function (i, region) {
if (region.el.element.find(e.target).length === 0) {
region.el.element.removeClass("selected");
}
});
});
BI.ResizeDetector.addResizeListener(this, function () {
self.arrangement.resize();
self.fireEvent(BI.AdaptiveArrangement.EVENT_RESIZE);
});
},
_isEqual: function () {
return this.arrangement._isEqual.apply(this.arrangement, arguments);
},
_setSelect: function (item) {
if (!item.element.hasClass("selected")) {
item.element.css("zIndex", ++this.zIndex);
BI.each(this.getAllRegions(), function (i, region) {
region.el.element.removeClass("selected");
});
item.element.addClass("selected");
}
},
_initResizable: function (item) {
var self = this, o = this.options;
item.element.css("zIndex", ++this.zIndex);
item.element.mousedown(function () {
self._setSelect(item)
});
},
_getScrollOffset: function () {
return this.arrangement._getScrollOffset();
},
getClientWidth: function () {
return this.arrangement.getClientWidth();
},
getClientHeight: function () {
return this.arrangement.getClientHeight();
},
addRegion: function (region, position) {
this._initResizable(region.el);
this._setSelect(region.el);
var self = this, flag;
var old = this.arrangement.getAllRegions();
if (flag = this.arrangement.addRegion(region, position)) {
this._old = old;
}
return flag;
},
deleteRegion: function (name) {
var flag;
var old = this.getAllRegions();
if (flag = this.arrangement.deleteRegion(name)) {
this._old = old;
} else {
this._old = this.getAllRegions();
this.relayout();
}
return flag;
},
setRegionSize: function (name, size) {
var flag;
var old = this.getAllRegions();
if (flag = this.arrangement.setRegionSize(name, size)) {
this._old = old;
}
return flag;
},
setPosition: function (position, size) {
var self = this;
return this.arrangement.setPosition(position, size);
},
setRegionPosition: function (name, position) {
var region = this.getRegionByName(name);
return this.arrangement.setRegionPosition(name, position);
},
setDropPosition: function (position, size) {
return this.arrangement.setDropPosition(position, size);
},
scrollInterval: function (e, isBorderScroll, isOverflowScroll, cb) {
// var self = this;
// var map = {
// top: [-1, 0],
// bottom: [1, 0],
// left: [0, -1],
// right: [0, 1]
// };
// var clientWidth = this.arrangement.getClientWidth();
// var clientHeight = this.arrangement.getClientHeight();
//
// function scrollTo(direction, callback) {
// if (direction === "") {
// self.lastActiveRegion = "";
// if (self._scrollInterval) {
// clearInterval(self._scrollInterval);
// self._scrollInterval = null;
// }
// return;
// }
// if (self.lastActiveRegion !== direction) {
// self.lastActiveRegion = direction;
// if (self._scrollInterval) {
// clearInterval(self._scrollInterval);
// self._scrollInterval = null;
// }
// var count = 0;
// self._scrollInterval = setInterval(function () {
// count++;
// if (count <= 3) {
// return;
// }
// var offset = self._getScrollOffset();
// var t = offset.top + map[direction][0] * 40;
// var l = offset.left + map[direction][1] * 40;
// if (t < 0 || l < 0) {
// return;
// }
// callback({
// offsetX: map[direction][1] * 40,
// offsetY: map[direction][0] * 40
// });
// self.scrollTo({
// top: t,
// left: l
// });
// }, 300);
// }
// }
cb({
offsetX: 0,
offsetY: 0
});
// var offset = this.element.offset();
// var p = {
// left: e.pageX - offset.left,
// top: e.pageY - offset.top
// };
// //向上滚
// if (isBorderScroll && p.top >= 0 && p.top <= 30) {
// scrollTo("top", cb)
// }
// //向下滚
// else if (isBorderScroll && p.top >= clientHeight - 30 && p.top <= clientHeight) {
// scrollTo("bottom", cb)
// }
// //向左滚
// else if (isBorderScroll && p.left >= 0 && p.left <= 30) {
// scrollTo("left", cb)
// }
// //向右滚
// else if (isBorderScroll && p.left >= clientWidth - 30 && p.left <= clientWidth) {
// scrollTo("right", cb)
// } else {
// if (isOverflowScroll === true) {
// if (p.top < 0) {
// scrollTo("top", cb);
// }
// else if (p.top > clientHeight) {
// scrollTo("bottom", cb);
// }
// else if (p.left < 0) {
// scrollTo("left", cb);
// }
// else if (p.left > clientWidth) {
// scrollTo("right", cb);
// } else {
// scrollTo("", cb);
// }
// } else {
// scrollTo("", cb);
// }
// }
},
scrollEnd: function () {
this.lastActiveRegion = "";
if (this._scrollInterval) {
clearInterval(this._scrollInterval);
this._scrollInterval = null;
}
},
scrollTo: function (scroll) {
this.arrangement.scrollTo(scroll);
},
zoom: function (ratio) {
this.arrangement.zoom(ratio);
},
resize: function () {
this.arrangement.resize();
},
relayout: function () {
return this.arrangement.relayout();
},
setLayoutType: function (type) {
var self = this;
this.arrangement.setLayoutType(type);
},
getLayoutType: function () {
return this.arrangement.getLayoutType();
},
getLayoutRatio: function () {
return this.arrangement.getLayoutRatio();
},
getHelper: function () {
return this.arrangement.getHelper();
},
getRegionByName: function (name) {
return this.arrangement.getRegionByName(name);
},
getAllRegions: function () {
return this.arrangement.getAllRegions();
},
revoke: function () {
if (this._old) {
this.populate(BI.toArray(this._old));
}
},
populate: function (items) {
var self = this;
BI.each(items, function (i, item) {
self._initResizable(item.el);
});
this.arrangement.populate(items);
}
});
BI.AdaptiveArrangement.EVENT_ELEMENT_START_RESIZE = "AdaptiveArrangement.EVENT_ELEMENT_START_RESIZE";
BI.AdaptiveArrangement.EVENT_ELEMENT_RESIZE = "AdaptiveArrangement.EVENT_ELEMENT_RESIZE";
BI.AdaptiveArrangement.EVENT_ELEMENT_STOP_RESIZE = "AdaptiveArrangement.EVENT_ELEMENT_STOP_RESIZE";
BI.AdaptiveArrangement.EVENT_RESIZE = "AdaptiveArrangement.EVENT_RESIZE";
BI.AdaptiveArrangement.EVENT_SCROLL = "AdaptiveArrangement.EVENT_SCROLL";
BI.shortcut('bi.adaptive_arrangement', BI.AdaptiveArrangement);