splitter.js 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. /********************************************************************************************************************************
  2. * Licensed Materials - Property of IBM *
  3. * *
  4. * IBM Cognos Products: AGS *
  5. * *
  6. * (C) Copyright IBM Corp. 2012 *
  7. * *
  8. * US Government Users Restricted Rights - Use, duplication or disclosure restricted by GSA ADP Schedule Contract with IBM Corp. *
  9. *********************************************************************************************************************************/
  10. /*-----------------------------------------------------------------------------------------------------
  11. Class : Splitter
  12. Description : Implements a splitter to resize the data items pane
  13. -----------------------------------------------------------------------------------------------------*/
  14. function Splitter() {
  15. this.splitterElement = null;
  16. this.oldZIndex = 0;
  17. this.containerBounds = null;
  18. this.m_observers = new CObserver(this);
  19. //add event handlers
  20. var iframeDoc = document.getElementById('messageIFrame').contentWindow.document;
  21. addEvent(document,'mousedown',this.onSplitterMouseDown, false);
  22. addEvent(document,'mouseup',this.onSplitterMouseUp, false);
  23. addEvent(iframeDoc,'mouseup',this.onSplitterMouseUp, false);
  24. this.setSelectionState=setSelectionState;
  25. this.emptyHandler=emptyHandler;
  26. this.findBounds=findBounds;
  27. this.addMouseMoveHandlers=addMouseMoveHandlers;
  28. this.removeMouseMoveHandlers=removeMouseMoveHandlers;
  29. this.onSplitterMouseMove=onSplitterMouseMove;
  30. }
  31. function setSelectionState(target,disabled){
  32. //IE
  33. if (typeof target.onselectstart!="undefined") {
  34. if (disabled)
  35. addEvent(target,'selectstart',emptyHandler, false);
  36. else
  37. removeEvent(target,'selectstart',emptyHandler, false);
  38. }
  39. //FF
  40. else if (typeof target.style.MozUserSelect!="undefined") {
  41. if (disabled)
  42. target.style.MozUserSelect="none";
  43. else
  44. target.style.MozUserSelect="";
  45. }
  46. }
  47. function emptyHandler() {
  48. return false;
  49. }
  50. function findBounds(ele) {
  51. var left = 0;
  52. var top = 0;
  53. var width = ele.offsetWidth;
  54. var height = ele.offsetHeight;
  55. if (ele.offsetParent) {
  56. do {
  57. left += ele.offsetLeft;
  58. top += ele.offsetTop;
  59. } while (ele = ele.offsetParent);
  60. return [left,top,width,height];
  61. }
  62. }
  63. function addMouseMoveHandlers() {
  64. var iframeDoc = document.getElementById('messageIFrame').contentWindow.document;
  65. addEvent(document,'mousemove',onSplitterMouseMove, false);
  66. addEvent(iframeDoc,'mousemove',onSplitterMouseMove, false);
  67. }
  68. function removeMouseMoveHandlers() {
  69. var iframeDoc = document.getElementById('messageIFrame').contentWindow.document;
  70. removeEvent(document,'mousemove',onSplitterMouseMove, false);
  71. removeEvent(iframeDoc,'mousemove',onSplitterMouseMove, false);
  72. }
  73. Splitter.prototype.onSplitterMouseDown = function(evt){
  74. //get the event in a cross-browser fashion
  75. evt = (evt) ? evt : ((event) ? event : null);
  76. // IE uses srcElement, others use target
  77. var target = evt.target != null ? evt.target : evt.srcElement;
  78. // for IE, left click == 1
  79. // for Firefox, left click == 0
  80. if ((evt.button == 1 && window.event != null || evt.button == 0) && target.id == 'splitter') {
  81. var container = document.getElementById('container_float');
  82. var splitter = document.getElementById('ghost_splitter');
  83. this.containerBounds = findBounds(container);
  84. //before we show the ghost splitter, position and resize
  85. var pos = findBounds(target);
  86. splitter.style.display='block';
  87. splitter.style.left=pos[0];
  88. splitter.style.top=pos[1];
  89. splitter.style.height=target.offsetHeight;
  90. splitter.style.display='block';
  91. target.style.visibility='hidden';
  92. // bring the clicked element to the front while it is being dragged
  93. this.oldZIndex = target.style.zIndex;
  94. target.style.zIndex = 10000;
  95. // we need to access the element in OnMouseMove
  96. this.splitterElement = target;
  97. // tell our code to start moving the element with the mouse
  98. addMouseMoveHandlers();
  99. // cancel out any text selections
  100. document.body.focus();
  101. // prevent text selection in IE
  102. setSelectionState(window.top.document.body,true);
  103. // prevent IE from trying to drag an image
  104. addEvent(target,'dragstart',emptyHandler, false);
  105. return false;
  106. }
  107. }
  108. Splitter.prototype.onSplitterMouseUp = function(evt){
  109. if (this.splitterElement != null) {
  110. var ghostSplitter = document.getElementById('ghost_splitter');
  111. this.splitterElement.style.zIndex = this.oldZIndex;
  112. //remove event handlers
  113. removeMouseMoveHandlers();
  114. setSelectionState(window.top.document.body,false);
  115. removeEvent(this.splitterElement,'dragstart',emptyHandler, false);
  116. this.splitterElement = null;
  117. //resize the menu frame
  118. var newWidth = ghostSplitter.offsetLeft+8;
  119. cfgSet("MenuSize", newWidth);
  120. updatePercentageWidths(newWidth);
  121. ghostSplitter.style.display='none';
  122. var splitter = document.getElementById('splitter');
  123. splitter.style.visibility='visible';
  124. }
  125. }
  126. /*
  127. * Convert the frame width into percentages for the task menu/message frame
  128. * and set both accordingly
  129. */
  130. function updatePercentageWidths(menuFrameWidth) {
  131. var perc;
  132. var menuFrame = document.getElementById('menuFrame');
  133. var parent = document.getElementById('container_float');
  134. var messageFrame = document.getElementById('messageFrame');
  135. var parentWidth=parent.offsetWidth;
  136. perc = Math.round((menuFrameWidth/parentWidth)*100);
  137. if (perc<=20) {
  138. perc=20;
  139. }
  140. var messageFramePerc = 100-perc;
  141. menuFrame.style.width=perc+'%';
  142. messageFrame.style.width=messageFramePerc+'%';
  143. }
  144. function onSplitterMouseMove(evt) {
  145. if (evt == null) {
  146. evt = window.event;
  147. }
  148. if (evt!=null) {
  149. var ghostSplitter = document.getElementById('ghost_splitter');
  150. var mouseX = evt.screenX != null ? evt.screenX : evt.screenLeft;
  151. var windowX = window.screenX != null ? window.screenX : window.screenLeft;
  152. var minXBounds = this.containerBounds[0];
  153. var maxXBounds = this.containerBounds[2];
  154. if (evt.clientX <= minXBounds) {
  155. ghostSplitter.style.left = minXBounds+'px';
  156. }
  157. else if (evt.clientX >= maxXBounds){
  158. ghostSplitter.style.left = maxXBounds+'px';
  159. }
  160. else {
  161. // this is the actual "drag code"
  162. var target = evt.target != null ? evt.target : evt.srcElement;
  163. ghostSplitter.style.left = (mouseX-windowX-ghostSplitter.offsetWidth-minXBounds-4) + 'px';
  164. }
  165. }
  166. }
  167. Splitter.prototype.getObservers = function() {
  168. return this.m_observers;
  169. }
  170. Splitter.prototype.update = function() {
  171. return true;
  172. }