Dock.js 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  1. Ext.define('Ext.theme.neptune.layout.component.Dock', {
  2. override: 'Ext.layout.component.Dock',
  3. /**
  4. * This table contains the border removal classes indexed by the sum of the edges to
  5. * remove. Each edge is assigned a value:
  6. *
  7. * * `left` = 1
  8. * * `bottom` = 2
  9. * * `right` = 4
  10. * * `top` = 8
  11. *
  12. * @private
  13. */
  14. noBorderClassTable: [
  15. 0, // TRBL
  16. Ext.baseCSSPrefix + 'noborder-l', // 0001 = 1
  17. Ext.baseCSSPrefix + 'noborder-b', // 0010 = 2
  18. Ext.baseCSSPrefix + 'noborder-bl', // 0011 = 3
  19. Ext.baseCSSPrefix + 'noborder-r', // 0100 = 4
  20. Ext.baseCSSPrefix + 'noborder-rl', // 0101 = 5
  21. Ext.baseCSSPrefix + 'noborder-rb', // 0110 = 6
  22. Ext.baseCSSPrefix + 'noborder-rbl', // 0111 = 7
  23. Ext.baseCSSPrefix + 'noborder-t', // 1000 = 8
  24. Ext.baseCSSPrefix + 'noborder-tl', // 1001 = 9
  25. Ext.baseCSSPrefix + 'noborder-tb', // 1010 = 10
  26. Ext.baseCSSPrefix + 'noborder-tbl', // 1011 = 11
  27. Ext.baseCSSPrefix + 'noborder-tr', // 1100 = 12
  28. Ext.baseCSSPrefix + 'noborder-trl', // 1101 = 13
  29. Ext.baseCSSPrefix + 'noborder-trb', // 1110 = 14
  30. Ext.baseCSSPrefix + 'noborder-trbl' // 1111 = 15
  31. ],
  32. /**
  33. * The numeric values assigned to each edge indexed by the `dock` config value.
  34. * @private
  35. */
  36. edgeMasks: {
  37. top: 8,
  38. right: 4,
  39. bottom: 2,
  40. left: 1
  41. },
  42. handleItemBorders: function() {
  43. var me = this,
  44. edges = 0,
  45. maskT = 8,
  46. maskR = 4,
  47. maskB = 2,
  48. maskL = 1,
  49. owner = me.owner,
  50. bodyBorder = owner.bodyBorder,
  51. ownerBorder = owner.border,
  52. collapsed = me.collapsed,
  53. edgeMasks = me.edgeMasks,
  54. noBorderCls = me.noBorderClassTable,
  55. dockedItemsGen = owner.dockedItems.generation,
  56. b, borderCls, docked, edgesTouched, i, ln, item, dock, lastValue, mask,
  57. addCls, removeCls;
  58. if (me.initializedBorders === dockedItemsGen) {
  59. return;
  60. }
  61. addCls = [];
  62. removeCls = [];
  63. borderCls = me.getBorderCollapseTable();
  64. noBorderCls = me.getBorderClassTable ? me.getBorderClassTable() : noBorderCls;
  65. me.initializedBorders = dockedItemsGen;
  66. // Borders have to be calculated using expanded docked item collection.
  67. me.collapsed = false;
  68. docked = me.getDockedItems('visual');
  69. me.collapsed = collapsed;
  70. for (i = 0, ln = docked.length; i < ln; i++) {
  71. item = docked[i];
  72. if (item.ignoreBorderManagement) {
  73. // headers in framed panels ignore border management, so we do not want
  74. // to set "satisfied" on the edge in question
  75. continue;
  76. }
  77. dock = item.dock;
  78. mask = edgesTouched = 0;
  79. addCls.length = 0;
  80. removeCls.length = 0;
  81. if (dock !== 'bottom') {
  82. if (edges & maskT) { // if (not touching the top edge)
  83. b = item.border;
  84. } else {
  85. b = ownerBorder;
  86. if (b !== false) {
  87. edgesTouched += maskT;
  88. }
  89. }
  90. if (b === false) {
  91. mask += maskT;
  92. }
  93. }
  94. if (dock !== 'left') {
  95. if (edges & maskR) { // if (not touching the right edge)
  96. b = item.border;
  97. } else {
  98. b = ownerBorder;
  99. if (b !== false) {
  100. edgesTouched += maskR;
  101. }
  102. }
  103. if (b === false) {
  104. mask += maskR;
  105. }
  106. }
  107. if (dock !== 'top') {
  108. if (edges & maskB) { // if (not touching the bottom edge)
  109. b = item.border;
  110. } else {
  111. b = ownerBorder;
  112. if (b !== false) {
  113. edgesTouched += maskB;
  114. }
  115. }
  116. if (b === false) {
  117. mask += maskB;
  118. }
  119. }
  120. if (dock !== 'right') {
  121. if (edges & maskL) { // if (not touching the left edge)
  122. b = item.border;
  123. } else {
  124. b = ownerBorder;
  125. if (b !== false) {
  126. edgesTouched += maskL;
  127. }
  128. }
  129. if (b === false) {
  130. mask += maskL;
  131. }
  132. }
  133. if ((lastValue = item.lastBorderMask) !== mask) {
  134. item.lastBorderMask = mask;
  135. if (lastValue) {
  136. removeCls[0] = noBorderCls[lastValue];
  137. }
  138. if (mask) {
  139. addCls[0] = noBorderCls[mask];
  140. }
  141. }
  142. if ((lastValue = item.lastBorderCollapse) !== edgesTouched) {
  143. item.lastBorderCollapse = edgesTouched;
  144. if (lastValue) {
  145. removeCls[removeCls.length] = borderCls[lastValue];
  146. }
  147. if (edgesTouched) {
  148. addCls[addCls.length] = borderCls[edgesTouched];
  149. }
  150. }
  151. if (removeCls.length) {
  152. item.removeCls(removeCls);
  153. }
  154. if (addCls.length) {
  155. item.addCls(addCls);
  156. }
  157. // mask can use += but edges must use |= because there can be multiple items
  158. // on an edge but the mask is reset per item
  159. edges |= edgeMasks[dock]; // = T, R, B or L (8, 4, 2 or 1)
  160. }
  161. mask = edgesTouched = 0;
  162. addCls.length = 0;
  163. removeCls.length = 0;
  164. if (edges & maskT) { // if (not touching the top edge)
  165. b = bodyBorder;
  166. } else {
  167. b = ownerBorder;
  168. if (b !== false) {
  169. edgesTouched += maskT;
  170. }
  171. }
  172. if (b === false) {
  173. mask += maskT;
  174. }
  175. if (edges & maskR) { // if (not touching the right edge)
  176. b = bodyBorder;
  177. } else {
  178. b = ownerBorder;
  179. if (b !== false) {
  180. edgesTouched += maskR;
  181. }
  182. }
  183. if (b === false) {
  184. mask += maskR;
  185. }
  186. if (edges & maskB) { // if (not touching the bottom edge)
  187. b = bodyBorder;
  188. } else {
  189. b = ownerBorder;
  190. if (b !== false) {
  191. edgesTouched += maskB;
  192. }
  193. }
  194. if (b === false) {
  195. mask += maskB;
  196. }
  197. if (edges & maskL) { // if (not touching the left edge)
  198. b = bodyBorder;
  199. } else {
  200. b = ownerBorder;
  201. if (b !== false) {
  202. edgesTouched += maskL;
  203. }
  204. }
  205. if (b === false) {
  206. mask += maskL;
  207. }
  208. if ((lastValue = me.lastBodyBorderMask) !== mask) {
  209. me.lastBodyBorderMask = mask;
  210. if (lastValue) {
  211. removeCls[0] = noBorderCls[lastValue];
  212. }
  213. if (mask) {
  214. addCls[0] = noBorderCls[mask];
  215. }
  216. }
  217. if ((lastValue = me.lastBodyBorderCollapse) !== edgesTouched) {
  218. me.lastBodyBorderCollapse = edgesTouched;
  219. if (lastValue) {
  220. removeCls[removeCls.length] = borderCls[lastValue];
  221. }
  222. if (edgesTouched) {
  223. addCls[addCls.length] = borderCls[edgesTouched];
  224. }
  225. }
  226. if (removeCls.length) {
  227. owner.removeBodyCls(removeCls);
  228. }
  229. if (addCls.length) {
  230. owner.addBodyCls(addCls);
  231. }
  232. },
  233. onRemove: function (item) {
  234. var me = this,
  235. lastBorderMask = item.lastBorderMask,
  236. lastBorderCollapse = item.lastBorderCollapse;
  237. if (!item.destroyed && !item.ignoreBorderManagement) {
  238. if (lastBorderMask) {
  239. item.lastBorderMask = 0;
  240. item.removeCls(me.noBorderClassTable[lastBorderMask]);
  241. }
  242. if (lastBorderCollapse) {
  243. item.lastBorderCollapse = 0;
  244. item.removeCls(me.getBorderCollapseTable()[lastBorderCollapse]);
  245. }
  246. }
  247. me.callParent([item]);
  248. }
  249. });