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

通讯编程

开发平台:

Visual C++

  1. # Copyright (C) 1998 by USC/ISI
  2. # All rights reserved.                                            
  3. #                                                                
  4. # Redistribution and use in source and binary forms are permitted
  5. # provided that the above copyright notice and this paragraph are
  6. # duplicated in all such forms and that any documentation, advertising
  7. # materials, and other materials related to such distribution and use
  8. # acknowledge that the software was developed by the University of
  9. # Southern California, Information Sciences Institute.  The name of the
  10. # University may not be used to endorse or promote products derived from
  11. # this software without specific prior written permission.
  12. # THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED
  13. # WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
  14. # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  15. # $Header: /cvsroot/nsnam/nam-1/tcl/build-ui.tcl,v 1.32 2002/11/25 20:14:32 buchheim Exp $
  16. Animator instproc build-ui {} {
  17. $self instvar netView id_ tlw_ balloon_
  18. # Start our own toplevel widget
  19. set tlw_ .model$id_
  20. toplevel $tlw_
  21. # Create balloon help for this animator
  22. set balloon_ [new BalloonHelp $tlw_]
  23.         # build the menu bar
  24.         frame $tlw_.menu -borderwidth 0
  25. $self build-menus $tlw_.menu
  26.         pack $tlw_.menu -side top -fill x
  27. # Every netmodel has: view (zoom bar, scroll bar, 
  28. # monitor pane, layout pane, annotation pane, time slider)
  29. frame $tlw_.view
  30. $self build-view $tlw_.view
  31.         # build the control panel with rew, ffwd, play, etc
  32. frame $tlw_.ctrl0 -relief flat -borderwidth 0
  33. $self build-animation-ctrl $tlw_.ctrl0 
  34.         pack $tlw_.ctrl0 -side top -fill x
  35. frame $tlw_.ctrl -relief flat -borderwidth 0
  36. $self build-view-ctrl $tlw_.ctrl
  37. set windows(control) $tlw_.ctrl
  38. pack $tlw_.ctrl -side bottom -fill x
  39. pack $tlw_.view -side top -fill both -expand true
  40. wm minsize $tlw_ 200 200
  41.         $self window_bind $tlw_
  42.         $self view_bind $netView
  43. # Stop the animation if the window is destroyed by the window manager
  44. bind $netView <Destroy> "$self stop 1"
  45. # Set window title to "nam #instance: trace_file_name"
  46. $self instvar tracefile
  47. wm title $tlw_ "[tk appname]: $tracefile"
  48. }
  49. Animator instproc build-view w {
  50. $self tkvar showpanel
  51. $self instvar netModel netView netViews tlw_ windows
  52. # View
  53.         frame $w.f
  54.         #frame is just to sink the netview
  55.         frame $w.f.f -borderwidth 2 -relief sunken
  56. # $netModel view $w.f.f.net
  57. $netModel editview $w.f.f.net
  58.         set netView $w.f.f.net
  59. set netViews $netView
  60.         pack $w.f.f.net -side top -expand true -fill both
  61. # X scroll bar
  62.         $netView xscroll $w.f.hsb
  63.         scrollbar $w.f.hsb -orient horizontal -width 10 
  64. -borderwidth 1 -command "$netView xview"
  65.         $w.f.hsb set 0.0 1.0
  66.         pack $w.f.hsb -side bottom -fill x
  67.         pack $w.f.f -side top -fill both -expand true
  68. # Y scroll bar
  69.         frame $w.f2
  70.         $netView yscroll $w.f2.vsb
  71.         scrollbar $w.f2.vsb -orient vertical -width 10 
  72. -borderwidth 1 -command "$netView yview"
  73.         $w.f2.vsb set 0.0 1.0
  74.         pack $w.f2.vsb -side top -fill y -expand true
  75.         frame $w.f2.l -width 12 -height 12
  76.         pack $w.f2.l -side top
  77. # zoom bar
  78. frame $w.ctrl -borderwidth 2 -relief groove
  79. $self build-zoombar $netView $w.ctrl $w
  80. pack $w.ctrl -side left -fill y
  81.         pack $w.f2 -side right -fill y
  82.         pack $w.f -side left -fill both -expand true
  83. # monitor pane
  84. frame $tlw_.monwin -relief groove -borderwidth 2
  85. button $tlw_.monwin.l -bitmap monitors -borderwidth 2 -relief groove 
  86. -command "$self closepanel monitor"
  87. pack $tlw_.monwin.l -side left -fill y
  88. set windows(monitor) $tlw_.monwin
  89. trace variable showpanel(monitor) w 
  90. "$self displaypanel $tlw_.monwin $w monitor top x false"
  91. set showpanel(monitor) 0
  92. }
  93. Animator instproc build-view-ctrl {w} {
  94. $self tkvar showpanel
  95. $self instvar NETWORK_MODEL mintime maxtime now mslider pipemode 
  96. vslider
  97. # Time slider pane
  98. frame $w.p0b -relief flat -borderwidth 0
  99. # $self build-slider $w.p0b
  100. set mslider [new TimesliderModel $mintime $maxtime $now $self]
  101. set vslider [new TimesliderView $w.p0b $mslider]
  102. $mslider addObserver $vslider
  103. $mslider setpipemode $pipemode
  104. # annotation pane
  105. frame $w.tl -relief flat -borderwidth 0
  106. $self build-annotation $w.tl
  107. set showpanel(annotate) 1
  108. if {$NETWORK_MODEL == "NetworkModel/Auto"} {
  109.         set showpanel(autolayout) 1
  110.         trace variable showpanel(autolayout) w 
  111.     "$self displaypanel $w.p2 $w.p0b autolayout 
  112.      top x false"
  113. frame $w.p2 -relief flat -borderwidth 0
  114. $self build-layout $w.p2
  115. pack $w.p0b $w.p2 $w.tl  
  116. -side top -fill x
  117. } else {
  118.         set showpanel(autolayout) 0
  119. pack $w.p0b $w.tl -side top -fill x
  120. }
  121. }
  122. Animator instproc build-menus w {
  123. $self tkvar nam_record_animation nam_auto_ff showpanel isSync_
  124. $self tkvar showData_ showRouting_ showMac_
  125.         $self instvar NETWORK_MODEL netModel nam_name windows 
  126. frame $w.menu -relief groove -bd 2
  127.         pack $w.menu -side top -fill x
  128. set padx 4
  129. set mb $w.menu.file
  130. set m $mb.m
  131. menubutton $mb -text "File" -menu $m -underline 0 
  132. -borderwidth 1 
  133. menu $m
  134. #$m add command -label "Open..." -state disabled
  135. $m add command -label "Save layout" -command "$self save_layout"
  136. $m add command -label "Print" -command "$self print_view $netModel nam"
  137. $m add separator
  138. # NEEDSWORK: record animation should prompt for the
  139. # prefix to use (nam_record_filename) in a dialog box.
  140. # Also, the file opening/closing should be moved to Tcl
  141. # so I can write to a
  142. # filename "|xwdtoppm | ppmtogif > sequenceXXX.gif"
  143. # and have the Right Thing happen.
  144. # Finally, it would be nice to put the clock
  145. # actually into the image so it makes it into the mpeg.
  146. $m add checkbutton -label "Record animation" 
  147. -variable [$self tkvarname nam_record_animation]
  148. if ![info exists nam_record_animation] {
  149. set nam_record_animation 0
  150. }
  151. $m add checkbutton -label "Auto FastForward" 
  152. -variable [$self tkvarname nam_auto_ff]
  153. if ![info exists nam_auto_ff] {
  154. set nam_auto_ff 0
  155. }
  156. $m add separator
  157. $m add command -label "Close" -command "$self done"
  158. pack $mb -side left -padx $padx
  159. set mb $w.menu.views
  160. set m $mb.m
  161. set mp $m.filter
  162. set mp1 $mp.type1
  163. set mp2 $mp.type2
  164. menubutton $mb -text "Views" -menu $m -underline 0 
  165. -borderwidth 1 
  166. menu $m
  167. $m add command -label "New view" -command "$self new_view"
  168. # $m add command -label "Edit view" -command "$self new_editview"
  169. $m add separator
  170. $m add command -label "Node energy" -command "$self energy_view"
  171. #filter menu
  172. $m add cascade -label "Packet filter" -menu $mp
  173. menu $mp
  174.  
  175. $mp add cascade -label "Packet type" -menu $mp1
  176. $mp add command -label "Traffic type" -command "$self select-traffic"
  177. $mp add command -label "Source node" -command "$self select-src"
  178. $mp add command -label "Destination node" -command "$self select-dst"
  179. $mp add command -label "Flow id" -command "$self select-fid"
  180. $mp add command -label "Reset all" -command "$netModel resetFilter"
  181. menu $mp1
  182. set showData_ 1
  183. set showRouting_ 1
  184. set showMac_ 1
  185. $mp1 add checkbutton -label "Data" 
  186. -variable [$self tkvarname showData_]
  187. $mp1 add checkbutton -label "Routing" 
  188. -variable [$self tkvarname showRouting_]
  189. $mp1 add checkbutton -label "Mac" 
  190. -variable [$self tkvarname showMac_]
  191. $m add command -label "Highlight leaf trees" -command 
  192. "$self show_subtrees"
  193. $m add checkbutton -label "Show monitors" 
  194. -variable [$self tkvarname showpanel(monitor)]
  195.         if {$NETWORK_MODEL=="NetworkModel/Auto"} {
  196.     $m add checkbutton -label "Show autolayout" 
  197.     -variable [$self tkvarname showpanel(autolayout)]
  198. } else {
  199.     $m add checkbutton -label "Show autolayout" -state disabled
  200. }
  201. $m add checkbutton -label "Show annotations" 
  202. -variable [$self tkvarname showpanel(annotate)]
  203. $m add checkbutton -label "Sync" 
  204. -variable [$self tkvarname isSync_]
  205. if ![info exists isSync_] {
  206. set isSync_ 0
  207. }
  208. trace variable isSync_ w "$self on-change-sync"
  209. pack $mb -side left -padx $padx
  210. # -----------------------------
  211. # Analysis Tool
  212. set mb $w.menu.analysis
  213. set m $mb.m
  214. $self instvar analysis_OK
  215. if { $analysis_OK == 0 } {
  216.     menubutton $mb -text "Analysis" -menu $m -underline 0 
  217. -borderwidth 1 -state disabled
  218.         } else {
  219.     menubutton $mb -text "Analysis" -menu $m -underline 0 
  220. -borderwidth 1
  221. }
  222. menu $m
  223. $m add command -label "Active Sessions" -command "$self active_sessions"
  224. $m add command -label "Legend ..." -command "$self auto_legend"
  225. #$m add command -label "Saving ..." -command "$self manual_legend"
  226. pack $mb -side left -padx $padx
  227. # ------------------------------
  228. label $w.menu.name -text $nam_name -font [smallfont] 
  229. -width 30 -borderwidth 2 -relief groove 
  230.         set windows(title) $w.menu.name
  231. pack $w.menu.name -side left -fill x -expand true -padx 4 -pady 1
  232. # Help is moved to main menu
  233. }
  234. Animator instproc select-traffic {} {
  235.    $self tkvar trafficType_
  236.    toplevel .selectTraffic
  237.    set w .selectTraffic
  238.    wm title $w "Enter traffic type (CBR,TCP,...)"
  239.    label $w.label -text "Traffic type:"
  240.    entry $w.entry -width 50 -relief sunken 
  241.                    -textvariable [$self tkvarname trafficType_]
  242.    pack $w.label $w.entry -side left -fill both -expand true
  243.    bind $w.entry <Return> "$self filter-traffic $w"
  244. }
  245. Animator instproc filter-traffic {w} {
  246.    $self tkvar trafficType_
  247.    $self instvar netModel 
  248.    destroy $w
  249.    $netModel traffic_filter $trafficType_
  250. }
  251. Animator instproc select-src {} {
  252.    $self tkvar srcNode_
  253.    toplevel .selectSrc
  254.    set w .selectSrc
  255.    wm title $w "Enter source node"
  256.    label $w.label -text "Source node:"
  257.    entry $w.entry -width 50 -relief sunken 
  258.                    -textvariable [$self tkvarname srcNode_]
  259.    pack $w.label $w.entry -side left -fill both -expand true
  260.    bind $w.entry <Return> "$self filter-src $w"
  261. }
  262. Animator instproc filter-src {w} {
  263.    $self tkvar srcNode_
  264.    $self instvar netModel 
  265.    destroy $w
  266.    $netModel src_filter $srcNode_
  267. }
  268. Animator instproc select-dst {} {
  269.    $self tkvar dstNode_
  270.    toplevel .selectDst
  271.    set w .selectDst
  272.    wm title $w "Enter destination node"
  273.    label $w.label -text "Destination node:"
  274.    entry $w.entry -width 50 -relief sunken 
  275.                    -textvariable [$self tkvarname dstNode_]
  276.    pack $w.label $w.entry -side left -fill both -expand true
  277.    bind $w.entry <Return> "$self filter-dst $w"
  278. }
  279. Animator instproc filter-dst {w} {
  280.    $self tkvar dstNode_
  281.    $self instvar netModel 
  282.    destroy $w
  283.    $netModel dst_filter $dstNode_
  284. }
  285. Animator instproc select-fid {} {
  286.    $self tkvar flowId_
  287.    toplevel .selectFlow
  288.    set w .selectFlow
  289.    wm title $w "Enter flow id"
  290.    label $w.label -text "Flow id:"
  291.    entry $w.entry -width 50 -relief sunken 
  292.                    -textvariable [$self tkvarname flowId_]
  293.    pack $w.label $w.entry -side left -fill both -expand true
  294.    bind $w.entry <Return> "$self filter-fid $w"
  295. }
  296. Animator instproc filter-fid {w} {
  297.    $self tkvar flowId_
  298.    $self instvar netModel 
  299.    destroy $w
  300.    $netModel fid_filter $flowId_
  301. }
  302. Animator instproc selectColor {} {
  303.    $self colorPaletteReq .colorpalette 
  304.         {0000 3300 6600 9900 CC00 FF00} 
  305.         {0000 3300 6600 9900 CC00 FF00} 
  306.         {0000 3300 6600 9900 CC00 FF00} 
  307.         .colorsp
  308. }
  309. Animator instproc colorPaletteReq { name redlist greenlist bluelist replace } {
  310.          $self instvar SharedEnv netModel
  311.  # Setup
  312.  set w ${name}
  313.  if {[winfo exists $w]} {
  314.             wm deiconify $w
  315.     raise $w
  316.     return
  317.          }
  318.  set SharedEnv($name) $replace
  319.  eval toplevel $w ""
  320.  wm protocol $w WM_DELETE_WINDOW "wm withdraw $w"
  321.  frame $w.f
  322.  foreach red $redlist {
  323.          frame $w.f.rcol_${red}
  324.  foreach green $greenlist {
  325.           frame $w.f.grow_${red}${green}
  326.  foreach blue $bluelist {
  327.          if { [info exists SharedEnv($w.f.c${red}${green}${blue})] } {
  328.      frame $w.f.c${red}${green}${blue} 
  329.            -relief raised -height 2m -width 2m 
  330.    -highlightthickness 0 
  331.    -bd 1 -bg $SharedEnv($w.f.c${red }${green}${blue})
  332.                                  } else {
  333.      frame $w.f.c${red}${green}${blue} 
  334.            -relief raised -height 2m -width 2m 
  335.    -highlightthickness 0 
  336.    -bd 1 -bg "#${red}${green}${blue}"
  337.                                  }
  338.  pack $w.f.c${red}${green}${blue} -side left 
  339.  -in $w.f.grow_${red}${green} -fill both -expand true
  340.   bind $w.f.c${red}${green}${blue} <ButtonRelease-1> "
  341.        $self setcolor %W
  342.                                   "
  343.                           }
  344.                           pack $w.f.grow_${red}${green} -side top 
  345.        -in $w.f.rcol_${red} -fill both -expand true
  346.                  }
  347.  pack $w.f.rcol_${red} -side left -in $w.f -fill both 
  348.       -expand true
  349. }
  350. frame $w.f.c_none -width 4m -relief raised -bd 1 
  351.       -highlightthickness 0
  352.         pack $w.f.c_none -in $w.f -side left -fill y
  353. pack $w.f -in $w -expand true -fill both
  354. # Return
  355. wm geometry $w 400x100
  356. }
  357. Animator instproc setcolor {w} {
  358.          $self instvar netModel colorarea colorn
  359.  $w configure -relief raised
  360.  set colorv [$w cget -bg]
  361.  set rgb [winfo rgb $w $colorv]
  362.  set colorn "[$netModel lookupColorName [lindex $rgb 0] 
  363.      [lindex $rgb 1] [lindex $rgb 2]]"
  364. set rgb [winfo rgb . $colorn]
  365. set name "[$netModel lookupColorName [lindex $rgb 0] 
  366.                  [lindex $rgb 1] [lindex $rgb 2]]"
  367.         $netModel select-color $name
  368. if {[info exists colorarea] && [winfo exists $colorarea]} {
  369.     $colorarea delete 0.0 end
  370.     $colorarea insert 0.0 $colorn
  371.     catch { $colorarea tag add bgcolor 0.0 end }
  372.     $colorarea tag configure bgcolor -background $colorn
  373.         }
  374. }
  375. Animator instproc on-change-sync args {
  376. $self tkvar isSync_
  377. if $isSync_ {
  378. $self add-sync $self
  379. } else {
  380. $self remove-sync $self
  381. }
  382. }
  383. Animator instproc set_run { w } {
  384. $self instvar netView running
  385. focus $netView
  386. $self set_forward_dir 1
  387. if { $running != 1 } {
  388. $self play 1
  389. #$self renderFrame
  390. }
  391. $self highlight $w.bar.run 1
  392. }
  393. Animator instproc set_back { w } {
  394. $self instvar netView running
  395. focus $netView
  396. $self set_backward_dir 1
  397. if { $running != 1 } {
  398. $self play 1
  399. $self renderFrame
  400. }
  401. $self highlight $w.bar.back 1
  402. }
  403. Animator instproc on-rateslider-press {} {
  404. $self instvar currRate prevRate
  405. set prevRate $currRate
  406. }
  407. Animator instproc on-rateslider-motion { v } {
  408. $self instvar timeStep stepDisp
  409. set timeStep [expr pow(10, $v / 10.)]
  410. set stepDisp [step_format $timeStep]
  411. }
  412. Animator instproc build-animation-ctrl {w} {
  413.         $self instvar rateSlider granularity timeStep currRate prevRate 
  414. stepDisp running direction balloon_
  415. set f [smallfont]
  416. frame $w.bar -relief groove -borderwidth 2
  417.         frame $w.bar.rate -borderwidth 1 -relief sunken
  418. scale $w.bar.rate.s -orient horizontal -width 7p 
  419.         -label "Step:" -font [smallfont]
  420. -from -60 -to -1 -showvalue false 
  421. -relief flat
  422. -borderwidth 1 -highlightthickness 0 
  423. -troughcolor [option get . background Nam]
  424.         pack $w.bar.rate.s -side top -fill both -expand true
  425.         set rateSlider $w.bar.rate.s
  426. set granularity [option get . granularity Nam]
  427. set timeStep [time2real [option get . rate Nam]]
  428.         set stepDisp [step_format $timeStep]
  429.         set currRate [expr 10*log10($timeStep)]
  430.         set prevRate $currRate
  431. $rateSlider set $currRate
  432.         bind $rateSlider <ButtonRelease-1> "$self set_rate [%W get] 1"
  433. bind $rateSlider <ButtonPress-1> "$self on-rateslider-press"
  434. bind $rateSlider <B1-Motion> "$self on-rateslider-motion [%W get]"
  435. trace variable stepDisp w "$self displayStep"
  436. $self tkvar nowDisp
  437. label $w.bar.timerVal -textvariable [$self tkvarname nowDisp] 
  438. -width 14 -anchor w -font $f -borderwidth 1 
  439. -relief sunken -anchor e
  440.         frame $w.bar.run
  441. button $w.bar.run.b -bitmap play -borderwidth 1 -relief raised 
  442. -highlightthickness 0 -font $f  
  443. -command "$self set_run $w"
  444.         frame $w.bar.run.f -height 5 -relief sunken 
  445. -borderwidth 1
  446.         pack $w.bar.run.b -side top -fill both -expand true
  447.         pack $w.bar.run.f -side top -fill x
  448. $balloon_ balloon_for $w.bar.run.b "play forward" 1000
  449.         frame $w.bar.back
  450. button $w.bar.back.b -bitmap back -borderwidth 1 -relief raised 
  451. -highlightthickness 0 -font $f 
  452. -command "$self set_back $w"
  453. $balloon_ balloon_for $w.bar.back.b "play backward" 1000
  454. # hilight running labels as $running changes
  455. trace variable running w "$self trace_running_handler $w"
  456.         frame $w.bar.back.f -height 5 -relief sunken 
  457. -borderwidth 1
  458.         pack $w.bar.back.b -side top -fill both -expand true
  459.         pack $w.bar.back.f -side top -fill x
  460.         
  461.         frame $w.bar.stop
  462. button $w.bar.stop.b -bitmap stop -borderwidth 1 -relief raised 
  463. -highlightthickness 0 -font $f 
  464. -command "$self stop 1;
  465.           $self renderFrame;
  466.   $self highlight $w.bar.stop 1"
  467. $balloon_ balloon_for $w.bar.stop.b "stop" 1000
  468.         frame $w.bar.stop.f -height 5 -relief sunken 
  469. -borderwidth 1
  470.         pack $w.bar.stop.b -side top -fill both -expand true
  471.         pack $w.bar.stop.f -side top -fill x
  472.         frame $w.bar.rew
  473. button $w.bar.rew.b -bitmap rew -borderwidth 1 -relief raised 
  474. -highlightthickness 0 -font $f -command "$self rewind"
  475. $balloon_ balloon_for $w.bar.rew.b "rewind" 1000
  476.         frame $w.bar.rew.f -height 5 -relief sunken 
  477.                 -borderwidth 1
  478.         pack $w.bar.rew.b -side top -fill both -expand true
  479.         pack $w.bar.rew.f -side top -fill x
  480.         frame $w.bar.ff
  481. button $w.bar.ff.b -bitmap ff -borderwidth 1 -relief raised 
  482. -highlightthickness 0 -font $f -command "$self fast_fwd"
  483. $balloon_ balloon_for $w.bar.ff.b "fast forward" 1000
  484.         frame $w.bar.ff.f -height 5 -relief sunken 
  485.                 -borderwidth 1
  486.         pack $w.bar.ff.b -side top -fill both -expand true
  487.         pack $w.bar.ff.f -side top -fill x
  488. # button $w.bar.quit -bitmap eject -borderwidth 1 -relief raised 
  489. # -highlightthickness 0 -font $f -command "$self stop; $self done"
  490. # $balloon_ balloon_for $w.bar.quit "Quit Animator" 1000
  491. pack $w.bar.rate -side right -fill y
  492. pack $w.bar.timerVal -side right -pady 0 
  493. -ipady 1 -padx 1 -fill y
  494. #        pack $w.bar.quit -side right -padx 1 -pady 1 -fill both -expand true
  495.         pack $w.bar.ff -side right -padx 1 -pady 1 -fill both -expand true
  496.         pack $w.bar.run -side right -padx 1 -pady 1 -fill both -expand true
  497.         pack $w.bar.stop -side right -padx 1 -pady 1 -fill both -expand true
  498.         pack $w.bar.back -side right -padx 1 -pady 1 -fill both -expand true
  499.         pack $w.bar.rew -side right -padx 1 -pady 1 -fill both -expand true
  500. #        pack $w.help -side left -padx 1 -pady 1 -fill y 
  501. pack $w.bar -fill x -expand 1 -side right
  502.         $self instvar prevbutton
  503.         set prevbutton $w.bar.stop
  504. # start out stopped
  505. $self highlight $w.bar.stop 1
  506. }
  507. # tb - the name of the edit button
  508. # db1, db2 - names of the buttons to be enable/disabled
  509. Animator instproc toggle-edit { view tb db1 db2 } {
  510. $self instvar enable_edit_ balloon_
  511. set enable_edit_ [expr !$enable_edit_]
  512. if {$enable_edit_} {
  513. $self clear_view_bind $view
  514. $self editview_bind $view
  515. $tb configure -relief sunken
  516. $db1 configure -state normal
  517. $db2 configure -state normal
  518. $tb configure -bitmap "netview"
  519. $balloon_ balloon_for $db1 "NodeUp (enabled)"
  520. $balloon_ balloon_for $db2 "NodeDown (enabled)"
  521. } else {
  522. $self clear_editview_bind $view
  523. $self view_bind $view
  524. $tb configure -relief raised
  525. $db1 configure -state disabled
  526. $db2 configure -state disabled
  527. $tb configure -bitmap "netedit"
  528. $balloon_ balloon_for $db1 "NodeUp (disabled)"
  529. $balloon_ balloon_for $db2 "NodeDown (disabled)"
  530. }
  531. }
  532. # We need $w to put the control pane into, and $mainW to handle "close"
  533. Animator instproc build-zoombar {view w mainW} {
  534. $self instvar magnification viewOffset balloon_
  535. set magnification 1.0
  536. set viewOffset(x) 0.0
  537. set viewOffset(y) 0.0
  538.     
  539. frame $w.f
  540. pack $w.f -side top
  541. button $w.f.b1 -bitmap "zoomin" -command "$view zoom 1.6" 
  542. -highlightthickness 0 -borderwidth 1
  543. pack $w.f.b1 -side top -ipady 3
  544. button $w.f.b2 -bitmap "zoomout" -command "$view zoom 0.625" 
  545. -highlightthickness 0 -borderwidth 1
  546. pack $w.f.b2 -side top -ipady 3
  547. # Build edit enable/disable button 
  548. $self instvar enable_edit_
  549. # By default disable editing
  550. set enable_edit_ 0
  551. button $w.f.b3 -bitmap "netedit" -command 
  552. "$self toggle-edit $view $w.f.b3 $w.f.b4 $w.f.b5" 
  553. -highlightthickness 1 -borderwidth 1
  554. pack $w.f.b3 -side top -ipady 3
  555. # Node size up/down buttons
  556. $self instvar netModel 
  557. button $w.f.b4 -bitmap "nodeup" -command 
  558. "$netModel incr-nodesize 1.1" -state disabled
  559. button $w.f.b5 -bitmap "nodedown" -command 
  560. "$netModel decr-nodesize 1.1" -state disabled
  561. pack $w.f.b4 -side top -ipady 3
  562. pack $w.f.b5 -side top -ipady 3
  563. $balloon_ balloon_for $w.f.b1 "ZoomIn"
  564. $balloon_ balloon_for $w.f.b2 "ZoomOut"
  565. $balloon_ balloon_for $w.f.b3 "Edit/View"
  566. $balloon_ balloon_for $w.f.b4 "NodeUp (disabled)"
  567. $balloon_ balloon_for $w.f.b5 "NodeDown (disabled)"
  568. if {[winfo name $mainW] != "view"} {
  569. button $w.f.b6 -bitmap "eject" -command "destroy $mainW" 
  570. -highlightthickness 0 -borderwidth 1
  571. pack $w.f.b6 -side top -ipady 3
  572. }
  573. }
  574. Animator instproc setCurrentTime {time} {
  575. $self tkvar nowDisp
  576. set nowDisp $time
  577. }
  578. Animator instproc build-slider {w} {
  579. $self instvar timeslider timeslider_width timeslider_tag 
  580.     timeslider_pos nowDisp 
  581. frame $w.f -borderwidth 2 -relief groove
  582. pack $w.f -side top -fill x -expand 1
  583. set timeslider(height) 12
  584. set timeslider(swidth) 32
  585. set timeslider(width) 32
  586. set timeslider_width($w.f.c) 32
  587. set timeslider(canvas) $w.f.c
  588. lappend timeslider(canvas_set) $timeslider(canvas)
  589. set timeslider(frame) $w
  590. canvas $w.f.c -height $timeslider(height) -width 300 
  591. -background white -highlightthickness 0
  592. pack $w.f.c -side left -fill x -expand 1 -padx 0 -pady 0
  593. label $w.f.c.b -bitmap time -highlightthickness 0 -borderwidth 1 
  594. -relief raised
  595. set timeslider_tag($w.f.c) [$w.f.c create window 
  596. [expr $timeslider(swidth)/2] 0 -window $w.f.c.b 
  597. -height 12 -width $timeslider(swidth) -anchor n]
  598. set timeslider_pos($w.f.c) 0
  599. bind $w.f.c <ButtonPress-1> "$self timeslidertrough $w.f.c %x %y"
  600. bind $w.f.c.b <ButtonPress-1> "$self timesliderpress $w.f.c %x %y;break"
  601. bind $w.f.c.b <ButtonRelease-1> "$self timesliderrelease $w.f.c %x %y"
  602. bind $w.f.c.b <B1-Motion> "$self timeslidermotion $w.f.c %x %y"
  603. bind $w.f.c <Configure> "$self timeticks $w.f.c"
  604. }
  605. Animator instproc timeticks { wfc } {
  606. $self instvar timeslider mintime range timeslider_width 
  607. timeslider_tag maxtime mid_
  608. set timeslider(canvas) $wfc
  609. set st [lindex [split $wfc "."] 2]
  610. if { [string compare $st "ctrl"] == 0 } {
  611. set width [winfo width $timeslider(canvas)]
  612. } else {
  613.                 if { [string compare $st "slider"] == 0 } {
  614.                     set namgraphname_ [lindex [split $wfc "."] 1]
  615.                     set width [winfo width .$namgraphname_.main.c]
  616.                 } else {                    
  617.             set width [winfo width $tlw_.$st.main.c]
  618.                 }
  619. }
  620. if {$width == $timeslider_width($wfc)} { return }
  621. set timeslider(width) $width
  622. set timeslider_width($wfc) $width
  623. $timeslider(canvas) delete ticks
  624. #we really shouldn't need to do this but there's a redraw bug in the
  625. #tk canvas that we need to work around (at least in tk4.2) - mjh
  626. pack forget $timeslider(canvas)
  627. update
  628. update idletasks
  629. pack $timeslider(canvas) -side left -fill x -expand 1 -padx 0 -pady 0
  630. set width [winfo width $wfc]
  631. # We need a more adaptive way to draw the ticks. Otherwise for long 
  632. # and sparse simulations, it'll result in long startup time - haoboy
  633. set x [expr $timeslider(swidth)/2]
  634. # Unit of time represented by one pixel
  635. set tickIncr [expr $range / ($width-$timeslider(swidth))]
  636. # Should check if range is 0
  637. if {$range == 0} {
  638. set intertick [expr ($width - $timeslider(swidth)) / 10]
  639. } else {
  640. set intertick [expr ($width-$timeslider(swidth))/(10 * $range)]
  641. }
  642. if {$intertick < 2} {
  643. # This increment should be at least 2 pixel
  644. set intertick 2
  645. }
  646. for {set t $mintime} {$t < ($range+$mintime)} {set t [expr $t+$intertick*$tickIncr]} {
  647. set intx [expr int($x)]
  648. $timeslider(canvas) addtag ticks withtag 
  649. [$timeslider(canvas) create line 
  650. $intx [expr $timeslider(height)/2] 
  651. $intx $timeslider(height)]
  652. set x [expr $x+$intertick]
  653. }
  654. set x [expr $timeslider(swidth)/2]
  655. if {$range == 0} {
  656. set intertick [expr $width - $timeslider(swidth)]
  657. } else {
  658. set intertick [expr ($width-$timeslider(swidth))/($range)]
  659. }
  660. if {$intertick < 20} {
  661. set intertick 20
  662. }
  663. for {set t $mintime} {$t < ($range+$mintime)} {set t [expr $t+$intertick*$tickIncr]} {
  664. set intx [expr int($x)]
  665. $timeslider(canvas) addtag ticks withtag 
  666. [$timeslider(canvas) create line 
  667. $intx 0 $intx $timeslider(height)]
  668. set x [expr $x+$intertick]
  669. }
  670. set wfc_width [winfo width $wfc]
  671. if {$maxtime > 0} {
  672. set x [expr ($wfc_width-$timeslider(swidth))*$now/$maxtime]
  673. } else {
  674. set x [expr ($wfc_width-$timeslider(swidth))*$now]
  675. }
  676. $wfc coords $timeslider_tag($wfc) [expr $x + $timeslider(swidth)/2] 0
  677. }
  678. Animator instproc getmainslidermodel {} {
  679. $self instvar mslider
  680. return $mslider
  681. }
  682. Animator instproc setsliderPressed {v} {
  683. $self instvar sliderPressed
  684. set sliderPressed $v
  685. }
  686. Animator instproc getrunning {} {
  687. $self instvar running
  688. return $running
  689. }
  690. Animator instproc timesliderset {t} {
  691. $self instvar mslider
  692. $mslider setcurrenttime $t
  693. return
  694. }
  695. Animator instproc timesliderpress {w x y} {
  696. $self instvar timeslider sliderPressed 
  697. set timeslider(oldpos) $x
  698. #    set timeslider(width) [winfo width $timeslider(canvas)]
  699. $w.b configure -relief sunken
  700. set sliderPressed 1
  701. }
  702. Animator instproc timeslidertrough {w x y} {
  703. $self instvar timeslider sliderPressed timeslider_pos
  704. if {$timeslider_pos($w)>$x} {
  705. $self rewind
  706. } else {
  707. $self fast_fwd
  708.     }
  709. }
  710. Animator instproc timeslidermotion {wc x y} {
  711. $self instvar timeslider mintime range timeslider_tag 
  712.               timeslider_pos timeslider_width
  713. $self tkvar nowDisp
  714. set diff [expr $x - $timeslider(oldpos)]
  715. set timeslider(canvas) $wc
  716. $timeslider(canvas) move $timeslider_tag($wc) 
  717. $diff 0
  718.  
  719. set timeslider_pos($wc) [expr $timeslider_pos($wc) + $diff]
  720. if {$timeslider_pos($wc)<0} {
  721. $timeslider(canvas) move $timeslider_tag($wc) 
  722.                          [expr 0 - $timeslider_pos($wc)] 0
  723. set timeslider_pos($wc) 0
  724. }
  725. if {$timeslider_pos($wc)>[expr $timeslider_width($wc)-$timeslider(swidth)]} {
  726. $timeslider(canvas) move $timeslider_tag($wc) 
  727.                          [expr ($timeslider_width($wc) - $timeslider(swidth)) - 
  728.                          $timeslider_pos($wc)] 0
  729. set timeslider_pos($wc) [expr $timeslider_width($wc)-$timeslider(swidth)]
  730. }
  731.  set tick 0
  732. catch {
  733. set tick [expr 1000.0*$timeslider_pos($wc)/($timeslider_width($wc)-$timeslider(swidth))]
  734. }
  735. set now [expr ($tick * $range) / 1000. + $mintime]
  736. set nowDisp [format %.6f $now]
  737. set timeslider(tick) $tick
  738. $self timesliderset $now
  739. }
  740. Animator instproc timesliderrelease {w x y} {
  741. $self instvar timeslider sliderPressed running
  742. $self timeslidermotion $w $x $y
  743. $w.b configure -relief raised
  744. $self slidetime $timeslider(tick) 1
  745. set sliderPressed 0
  746. if $running {
  747. $self renderFrame
  748. }
  749. }
  750. Animator instproc nam-relayout {} {
  751. $self tkvar ITERATIONS KCa KCr Recalc 
  752. $self instvar now netModel
  753. $netModel do_relayout $ITERATIONS $KCa $KCr $Recalc
  754. $self settime $now
  755. update idletasks
  756. }
  757. Animator instproc set-layout-params { iter kca kcr } {
  758. $self tkvar ITERATIONS KCa KCr 
  759. set ITERATIONS $iter
  760. set KCa $kca 
  761. set KCr $kcr
  762. }
  763. Animator instproc build-layout {w} {
  764. $self tkvar ITERATIONS KCa KCr Recalc
  765. $self instvar NETWORK_MODEL 
  766. if {$NETWORK_MODEL != "NetworkModel/Auto"} {
  767. return
  768. }
  769. set f [smallfont]
  770. # frame $w.bar -relief ridge -borderwidth 2
  771.         label $w.label -text "Auto layout:" -font $f
  772. label $w.label_ca -text "Ca" -font $f
  773. entry $w.inputca -width 6 -relief sunken 
  774. -textvariable [$self tkvarname KCa] -font $f
  775. label $w.label_cr -text "Cr" -font $f
  776. entry $w.inputcr -width 6 -relief sunken 
  777. -textvariable [$self tkvarname KCr] -font $f
  778. label $w.label_iter -text "Iterations" -font $f
  779. entry $w.inputiter -width 6 -relief sunken 
  780. -textvariable [$self tkvarname ITERATIONS]
  781.         set Recalc 1
  782.         checkbutton $w.recalc -text Recalc -onvalue 1 -offvalue 0 
  783. -variable [$self tkvarname Recalc] -font $f 
  784. -highlightthickness 0
  785. $self instvar netModel
  786. button $w.reset -text reset -relief raised -font $f 
  787. -command "$netModel reset"
  788. button $w.relayout -text re-layout -relief raised -font $f 
  789. -command "$self nam-relayout"
  790. pack $w.label -side left -padx 1 -pady 1
  791. pack $w.label_ca -side left -padx 1 -pady 1 -fill x
  792. pack $w.inputca -side left -padx 1 -pady 1 -fill x
  793. pack $w.label_cr -side left -padx 1 -pady 1 -fill x
  794. pack $w.inputcr -side left -padx 1 -pady 1 -fill x
  795. pack $w.label_iter -side left -padx 1 -pady 1 -fill x
  796. pack $w.inputiter -side left -padx 1 -pady 1 -fill x
  797. pack $w.recalc -side left -padx 1 -pady 1 -fill both
  798. pack $w.reset -side right -padx 1 -pady 1 -fill both
  799. pack $w.relayout -side right -padx 1 -pady 1 -fill both
  800. # pack $w.bar -fill x -expand 1
  801. bind $w.inputca <Return> " $self nam-relayout"
  802. bind $w.inputcr <Return> " $self nam-relayout"
  803. bind $w.inputiter <Return> "$self nam-relayout"
  804. }
  805. # we'll build a new annotation listbox for this
  806. Animator instproc build-annotation { w } {
  807. $self tkvar showpanel
  808. $self instvar annoBox annoBoxHeight annoJump
  809.         frame $w.spaceral -borderwidth 0 -highlightthickness 0 
  810. -height 0 -width 10
  811.         pack $w.spaceral -side top -padx 0 -pady 0
  812.         frame $w.f -borderwidth 0 -highlightthickness 0
  813. frame $w.f.f
  814. set annoJump 0
  815. set annoBoxHeight 3
  816. listbox $w.f.f.a -xscrollcommand "$w.f.f.ah set" 
  817. -yscrollcommand "$w.f.f2.av set" -height $annoBoxHeight 
  818. -selectmode single 
  819. pack $w.f.f.a -fill both -side top -expand true 
  820. set annoBox $w.f.f.a
  821. scrollbar $w.f.f.ah -orient horizontal -width 10 -borderwidth 1 
  822. -command "$w.f.f.a xview"
  823. $w.f.f.ah set 0.0 1.0
  824. pack $w.f.f.ah -side bottom -fill x
  825. frame $w.f.f2
  826. pack $w.f.f2 -side left -fill y
  827. scrollbar $w.f.f2.av -orient vertical -width 10 -borderwidth 1 
  828. -command "$w.f.f.a yview"
  829. $w.f.f2.av set 0.0 1.0
  830. pack $w.f.f2.av -side top -fill y -expand true
  831.         pack $w.f.f -side left -fill both -expand true
  832.         trace variable showpanel(annotate) w 
  833. "$self displaypanel $w.f $w.spaceral annotate top both true"
  834. bind $w.f.f.a <Double-ButtonPress-1> "$self jump_to_annotation $w.f.f.a"
  835. bind $w.f.f.a <ButtonPress-3> "$self popup_annotation $w %x %y"
  836. }
  837. #
  838. # Helper functions
  839. #
  840. Animator instproc displaypanel {panel after name side fill expand args} {
  841. $self tkvar showpanel
  842. if {$showpanel($name) == 1} {
  843. set str "pack $panel -side $side -fill $fill -expand $expand"
  844. if {$after!=""} {
  845. set str "$str -after $after"
  846. }
  847. eval $str
  848. } else {
  849. pack forget $panel
  850. }
  851. }
  852. Animator instproc closepanel { name } {
  853. $self tkvar showpanel
  854. set showpanel($name) 0
  855. }
  856. Animator instproc highlight {w mode} {
  857.     $self instvar prevbutton
  858.     if {$mode==1} {
  859. $prevbutton.b configure -relief raised
  860. $prevbutton.f configure -background [option get . background Nam]
  861. set prevbutton $w
  862.     }
  863.     $w.f configure -background seagreen
  864.     $w.f configure -relief sunken
  865. }
  866. Animator instproc trace_running_handler { w args } { 
  867. $self instvar direction running
  868. # $x == $running
  869. if {$running == 0} {
  870. $self highlight $w.bar.stop 1 
  871. } elseif {($direction == 1)} {
  872. $self highlight $w.bar.run 1
  873. } else {
  874. $self highlight $w.bar.back 1
  875. }
  876. }
  877. #-----------------------------------------------------------------------
  878. # Animator instproc window_bind {w}
  879. #  - Add key and event bindings to the animation window
  880. #-----------------------------------------------------------------------
  881. Animator instproc window_bind {w} {
  882. bind $w <q> "$self done"
  883. bind $w <Q> "$self all_done"
  884. bind $w <Control-w> "$self done"
  885. bind $w <Control-W> "$self done"
  886. bind $w <Control-q> "[AnimControl instance] done"
  887. bind $w <Control-Q> "[AnimControl instance] done"
  888. bind $w <Control-c> "$self done"
  889. wm protocol $w WM_DELETE_WINDOW "$self done"
  890. bind $w <b> "$self back_step"
  891. bind $w <B> "$self back_step"
  892. bind $w <c> "$self play 1"
  893. bind $w <C> "$self play 1"
  894. bind $w <f> "$self fast_fwd"
  895. bind $w <F> "$self fast_fwd"
  896. bind $w <n> "$self next_event"
  897. bind $w <N> "$self next_event"
  898. bind $w <p> "$self stop 1"
  899. bind $w <P> "$self stop 1"
  900. bind $w <r> "$self rewind"
  901. bind $w <R> "$self rewind"
  902. bind $w <u> "$self time_undo"
  903. bind $w <U> "$self time_undo"
  904. bind $w <x> "$self rate_undo"
  905. bind $w <X> "$self rate_undo"
  906. bind $w <period> "$self change_rate 1"
  907. bind $w <greater> "$self change_rate 1"
  908. bind $w <comma> "$self change_rate 0"
  909. bind $w <less> "$self change_rate 0"
  910. }
  911. Animator instproc view_bind {netView} {
  912. # We need these keys in input boxes, so only bind them to .view
  913. bind $netView <space> "$self toggle_pause"
  914. bind $netView <Control-d> "$self done"
  915. bind $netView <Return> "$self single_step"
  916. bind $netView <BackSpace> "$self back_step"
  917. bind $netView <Delete> "$self back_step"
  918. bind $netView <0> "$self reset"
  919. bind $netView <ButtonPress-1> "$self start_info $netView %x %y left"
  920. bind $netView <ButtonPress-3> "$self start_info $netView %x %y right"
  921. bind $netView <ButtonPress-2> "$self view_drag_start $netView %x %y"
  922. bind $netView <B2-Motion> "$self view_drag_motion $netView %x %y"
  923. # bind $netView <ButtonRelease-3> "$self end_info $netView"
  924. }
  925. Animator instproc clear_view_bind { netView } {
  926. bind $netView <ButtonPress-1> ""
  927. bind $netView <ButtonPress-3> ""
  928. bind $netView <ButtonPress-2> ""
  929. bind $netView <B2-Motion> ""
  930. }