# # Copyright 2005-2008 University of Zagreb, Croatia. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. # # #****h* imunes/canvas.tcl # NAME # canvas.tcl -- file used for manipultaion with canvases in IMUNES # FUNCTION # This module is used to define all the actions used for configuring # canvases in IMUNES. On each canvas a part of the simulation is presented # If there is no additional canvas defined, simulation is presented on the # defalut canvas. # #**** #****f* canvas.tcl/removeCanvas # NAME # removeCanvas -- remove canvas # SYNOPSIS # removeCanvas $canvas_id # FUNCTION # Removes the canvas from simulation. This function does not change the # configuration of the nodes, i.e. nodes attached to the removed canvas # remain attached to the same non existing canvas. # INPUTS # * canvas_id -- canvas id #**** proc removeCanvas { canvas } { global canvas_list $canvas set i [lsearch $canvas_list $canvas] set canvas_list [lreplace $canvas_list $i $i] set $canvas {} } #****f* canvas.tcl/newCanvas # NAME # newCanvas -- craete new canvas # SYNOPSIS # set canvas_id [newCanvas $canvas_name] # FUNCTION # Creates new canvas. Returns the canvas_id of the new canvas. # If the canvas_name parameter is empty, the name of the new canvas # is set to CanvasN, where N represents the canvas_id of the new canvas. # INPUTS # * canvas_name -- canvas name # RESULT # * canvas_id -- canvas id #**** proc newCanvas { name } { global canvas_list set canvas [newObjectId canvas] global $canvas lappend canvas_list $canvas set $canvas {} if { $name != "" } { setCanvasName $canvas $name } else { setCanvasName $canvas Canvas[string range $canvas 1 end] } return $canvas } proc setCanvasSize { canvas x y } { global $canvas set i [lsearch [set $canvas] "size *"] if { $i >= 0 } { set $canvas [lreplace [set $canvas] $i $i "size {$x $y}"] } else { set $canvas [linsert [set $canvas] 1 "size {$x $y}"] } } proc getCanvasSize { canvas } { global $canvas g_prefs set entry [lrange [lsearch -inline [set $canvas] "size *"] 1 end] set size [string trim $entry \{\}] if { $size == "" } { return "$g_prefs(gui_canvas_x) $g_prefs(gui_canvas_y)" } else { return $size } } #****f* canvas.tcl/getCanvasName # NAME # getCanvasName -- get canvas name # SYNOPSIS # set canvas_name [getCanvasName $canvas_id] # FUNCTION # Returns the name of the canvas. # INPUTS # * canvas_id -- canvas id # RESULT # * canvas_name -- canvas name #**** proc getCanvasName { canvas } { global $canvas set entry [lrange [lsearch -inline [set $canvas] "name *"] 1 end] return [string trim $entry \{\}] } #****f* canvas.tcl/setCanvasName # NAME # setCanvasName -- set canvas name # SYNOPSIS # setCanvasName $canvas_id $canvas_name # FUNCTION # Sets the name of the canvas. # INPUTS # * canvas_id -- canvas id # * canvas_name -- canvas name #**** proc setCanvasName { canvas name } { global $canvas set i [lsearch [set $canvas] "name *"] if { $i >= 0 } { set $canvas [lreplace [set $canvas] $i $i "name {$name}"] } else { set $canvas [linsert [set $canvas] 1 "name {$name}"] } } # Boeing: canvas wallpaper support proc getCanvasWallpaper { canvas } { global $canvas set entry [lrange [lsearch -inline [set $canvas] "wallpaper *"] 1 end] set entry2 [lrange [lsearch -inline \ [set $canvas] "wallpaper-style *"] 1 end] return [list [string trim $entry \{\}] [string trim $entry2 \{\}]] } proc setCanvasWallpaper { canvas file style} { global $canvas set i [lsearch [set $canvas] "wallpaper *"] if { $i >= 0 } { set $canvas [lreplace [set $canvas] $i $i "wallpaper {$file}"] } else { set $canvas [linsert [set $canvas] 1 "wallpaper {$file}"] } set i [lsearch [set $canvas] "wallpaper-style *"] if { $i >= 0 } { set $canvas [lreplace [set $canvas] $i $i "wallpaper-style {$style}"] } else { set $canvas [linsert [set $canvas] 1 "wallpaper-style {$style}"] } } # Boeing: manage canvases proc manageCanvasPopup { x y } { global curcanvas CORE_DATA_DIR set w .entry1 catch {destroy $w} toplevel $w -takefocus 1 if { $x == 0 && $y == 0 } { set screen [wm maxsize .] set x [expr {[lindex $screen 0] / 4}] set y [expr {[lindex $screen 1] / 4}] } else { set x [expr {$x + 10}] set y [expr {$y - 250}] } wm geometry $w +$x+$y wm title $w "Manage Canvases" wm iconname $w "Manage Canvases" ttk::frame $w.name ttk::label $w.name.lab -text "Canvas name:" ttk::entry $w.name.ent $w.name.ent insert 0 [getCanvasName $curcanvas] pack $w.name.lab $w.name.ent -side left -fill x pack $w.name -side top -padx 4 -pady 4 global canvas_list ttk::frame $w.canv listbox $w.canv.cl -bg white -yscrollcommand "$w.canv.scroll set" ttk::scrollbar $w.canv.scroll -orient vertical -command "$w.canv.cl yview" foreach canvas $canvas_list { $w.canv.cl insert end [getCanvasName $canvas] if { $canvas == $curcanvas } { set curindex [expr {[$w.canv.cl size] - 1}] } } pack $w.canv.cl -side left -pady 4 -fill both -expand true pack $w.canv.scroll -side left -fill y pack $w.canv -side top -fill both -expand true -padx 4 -pady 4 $w.canv.cl selection set $curindex $w.canv.cl see $curindex bind $w.canv.cl "manageCanvasSwitch $w" ttk::frame $w.buttons2 foreach b {up down} { set fn "$CORE_DATA_DIR/icons/tiny/arrow.${b}.gif" set img$b [image create photo -file $fn] ttk::button $w.buttons2.$b -image [set img${b}] \ -command "manageCanvasUpDown $w $b" } pack $w.buttons2.up $w.buttons2.down -side left -expand 1 pack $w.buttons2 -side top -fill x -pady 2 # hidden list of canvas numbers ttk::label $w.list -text $canvas_list ttk::frame $w.buttons ttk::button $w.buttons.apply -text "Apply" -command "manageCanvasApply $w" ttk::button $w.buttons.cancel -text "Cancel" -command "destroy $w" pack $w.buttons.apply $w.buttons.cancel -side left -expand 1 pack $w.buttons -side bottom -fill x -pady 2m bind $w "destroy $w" bind $w "manageCanvasApply $w" } # Boeing: manage canvases helper # called when a canvas in the list is double-clicked proc manageCanvasSwitch { w } { global canvas_list curcanvas set i [$w.canv.cl curselection] if {$i == ""} { return} set i [lindex $i 0] set item [$w.canv.cl get $i] foreach canvas $canvas_list { if {[getCanvasName $canvas] == $item} { $w.name.ent delete 0 end $w.name.ent insert 0 $item set curcanvas $canvas switchCanvas none return } } } # manage canvases helper # handle the move up/down buttons for the canvas selection window proc manageCanvasUpDown { w dir } { global canvas_list # get the currently selected item set i [$w.canv.cl curselection] if {$i == ""} { return} set i [lindex $i 0] set item [$w.canv.cl get $i] if {$dir == "down" } { set max [expr {[llength $canvas_list] - 1}] if {$i >= $max } { return } set newi [expr {$i + 1}] } else { if {$i <= 0} { return } set newi [expr {$i - 1}] } # change the position $w.canv.cl delete $i $w.canv.cl insert $newi $item $w.canv.cl selection set $newi $w.canv.cl see $newi # update hidden list of canvas numbers set new_canvas_list [$w.list cget -text] set item [lindex $new_canvas_list $i] set new_canvas_list [lreplace $new_canvas_list $i $i] set new_canvas_list [linsert $new_canvas_list $newi $item] $w.list configure -text $new_canvas_list } # manage canvases helper # called when apply button is pressed - changes the order of the canvases proc manageCanvasApply { w } { global canvas_list curcanvas changed # we calculated this list earlier, making life easier here set new_canvas_list [$w.list cget -text] if {$canvas_list != $new_canvas_list} { set canvas_list $new_canvas_list } set newname [$w.name.ent get] destroy $w if { $newname != [getCanvasName $curcanvas] } { set changed 1 } setCanvasName $curcanvas $newname switchCanvas none updateUndoLog } proc setCanvasScale { canvas scale } { global $canvas set i [lsearch [set $canvas] "scale *"] if { $i >= 0 } { set $canvas [lreplace [set $canvas] $i $i "scale $scale"] } else { set $canvas [linsert [set $canvas] 1 "scale $scale"] } } proc getCanvasScale { canvas } { global $canvas g_prefs set entry [lrange [lsearch -inline [set $canvas] "scale *"] 1 end] set scale [string trim $entry \{\}] if { $scale == "" } { if { ![info exists g_prefs(gui_canvas_scale)] } { return 150.0 } return "$g_prefs(gui_canvas_scale)" } else { return $scale } } proc setCanvasRefPoint { canvas refpt } { global $canvas set i [lsearch [set $canvas] "refpt *"] if { $i >= 0 } { set $canvas [lreplace [set $canvas] $i $i "refpt {$refpt}"] } else { set $canvas [linsert [set $canvas] 1 "refpt {$refpt}"] } } proc getCanvasRefPoint { canvas } { global $canvas g_prefs DEFAULT_REFPT set entry [lrange [lsearch -inline [set $canvas] "refpt *"] 1 end] set altitude [string trim $entry \{\}] if { $altitude == "" } { if { ![info exists g_prefs(gui_canvas_refpt)] } { return $DEFAULT_REFPT } return "$g_prefs(gui_canvas_refpt)" } else { return $altitude } } # from http://wiki.tcl.tk/1415 (MAK) proc canvasSee { hWnd items } { set box [eval $hWnd bbox $items] if {$box == ""} { return } if {[string match {} [$hWnd cget -scrollregion]] } { # People really should set -scrollregion you know... foreach {x y x1 y1} $box break set x [expr round(2.5 * ($x1+$x) / [winfo width $hWnd])] set y [expr round(2.5 * ($y1+$y) / [winfo height $hWnd])] $hWnd xview moveto 0 $hWnd yview moveto 0 $hWnd xview scroll $x units $hWnd yview scroll $y units } else { # If -scrollregion is set properly, use this foreach { x y x1 y1 } $box break foreach { top btm } [$hWnd yview] break foreach { left right } [$hWnd xview] break foreach { p q xmax ymax } [$hWnd cget -scrollregion] break set xpos [expr (($x1+$x) / 2.0) / $xmax - ($right-$left) / 2.0] set ypos [expr (($y1+$y) / 2.0) / $ymax - ($btm-$top) / 2.0] $hWnd xview moveto $xpos $hWnd yview moveto $ypos } }