panedwindow.tcl
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:5k
源码类别:

通讯编程

开发平台:

Visual C++

  1. # panedwindow.tcl --
  2. #
  3. # This file defines the default bindings for Tk panedwindow widgets and
  4. # provides procedures that help in implementing those bindings.
  5. #
  6. # RCS: @(#) $Id: panedwindow.tcl,v 1.6.2.4 2006/01/25 18:21:41 dgp Exp $
  7. #
  8. bind Panedwindow <Button-1> { ::tk::panedwindow::MarkSash %W %x %y 1 }
  9. bind Panedwindow <Button-2> { ::tk::panedwindow::MarkSash %W %x %y 0 }
  10. bind Panedwindow <B1-Motion> { ::tk::panedwindow::DragSash %W %x %y 1 }
  11. bind Panedwindow <B2-Motion> { ::tk::panedwindow::DragSash %W %x %y 0 }
  12. bind Panedwindow <ButtonRelease-1> {::tk::panedwindow::ReleaseSash %W 1}
  13. bind Panedwindow <ButtonRelease-2> {::tk::panedwindow::ReleaseSash %W 0}
  14. bind Panedwindow <Motion> { ::tk::panedwindow::Motion %W %x %y }
  15. bind Panedwindow <Leave> { ::tk::panedwindow::Leave %W }
  16. # Initialize namespace
  17. namespace eval ::tk::panedwindow {}
  18. # ::tk::panedwindow::MarkSash --
  19. #
  20. #   Handle marking the correct sash for possible dragging
  21. #
  22. # Arguments:
  23. #   w the widget
  24. #   x widget local x coord
  25. #   y widget local y coord
  26. #   proxy whether this should be a proxy sash
  27. # Results:
  28. #   None
  29. #
  30. proc ::tk::panedwindow::MarkSash {w x y proxy} {
  31.     if {[$w cget -opaqueresize]} { set proxy 0 }
  32.     set what [$w identify $x $y]
  33.     if { [llength $what] == 2 } {
  34. foreach {index which} $what break
  35. if { !$::tk_strictMotif || $which eq "handle" } {
  36.     if {!$proxy} { $w sash mark $index $x $y }
  37.     set ::tk::Priv(sash) $index
  38.     foreach {sx sy} [$w sash coord $index] break
  39.     set ::tk::Priv(dx) [expr {$sx-$x}]
  40.     set ::tk::Priv(dy) [expr {$sy-$y}]
  41.     # Do this to init the proxy location
  42.     DragSash $w $x $y $proxy
  43. }
  44.     }
  45. }
  46. # ::tk::panedwindow::DragSash --
  47. #
  48. #   Handle dragging of the correct sash
  49. #
  50. # Arguments:
  51. #   w the widget
  52. #   x widget local x coord
  53. #   y widget local y coord
  54. #   proxy whether this should be a proxy sash
  55. # Results:
  56. #   Moves sash
  57. #
  58. proc ::tk::panedwindow::DragSash {w x y proxy} {
  59.     if {[$w cget -opaqueresize]} { set proxy 0 }
  60.     if { [info exists ::tk::Priv(sash)] } {
  61. if {$proxy} {
  62.     $w proxy place 
  63.     [expr {$x+$::tk::Priv(dx)}] [expr {$y+$::tk::Priv(dy)}]
  64. } else {
  65.     $w sash place $::tk::Priv(sash) 
  66.     [expr {$x+$::tk::Priv(dx)}] [expr {$y+$::tk::Priv(dy)}]
  67. }
  68.     }
  69. }
  70. # ::tk::panedwindow::ReleaseSash --
  71. #
  72. #   Handle releasing of the sash
  73. #
  74. # Arguments:
  75. #   w the widget
  76. #   proxy whether this should be a proxy sash
  77. # Results:
  78. #   Returns ...
  79. #
  80. proc ::tk::panedwindow::ReleaseSash {w proxy} {
  81.     if {[$w cget -opaqueresize]} { set proxy 0 }
  82.     if { [info exists ::tk::Priv(sash)] } {
  83. if {$proxy} {
  84.     foreach {x y} [$w proxy coord] break
  85.     $w sash place $::tk::Priv(sash) $x $y
  86.     $w proxy forget
  87. }
  88. unset ::tk::Priv(sash) ::tk::Priv(dx) ::tk::Priv(dy)
  89.     }
  90. }
  91. # ::tk::panedwindow::Motion --
  92. #
  93. #   Handle motion on the widget.  This is used to change the cursor
  94. #   when the user moves over the sash area.
  95. #
  96. # Arguments:
  97. #   w the widget
  98. #   x widget local x coord
  99. #   y widget local y coord
  100. # Results:
  101. #   May change the cursor.  Sets up a timer to verify that we are still
  102. #   over the widget.
  103. #
  104. proc ::tk::panedwindow::Motion {w x y} {
  105.     variable ::tk::Priv
  106.     set id [$w identify $x $y]
  107.     if {([llength $id] == 2) && 
  108.     (!$::tk_strictMotif || [lindex $id 1] eq "handle")} {
  109. if { ![info exists Priv($w,panecursor)] } {
  110.     set Priv($w,panecursor) [$w cget -cursor]
  111.     if { [$w cget -sashcursor] eq "" } {
  112. if { [$w cget -orient] eq "horizontal" } {
  113.     $w configure -cursor sb_h_double_arrow
  114. } else {
  115.     $w configure -cursor sb_v_double_arrow
  116. }
  117.     } else {
  118. $w configure -cursor [$w cget -sashcursor]
  119.     }
  120.     if {[info exists Priv($w,pwAfterId)]} {
  121. after cancel $Priv($w,pwAfterId)
  122.     }
  123.     set Priv($w,pwAfterId) [after 150 
  124.     [list ::tk::panedwindow::Cursor $w]]
  125. }
  126. return
  127.     }
  128.     if { [info exists Priv($w,panecursor)] } {
  129. $w configure -cursor $Priv($w,panecursor)
  130. unset Priv($w,panecursor)
  131.     }
  132. }
  133. # ::tk::panedwindow::Cursor --
  134. #
  135. #   Handles returning the normal cursor when we are no longer over the
  136. #   sash area.  This needs to be done this way, because the panedwindow
  137. #   won't see Leave events when the mouse moves from the sash to a
  138. #   paned child, although the child does receive an Enter event.
  139. #
  140. # Arguments:
  141. #   w the widget
  142. # Results:
  143. #   May restore the default cursor, or schedule a timer to do it.
  144. #
  145. proc ::tk::panedwindow::Cursor {w} {
  146.     variable ::tk::Priv
  147.     # Make sure to check window existence in case it is destroyed.
  148.     if {[info exists Priv($w,panecursor)] && [winfo exists $w]} {
  149. if {[winfo containing [winfo pointerx $w] [winfo pointery $w]] eq $w} {
  150.     set Priv($w,pwAfterId) [after 150 
  151.     [list ::tk::panedwindow::Cursor $w]]
  152. } else {
  153.     $w configure -cursor $Priv($w,panecursor)
  154.     unset Priv($w,panecursor)
  155.     if {[info exists Priv($w,pwAfterId)]} {
  156. after cancel $Priv($w,pwAfterId)
  157. unset Priv($w,pwAfterId)
  158.     }
  159. }
  160.     }
  161. }
  162. # ::tk::panedwindow::Leave --
  163. #
  164. #   Return to default cursor when leaving the pw widget.
  165. #
  166. # Arguments:
  167. #   w the widget
  168. # Results:
  169. #   Restores the default cursor
  170. #
  171. proc ::tk::panedwindow::Leave {w} {
  172.     if {[info exists ::tk::Priv($w,panecursor)]} {
  173.         $w configure -cursor $::tk::Priv($w,panecursor)
  174.         unset ::tk::Priv($w,panecursor)
  175.     }
  176. }