ucbuilder
Version:
For Developing Applications with multiple form/usercontrols etc.. In Single BrowserWindow...
180 lines (170 loc) • 7.16 kB
text/typescript
import { Point, Size } from "ucbuilder/global/drawing/shapes";
import { numOpt } from "ucbuilder/build/common";
import { MouseForMove } from "ucbuilder/global/mouseForMove";
import { scrollbarHandler } from "ucbuilder/global/listUI/pager/scrollbarHandler";
import { ScrollerType, ScrollerUIElements, scrollerUIElements } from "ucbuilder/global/listUI/pager/enumAndMore";
import { newObjectOpt } from "ucbuilder/global/objectOpt";
import { keyBoard } from "ucbuilder/global/hardware/keyboard";
import { timeoutCall } from "ucbuilder/global/timeoutCall";
import { getConvertedNames, namingConversion, NamingConversion } from "ucbuilder/global/resizer/namingConversion";
export class pagerScroll {
nameList: NamingConversion = Object.assign({}, namingConversion);
dir: ScrollerType = 'Vertical';
constructor(dir: ScrollerType) {
this.nameList = getConvertedNames(dir == 'Horizontal' ? 'grid-template-columns' : 'grid-template-rows');
this.dir = dir;
}
doDebug: boolean = false;
refresh = {
scrollPosition: (): void => {
if (this.hasMouseDown) return;
if (this.mainlength != this.pagerLv.length) {
this.refresh.scrollSize();
return;
}
if (this.doDebug) debugger;
let tpos = this.pagerLv.pageInfo.extended._begin;
let ts = this.trackSize;
let stop = numOpt.gtvc(this.mainlength, ts, tpos);
this.scrollTop = Math.min(stop, this.trackSize - this.scrollSize);
},
scrollSize: (): void => {
this.mainlength = this.pagerLv.length;
this.trackSize = this.nodes.track[this.nameList.offsetSize];
let avval = this.mainlength / this.perPageRecord;
this.scrollSize = Math.min(
Math.max(this.trackSize / avval, 15),
this.trackSize
);
this.refresh.scrollPosition();
},
};
mainlength: number = 0;
_scrollSize: number = 0;
get scrollSize(): number {
return this._scrollSize;
}
set scrollSize(value: number) {
this._scrollSize = value;
this.nodes.scroller.style[this.nameList.size] = value + "px";
}
trackSize: number = 0;
_scrollTop: number = 0;
get scrollTop(): number {
return this._scrollTop;
}
set scrollTop(value: number) {
this._scrollTop = value;
this.nodes.scroller.style[this.nameList.dir] = value + "px";
this.Events.onChangeHiddenCount(
this.pageLvExtend.topHiddenRowCount,
this.pageLvExtend.bottomHiddenRowCount
);
}
Events = {
onChangeHiddenCount: (beginHiddenCount: number, endHiddenCount: number): void => {
this.nodes.beginText.innerText = ''+beginHiddenCount;
this.nodes.endText.innerText = ''+endHiddenCount;
},
};
nodes: ScrollerUIElements = Object.assign({},scrollerUIElements);
hasMouseDown: boolean = false;
get pagerLv() {
return this.main.main;
}
get pageLvExtend(): any {
return this.pagerLv.pageInfo.extended;
}
main: scrollbarHandler;
/**
* @param {scrollbarHandler} main
*/
getComplete(main: scrollbarHandler): void {
this.main = main;
this.pagerLv.Records.scrollerElement.addEventListener("keydown", (e: any) => {
if (e.keyCode === keyBoard.keys.single_quote) {
this.doDebug = !this.doDebug;
console.log("debug state : " + this.doDebug);
}
});
this.nodes.initByType("pager");
this.nodes.scrollbar.setAttribute("dir", this.dir);
if (this.nodes.scrollbar.parentElement == null) {
this.pagerLv.uc.ucExtends.passElement(this.nodes.scrollbar);
this.pagerLv.Records.scrollerElement.appendChild(this.nodes.scrollbar);
}
this.pagerLv.Events.onListUISizeChanged.on((r: any) => {
// console.log(this.perPageRecord);
this.refresh.scrollSize();
});
let mouseMv = new MouseForMove();
let tstamp = this.nodes.track.stamp();
this.nodes.track.addEventListener("mousedown", (e: any) => {
if (e.target.stamp() === tstamp) {
let hs = e[this.nameList.offsetPoint] - Math.floor(this.scrollSize / 2);
this.DOWN_SCROLL_POS = 0;
this.doContentScrollAt(hs, false);
mouseMv.doMouseDown(e);
}
});
mouseMv.bind(
{
onDown: (evt: any, pt: any): void => {
this.DOWN_PER_PAGE_ROW = this.perPageRecord;
this.DOWN_SCROLL_POS = this.scrollTop;
this.main.scrollBox.vScrollbar.nodes.scrollbar.setAttribute(
"active",
"1"
);
this.hasMouseDown = true;
},
onMove: (evt: any, diff: any): void => {
this.doContentScrollAt(diff[this.nameList.point]);
},
onUp: (evt: any, diff: any): void => {
this.hasMouseDown = false;
this.main.scrollBox.vScrollbar.nodes.scrollbar.setAttribute(
"active",
"0"
);
},
},
this.nodes.scroller
);
}
get perPageRecord(): number {
return this.pagerLv.pageInfo.extended.perPageRecord;
}
DOWN_PER_PAGE_ROW: number = 0;
DOWN_SCROLL_POS: number = 0;
isfilling: boolean = false;
doContentScrollAt(scrollval: number, useTimeOut: boolean = true): void {
if (this.isfilling) return;
this.isfilling = true;
//this.pagerLv.Records.scrollerElement.scrollHeight
let _this = this;
if (useTimeOut) setTimeout(doscroll);
else doscroll();
function doscroll() {
/*
scrollval += this.DOWN_SCROLL_POS;
scrollval = Math.min(scrollval, (this.trackSize - this.scrollSize));
scrollval = Math.max(scrollval, 0);
let st = (scrollval * this.contentSize) / this.trackSize;
this.scrollAt = scrollval;
this.pagerLv.Records.scrollerElement[this.nameList.scrollPosition] = st;
*/
scrollval += _this.DOWN_SCROLL_POS;
scrollval = Math.min(scrollval, _this.trackSize - _this.scrollSize);
scrollval = Math.max(scrollval, 0);
let sch =
((_this.mainlength - _this.DOWN_PER_PAGE_ROW) /
(_this.trackSize - _this.scrollSize)) *
scrollval;
_this.pagerLv.pageInfo.top = Math.floor(sch);
_this.pagerLv.nodes.fill();
_this.scrollTop = scrollval;
_this.isfilling = false;
}
}
}