pagesmgr.tcl 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299
  1. # ------------------------------------------------------------------------------
  2. # pagesmgr.tcl
  3. # This file is part of Unifix BWidget Toolkit
  4. # $Id$
  5. # ------------------------------------------------------------------------------
  6. # Index of commands:
  7. # - PagesManager::create
  8. # - PagesManager::configure
  9. # - PagesManager::cget
  10. # - PagesManager::compute_size
  11. # - PagesManager::add
  12. # - PagesManager::delete
  13. # - PagesManager::raise
  14. # - PagesManager::page
  15. # - PagesManager::pages
  16. # - PagesManager::getframe
  17. # - PagesManager::_test_page
  18. # - PagesManager::_select
  19. # - PagesManager::_redraw
  20. # - PagesManager::_draw_area
  21. # - PagesManager::_realize
  22. # ------------------------------------------------------------------------------
  23. namespace eval PagesManager {
  24. Widget::declare PagesManager {
  25. {-background TkResource "" 0 frame}
  26. {-width Int 0 0 {=0 ""}}
  27. {-height Int 0 0 {=0 ""}}
  28. }
  29. Widget::addmap PagesManager "" :cmd {-width {} -height {}}
  30. proc ::PagesManager { path args } { return [eval PagesManager::create $path $args] }
  31. proc use {} {}
  32. }
  33. # ------------------------------------------------------------------------------
  34. # Command PagesManager::create
  35. # ------------------------------------------------------------------------------
  36. proc PagesManager::create { path args } {
  37. variable $path
  38. upvar 0 $path data
  39. Widget::init PagesManager $path $args
  40. set data(select) ""
  41. set data(pages) {}
  42. set data(cpt) 0
  43. set data(realized) 0
  44. # --- creation du canvas -----------------------------------------------------------------
  45. set w [Widget::cget $path -width]
  46. set h [Widget::cget $path -height]
  47. canvas $path -relief flat -bd 0 -highlightthickness 0 -width $w -height $h
  48. bind $path <Configure> "PagesManager::_realize $path"
  49. bind $path <Destroy> "PagesManager::_destroy $path"
  50. rename $path ::$path:cmd
  51. proc ::$path { cmd args } "return \[eval PagesManager::\$cmd $path \$args\]"
  52. return $path
  53. }
  54. # ------------------------------------------------------------------------------
  55. # Command PagesManager::configure
  56. # ------------------------------------------------------------------------------
  57. proc PagesManager::configure { path args } {
  58. return [Widget::configure $path $args]
  59. }
  60. # ------------------------------------------------------------------------------
  61. # Command PagesManager::cget
  62. # ------------------------------------------------------------------------------
  63. proc PagesManager::cget { path option } {
  64. return [Widget::cget $path $option]
  65. }
  66. # ------------------------------------------------------------------------------
  67. # Command PagesManager::compute_size
  68. # ------------------------------------------------------------------------------
  69. proc PagesManager::compute_size { path } {
  70. variable $path
  71. upvar 0 $path data
  72. set wmax 0
  73. set hmax 0
  74. update idletasks
  75. foreach page $data(pages) {
  76. set w [winfo reqwidth $path.f$page]
  77. set h [winfo reqheight $path.f$page]
  78. set wmax [expr {$w>$wmax ? $w : $wmax}]
  79. set hmax [expr {$h>$hmax ? $h : $hmax}]
  80. }
  81. configure $path -width $wmax -height $hmax
  82. }
  83. # ------------------------------------------------------------------------------
  84. # Command PagesManager::add
  85. # ------------------------------------------------------------------------------
  86. proc PagesManager::add { path page } {
  87. variable $path
  88. upvar 0 $path data
  89. if { [lsearch $data(pages) $page] != -1 } {
  90. return -code error "page \"$page\" already exists"
  91. }
  92. lappend data(pages) $page
  93. frame $path.f$page -relief flat -background [Widget::cget $path -background] -borderwidth 0
  94. return $path.f$page
  95. }
  96. # ------------------------------------------------------------------------------
  97. # Command PagesManager::delete
  98. # ------------------------------------------------------------------------------
  99. proc PagesManager::delete { path page } {
  100. variable $path
  101. upvar 0 $path data
  102. set pos [_test_page $path $page]
  103. set data(pages) [lreplace $data(pages) $pos $pos]
  104. if { $data(select) == $page } {
  105. set data(select) ""
  106. }
  107. destroy $path.f$page
  108. _redraw $path
  109. }
  110. # ------------------------------------------------------------------------------
  111. # Command PagesManager::raise
  112. # ------------------------------------------------------------------------------
  113. proc PagesManager::raise { path {page ""} } {
  114. variable $path
  115. upvar 0 $path data
  116. if { $page != "" } {
  117. _test_page $path $page
  118. _select $path $page
  119. }
  120. return $data(select)
  121. }
  122. # ------------------------------------------------------------------------------
  123. # Command PagesManager::page - deprecated, use pages
  124. # ------------------------------------------------------------------------------
  125. proc PagesManager::page { path first {last ""} } {
  126. variable $path
  127. upvar 0 $path data
  128. if { $last == "" } {
  129. return [lindex $data(pages) $first]
  130. } else {
  131. return [lrange $data(pages) $first $last]
  132. }
  133. }
  134. # ------------------------------------------------------------------------------
  135. # Command PagesManager::pages
  136. # ------------------------------------------------------------------------------
  137. proc PagesManager::pages { path {first ""} {last ""} } {
  138. variable $path
  139. upvar 0 $path data
  140. if { ![string length $first] } {
  141. return $data(pages)
  142. }
  143. if { ![string length $last] } {
  144. return [lindex $data(pages) $first]
  145. } else {
  146. return [lrange $data(pages) $first $last]
  147. }
  148. }
  149. # ------------------------------------------------------------------------------
  150. # Command PagesManager::_destroy
  151. # ------------------------------------------------------------------------------
  152. proc PagesManager::_destroy { path } {
  153. variable $path
  154. upvar 0 $path data
  155. Widget::destroy $path
  156. unset data
  157. rename $path {}
  158. }
  159. # ------------------------------------------------------------------------------
  160. # Command PagesManager::getframe
  161. # ------------------------------------------------------------------------------
  162. proc PagesManager::getframe { path page } {
  163. return $path.f$page
  164. }
  165. # ------------------------------------------------------------------------------
  166. # Command PagesManager::_test_page
  167. # ------------------------------------------------------------------------------
  168. proc PagesManager::_test_page { path page } {
  169. variable $path
  170. upvar 0 $path data
  171. if { [set pos [lsearch $data(pages) $page]] == -1 } {
  172. return -code error "page \"$page\" does not exists"
  173. }
  174. return $pos
  175. }
  176. # ------------------------------------------------------------------------------
  177. # Command PagesManager::_select
  178. # ------------------------------------------------------------------------------
  179. proc PagesManager::_select { path page } {
  180. variable $path
  181. upvar 0 $path data
  182. set oldsel $data(select)
  183. if { $page != $oldsel } {
  184. set data(select) $page
  185. _draw_area $path
  186. }
  187. }
  188. # ------------------------------------------------------------------------------
  189. # Command PagesManager::_redraw
  190. # ------------------------------------------------------------------------------
  191. proc PagesManager::_redraw { path } {
  192. variable $path
  193. upvar 0 $path data
  194. if { !$data(realized) } {
  195. return
  196. }
  197. _draw_area $path
  198. }
  199. # ------------------------------------------------------------------------------
  200. # Command PagesManager::_draw_area
  201. # ------------------------------------------------------------------------------
  202. proc PagesManager::_draw_area { path } {
  203. variable $path
  204. upvar 0 $path data
  205. set w [winfo width $path]
  206. set h [winfo height $path]
  207. set sel $data(select)
  208. if { $sel != "" } {
  209. if { [llength [$path:cmd find withtag "window"]] } {
  210. $path:cmd coords "window" 0 0
  211. $path:cmd itemconfigure "window" \
  212. -width $w \
  213. -height $h \
  214. -window $path.f$sel
  215. } else {
  216. $path:cmd create window 0 0 \
  217. -width $w \
  218. -height $h \
  219. -anchor nw \
  220. -tags "window" \
  221. -window $path.f$sel
  222. }
  223. } else {
  224. $path:cmd delete "window"
  225. }
  226. }
  227. # ------------------------------------------------------------------------------
  228. # Command PagesManager::_realize
  229. # ------------------------------------------------------------------------------
  230. proc PagesManager::_realize { path } {
  231. variable $path
  232. upvar 0 $path data
  233. if { [set width [Widget::cget $path -width]] == 0 ||
  234. [set height [Widget::cget $path -height]] == 0 } {
  235. compute_size $path
  236. }
  237. set data(realized) 1
  238. _draw_area $path
  239. bind $path <Configure> "PagesManager::_draw_area $path"
  240. }