|
1 #ifdef 0 |
|
2 /* This Source Code Form is subject to the terms of the Mozilla Public |
|
3 * License, v. 2.0. If a copy of the MPL was not distributed with this file, |
|
4 * You can obtain one at http://mozilla.org/MPL/2.0/. */ |
|
5 #endif |
|
6 |
|
7 /** |
|
8 * This class manages a cell's DOM node (not the actually cell content, a site). |
|
9 * It's mostly read-only, i.e. all manipulation of both position and content |
|
10 * aren't handled here. |
|
11 */ |
|
12 function Cell(aGrid, aNode) { |
|
13 this._grid = aGrid; |
|
14 this._node = aNode; |
|
15 this._node._newtabCell = this; |
|
16 |
|
17 // Register drag-and-drop event handlers. |
|
18 ["dragenter", "dragover", "dragexit", "drop"].forEach(function (aType) { |
|
19 this._node.addEventListener(aType, this, false); |
|
20 }, this); |
|
21 } |
|
22 |
|
23 Cell.prototype = { |
|
24 /** |
|
25 * The grid. |
|
26 */ |
|
27 _grid: null, |
|
28 |
|
29 /** |
|
30 * The cell's DOM node. |
|
31 */ |
|
32 get node() this._node, |
|
33 |
|
34 /** |
|
35 * The cell's offset in the grid. |
|
36 */ |
|
37 get index() { |
|
38 let index = this._grid.cells.indexOf(this); |
|
39 |
|
40 // Cache this value, overwrite the getter. |
|
41 Object.defineProperty(this, "index", {value: index, enumerable: true}); |
|
42 |
|
43 return index; |
|
44 }, |
|
45 |
|
46 /** |
|
47 * The previous cell in the grid. |
|
48 */ |
|
49 get previousSibling() { |
|
50 let prev = this.node.previousElementSibling; |
|
51 prev = prev && prev._newtabCell; |
|
52 |
|
53 // Cache this value, overwrite the getter. |
|
54 Object.defineProperty(this, "previousSibling", {value: prev, enumerable: true}); |
|
55 |
|
56 return prev; |
|
57 }, |
|
58 |
|
59 /** |
|
60 * The next cell in the grid. |
|
61 */ |
|
62 get nextSibling() { |
|
63 let next = this.node.nextElementSibling; |
|
64 next = next && next._newtabCell; |
|
65 |
|
66 // Cache this value, overwrite the getter. |
|
67 Object.defineProperty(this, "nextSibling", {value: next, enumerable: true}); |
|
68 |
|
69 return next; |
|
70 }, |
|
71 |
|
72 /** |
|
73 * The site contained in the cell, if any. |
|
74 */ |
|
75 get site() { |
|
76 let firstChild = this.node.firstElementChild; |
|
77 return firstChild && firstChild._newtabSite; |
|
78 }, |
|
79 |
|
80 /** |
|
81 * Checks whether the cell contains a pinned site. |
|
82 * @return Whether the cell contains a pinned site. |
|
83 */ |
|
84 containsPinnedSite: function Cell_containsPinnedSite() { |
|
85 let site = this.site; |
|
86 return site && site.isPinned(); |
|
87 }, |
|
88 |
|
89 /** |
|
90 * Checks whether the cell contains a site (is empty). |
|
91 * @return Whether the cell is empty. |
|
92 */ |
|
93 isEmpty: function Cell_isEmpty() { |
|
94 return !this.site; |
|
95 }, |
|
96 |
|
97 /** |
|
98 * Handles all cell events. |
|
99 */ |
|
100 handleEvent: function Cell_handleEvent(aEvent) { |
|
101 // We're not responding to external drag/drop events |
|
102 // when our parent window is in private browsing mode. |
|
103 if (inPrivateBrowsingMode() && !gDrag.draggedSite) |
|
104 return; |
|
105 |
|
106 if (aEvent.type != "dragexit" && !gDrag.isValid(aEvent)) |
|
107 return; |
|
108 |
|
109 switch (aEvent.type) { |
|
110 case "dragenter": |
|
111 aEvent.preventDefault(); |
|
112 gDrop.enter(this, aEvent); |
|
113 break; |
|
114 case "dragover": |
|
115 aEvent.preventDefault(); |
|
116 break; |
|
117 case "dragexit": |
|
118 gDrop.exit(this, aEvent); |
|
119 break; |
|
120 case "drop": |
|
121 aEvent.preventDefault(); |
|
122 gDrop.drop(this, aEvent); |
|
123 break; |
|
124 } |
|
125 } |
|
126 }; |