Helios-Layout.st 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. Smalltalk current createPackage: 'Helios-Layout' properties: #{}!
  2. Widget subclass: #HLContainer
  3. instanceVariableNames: 'splitter'
  4. package: 'Helios-Layout'!
  5. !HLContainer methodsFor: 'accessing'!
  6. splitter
  7. ^ splitter
  8. !
  9. splitter: aSplitter
  10. splitter := aSplitter
  11. ! !
  12. !HLContainer methodsFor: 'rendering'!
  13. renderOn: html
  14. html div
  15. id: 'container';
  16. with: self splitter.
  17. (window jQuery: window) bind: 'resize' do: [ self splitter resize ]
  18. ! !
  19. !HLContainer class methodsFor: 'instance creation'!
  20. with: aSplitter
  21. ^ self new
  22. splitter: aSplitter;
  23. yourself
  24. ! !
  25. Widget subclass: #HLPane
  26. instanceVariableNames: ''
  27. package: 'Helios-Layout'!
  28. HLPane subclass: #HLHorizontalPane
  29. instanceVariableNames: ''
  30. package: 'Helios-Layout'!
  31. HLPane subclass: #HLVerticalPane
  32. instanceVariableNames: ''
  33. package: 'Helios-Layout'!
  34. Widget subclass: #HLSplitter
  35. instanceVariableNames: 'firstWidget secondWidget firstPane secondPane splitter'
  36. package: 'Helios-Layout'!
  37. !HLSplitter methodsFor: 'accessing'!
  38. cssClass
  39. ^ 'splitter'
  40. !
  41. firstWidget
  42. ^ firstWidget
  43. !
  44. firstWidget: aWidget
  45. firstWidget := aWidget
  46. !
  47. secondWidget
  48. ^ secondWidget
  49. !
  50. secondWidget: aWidget
  51. secondWidget := aWidget
  52. ! !
  53. !HLSplitter methodsFor: 'rendering'!
  54. panesCssClass
  55. ^ 'panes'
  56. !
  57. renderOn: html
  58. html div class: self panesCssClass; with: [
  59. firstPane := html div class: 'pane'; with: self firstWidget.
  60. splitter := html div class: self cssClass.
  61. secondPane := html div class: 'pane'; with: self secondWidget ].
  62. self
  63. setupSplitter;
  64. resize
  65. !
  66. resize
  67. self firstWidget isHeliosSplitter ifTrue: [ self firstWidget resize ].
  68. self secondWidget isHeliosSplitter ifTrue: [ self secondWidget resize ]
  69. !
  70. setupSplitter
  71. ! !
  72. !HLSplitter methodsFor: 'testing'!
  73. isHeliosSplitter
  74. ^ true
  75. ! !
  76. !HLSplitter class methodsFor: 'instance creation'!
  77. with: aWidget with: anotherWidget
  78. ^ self new
  79. firstWidget: aWidget;
  80. secondWidget: anotherWidget;
  81. yourself
  82. ! !
  83. HLSplitter subclass: #HLHorizontalSplitter
  84. instanceVariableNames: ''
  85. package: 'Helios-Layout'!
  86. !HLHorizontalSplitter methodsFor: 'accessing'!
  87. cssClass
  88. ^ super cssClass, ' horizontal'
  89. !
  90. panesCssClass
  91. ^ super panesCssClass, ' horizontal'
  92. ! !
  93. !HLHorizontalSplitter methodsFor: 'actions'!
  94. resize
  95. | container position |
  96. container := firstPane asJQuery parent.
  97. position := splitter asJQuery offset top - container offset top.
  98. firstPane asJQuery height: ((position min: container height - 100) max: 100).
  99. secondPane asJQuery height: (((container height - position) min: container height - 100) max: 100) - 6.
  100. "Put the splitter div back to a relative position"
  101. splitter asJQuery css: 'top' value: 0.
  102. super resize
  103. ! !
  104. !HLHorizontalSplitter methodsFor: 'rendering'!
  105. setupSplitter
  106. splitter asJQuery draggable: #{ 'axis' -> 'y'. 'stop' -> [ self resize ] }
  107. ! !
  108. HLSplitter subclass: #HLVerticalSplitter
  109. instanceVariableNames: ''
  110. package: 'Helios-Layout'!
  111. !HLVerticalSplitter methodsFor: 'accessing'!
  112. cssClass
  113. ^ super cssClass, ' vertical'
  114. !
  115. panesCssClass
  116. ^ super panesCssClass, ' vertical'
  117. ! !
  118. !HLVerticalSplitter methodsFor: 'actions'!
  119. resize
  120. | container position |
  121. container := firstPane asJQuery parent.
  122. position := splitter asJQuery offset left - container offset left.
  123. firstPane asJQuery width: ((position min: container width - 100) max: 100).
  124. secondPane asJQuery width: (((container width - position) min: container width - 100) max: 100) - 6.
  125. "Put the splitter div back to a relative position"
  126. splitter asJQuery css: 'left' value: 0.
  127. super resize
  128. ! !
  129. !HLVerticalSplitter methodsFor: 'rendering'!
  130. setupSplitter
  131. splitter asJQuery draggable: #{ 'axis' -> 'x'. 'stop' -> [ self resize ] }
  132. ! !
  133. !Object methodsFor: '*Helios-Layout'!
  134. isHeliosSplitter
  135. ^ false
  136. ! !