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

通讯编程

开发平台:

Visual C++

  1. #
  2. # Copyright (C) 2001 by USC/ISI
  3. # All rights reserved.                                            
  4. #                                                                
  5. # Redistribution and use in source and binary forms are permitted
  6. # provided that the above copyright notice and this paragraph are
  7. # duplicated in all such forms and that any documentation, advertising
  8. # materials, and other materials related to such distribution and use
  9. # acknowledge that the software was developed by the University of
  10. # Southern California, Information Sciences Institute.  The name of the
  11. # University may not be used to endorse or promote products derived from
  12. # this software without specific prior written permission.
  13. # THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED
  14. # WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
  15. # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  16. # Editor.tcl
  17. #   - the nam editor
  18. # Must initialize C++/Tcl bound variables before use
  19. #   - Seems to be a bug in the design of tclcl
  20. NetworkModel/Editor set maximum_simulation_time_ 60.0
  21. Class Editor 
  22. Editor set uniqueID_ 0
  23. Editor proc getid {} {
  24.   set id [Editor set uniqueID_]
  25.   Editor set uniqueID_ [expr $id + 1]
  26.   return $id
  27. }
  28. #----------------------------------------------------------------------
  29. # Called when creating a new editor from nam console
  30. #   from anim-ctrl.tcl:on-new 
  31. #           set editor [new Editor ""]
  32. #----------------------------------------------------------------------
  33. Editor instproc init {tracefile} {
  34.   $self instvar menulist_ SharedEnv id_ editorwindow_ 
  35.                 editor_view_ balloon_ menubar_ save_filename_ 
  36.                 agent_types_ source_types_ lossmodel_types_ 
  37.                 toolbar_buttons_ current_tool_ netmodel_ mintime_ 
  38.                 now_ slider_model_ slider_view_ pipemode_ current_time_ 
  39.                 simulatior_property_window_
  40.   $self tkvar current_agent_ current_time_ current_source_ current_lossmodel_
  41.   set current_time_ 0.0
  42.   set id_ [Editor getid]
  43.   toplevel .nameditor-$id_
  44.   set editorwindow_ .nameditor-$id_
  45.   if {$tracefile == ""} {
  46.     wm title $editorwindow_ "NAM Editor - $id_"
  47.   } else {
  48.     wm title $editorwindow_ "NAM Editor - $tracefile"
  49.   }
  50.   #set agent_types_ {Null TCP TCP/FullTCP TCP/Reno TCP/NewReno 
  51.   #                 TCP/Vegas TCP/Sack1 TCP/Fack TCPSink 
  52.   #                 TCPSink/DelAck TCPSink/Sack1 UDP}
  53.   set agent_types_ {TCP TCP/Reno 
  54.                    TCP/Vegas TCP/Sack1 TCP/Fack UDP - Null TCPSink 
  55.                    TCPSink/DelAck TCPSink/Sack1}
  56.   set current_agent_ UDP
  57.   
  58.   # There is also a "Trace" traffic source which reads
  59.   # traffic information from a file
  60.   set source_types_ {CBR Exponential FTP Pareto Telnet} 
  61.   set current_source_ CBR
  62.   #set lossmodel_types_ {Periodic Uniform Expo SRM}
  63.   set lossmodel_types_ {Periodic Uniform}
  64.   set current_lossmodel_ Periodic
  65.   
  66.   set SharedEnv(CurrentPageId) 1
  67.   set SharedEnv(CurrentCanvas) "" 
  68.   set SharedEnv(PageWidth) 8.5i
  69.   set SharedEnv(PageHeight) 11i
  70.   set SharedEnv(PageVisX) 3i
  71.   set SharedEnv(PageVisY) 2i 
  72.   set SharedEnv(SlideBG) white
  73.   set SharedEnv(Landscape) 0 
  74.   set SharedEnv(ColorWidth) 400      
  75.   set SharedEnv(ColorHeight) 100
  76.   set SharedEnv(PrivateCmap) ""
  77.   set SharedEnv(ButtonOrient) left
  78.   set SharedEnv(ButtonCount)  10
  79.   set SharedEnv(ButtonSize) .35i
  80.   set SharedEnv(ButtonRelief) flat
  81.   set SharedEnv(ButtonStipple1) gray50
  82.   set SharedEnv(ButtonStipple2) {}
  83.   set SharedEnv(ButtonColor) cyan
  84.   set SharedEnv(Fill) "" 
  85.   set SharedEnv(MenuSelect) 0
  86.   button .b
  87.   set SharedEnv(Background) [.b cget -bg]
  88.   set SharedEnv(ActiveBackground) [.b cget -activebackground]
  89.   destroy .b
  90.   set SharedEnv(DefButtonColor) [. cget -bg]
  91.   set SharedEnv(Cut) ""
  92.   set SharedEnv(Copy) ""
  93.   set SharedEnv(Message) "Select"
  94.   set SharedEnv(Xpos) 0
  95.   set SharedEnv(Ypos) 0
  96.   set SharedEnv(Smooth) 0
  97.   set SharedEnv(Outline) black
  98.   set SharedEnv(Stipple) ""
  99.   set SharedEnv(Arrow) none
  100.   set SharedEnv(JoinStyle) miter 
  101.   set SharedEnv(Grid) 0
  102.   set SharedEnv(GridX) .25i
  103.   set SharedEnv(GridY) .25i
  104.   set SharedEnv(UnitX) i
  105.   set SharedEnv(UnitY) i
  106.   set SharedEnv(ScreenH) [winfo screenheight .]
  107.   set SharedEnv(ScreenW) [winfo screenwidth .]
  108.   set SharedEnv(Gravity) 1
  109.   set SharedEnv(GravityVal) 30
  110.   set SharedEnv(Sub-Cursor) ""
  111.   
  112.   set SharedEnv(Start) ""
  113.   set SharedEnv(top_left_corner) bottom_right_corner
  114.   set SharedEnv(top_side) bottom_side
  115.   set SharedEnv(top_right_corner) bottom_left_corner
  116.   set SharedEnv(right_side) left_side
  117.   set SharedEnv(bottom_right_corner) top_left_corner
  118.   set SharedEnv(bottom_side) top_side
  119.   
  120.   set SharedEnv(bottom_left_corner) top_right_corner
  121.   set SharedEnv(left_side) right_side
  122.   set SharedEnv(FixedAspect) True
  123.   # Intialize balloon help
  124.   set balloon_ [new BalloonHelp $editorwindow_]
  125.   if {$tracefile == ""} {
  126.     set save_filename_ ""
  127.   } else {
  128.     set save_filename_ $tracefile
  129.   }
  130.   # Create a new model to hold the editor's objects.
  131.   # Don't include a tracefile to signify this is 
  132.   # the creation of a nam editor window
  133.   set netmodel_ [new NetworkModel/Editor $self " "]
  134.   $netmodel_ set Wpxmin_ 500.0
  135.   $netmodel_ set Wpymin_ 500.0
  136.   $netmodel_ set Wpxmax_ 625.0
  137.   $netmodel_ set Wpymax_ 625.0
  138.   # Create menubar at the top of the window
  139.   frame $editorwindow_.menubar_ -relief raised -bd 2
  140.   $self buildMenubar $editorwindow_.menubar_
  141.   pack $editorwindow_.menubar_ -side top -fill x
  142.   # Creates Editor viewport with scrollbars and zoom controls
  143.   # Attaches that view to a network model
  144.   # -- This has to be created first because the toolbar needs the
  145.   #    editor_view to be setup in advance.
  146.   frame $editorwindow_.view
  147.   $self buildEditorView $editorwindow_.view
  148.   # TimeControls
  149.   frame $editorwindow_.timecontrols -borderwidth 2 -relief groove
  150.   $self buildTimeControls $editorwindow_.timecontrols
  151.   # Toolbar
  152.   frame $editorwindow_.tools -borderwidth 2 -relief groove
  153.   $self buildToolbar $editor_view_ $editorwindow_.tools
  154.   # TimeSlider
  155.   frame $editorwindow_.timeslider -relief flat -borderwidth 0
  156.   $self buildTimeSlider $editorwindow_.timeslider
  157.   
  158.   pack $editorwindow_.tools $editorwindow_.timecontrols -side top -fill x
  159.   pack $editorwindow_.timeslider -side bottom -fill x 
  160.   pack $editorwindow_.view -side left -fill both -expand true
  161.   # Object Properties Window
  162.   #frame $editorwindow_.properties
  163.   #pack $editorwindow_.properties -side left -fill y
  164.   bind $editorwindow_ <q> "destroy $editorwindow_"
  165.   bind $editorwindow_ <Q> "destroy $editorwindow_"
  166.   bind $editorwindow_ <Control-w> "destroy $editorwindow_"
  167.   bind $editorwindow_ <Control-W> "destroy $editorwindow_"
  168.   bind $editorwindow_ <Control-q> "[AnimControl instance] done"
  169.   bind $editorwindow_ <Control-Q> "[AnimControl instance] done"
  170.   $self setCursor Select
  171.   # Initial state: select
  172.   $self chooseAgent TCP 
  173.   $self chooseTrafficSource FTP
  174.   $self chooseTool select
  175. #  $editor_view_ zoom 1.6
  176.   # Load a nam editor ns script
  177.   if {$tracefile != ""} {
  178.     $self loadNsScript $tracefile
  179.   }
  180. }
  181. #----------------------------------------------------------------------
  182. # Cleanup variables that we have new-ed.
  183. #----------------------------------------------------------------------
  184. Editor instproc destroy {} {
  185.   $self instvar balloon_
  186.   delete $balloon_
  187.   delete $slider_model_
  188.   delete $slider_view_
  189. }
  190. #----------------------------------------------------------------------
  191. #
  192. #----------------------------------------------------------------------
  193. Editor instproc done {} {
  194.   $self instvar editorwindow_
  195.   destroy $editorwindow_
  196.   delete $self
  197. }
  198. #----------------------------------------------------------------------
  199. # Editor instproc buildEditorView {w}
  200. #  - Creates main canvas with scrollbars to which the user can add
  201. #    ns objects
  202. #----------------------------------------------------------------------
  203. Editor instproc buildEditorView {w} {
  204.   $self instvar id_ SharedEnv netmodel_ 
  205.         editor_view_ editorwindow_ balloon_ magnification viewOffset
  206.   # Create Window Layout
  207.   frame $w.view
  208.   #frame is just to sink the editor_view_
  209.   frame $w.view.sunk -borderwidth 2 -relief sunken
  210.   $netmodel_ view $w.view.sunk.net
  211.   set editor_view_ $w.view.sunk.net
  212. #    lappend netViews $editor_view_
  213.   set SharedEnv(CurrentCanvas) $editor_view_
  214.   pack $w.view.sunk.net -side top -expand true -fill both
  215.   # X scroll bar
  216.   $editor_view_ xscroll $w.view.hsb
  217.   scrollbar $w.view.hsb -orient horizontal -width 10 -borderwidth 1 
  218.                         -command "$editor_view_ xview"
  219.   $w.view.hsb set 0.0 1.0
  220.   pack $w.view.hsb -side bottom -fill x
  221.   pack $w.view.sunk -side top -fill both -expand true 
  222.   # Y scroll bar
  223.   frame $w.yscroll
  224.   $editor_view_ yscroll $w.yscroll.vsb
  225.   scrollbar $w.yscroll.vsb -orient vertical -width 10 -borderwidth 1 
  226.                            -command "$editor_view_ yview"
  227.   $w.yscroll.vsb set 0.0 1.0
  228.   pack $w.yscroll.vsb -side top -fill y -expand true
  229.   # Scrollbar spacer
  230.   frame $w.yscroll.l -width 12 -height -12
  231.   pack $w.yscroll.l -side top -ipady 6 
  232.   set view $editor_view_
  233.   
  234.   # Zoom bar
  235.   set magnification 1.0
  236.   set viewOffset(x) 0.0
  237.   set viewOffset(y) 0.0
  238.   frame $w.zoom -borderwidth 2 -relief groove
  239.   frame $w.zoom.bar 
  240.   pack $w.zoom.bar -side top
  241.   # Put the zoom bar on the left
  242.   button $w.zoom.bar.zoomin -bitmap "zoomin" 
  243.                                    -command "$view zoom 1.6" 
  244.                                    -highlightthickness 0 
  245.                                    -borderwidth 1
  246.   button $w.zoom.bar.zoomout -bitmap "zoomout" 
  247.                                     -command "$view zoom 0.625" 
  248.                                     -highlightthickness 0 
  249.                                     -borderwidth 1
  250.   pack $w.zoom.bar.zoomin 
  251.        $w.zoom.bar.zoomout 
  252.        -side top
  253.   $balloon_ balloon_for $w.zoom.bar.zoomin "Zoom In"
  254.   $balloon_ balloon_for $w.zoom.bar.zoomout "Zoom Out"
  255.   
  256.   pack $w.zoom -side left -fill y
  257.   pack $w.yscroll -side right -fill y
  258.   pack $w.view -side left -fill both -expand true
  259.   $self viewBind $editor_view_
  260. }
  261. #----------------------------------------------------------------------
  262. # Editor instproc viewBind {netView}
  263. #   - Setup mouse button bindings
  264. #----------------------------------------------------------------------
  265. Editor instproc viewBind {netView} {
  266.   $self instvar SharedEnv 
  267.   bind $netView <Button-1>        "$self handleLeftButtonClick %x %y"
  268.   bind $netView <Button-3>        "$self handleRightButtonClick %x %y"
  269.   bind $netView <Any-B1-Motion>   "$self handleLeftButtonDrag %x %y"
  270.   bind $netView <ButtonRelease-1> "$self handleLeftButtonRelease %x %y"
  271.   bind $netView <Motion>          "$self handleMouseMovement %x %y"
  272.   bind $netView <Double-Button-1> "$self handleLeftButtonDoubleClick %x %y"
  273. #       bind $netView <ButtonPress-3> "$self start_info $netView %x %y right"
  274. #       bind $netView <ButtonPress-2> "$self view_drag_start $netView %x %y"
  275. #       bind $netView <B2-Motion> "$self view_drag_motion $netView %x %y"
  276. #       bind $netView <ButtonRelease-3> "$self end_info $netView"
  277. }
  278. #----------------------------------------------------------------------
  279. # Editor instproc handleRightButtonClick {x y} 
  280. #  - Allows user to edit properties of an object by right clicking
  281. #    without having to switch to the select tool and double clicking
  282. #----------------------------------------------------------------------
  283. Editor instproc handleRightButtonClick {x y} {
  284.   $self instvar current_tool_
  285.   set old_tool $current_tool_
  286.   $self chooseTool select 
  287.   $self handleLeftButtonDoubleClick $x $y
  288.   $self chooseTool $old_tool
  289. }
  290. #----------------------------------------------------------------------
  291. #
  292. #----------------------------------------------------------------------
  293. Editor instproc handleLeftButtonDoubleClick {x y} {
  294.   $self instvar SharedEnv editor_view_ current_tool_ editorwindow_
  295.     
  296.   switch $current_tool_ {
  297.     select {
  298.       set objinfo [$editor_view_ getObjectProperty $x $y]
  299.       if {[string compare $objinfo "NONE"] == 0 } {
  300.         return 
  301.       }
  302.       set item [lindex $objinfo 0]
  303.       set item [lindex $item 0]
  304.       $self displayObjectProperties $editorwindow_.properties $item $x $y $objinfo
  305.       place_frame $editorwindow_ $editorwindow_.properties $x $y
  306.     }
  307.   }
  308. }
  309. #----------------------------------------------------------------------
  310. # Editor instproc handleMouseMovement {x y}
  311. #----------------------------------------------------------------------
  312. Editor instproc handleMouseMovement {x y} {
  313.   $self instvar SharedEnv editor_view_ current_tool_
  314.   set objinfo [$editor_view_ getObjectInformation $x $y]
  315.   if {[string compare $objinfo "NONE"] != 0} {
  316.      $editor_view_ showAgentLink $x $y
  317.   } else {
  318.      $editor_view_ hideAgentLinks
  319.   }
  320.   switch $current_tool_ {
  321.     deleteobject -
  322.     select {
  323.     #  set objinfo [$editor_view_ getObjectInformation $x $y]
  324.       if {[string compare $objinfo "NONE"] != 0} {
  325.         $self enterObject $editor_view_ $x $y $objinfo
  326.       } else {
  327.         catch {destroy $editor_view_.f}
  328.       }
  329.     }
  330.   }
  331. }
  332. #----------------------------------------------------------------------
  333. # Editor instproc handleLeftButtonClick {x y}
  334. #     - called when mouse button 1 is pressed
  335. #     - switches over to EditView::command(..) in editview.cc
  336. #----------------------------------------------------------------------
  337. Editor instproc handleLeftButtonClick {x y} {
  338.   $self instvar SharedEnv editor_view_ current_tool_
  339.   $self tkvar current_agent_ current_source_ current_lossmodel_
  340.                 
  341.   switch $current_tool_ {
  342.     # These functions are in editview.cc: command()
  343.     select      {$editor_view_ setPoint $x $y 0}
  344.     addnode     {$editor_view_ addNode $x $y}
  345.     addlink     {$editor_view_ addLink $x $y}
  346.     addagent    {$editor_view_ addAgent $x $y $current_agent_}
  347.     addtrafficsource {$editor_view_ addTrafficSource $x $y $current_source_}
  348.     addlossmodel {$editor_view_ addLossModel $x $y $current_lossmodel_}
  349.     deleteobject {
  350.       $editor_view_ deleteObject $x $y 
  351.     }
  352.   }
  353.   $self renderFrame
  354. }
  355. #----------------------------------------------------------------------
  356. #
  357. #----------------------------------------------------------------------
  358. Editor instproc handleLeftButtonRelease {x y} {
  359.   $self instvar SharedEnv editor_view_ current_tool_ slider_view_
  360. #  switch $SharedEnv(Cursor) {
  361.   switch $current_tool_ {
  362. #    Select {
  363.     select {
  364.       set marker_list [$editor_view_ releasePoint $x $y]
  365.       $slider_view_ clearMarkers
  366.       if {$marker_list != "NONE"} {
  367.         $self addTimeSliderNodeMarkers $marker_list
  368.       }
  369.     }
  370. #    Link   {
  371.     addlink   {
  372.       $editor_view_ releasePoint $x $y
  373.     }
  374.   }
  375. }
  376. #----------------------------------------------------------------------
  377. #
  378. #----------------------------------------------------------------------
  379. Editor instproc handleLeftButtonDrag {x y} {
  380.   $self instvar SharedEnv editor_view_ current_tool_
  381.   switch $current_tool_ {
  382.     select {
  383.       $editor_view_ moveTo $x $y
  384.     }
  385.     addlink   {
  386.       $editor_view_ moveTo $x $y 
  387.     }
  388.   }
  389. }
  390. #----------------------------------------------------------------------
  391. #
  392. #----------------------------------------------------------------------
  393. Editor instproc showPalette {property_variable} {
  394. #    $self createColorPalette .colorpalette 
  395. #        {0000 3300 6600 9900 CC00 FF00} 
  396. #        {0000 3300 6600 9900 CC00 FF00} 
  397. #        {0000 3300 6600 9900 CC00 FF00} 
  398. #        .colorsp
  399.     $self createColorPalette .colorpalette 
  400.         {00 33 66 99 CC FF} 
  401.         {00 33 66 99 CC FF} 
  402.         {00 33 66 99 CC FF} 
  403.         .colorsp
  404. }
  405. #----------------------------------------------------------------------
  406. #----------------------------------------------------------------------
  407. Editor instproc addTimeListItem {time_menu textbox} {
  408.   $self instvar start_stop_time_list_
  409.   $self tkvar start_stop_time_ 
  410.  
  411.   # Grab the time value from the grab textbox
  412.   set value [$textbox get 0.0 1.end]
  413.   set duplicate "no"
  414.   foreach time $start_stop_time_list_ {
  415.     if {$value == $time} {
  416.       set duplicate "yes"
  417.     }
  418.   }
  419.   if {$duplicate != "yes"} {
  420.     # Create a new sorted list with the new time value added
  421.     set add_list [lsort -real [linsert $start_stop_time_list_ 0 $value]]
  422.     # generate updated menu and update start_stop_time_list_
  423.     $self generateTimeListMenu $time_menu $add_list
  424.     # Set shown menu value to be the newly added value
  425.     set start_stop "start"
  426.     foreach time $start_stop_time_list_ {
  427.       if {$value == $time} {
  428.         set start_stop_time_ "$start_stop $time"
  429.       }
  430.       if {$start_stop == "start"} {
  431.         set start_stop "stop"
  432.       } else {
  433.         set start_stop "start"
  434.       }
  435.     }
  436.   }
  437. }
  438. #----------------------------------------------------------------------
  439. #----------------------------------------------------------------------
  440. Editor instproc deleteTimeListItem {time_menu} {
  441.   $self instvar start_stop_time_list_
  442.   $self tkvar start_stop_time_ 
  443.   # Grab only the time value from the menu which is after the
  444.   # start/stop label
  445.   set time [lindex $start_stop_time_ 1]
  446.   # Find the index in the time list of this time value
  447.   # so that it can be removed using lreplace
  448.   set index [lsearch $start_stop_time_list_ $time]
  449.   # Remove time value and generate new menu
  450.   $self generateTimeListMenu $time_menu 
  451.                          [lreplace $start_stop_time_list_ $index $index]
  452.   # Update the menu to show the first time item which 
  453.   # will always be a start value
  454.   set start_stop_time_ "start [lindex $start_stop_time_list_ 0]"
  455. }
  456.   
  457. #----------------------------------------------------------------------
  458. #----------------------------------------------------------------------
  459. Editor instproc generateTimeListMenu {list_menu list_values} {
  460.  $self instvar start_stop_time_list_
  461.   
  462.  # Remove old menu
  463.  $list_menu delete 0 end
  464.  
  465.  # Create list menu
  466.  set start_stop "start"
  467.  foreach time_value $list_values {
  468.    $list_menu add radiobutton -label "$start_stop $time_value" 
  469.                  -variable start_stop_time_ 
  470.                  -command "set [$self tkvarname start_stop_time_] 
  471.                            "$start_stop $time_value""
  472.    if {$start_stop == "start"} {
  473.      set start_stop "stop"
  474.    } else {
  475.      set start_stop "start"
  476.    }
  477.  }
  478.  set start_stop_time_list_ $list_values
  479. }
  480.   
  481. #----------------------------------------------------------------------
  482. #----------------------------------------------------------------------
  483. Editor instproc displaySimulatorProperties {window_name} {
  484. $self instvar SharedEnv netmodel_
  485. $netmodel_ instvar maximum_simulation_time_
  486.         # Setup
  487. set window $window_name
  488. if {[winfo exists $window]} {
  489. wm deiconify $window
  490. raise $window
  491. return
  492. }
  493. eval toplevel $window $SharedEnv(PrivateCmap)
  494. wm protocol $window WM_DELETE_WINDOW "wm withdraw $window"
  495. frame $window.properties
  496. label $window.properties.title 
  497.       -wraplength 200 
  498.       -text "Simulator Properties"
  499. pack $window.properties.title -side top
  500. frame $window.properties.simulation_time
  501. label $window.properties.simulation_time.label 
  502.       -wraplength 300 -text "Maximum Simulation Time (seconds)"
  503. text $window.properties.simulation_time.value 
  504.      -width 10 -height 1
  505. $window.properties.simulation_time.value insert 
  506.      0.0 $maximum_simulation_time_
  507. pack $window.properties.simulation_time.label -side left
  508. pack $window.properties.simulation_time.value -side right
  509. pack $window.properties.simulation_time -side top
  510. # Apply and Cancel Buttons
  511. frame $window.buttons
  512. button $window.buttons.apply -text "Apply"
  513.        -command "$self setSimulatorProperties $window; 
  514.                  destroy $window"
  515. button $window.buttons.cancel -text "Cancel" 
  516.        -command "destroy $window"
  517. pack $window.buttons.apply $window.buttons.cancel 
  518.      -side left -padx 1m -pady 1m
  519. pack $window.buttons -side bottom -padx 1m -pady 1m
  520. pack $window.properties -side top
  521. }
  522. #----------------------------------------------------------------------
  523. Editor instproc setSimulatorProperties {window} {
  524. $self instvar netmodel_ editorwindow_ slider_model_ slider_view_
  525. $netmodel_ instvar maximum_simulation_time_
  526. # EditorNetModel maximum simulation time
  527. set maximum_simulation_time_ 
  528.     [$window.properties.simulation_time.value get 0.0 1.end]
  529. $slider_model_ destroy
  530. $slider_view_ destroy
  531. $self buildTimeSlider $editorwindow_.timeslider
  532. }
  533. #----------------------------------------------------------------------
  534. #----------------------------------------------------------------------
  535. Editor instproc setDropDownValue {value} {
  536.   $self tkvar drop_down_value_
  537.   set drop_down_value_ $value
  538. }
  539. #----------------------------------------------------------------------
  540. #----------------------------------------------------------------------
  541. Editor instproc reloadObjectProperties {display_frame x y} {
  542.   $self instvar editor_view_ editorwindow_
  543.   $self tkvar drop_down_value_
  544.   $self undisplayObjectProperties $display_frame
  545.   set objinfo [$editor_view_ getObjectProperty $x $y $drop_down_value_]
  546.   if {[string compare $objinfo "NONE"] == 0 } {
  547.     return 
  548.   }
  549.   set item [lindex $objinfo 0]
  550.   set item [lindex $item 0]
  551.   $self displayObjectProperties $editorwindow_.properties $item $x $y $objinfo
  552.   place_frame $editorwindow_ $editorwindow_.properties $x $y
  553. }
  554. #----------------------------------------------------------------------
  555. # Editor instproc
  556. # displayObjectProperties {display_frame item x y properties}
  557. #  - A draws the list of properties for an editor object.
  558. #  - The format of the "properties" list is
  559. #    {label modified_variable property_type}
  560. #  - update_object contains a list of each property and it's stored
  561. #    value
  562. #----------------------------------------------------------------------
  563. Editor instproc displayObjectProperties {display_frame item x y properties} {
  564.   $self instvar SharedEnv colorarea property_values textwidgets drop_down_list_
  565.   $self tkvar current_time_ start_stop_time_ drop_down_value_
  566.   set SharedEnv($item) $properties
  567.   $self undisplayObjectProperties $display_frame
  568.   frame $display_frame -relief raised -borderwidth 1 
  569.   set number 0
  570.   
  571.   foreach property $properties {
  572.     set property_label [lindex $property 0]
  573.     set property_variable [lindex $property 1]
  574.     set property_type [lindex $property 2]
  575.     set property_value [lindex $property 3]
  576.     
  577.     set property_values($property_variable) $property_value 
  578.     # Create frame to hold each property line
  579.     frame $display_frame.line_$number
  580.     if {$property_type == "title"} {
  581.       # Displays the title in the property window frame
  582.       label $display_frame.line_$number.title -wraplength 200 
  583.                                               -text $property_label
  584.       pack $display_frame.line_$number.title -side top
  585.     } elseif {$property_type == "text"} { 
  586.       # Otherwise just put a label
  587.       label $display_frame.line_$number.label_${property_variable} 
  588.            -wraplength 300 -text "$property_label"
  589.       text $display_frame.line_$number.input_${property_variable} 
  590.            -width 10 -height 1
  591.       set textwidgets($property_variable) 
  592.           $display_frame.line_$number.input_${property_variable}
  593.       # Set text box to current variable value
  594.       $display_frame.line_$number.input_${property_variable} insert 
  595.             0.0 $property_value
  596.       pack $display_frame.line_$number.label_${property_variable} -side left
  597.       pack $display_frame.line_$number.input_${property_variable} -side right
  598.     } elseif {$property_type == "color"} {
  599.       # We have a color property
  600.       button $display_frame.line_$number.label_${property_variable} 
  601.              -text "$property_label" 
  602.              -command "$self showPalette $display_frame.line_$number.input_${property_variable}"
  603.       text $display_frame.line_$number.input_${property_variable} 
  604.            -width 10 -height 1
  605.       set textwidgets($property_variable) 
  606.           $display_frame.line_$number.input_${property_variable}
  607.       $display_frame.line_$number.input_${property_variable} insert 
  608.             0.0 $property_value
  609.       pack $display_frame.line_$number.label_${property_variable} -side left
  610.       pack $display_frame.line_$number.input_${property_variable} -side right
  611.       #set colorarea $display_frame.line_$number.eCOLOR
  612.       set colorarea $textwidgets($property_variable)
  613.       pack $display_frame.line_$number.input_${property_variable} -side right
  614.     } elseif {$property_type == "label"} {
  615.       label $display_frame.line_$number.label_${property_variable} 
  616.            -wraplength 200 -text "$property_label"
  617.       pack $display_frame.line_$number.label_${property_variable} -side left
  618.     } elseif {$property_type == "timelist"} {
  619.       # Displays a complex time list object with
  620.       # Buttons for grabbing the current time, add the time to the 
  621.       # start/stop time list and removing time from the list.
  622.       # It should look like this.
  623.       # [Grab]  ___________  [Add] [Remove] [- time list menu]
  624.       label $display_frame.line_$number.label_${property_variable} 
  625.            -wraplength 100 -text "$property_label"
  626.       button $display_frame.line_$number.set_${property_variable} 
  627.              -text "Grab" 
  628.              -command "$self insertTimeInto 
  629.               $display_frame.line_$number.input_${property_variable}"
  630.       text $display_frame.line_$number.input_${property_variable} 
  631.            -width 10 -height 1
  632.       $display_frame.line_$number.input_${property_variable} insert 
  633.             0.0 [lindex $property_value 0]
  634.       set time_menu $display_frame.line_$number.timelist_${property_variable}.menu
  635.       # Add Remove list widgets
  636.       button $display_frame.line_$number.add_${property_variable} 
  637.              -text "Add" -command "$self addTimeListItem $time_menu 
  638.               $display_frame.line_$number.input_${property_variable}"
  639.       # Add a drop down list of start and stop times that are passed in
  640.       # from the object in the property_value as a list
  641.       set start_stop_time_ " "
  642.       menubutton $display_frame.line_$number.timelist_${property_variable} 
  643.                  -textvariable [$self tkvarname start_stop_time_] 
  644.                  -text $start_stop_time_ 
  645.                  -indicatoron 1 -menu $time_menu 
  646.                  -relief raised -bd 2 -highlightthickness 2 -anchor c 
  647.                  -direction flush -width 15
  648.       
  649.       menu $time_menu -tearoff 0
  650.       $self generateTimeListMenu $time_menu $property_value
  651.       set start_stop_time_ "start [lindex $property_value 0]"
  652.       
  653. #      label $display_frame.line_$number.label_${property_variable} 
  654. #           -text "$property_label"
  655.       button $display_frame.line_$number.remove_${property_variable} 
  656.         -text "Remove" -command "$self deleteTimeListItem $time_menu"
  657.       pack $display_frame.line_$number.label_${property_variable} -side left
  658.       pack $display_frame.line_$number.set_${property_variable} 
  659.            $display_frame.line_$number.input_${property_variable} -side left
  660.       pack $display_frame.line_$number.remove_${property_variable} 
  661.            $display_frame.line_$number.timelist_${property_variable} 
  662.            $display_frame.line_$number.add_${property_variable} -side right
  663.     } elseif {$property_type == "time"} {
  664.       # Display a button and text box
  665.       #  - the button grabs the time from current_time_
  666.       #  - the text box allows the time to be set expicitly
  667.       text $display_frame.line_$number.input_${property_variable} 
  668.            -width 10 -height 1
  669.       set textwidgets($property_variable) 
  670.           $display_frame.line_$number.input_${property_variable}
  671.       button $display_frame.line_$number.label_${property_variable} 
  672.         -text "$property_label" 
  673.         -command "$self insertTimeInto 
  674.                         $display_frame.line_$number.input_${property_variable}"
  675.       #label $display_frame.line_$number.label_${property_variable} 
  676.       #     -text "$property_label"
  677.       # Set text box to current variable value
  678.       $display_frame.line_$number.input_${property_variable} insert 
  679.             0.0 $property_value
  680.       pack $display_frame.line_$number.label_${property_variable} -side left
  681.       pack $display_frame.line_$number.input_${property_variable} -side right
  682.     #-------------- drop down list -------------------------------------
  683.     } elseif {$property_type == "drop_down_list"} {
  684.       set drop_down_value_ [lindex $property_value 0]
  685.       set drop_down_list_ [lindex $property_value 1]
  686.       # used to save typing and make this more readable
  687.       set line_frame $display_frame.line_$number
  688.       label $line_frame.label_${property_variable} 
  689.            -wraplength 100 -text "$property_label"
  690.       # Create a button from which to hang menu 
  691.       menubutton $line_frame.list_${property_variable} 
  692.              -textvariable [$self tkvarname drop_down_value_] 
  693.              -text $drop_down_value_ 
  694.              -indicatoron 1 -menu $line_frame.list_${property_variable}.menu 
  695.              -relief raised -bd 2 -highlightthickness 2 -anchor c 
  696.              -direction flush -width 17
  697.       # Create menu object and the menu selections
  698.       menu $line_frame.list_${property_variable}.menu -tearoff 0
  699.       foreach i $drop_down_list_ {
  700.         if {$i == "-"} {
  701.           $line_frame.list_${property_variable}.menu add separator
  702.         } else {
  703.           $line_frame.list_${property_variable}.menu add radiobutton -label $i 
  704.                 -variable drop_down_value_ 
  705.                 -command "$self setDropDownValue $i; $self reloadObjectProperties $display_frame $x $y" 
  706.         }
  707.       }
  708.       $self setDropDownValue [lindex $property_value 0]
  709. #      $line_frame.list_${property_variable} configure -width 16
  710.       pack $line_frame.label_${property_variable} -side left
  711.       pack $line_frame.list_${property_variable} -side right
  712.     #-------------- Boolean Check Box--------------------------------
  713.     } elseif {$property_type == "checkbox"} {
  714.       # Otherwise just put a label
  715.       checkbutton $display_frame.line_$number.checkbox_${property_variable} 
  716.             -text "$property_label" -variable $property_variable
  717.       #set textwidgets($property_variable) 
  718.       #    $display_frame.line_$number.input_${property_variable}
  719.       pack $display_frame.line_$number.checkbox_${property_variable} -side left
  720.     }
  721.     pack $display_frame.line_$number -side top -fill x 
  722.     incr number
  723.   } ;# End foreach
  724.   
  725.   # Apply and Cancel Buttons
  726.   frame $display_frame.buttons
  727.   button $display_frame.buttons.apply -text "Apply"
  728.          -command "$self setObjectProperties {$properties}; 
  729.           $self undisplayObjectProperties $display_frame"
  730.   button $display_frame.buttons.cancel -text "Cancel" 
  731.          -command "$self undisplayObjectProperties $display_frame"
  732.   pack $display_frame.buttons.apply $display_frame.buttons.cancel -side left 
  733.        -padx 1m -pady 1m
  734.   pack $display_frame.buttons -side bottom -padx 1m -pady 1m
  735. }
  736. #----------------------------------------------------------------------
  737. #
  738. #----------------------------------------------------------------------
  739. Editor instproc insertTimeInto {textbox} {
  740.   $self tkvar current_time_    
  741.   $textbox delete 0.0 end
  742.   $textbox insert 0.0 $current_time_
  743. }
  744. #----------------------------------------------------------------------
  745. #
  746. #----------------------------------------------------------------------
  747. Editor instproc undisplayObjectProperties {display_frame} {
  748.   if {[winfo exists $display_frame]} {
  749.     # Need to delete old properties widgets
  750.     foreach widget [pack slaves $display_frame] {
  751.       # Each property has a frame for it's line(ie. label textbox)
  752.       set subwidgets [pack slaves $widget]
  753.       if {[llength $subwidgets] > 0} {
  754.         pack forget $subwidgets
  755.         destroy $subwidgets
  756.       }
  757.       pack forget $widget
  758.       destroy $widget
  759.     }
  760.   }
  761.   catch {destroy $display_frame}
  762. }
  763. #-----------------------------------------------------------------------
  764. # Editor instproc setObjectProperties {properties}
  765. #  - takes property list and sets each property in the list to it's
  766. #    value
  767. #  - properties format is:
  768. #    {{label variable type value} {label variable type value}}
  769. #-----------------------------------------------------------------------
  770. Editor instproc setObjectProperties {properties} {
  771.   $self instvar editor_view_ property_values textwidgets 
  772.                 start_stop_time_list_
  773.   $self tkvar drop_down_value_
  774.   foreach property $properties {
  775.   #  puts $property
  776.     
  777.     set property_label [lindex $property 0]
  778.     set property_variable [lindex $property 1]
  779.     set property_type [lindex $property 2]
  780.     if {$property_type == "title"} {
  781.       # This should be the first property and property_value should
  782.       # include the object type and id
  783.       set property_value [lindex $property 3]
  784.       set type [lindex $property_value 0]
  785.       set typeid [lindex $property_value 1] 
  786.     } elseif {$property_type == "label"} {
  787.       # Do nothing for a label
  788.     } elseif {$property_type == "timelist"} {
  789.       set property_value $start_stop_time_list_
  790.     } elseif {$property_type == "drop_down_list"} {
  791.       set property_value $drop_down_value_
  792.     } elseif {$property_type == "checkbox"} {
  793.     } else {
  794.       # Get the value from the text box
  795.       set property_value [$textwidgets($property_variable) get 0.0 1.end]
  796.       #puts [$textwidgets($property_variable) get 0.0 1.end]
  797.     }
  798.     switch "$type" {
  799.       Node {
  800.         $editor_view_ setNodeProperty $typeid 
  801.                                       $property_value 
  802.                                       $property_variable
  803.       }
  804.       Agent {
  805.         $editor_view_ setAgentProperty $typeid 
  806.                                        $property_value 
  807.                                        $property_variable
  808.       }
  809.       Link {
  810.         set src_dst [split $typeid "-"]
  811.         set src [lindex $src_dst 0]
  812.         set dst [lindex $src_dst 1]
  813.         $editor_view_ setLinkProperty $src $dst 
  814.                                       $property_value 
  815.                                       $property_variable
  816.       }
  817.       QueueHandle {
  818.         set src_dst [split $typeid "-"]
  819.         set source [lindex $src_dst 0]
  820.         set destination [lindex $src_dst 1]
  821.         $editor_view_ setQueueHandleProperty $source $destination 
  822.                                              $property_value 
  823.                                              $property_variable
  824.       }
  825.       TrafficSource {
  826.         $editor_view_ setTrafficSourceProperty $typeid 
  827.                                                $property_value 
  828.                                                $property_variable
  829.       }
  830.  
  831.       LossModel {
  832.         $editor_view_ setLossModelProperty $typeid 
  833.                                            $property_value 
  834.                                            $property_variable
  835.       }
  836.     }
  837.   }
  838. }
  839. #----------------------------------------------------------------------
  840. # Editor instproc buildToolbar {view toolbar} {
  841. #   - Toolbar along the top side of the nam editor window
  842. #   - Tools are:
  843. #        select
  844. #        addnode
  845. #        addlink
  846. #        addagent
  847. #        addtrafficsource
  848. #        deleteobject
  849. #----------------------------------------------------------------------
  850. Editor instproc buildToolbar {view toolbar} {
  851.   $self instvar magnification viewOffset SharedEnv balloon_ 
  852.         state_buttons_ edit_state_ editorwindow_ agent_types_ 
  853.         source_types_ toolbar_buttons_ current_tool_ 
  854.         lossmodel_types_
  855.   $self tkvar current_agent_ current_source_ current_lossmodel_
  856.   # Build toolbar
  857.   frame $toolbar.leftside
  858.   button $toolbar.leftside.select -bitmap "select" 
  859.                                   -command "$self chooseTool select" 
  860.                                   -highlightthickness 0 -borderwidth 1
  861.   set toolbar_buttons_(select) $toolbar.leftside.select
  862.   button $toolbar.leftside.addnode -bitmap "addnode" 
  863.                               -command " $self chooseTool addnode" 
  864.                               -highlightthickness 0 -borderwidth 1
  865.   set toolbar_buttons_(addnode) $toolbar.leftside.addnode
  866.   button $toolbar.leftside.addlink -bitmap "addlink" 
  867.                               -command "$self chooseTool addlink" 
  868.                               -highlightthickness 0 -borderwidth 1
  869.   set toolbar_buttons_(addlink) $toolbar.leftside.addlink
  870.   button $toolbar.leftside.addagent -text "Agent" 
  871.                         -command "$self chooseTool addagent" 
  872.                         -highlightthickness 0 -borderwidth 1
  873.   set toolbar_buttons_(addagent) $toolbar.leftside.addagent
  874.   #---------------------------------------------------------------------
  875.   # Create drop down list of agents
  876.   #   - current_agent_ needs to be initialized to first element in
  877.   #     $agent_types_
  878.   menubutton $toolbar.leftside.agent_list -textvariable [$self tkvarname current_agent_] 
  879.              -text $current_agent_ 
  880.              -indicatoron 1 -menu $toolbar.leftside.agent_list.menu 
  881.              -relief raised -bd 2 -highlightthickness 2 -anchor c 
  882.              -direction flush
  883.   menu $toolbar.leftside.agent_list.menu -tearoff 0
  884.   foreach i $agent_types_ {
  885.     if {$i == "-"} {
  886.       $toolbar.leftside.agent_list.menu add separator
  887.     } else {
  888.       $toolbar.leftside.agent_list.menu add radiobutton -label $i 
  889.                                       -variable current_agent_ 
  890.                                       -command "$self chooseAgent $i" 
  891.     }
  892.   }
  893.   $toolbar.leftside.agent_list configure -width 16
  894.   # Traffic source button and drop down list
  895.   button $toolbar.leftside.add_traffic_source -text "Traffic Source" 
  896.                         -command "$self chooseTool addtrafficsource" 
  897.                         -highlightthickness 0 -borderwidth 1
  898.   set toolbar_buttons_(addtrafficsource) $toolbar.leftside.add_traffic_source
  899.   #---------------------------------------------------------------------
  900.   # Drop down list of Traffic Sources
  901.   #   - $current_source_ needs to be initialized to first element in
  902.   #     $source_types_
  903.   menubutton $toolbar.leftside.source_list -textvariable [$self tkvarname current_source_] 
  904.              -indicatoron 1 -menu $toolbar.leftside.source_list.menu 
  905.              -relief raised -bd 2 -highlightthickness 2 -anchor c 
  906.              -direction flush
  907.   menu $toolbar.leftside.source_list.menu -tearoff 0
  908.   foreach i $source_types_ {
  909.     $toolbar.leftside.source_list.menu add radiobutton -label $i 
  910.                                       -variable current_source_ 
  911.                                       -command "$self chooseTrafficSource $i" 
  912.   }
  913.   $toolbar.leftside.source_list configure -width 16
  914.   
  915.   #---------------------------------------------------------------------
  916.   # Loss Model button and drop down list
  917.   #
  918.   button $toolbar.leftside.add_lossmodel -text "Loss Model" 
  919.                         -command "$self chooseTool addlossmodel" 
  920.                         -highlightthickness 0 -borderwidth 1
  921.   set toolbar_buttons_(addlossmodel) $toolbar.leftside.add_lossmodel
  922.   # Drop down list of Loss Models
  923.   #   - $current_lossmodel_ needs to be initialized to first element in
  924.   #     $lossmodel_types_
  925.   menubutton $toolbar.leftside.lossmodel_list 
  926.              -textvariable [$self tkvarname current_lossmodel_] 
  927.              -indicatoron 1 -menu $toolbar.leftside.lossmodel_list.menu 
  928.              -relief raised -bd 2 -highlightthickness 2 -anchor c 
  929.              -direction flush
  930.   menu $toolbar.leftside.lossmodel_list.menu -tearoff 0
  931.   foreach i $lossmodel_types_ {
  932.     $toolbar.leftside.lossmodel_list.menu add radiobutton -label $i 
  933.                                       -variable current_lossmodel_ 
  934.                                       -command "$self chooseLossModel $i" 
  935.   }
  936.   $toolbar.leftside.lossmodel_list configure -width 16
  937.   
  938.   #---------------------------------------------------------------------
  939.   # Delete Object Button
  940.   button $toolbar.leftside.deleteobject -bitmap "delete" 
  941.                         -command "$self chooseTool deleteobject" 
  942.                         -highlightthickness 0 -borderwidth 1
  943.   set toolbar_buttons_(deleteobject) $toolbar.leftside.deleteobject
  944.   pack $toolbar.leftside.select 
  945.        $toolbar.leftside.addnode 
  946.        $toolbar.leftside.addlink 
  947.        $toolbar.leftside.addagent 
  948.        $toolbar.leftside.agent_list 
  949.        $toolbar.leftside.add_traffic_source 
  950.        $toolbar.leftside.source_list 
  951.        $toolbar.leftside.add_lossmodel 
  952.        $toolbar.leftside.lossmodel_list 
  953.        $toolbar.leftside.deleteobject 
  954.        -side left
  955.   pack $toolbar.leftside -side left 
  956. #  pack $toolbar.zoombar -side left -fill x
  957.   $balloon_ balloon_for $toolbar.leftside.select "Select Object, Move Object or Get Object Properties"
  958.   $balloon_ balloon_for $toolbar.leftside.addnode "Add Node"
  959.   $balloon_ balloon_for $toolbar.leftside.addlink "Add Link or Connect Agents"
  960.   $balloon_ balloon_for $toolbar.leftside.addagent "Add Agent to a Node"
  961.   $balloon_ balloon_for $toolbar.leftside.agent_list "Choose Which Agent to Add"
  962.   $balloon_ balloon_for $toolbar.leftside.add_traffic_source "Add Traffic Source"
  963.   $balloon_ balloon_for $toolbar.leftside.source_list "Choose Which Traffic Source to Add"
  964.   $balloon_ balloon_for $toolbar.leftside.add_lossmodel "Add Link Loss Model"
  965.   $balloon_ balloon_for $toolbar.leftside.lossmodel_list "Choose Which Loss Model to Add"
  966.   $balloon_ balloon_for $toolbar.leftside.deleteobject "Delete Object"
  967. }
  968. #-----------------------------------------------------------------------
  969. # Editor instproc buildTimeControls {w}
  970. #  - builds the set of time controls into the frame w
  971. #  - This code was originally copied from build-ui.tcl so it is not
  972. #    very pretty looking 
  973. #-----------------------------------------------------------------------
  974. Editor instproc buildTimeControls {w} {
  975.   $self instvar rateSlider granularity time_step_ stepDisp running 
  976.         direction balloon_ current_time_step_ previous_time_step_
  977.   $self tkvar current_time_
  978.   set current_time_step_ 0.0001
  979.   set f [smallfont]
  980.   frame $w.bar -relief groove -borderwidth 2
  981. #  frame $w.bar.rate -borderwidth 1 -relief sunken
  982. #  scale $w.bar.rate.slider -orient horizontal -width 7p 
  983. #                           -label "Step:" -font [smallfont] 
  984. #                           -from -60 -to -1 -showvalue false 
  985. #                           -relief flat 
  986. #                           -borderwidth 1 -highlightthickness 0 
  987. #                      -troughcolor [option get . background Nam]
  988. #  pack $w.bar.rate.slider -side top -fill both -expand true
  989. #  set rateSlider $w.bar.rate.slider
  990.   #puts [time2real [option get . rate Nam]]
  991. #  set granularity [option get . granularity Nam]
  992.   #set time_step_ [time2real [option get . rate Nam]]
  993. #  set time_step_ 10.0
  994.   
  995. #  set stepDisp [step_format $time_step_]
  996. #  set current_time_step_ [expr 10*log10($time_step_)]
  997. #  set previous_time_step_ $current_time_step_
  998. #  $rateSlider set $current_time_step_
  999. #  bind $rateSlider <ButtonRelease-1> "$self set_rate [%W get] 1"
  1000. #  bind $rateSlider <ButtonPress-1> "$self on-rateslider-press"
  1001. #  bind $rateSlider <B1-Motion> "$self on-rateslider-motion [%W get]"
  1002. #  trace variable stepDisp w "$self displayStep"
  1003.   # Shows the current time in the time control bar
  1004.   label $w.bar.timer_label -text "Time :" 
  1005.                         -anchor w -font $f -borderwidth 1 
  1006.                         -relief sunken -anchor e
  1007.   label $w.bar.timer_value -textvariable [$self tkvarname current_time_] 
  1008.                         -width 14 -anchor w -font $f -borderwidth 1 
  1009.                         -relief sunken -anchor e
  1010. #  frame $w.bar.run
  1011. #  button $w.bar.run.b -bitmap play -borderwidth 1 -relief raised 
  1012. #                      -highlightthickness 0 -font $f  
  1013. #                      -command "puts "$self set_run $w""
  1014. #  frame $w.bar.run.f -height 5 -relief sunken 
  1015. #                     -borderwidth 1
  1016. #  pack $w.bar.run.b -side top -fill both -expand true
  1017. #  pack $w.bar.run.f -side top -fill x
  1018. #  $balloon_ balloon_for $w.bar.run.b "play forward" 1000
  1019. #  frame $w.bar.back
  1020. #  button $w.bar.back.b -bitmap back -borderwidth 1 -relief raised 
  1021. #                       -highlightthickness 0 -font $f 
  1022. #                       -command "puts "$self set_back $w""
  1023. #  $balloon_ balloon_for $w.bar.back.b "play backward" 1000
  1024.   # hilight running labels as $running changes
  1025. #  trace variable running w "$self trace_running_handler $w"
  1026.   
  1027. #  frame $w.bar.back.f -height 5 -relief sunken 
  1028. #                      -borderwidth 1
  1029. #  pack $w.bar.back.b -side top -fill both -expand true
  1030. #  pack $w.bar.back.f -side top -fill x
  1031.         
  1032. #  frame $w.bar.stop
  1033. #  button $w.bar.stop.b -bitmap stop -borderwidth 1 -relief raised 
  1034. #                       -highlightthickness 0 -font $f 
  1035. #                       -command "puts "$self stop 1;
  1036. #                                 $self renderFrame;
  1037. #                                 $self highlight $w.bar.stop 1""
  1038. #  $balloon_ balloon_for $w.bar.stop.b "stop" 1000
  1039. #  frame $w.bar.stop.f -height 5 -relief sunken 
  1040. #                      -borderwidth 1
  1041. #  pack $w.bar.stop.b -side top -fill both -expand true
  1042. #  pack $w.bar.stop.f -side top -fill x
  1043. #  frame $w.bar.rew
  1044. #  button $w.bar.rew.b -bitmap rew -borderwidth 1 -relief raised 
  1045. #                      -highlightthickness 0 -font $f 
  1046. #                      -command "$self rewind"
  1047. #  $balloon_ balloon_for $w.bar.rew.b "rewind" 1000
  1048. #  frame $w.bar.rew.f -height 5 -relief sunken 
  1049. #                     -borderwidth 1
  1050. #  pack $w.bar.rew.b -side top -fill both -expand true
  1051. #  pack $w.bar.rew.f -side top -fill x
  1052. #  frame $w.bar.ff
  1053. #  button $w.bar.ff.b -bitmap ff -borderwidth 1 -relief raised 
  1054. #                     -highlightthickness 0 -font $f 
  1055. #                     -command "$self fast_fwd"
  1056. #  $balloon_ balloon_for $w.bar.ff.b "fast forward" 1000
  1057. #  frame $w.bar.ff.f -height 5 -relief sunken 
  1058. #                    -borderwidth 1
  1059. #  pack $w.bar.ff.b -side top -fill both -expand true
  1060. #  pack $w.bar.ff.f -side top -fill x
  1061. #  pack $w.bar.rate -side right -fill y
  1062.   pack $w.bar.timer_value $w.bar.timer_label -side right -pady 0 
  1063.                        -ipady 1 -padx 1 -fill y
  1064. #  pack $w.bar.ff -side right -padx 1 -pady 1 -fill both -expand true
  1065. #  pack $w.bar.run -side right -padx 1 -pady 1 -fill both -expand true
  1066. #  pack $w.bar.stop -side right -padx 1 -pady 1 -fill both -expand true
  1067. #  pack $w.bar.back -side right -padx 1 -pady 1 -fill both -expand true
  1068. #  pack $w.bar.rew -side right -padx 1 -pady 1 -fill both -expand true
  1069.   pack $w.bar -fill x -expand 1 -side right
  1070. #  $self instvar prevbutton
  1071. #  set prevbutton $w.bar.stop
  1072. #  start out stopped
  1073. #  $self highlight $w.bar.stop 1
  1074. }
  1075. #-----------------------------------------------------------------------
  1076. # Editor instproc buildTimeSlider {view w}
  1077. #  - creates a time slider to be used in setting time events
  1078. #  - w is the slider frame
  1079. #-----------------------------------------------------------------------
  1080. Editor instproc buildTimeSlider {w} {
  1081.   $self tkvar showpanel
  1082.   $self instvar mintime_ now_ slider_model_ pipemode_ slider_view_ netmodel_
  1083.   $netmodel_ instvar maximum_simulation_time_ ;# This is set by editornetmodel.cc
  1084.   # Initialize Time Slider Values
  1085.   set mintime_ 0.0
  1086.   set now_ 0.0
  1087.   set slider_model_ [new TimesliderModel $mintime_ $maximum_simulation_time_ $now_ $self]
  1088.   set slider_view_ [new TimesliderView $w $slider_model_]
  1089.   $slider_model_ addObserver $slider_view_
  1090.   $slider_model_ setpipemode 0
  1091.   $self setCurrentTime 0.0
  1092. }
  1093. #------------- Functions needed for TimeSlider -------------
  1094. Editor instproc setsliderPressed {v} {
  1095. #  puts "setsliderPressed $v"
  1096. }
  1097. #-----------------------------------------------------------------------
  1098. #-----------------------------------------------------------------------
  1099. Editor instproc setCurrentTime {time} {
  1100.   $self tkvar current_time_
  1101.   set current_time_ $time
  1102.   $self renderFrame
  1103. }
  1104. #-----------------------------------------------------------------------
  1105. #-----------------------------------------------------------------------
  1106. Editor instproc slidetime {a b} {
  1107. #  puts "slidetime $a $b"
  1108. }
  1109. #-----------------------------------------------------------------------
  1110. #-----------------------------------------------------------------------
  1111. Editor instproc fast_fwd {} {
  1112. #  $self instvar current_time_step_ slider_model_
  1113. #  $self tkvar current_time_
  1114. #  puts "fast_fwd -> $current_time_step_"
  1115. #  set current_time_ [expr $current_time_ + $current_time_step_]
  1116. #  $slider_model_ setcurrenttime $current_time_step_
  1117.   
  1118. }
  1119. #-----------------------------------------------------------------------
  1120. #-----------------------------------------------------------------------
  1121. Editor instproc rewind {} {
  1122. #  $self instvar current_time_step_ slider_model_
  1123. #  $self tkvar current_time_
  1124. #  puts "rewind -> $current_time_step_"
  1125. #  set current_time_ [expr $current_time_ - $current_time_step_]
  1126. #  $slider_model_ setcurrenttime $current_time_step_
  1127. }
  1128. #-----------------------------------------------------------------------
  1129. #-----------------------------------------------------------------------
  1130. Editor instproc setsliderPressed {b} {
  1131. #  puts "setsliderPressed $b"
  1132. }
  1133. #-----------------------------------------------------------------------
  1134. #-----------------------------------------------------------------------
  1135. Editor instproc getrunning {} {
  1136. #  puts getrunning
  1137.   return 1
  1138. }
  1139. #-----------------------------------------------------------------------
  1140. # Editor instproc renderFrame {} 
  1141. #  -- called by the TimeSlider after the slider is released
  1142. #-----------------------------------------------------------------------
  1143. Editor instproc renderFrame {} {
  1144.   $self instvar editor_view_ netmodel_ slider_view_
  1145.   $self tkvar current_time_
  1146.   $netmodel_ updateNodePositions $current_time_
  1147.   $editor_view_ draw $current_time_
  1148. }
  1149. #------------- End Functions needed for TimeSlider -------------
  1150. #-----------------------------------------------------------------------
  1151. # Editor instproc addTimeSliderNodeMarkers{} 
  1152. #-----------------------------------------------------------------------
  1153. Editor instproc addTimeSliderNodeMarkers {marker_list} {
  1154. $self instvar slider_view_
  1155. foreach line $marker_list {
  1156. set node_id [lindex $line 0]
  1157. foreach time [lrange $line 1 end] {
  1158. $slider_view_ addMarker $time $node_id seagreen
  1159. }
  1160. }
  1161. }
  1162. #-----------------------------------------------------------------------
  1163. # Editor instproc buildMenubar {w}
  1164. #  - w is the parent window frame
  1165. #-----------------------------------------------------------------------
  1166. Editor instproc buildMenubar {w} {
  1167.   $self instvar editorwindow_ menubar_ agent_types_ 
  1168.         source_types_ lossmodel_types_
  1169.   $self tkvar current_agent_ current_source_ current_lossmodel_
  1170.   # File Menu
  1171.   menubutton $w.file -text File -underline 0 
  1172.              -menu $w.file.menu
  1173.   menu $w.file.menu
  1174.   $w.file.menu add command -label New 
  1175.                      -underline 0 -command "$self newFile"
  1176.   $w.file.menu add command -label Open 
  1177.                      -underline 0 -command "$self openFile"
  1178.   $w.file.menu add command -label Save 
  1179.                      -underline 0 -command "$self doSave"
  1180.   $w.file.menu add command -label "Save As..." 
  1181.                      -underline 4 -command "$self doSaveAs"
  1182.   $w.file.menu add separator
  1183.   $w.file.menu add command -label "Run Ns" 
  1184.                      -underline 1 -command "$self doSave; $self runNs"
  1185.   $w.file.menu add command -label "Close" 
  1186.                      -underline 0 -command "destroy $editorwindow_"
  1187.   # Edit Menu
  1188.   menubutton $w.edit -text Edit -underline 0 
  1189.              -menu $w.edit.menu
  1190.   menu $w.edit.menu
  1191.   $w.edit.menu add command -label "Undo" 
  1192.                      -underline 0 -command "puts Undo" -state disabled
  1193.   $w.edit.menu add command -label "Redo" 
  1194.                      -underline 0 -command "puts Redo" -state disabled
  1195.   $w.edit.menu add separator
  1196.   $w.edit.menu add command -label "Cut" 
  1197.                      -underline 0 -command "puts Cut" -state disabled
  1198.   $w.edit.menu add command -label "Copy" 
  1199.                      -underline 0 -command "puts Copy" -state disabled
  1200.   $w.edit.menu add command -label "Paste" 
  1201.                      -underline 0 -command "puts Paste" -state disabled
  1202.   $w.edit.menu add separator
  1203.   $w.edit.menu add command -label "Simulator Properties" 
  1204.                      -underline 0 -command "$self displaySimulatorProperties .properties"
  1205.   # Tools Menu
  1206.   menubutton $w.tools -text Tools -underline 0 
  1207.              -menu $w.tools.menu
  1208.   menu $w.tools.menu
  1209.   $w.tools.menu add command -label "Select" 
  1210.                      -underline 0 -command "$self chooseTool select"
  1211.   $w.tools.menu add command -label "Add Node" 
  1212.       -underline 0  
  1213.       -command "$self chooseTool addnode"
  1214.   $w.tools.menu add command -label "Add Link" 
  1215.       -underline 0  
  1216.       -command "$self chooseTool addlink"
  1217.   # Cascading Agents menu
  1218.   $w.tools.menu add cascade -label "Agents" 
  1219.       -underline 0 -menu $w.tools.menu.agents
  1220.   menu $w.tools.menu.agents
  1221.   foreach i $agent_types_ {
  1222.     if {$i == "-"} {
  1223.       $w.tools.menu.agents add separator
  1224.     } else {
  1225.       $w.tools.menu.agents add radiobutton 
  1226.            -label $i -variable current_agent_ -value $i 
  1227.            -command "$self chooseAgent $i"
  1228.     }
  1229.   }
  1230.   # Cascading Sources menu
  1231.   $w.tools.menu add cascade -label "Traffic Sources" 
  1232.       -underline 0 -menu $w.tools.menu.sources
  1233.   menu $w.tools.menu.sources
  1234.   foreach i $source_types_ {
  1235.     $w.tools.menu.sources add radiobutton 
  1236.            -label $i -variable current_source_ -value $i 
  1237.            -command "$self chooseTrafficSource $i"
  1238.   }
  1239.   # Cascading Loss Models menu
  1240.   $w.tools.menu add cascade -label "Link Loss Models" 
  1241.       -underline 0 -menu $w.tools.menu.lossmodels
  1242.   menu $w.tools.menu.lossmodels
  1243.   foreach i $lossmodel_types_ {
  1244.     $w.tools.menu.lossmodels add radiobutton 
  1245.            -label $i -variable current_lossmodel_ -value $i 
  1246.            -command "$self chooseLossModel $i"
  1247.   }
  1248.   $w.tools.menu add command -label "Delete Object" 
  1249.                      -underline 0 -command "$self chooseTool deleteobject"
  1250.   # Attach Menus to Parent Window
  1251.   pack $w.file $w.edit 
  1252.        $w.tools -side left   
  1253.   # Add Help menu to the Right
  1254.   menubutton $w.help -text "Help" -underline 0 
  1255.              -menu $w.help.menu
  1256.   menu $w.help.menu
  1257.   $w.help.menu add command -label "Help" 
  1258.              -underline 0 -command "$self showHelp"
  1259.   pack $w.help -side right
  1260.   # Enable Keyboard Focus
  1261. #  tk_menuBar $editorwindow_.menubar_  
  1262. #             $editorwindow_.menubar_.file 
  1263. #             $editorwindow_.menubar_.edit
  1264. }
  1265. #----------------------------------------------------------------------
  1266. #
  1267. #----------------------------------------------------------------------
  1268. Editor instproc setMessage {} {
  1269.   $self instvar SharedEnv
  1270.   return $SharedEnv(Cursor)
  1271. }
  1272. #----------------------------------------------------------------------
  1273. #
  1274. #----------------------------------------------------------------------
  1275. Editor instproc originObject { name } {
  1276.         $self instvar SharedEnv
  1277.                 
  1278.         set bb [$SharedEnv(CurrentCanvas) bbox $name]
  1279.         set x [lindex $bb 0]
  1280.         set y [lindex $bb 1]
  1281.         if {$x > 0} {
  1282.                 set nx -$x
  1283.         } else {
  1284.                 set nx [expr abs($x)]
  1285.         }
  1286.         if {$y > 0} {
  1287.                 set ny -$y              
  1288.         } else {         
  1289.                 set ny [expr abs($y)]
  1290.         }       
  1291.         $SharedEnv(CurrentCanvas) move $name $nx $ny
  1292. }    
  1293. #----------------------------------------------------------------------
  1294. #
  1295. #----------------------------------------------------------------------
  1296. Editor instproc scaleObject {name ratio width height} {
  1297.   $self instvar SharedEnv
  1298.   set bb [eval $SharedEnv(CurrentCanvas) bbox $name]
  1299.   if {"$bb" != ""} {
  1300.     set x [lindex $bb 2]
  1301.     set y [lindex $bb 3]
  1302.     if {$ratio == "variable"} {
  1303.       set scalex [expr ($width + 0.0) / $x]
  1304.       set scaley [expr ($height + 0.0) / $y]
  1305.       if {$scalex > $scaley} {
  1306.         set scale $scaley
  1307.       } else {
  1308.         set scale $scalex
  1309.       }
  1310.     } elseif {$ratio != ""} {
  1311.       set scalex $ratio
  1312.       set scaley $ratio
  1313.       set scale $ratio
  1314.     } else {
  1315.       set scalex [expr ($width + 0.0) / $x]
  1316.       set scaley [expr ($height + 0.0) / $y]
  1317.       if {$scalex > $scaley} {
  1318.         set scalex $scaley
  1319.         set scale $scaley
  1320.       } else {
  1321.         set scaley $scalex
  1322.         set scale $scalex
  1323.       }
  1324.     }
  1325.     $SharedEnv(CurrentCanvas) scale $name 0 0 $scalex $scaley
  1326.     foreach i [$SharedEnv(CurrentCanvas) find withtag all] {
  1327.       set type [$SharedEnv(CurrentCanvas) type $i]
  1328.       if {"$type" != "text"} {
  1329.         continue
  1330.       }
  1331.       if {$SharedEnv(FontScale)} {
  1332.         set fn [$SharedEnv(CurrentCanvas) itemcget $i -font]
  1333.         regexp 
  1334.         {([-][^-]*-[^-]*-[^-]*-[^-]*-[^-]*-[^-]*-[^-]*-)([^-]*)(-.*)}
  1335.           $fn dummy d1 size d2;
  1336.         if {"$dummy" != ""} {
  1337.           set nsize [expr round($size * $scale)]
  1338.           if {$nsize < 20} {
  1339.             set nsize 20
  1340.           }
  1341.           $SharedEnv(CurrentCanvas) itemconfigure $i 
  1342.             -font ${d1}${nsize}${d2}
  1343.           set fnn [$SharedEnv(CurrentCanvas) itemcget $i -font]
  1344.           regexp 
  1345.             {([-][^-]*-[^-]*-[^-]*-[^-]*-[^-]*-[^-]*-[^-]*-)([^-]*)(-.*)}
  1346.             $fnn dummy d1 nsize d2;
  1347.           if { ($scale < 1 && $nsize < $size ) || 
  1348.              ($scale > 1 && $nsize > $size) } {
  1349.             $SharedEnv(CurrentCanvas) itemconfigure $i 
  1350.               -width [expr [$SharedEnv(CurrentCanvas) itemcget $i 
  1351.               -width] * $scale]
  1352.           } else {
  1353.             $SharedEnv(CurrentCanvas) itemconfigure $i 
  1354.               -font $fn
  1355.           }
  1356.         }
  1357.       } else {
  1358.         $SharedEnv(CurrentCanvas) itemconfigure $i 
  1359.           -width [expr [$SharedEnv(CurrentCanvas) itemcget $i -width] 
  1360.             * $scale]
  1361.       }
  1362.     }
  1363.   }
  1364. }
  1365. #----------------------------------------------------------------------
  1366. #
  1367. #----------------------------------------------------------------------
  1368. Editor instproc setCursor { value } {                              
  1369.         $self instvar SharedEnv                                   
  1370.                                                         
  1371.         set SharedEnv(Cursor) $value                       
  1372.         $self setRadioButton SharedEnv(Cursor) $value    
  1373. }
  1374. #----------------------------------------------------------------------
  1375. #
  1376. #----------------------------------------------------------------------
  1377. Editor instproc setRadioButton { var value } {
  1378.         $self instvar SharedEnv
  1379.         if {[info exists SharedEnv(W_${value})]} {
  1380.                 set bd [$SharedEnv(W_${value}) cget -bd]
  1381.                 $self clearRadioVariable $var
  1382.                 $SharedEnv(W_${value}) configure -relief sunken
  1383.                 $SharedEnv(W_${value}) move all $bd $bd
  1384.                 set SharedEnv($var) $SharedEnv(W_${value})
  1385.         }        
  1386.         set $var "$value"       
  1387. }
  1388. #----------------------------------------------------------------------
  1389. #
  1390. #----------------------------------------------------------------------
  1391. Editor instproc clearRadioVariable {var} { 
  1392.         $self instvar SharedEnv           
  1393.         if {[info exists SharedEnv($var)] && [winfo exists $SharedEnv($var)]} {
  1394.                 set bd [$SharedEnv($var) cget -bd]
  1395.                 $SharedEnv($var) configure -relief $SharedEnv(ButtonRelief)
  1396.                 eval $SharedEnv($var) move all -$bd -$bd
  1397.         }       
  1398.         set $var ""  
  1399. }
  1400. #----------------------------------------------------------------------
  1401. #  Editor instproc enterObject { w x y value }
  1402. #     - Shows an objects popup info window
  1403. #----------------------------------------------------------------------
  1404. Editor instproc enterObject { w x y value } {
  1405. catch {destroy $w.f}
  1406. frame $w.f -relief groove -borderwidth 2
  1407. message $w.f.msg -width 8c -text $value
  1408. pack $w.f.msg
  1409. pack $w.f
  1410. catch {place_frame $w $w.f [expr $x+10] [expr $y+10]}
  1411. }
  1412. #----------------------------------------------------------------------
  1413. #
  1414. #----------------------------------------------------------------------
  1415. Editor instproc enterToolButtons { w x y value } {
  1416.   $self instvar SharedEnv
  1417.     set geo [winfo geometry $w]
  1418.     set px [lindex [split $geo "+"] 1]
  1419.     set py [lindex [split $geo "+"] 2]
  1420.     set psize [lindex [split $geo "+"] 0]
  1421.     set pxsize [lindex [split $psize "x"] 0]
  1422.     set pysize [lindex [split $psize "x"] 1]
  1423.                         
  1424.     set w [winfo parent $w]
  1425.     catch {destroy $w.fm}
  1426.     frame $w.fm -relief groove -borderwidth 2
  1427.     message $w.fm.msg -width 10c -text $value -background yellow
  1428.     pack $w.fm.msg
  1429.     pack $w.fm 
  1430.     catch {place_frame $w $w.fm [expr $pxsize+$px] [expr $pysize+$py]}
  1431. }
  1432. #----------------------------------------------------------------------
  1433. #
  1434. #----------------------------------------------------------------------
  1435. Editor instproc leaveToolButtons { w } {
  1436.     set w [winfo parent $w]
  1437.     catch {destroy $w.fm} 
  1438. }
  1439. #----------------------------------------------------------------------
  1440. # Editor instproc createColorPalette {name redlist greenlist bluelist replace}
  1441. #  - This procedure is pretty messy but it seems to work in creating
  1442. #    a color selection box and putting the result into the variable
  1443. #    colorarea via the getcolornam procedure.
  1444. #  - I don't feel like renaming the variables to make to more readable
  1445. #    and straightforward like I have done on other parts of 
  1446. #    poorly written code similar to this.
  1447. #----------------------------------------------------------------------
  1448. Editor instproc createColorPalette {name redlist greenlist bluelist replace} {
  1449. $self instvar SharedEnv netmodel_
  1450. # Setup
  1451. set w ${name}
  1452. if {[winfo exists $w]} {
  1453. wm deiconify $w
  1454. raise $w
  1455. return
  1456. }
  1457. set SharedEnv($name) $replace
  1458. eval toplevel $w $SharedEnv(PrivateCmap)
  1459. wm protocol $w WM_DELETE_WINDOW "wm withdraw $w"
  1460. frame $w.f
  1461. foreach red $redlist {
  1462. frame $w.f.rcol_${red}
  1463. foreach green $greenlist {
  1464. frame $w.f.grow_${red}${green}
  1465. foreach blue $bluelist {
  1466. if { [info exists SharedEnv($w.f.c${red}${green}${blue})] } {
  1467. frame $w.f.c${red}${green}${blue} 
  1468. -relief raised -height 2m -width 2m 
  1469. -highlightthickness 0 
  1470. -bd 1 -bg $SharedEnv($w.f.c${red}${green}${blue})
  1471. } else {
  1472. frame $w.f.c${red}${green}${blue} 
  1473. -relief raised -height 2m -width 2m 
  1474. -highlightthickness 0 
  1475. -bd 1 -bg "#${red}${green}${blue}"
  1476. }
  1477. pack $w.f.c${red}${green}${blue} -side left 
  1478. -in $w.f.grow_${red}${green} -fill both -expand true
  1479. bind $w.f.c${red}${green}${blue} <1> {
  1480. %W configure -relief sunken
  1481. }
  1482. # This grabs the color and puts it into the color text box 
  1483. bind $w.f.c${red}${green}${blue} <Double-Button-1> "$self getcolorname %W; destroy $w"
  1484. bind $w.f.c${red}${green}${blue} <ButtonRelease-1> "$self getcolorname %W; destroy $w"
  1485.           
  1486. }
  1487. pack $w.f.grow_${red}${green} -side top -in $w.f.rcol_${red} -fill both -expand true
  1488. }
  1489. pack $w.f.rcol_${red} -side left -in $w.f -fill both -expand true
  1490. }
  1491. frame $w.f.c_none -width 4m -relief raised -bd 1 
  1492. -highlightthickness 0
  1493. pack $w.f.c_none -in $w.f -side left -fill y 
  1494. pack $w.f -in $w -expand true -fill both
  1495. # Return
  1496. wm geometry $w $SharedEnv(ColorWidth)x$SharedEnv(ColorHeight)
  1497. }
  1498. #----------------------------------------------------------------------
  1499. # Editor instproc getcolorname {w} 
  1500. #  - gets the clicked on color value from the color palette window
  1501. #    and puts the result into the textbox pointed at by colorarea
  1502. #  - colorarea is set in the displayObjectProperties procedure.
  1503. #----------------------------------------------------------------------
  1504. Editor instproc getcolorname {w} {
  1505.   $self instvar netmodel_ colorarea
  1506.   $w configure -relief raised
  1507.   set colorv [$w cget -bg] 
  1508.   set rgb [winfo rgb $w $colorv]
  1509.   set colorn "[$netmodel_ lookupColorName [lindex $rgb 0] 
  1510.                [lindex $rgb 1] [lindex $rgb 2]]"
  1511.   if {[info exists colorarea] && [winfo exists $colorarea]} {
  1512.       $colorarea delete 0.0 end
  1513.       $colorarea insert 0.0 $colorn 
  1514.       catch { $colorarea tag add bgcolor 0.0 end }
  1515.       $colorarea tag configure bgcolor -background $colorn
  1516.   
  1517.   }
  1518.   
  1519. }
  1520. #----------------------------------------------------------------------
  1521. #
  1522. #----------------------------------------------------------------------
  1523. Editor instproc showHelp {} {
  1524.   $self instvar editorwindow_
  1525.   set w $editorwindow_.1
  1526.   if {[winfo exists $w]} {
  1527.     wm deiconify $w
  1528.     raise $w
  1529.     return
  1530.   }
  1531.   toplevel $w
  1532.   wm title $w "Quick Tips on using the Nam Editor"
  1533.   listbox $w.lbox -width 48 -height 11
  1534.   pack $w.lbox -side left -expand yes -fill both
  1535.   $w.lbox insert 0 
  1536.           "Nam Editor Help"
  1537.           "-----------------------------------------------" 
  1538.           "1) Create nodes using the add node tool " 
  1539.           "2) Connect them using the add link tool." 
  1540.           "3) Attach an agent to a node"
  1541.           "4) Connect agents by using the link tool."
  1542.           "5) Set options by double clicking or right clicking on each object."
  1543.           "6) Run the scenario using the File Menu command, Run Ns."
  1544.           "-----------------------------------------------" 
  1545.           "Please report all bugs to ns-users@isi.edu"
  1546.   $w.lbox selection set 0
  1547. }
  1548. #----------------------------------------------------------------------
  1549. # Editor instproc chooseTool {tool}
  1550. #  - tools are created in the buildToolbar procedure
  1551. #----------------------------------------------------------------------
  1552. Editor instproc chooseTool {tool} {
  1553.   $self instvar SharedEnv state_buttons_ toolbar_buttons_ 
  1554.                 current_tool_ slider_view_
  1555.   $self tkvar current_agent_ current_source_
  1556.   $slider_view_ instvar delete_marker_
  1557.   # Release last tool button
  1558.   if [info exists current_tool_] {
  1559.     $toolbar_buttons_($current_tool_) configure -relief raised
  1560.   }
  1561.   # Depress current tool button
  1562.   set current_tool_ $tool
  1563.   if [info exists toolbar_buttons_($tool)] {
  1564.     $toolbar_buttons_($tool) configure -relief sunken
  1565.   }
  1566.   if {$tool == "deleteobject"} {
  1567.     # Set the slider view to delete it's markers if they are clicked upon
  1568.     set delete_marker_ 1
  1569.   } else {
  1570.     set delete_marker_ 0
  1571.   }
  1572. }
  1573. #----------------------------------------------------------------------
  1574. # Editor instproc chooseAgent {agent}
  1575. #  -- This function is used to set the current_agent_ variable.
  1576. #     I believe there is a bug in otcl and creating menubuttons.
  1577. #     The scope of a instvar varible doesn't seem to be passed in
  1578. #     properly to the menubutton function.
  1579. #----------------------------------------------------------------------
  1580. Editor instproc chooseAgent {agent} {
  1581.   $self tkvar current_agent_
  1582.   set current_agent_ $agent
  1583.   $self chooseTool addagent
  1584. }
  1585. #----------------------------------------------------------------------
  1586. # Editor instproc chooseTrafficSource {source} 
  1587. #  -- This function is used to set the current_source_ variable.
  1588. #     I believe there is a bug in otcl and creating menubuttons.
  1589. #     The scope of a instvar varible doesn't seem to be passed in
  1590. #     properly to the menubutton function.
  1591. #
  1592. #----------------------------------------------------------------------
  1593. Editor instproc chooseTrafficSource {source} {
  1594.  $self tkvar current_source_
  1595.  set current_source_ $source
  1596.  $self chooseTool addtrafficsource
  1597. }
  1598. #----------------------------------------------------------------------
  1599. # Editor instproc chooseLossModel {lossmodel} 
  1600. #----------------------------------------------------------------------
  1601. Editor instproc chooseLossModel {lossmodel} {
  1602.  $self tkvar current_lossmodel_
  1603.  set current_lossmodel_ $lossmodel
  1604.  $self chooseTool addlossmodel
  1605. }
  1606. #----------------------------------------------------------------------
  1607. #
  1608. #----------------------------------------------------------------------
  1609. Editor instproc popupCanvasSet { type } {
  1610.   $self instvar SharedEnv edit_state_ state_buttons_
  1611.   # Release last state button, press down new one
  1612.   if [info exists edit_state_] {
  1613.     $state_buttons_($edit_state_) configure -relief raised
  1614.   }
  1615.   set edit_state_ $type
  1616.   if [info exists state_buttons_($type)] {
  1617.     $state_buttons_($type) configure -relief sunken
  1618.   }
  1619.   $self setCursor "$type"
  1620.   switch "$SharedEnv(Cursor)" {
  1621.     Cut {
  1622.       set SharedEnv(Message) Cut
  1623.       $self setCursor "Cut"
  1624.       #cutCopySelected Cut Imp_Selected 1
  1625.       #set SharedEnv(Message) Select
  1626.       #enableSelectionButtons
  1627.     }
  1628.     Paste {
  1629.       if {$SharedEnv(Cut) == ""} {
  1630.         setCursor "Select"
  1631.         set SharedEnv(Message) Select
  1632.         enableSelectionButtons
  1633.       }
  1634.     }
  1635.     Link -
  1636.     Node -
  1637.     Queue -
  1638.     Agent -
  1639.     Text {
  1640.       set SharedEnv(Sub-Cursor) ""
  1641.       #$SharedEnv(CurrentCanvas) delete SharedEnv(curline)
  1642.       #$SharedEnv(CurrentCanvas) delete selector
  1643.       $SharedEnv(CurrentCanvas) dctag
  1644.       set SharedEnv(Message) $SharedEnv(Cursor)
  1645.       #deselectAll
  1646.       #disableSelectionButtons
  1647.     }
  1648.     Select {
  1649.       set SharedEnv(Message) $SharedEnv(Cursor)
  1650.       #deselectAll
  1651.       #enableSelectionButtons
  1652.     }
  1653.   
  1654.     Print {
  1655.       #printRaise .print
  1656.       
  1657.       return
  1658.     }
  1659.   }
  1660.   focus $SharedEnv(CurrentCanvas)
  1661. }
  1662. #----------------------------------------------------------------------
  1663. #
  1664. #----------------------------------------------------------------------
  1665. Editor instproc newFile {} {
  1666.         set editor [new Editor ""]
  1667. }
  1668. #----------------------------------------------------------------------
  1669. #
  1670. #----------------------------------------------------------------------
  1671. Editor instproc openFile {} {
  1672.   $self instvar editorwindow_
  1673. #  $self tkvar openFile_
  1674.   set openFile_ [tk_getOpenFile 
  1675.                 -filetypes {{{Nam Editor} {.ns .enam}} 
  1676.                             {{All Files} {*}}} 
  1677.                 -parent $editorwindow_]
  1678.   if {$openFile_ == ""} {
  1679.     return 
  1680.   }
  1681.   set editor [new Editor $openFile_]
  1682.   return
  1683. }
  1684. #----------------------------------------------------------------------
  1685. # Editor instproc doSave {}
  1686. #  - Saves the file if save_filename_ is defined otherwise it
  1687. #    calls doSaveAs
  1688. #----------------------------------------------------------------------
  1689. Editor instproc doSave {} {
  1690.   $self instvar save_filename_
  1691.   
  1692.   if {"$save_filename_" != ""} {
  1693.     $self writeFile $save_filename_
  1694.   } else {
  1695.     $self doSaveAs
  1696.   }
  1697. }
  1698. #----------------------------------------------------------------------
  1699. # Editor instproc doSaveAs {}
  1700. #  - brings up a saveas dialog box and if the filename exists it calls
  1701. #    writeFile to write out the nam editor ns script
  1702. #----------------------------------------------------------------------
  1703. Editor instproc doSaveAs {} {
  1704.   $self instvar save_filename_ editorwindow_
  1705.   set filename [tk_getSaveFile -defaultextension ".ns" 
  1706.                                -filetypes {{{Nam Editor} {.ns .enam}}} 
  1707.                                -parent $editorwindow_]
  1708.   if {"$filename" != ""} {
  1709.     $self writeFile $filename
  1710.   }
  1711. }
  1712. #----------------------------------------------------------------------
  1713. # Editor instproc writeFile {filename}
  1714. #  - calls saveasns to write out the nam generate ns script to a file
  1715. #    and raises a message if a problem occurred.
  1716. #  - "saveasns" is part of enetmodel.cc:command
  1717. #----------------------------------------------------------------------
  1718. Editor instproc writeFile {filename} {
  1719.   $self instvar netmodel_ save_filename_ editorwindow_
  1720.   if {"$filename" != ""} {
  1721.     regexp {(.*)[.]ns} $filename matched filename_root
  1722.     catch {$netmodel_ saveasns $filename $filename_root} error
  1723.     if {![info exists error]} {
  1724.       $self msgRaise .alert "Nam File Error" "ERROR: Unable to save file: $filename."
  1725.     } else {
  1726.       set save_filename_ $filename
  1727.       wm title $editorwindow_ "Nam Editor - $save_filename_"
  1728.       update
  1729.     }
  1730.   }
  1731. }
  1732. #----------------------------------------------------------------------
  1733. #
  1734. #----------------------------------------------------------------------
  1735. Editor instproc runNs {} {
  1736.   $self instvar save_filename_
  1737.   if {$save_filename_ != ""} {
  1738.     set filename $save_filename_
  1739.     catch {exec ns $filename &} error
  1740.     if {[info exists error]} {
  1741.       if {[regexp {([0-9]+)} $error matched process_id]} {
  1742.         $self msgRaise .alert "Nam - Ns id $process_id" "Ns should be running as process id $process_id.n
  1743.                                  The result will be shown when it finishes."
  1744.       } else {
  1745.         $self msgRaise .alert "Nam - Ns Error" "Ns was unable to run.          n
  1746.                                  The error message reported was:n
  1747.                                  [ $error ]"
  1748.       }
  1749.     }
  1750.   }
  1751. }
  1752. #----------------------------------------------------------------------
  1753. #
  1754. #----------------------------------------------------------------------
  1755. Editor instproc msgRaise {name title message} {  
  1756.         $self instvar SharedEnv   
  1757.         set w ${name}   
  1758.         set SharedEnv(MsgReplace) $SharedEnv(CurrentCanvas)
  1759.         if {![winfo exists $name]} {
  1760.                $self  msgRequestor $name
  1761.         }
  1762.         $w.message configure -text "$message"
  1763.         wm title $w $title
  1764.         wm deiconify $w
  1765.         focus $w
  1766. }
  1767. #----------------------------------------------------------------------
  1768. #
  1769. #----------------------------------------------------------------------
  1770. Editor instproc msgRequestor {name} {
  1771.         $self instvar SharedEnv
  1772.         set w ${name}   
  1773.         toplevel $w
  1774. #               wm transient $w .
  1775.         wm protocol $w WM_DELETE_WINDOW {set dummy 1}
  1776.         frame $w.f -borderwidth 0 -highlightthickness 0
  1777.         frame $w.texttop -borderwidth 0 -highlightthickness 0
  1778.         frame $w.textbottom -relief raised -bd 1
  1779.         label $w.message
  1780.         button $w.ok -text "Ok" -command "$self msgLower $w"
  1781.         pack $w.message -in $w.texttop -fill both -expand true
  1782.         pack $w.ok -in $w.textbottom -side bottom -padx 2m -pady 2m
  1783.         pack $w.texttop $w.textbottom -anchor sw -in $w -fill x -expand true
  1784.         pack $w.f -in $w
  1785.         wm withdraw $w
  1786. }
  1787. #----------------------------------------------------------------------
  1788. #
  1789. #----------------------------------------------------------------------
  1790. Editor instproc msgLower {name} {
  1791.         $self instvar SharedEnv
  1792.         set w ${name}
  1793.         wm withdraw $w
  1794. }
  1795. #-----------------------------------------------------------------------
  1796. # Editor instproc moveToMarkerTime {time} {
  1797. #   - adjusts the current time to the one held by the clicked on 
  1798. #     timeslider marker
  1799. #-----------------------------------------------------------------------
  1800. Editor instproc moveToMarkerTime {time} {
  1801. $self instvar slider_model_
  1802. $slider_model_ setcurrenttime $time
  1803. $self setCurrentTime $time
  1804. }
  1805. #-----------------------------------------------------------------------
  1806. # Editor instproc removeMarker {time node_id}
  1807. #   - deletes the node movement value that is associated with
  1808. #     a timeslider marker
  1809. #-----------------------------------------------------------------------
  1810. Editor instproc removeMarker {time node_id} {
  1811. $self instvar netmodel_
  1812. $netmodel_ removeNodeMovement $node_id $time
  1813. $self renderFrame
  1814. }