blob: 0010271e37c33d18b62812030b14877fba1d07a2 [file] [log] [blame]
Nils Diewald0e6992a2015-04-14 20:13:52 +00001 /**
2 * Menu to choose from for tree views.
3 */
4define(['menu', 'match/treeitem'], function (menuClass, itemClass) {
5 "use strict";
6
7 return {
Nils Diewald7148c6f2015-05-04 15:07:53 +00008
9 /**
10 * Create new menu object.
11 * Pass the match information object
12 * and the item parameters.
13 *
14 * @param info The match info object
15 * @param params The match menu items
16 * as an array of arrays.
17 */
Akroneaba63e2018-01-26 19:49:30 +010018 create : function (list) {
Nils Diewald0e6992a2015-04-14 20:13:52 +000019 var obj = Object.create(menuClass)
Akrond67d45b2017-05-18 21:47:38 +020020 .upgradeTo(this)
Akron0988d882017-11-10 16:13:12 +010021 ._init(list, {itemClass : itemClass});
Nils Diewald0e6992a2015-04-14 20:13:52 +000022 obj.limit(6);
Akroneaba63e2018-01-26 19:49:30 +010023
24 var e = obj.element();
Nils Diewald0e6992a2015-04-14 20:13:52 +000025
26 // This is only domspecific
Akroneaba63e2018-01-26 19:49:30 +010027 e.addEventListener('blur', function (e) {
Akrond67d45b2017-05-18 21:47:38 +020028 this.menu.hide();
Nils Diewald0e6992a2015-04-14 20:13:52 +000029 });
Akroneaba63e2018-01-26 19:49:30 +010030
31 e.setAttribute('id', 'treeMenu');
32
33 // Add menu to body
34 document.getElementsByTagName('body')[0].appendChild(e);
35
Nils Diewald0e6992a2015-04-14 20:13:52 +000036 return obj;
37 },
Nils Diewald7148c6f2015-05-04 15:07:53 +000038
39 /**
40 * The match information object of the menu.
41 */
Akroneaba63e2018-01-26 19:49:30 +010042 info :function (infoVar) {
43 if (infoVar !== undefined)
44 this._info = infoVar;
45
Nils Diewald0e6992a2015-04-14 20:13:52 +000046 return this._info;
Akroneaba63e2018-01-26 19:49:30 +010047 },
48
Akronbec4a6a2018-07-10 14:45:15 +020049 // Attach menu to button
Akroneaba63e2018-01-26 19:49:30 +010050 attachTo : function (e) {
Akron257aa852018-02-06 19:29:51 +010051
52 // this._attached = e;
53 this._repos(e);
54 this.slider().reInit();
55
56 /*
57 * This is a suboptimal scrolling solution, see
58 * see https://developer.mozilla.org/docs/Mozilla/Performance/ScrollLinkedEffects
59 */
60 if (this._onscroll !== undefined) {
61 window.removeEventListener('scroll', this._onscroll);
62 };
63
64 this._onscroll = function () {
65 this._repos(e);
66 }.bind(this);
67
68 window.addEventListener('scroll', this._onscroll);
69 },
70
71
72 // Overwrite onHide method
73 onHide : function () {
74
75 // Remove listener
76 if (this._onscroll !== undefined) {
77 window.removeEventListener('scroll', this._onscroll);
78 };
Akronc296ca22018-04-24 16:35:26 +020079 this.element().blur();
Akron257aa852018-02-06 19:29:51 +010080 },
81
82 _repos : function (e) {
Akroneaba63e2018-01-26 19:49:30 +010083 var bounding = e.getBoundingClientRect();
84 this._element.style.left = bounding.left + "px";
Akron257aa852018-02-06 19:29:51 +010085 this._element.style.top = (
86 bounding.top +
87 bounding.height -
88 this._element.clientHeight
89 ) + "px";
Nils Diewald0e6992a2015-04-14 20:13:52 +000090 }
91 };
92});