core-extra/gui/initgui.tcl

816 lines
26 KiB
Tcl

#
# Copyright 2004-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.
#
# This work was supported in part by Croatian Ministry of Science
# and Technology through the research contract #IP-2003-143.
#
#****h* imunes/initgui.tcl
# NAME
# initgui.tcl
# FUNCTION
# Initialize GUI. Not included when operating in batch mode.
#****
#
# GUI-related global variables
#
#****v* initgui.tcl/global variables
# NAME
# global variables
# FUNCTION
# GUI-related global varibles
#
# * newlink -- helps when creating a new link. If there is no
# link currently created, this value is set to an empty string.
# * selectbox -- the value of the box representing all the selected items
# * selected -- containes the list of node_id's of all selected nodes.
# * newCanvas --
#
# * animatephase -- starting dashoffset. With this value the effect of
# rotating line around selected itme is achived.
# * undolevel -- control variable for undo.
# * redolevel -- control variable for redo.
# * undolog -- control variable for saving all the past configurations.
# * changed -- control variable for indicating that there something changed
# in active configuration.
# * badentry -- control variable indicating that there has been a bad entry
# in the text box.
# * cursorstate -- control variable for animating cursor.
# * clock_seconds -- control variable for animating cursor.
# * oper_mode -- control variable reresenting operating mode, possible
# values are edit and exec.
# * grid -- control variable representing grid distance. All new
# elements on the
# canvas are snaped to grid. Default value is 24.
# * sizex -- X size of the canvas.
# * sizey -- Y size of the canvas.
# * curcanvas -- the value of the current canvas.
# * autorearrange_enabled -- control variable indicating is
# autorearrange enabled.
#
# * defLinkColor -- defines the default link color, default link color is set
# to red.
# * defLinkWidth -- defines the width of the link, default is 2.
# * defEthBandwidth -- defines the ethernet bandwidth, default is set to
# 100000000.
# * defSerBandwidth -- defines the serail link bandwidth, default is 2048000.
# * defSerDelay -- defines the serail link delay, default is 2500.
# * showIfNames -- control variable for showing interface names, default is 1
# * showIfIPaddrs -- control variable for showing interface IPv4 addresses,
# default is 1 (addresses are visible).
# * showIfIPv6addrs -- control variable for showing interface IPv4
# addresses, default is 1 (addresses are visible).
# * showNodeLabels -- control variable for showing node labels, default is 1.
# * showLinkLabels -- control variable for showing link labels, default is 1.
#
#****
set newlink ""
set selectbox ""
set selected ""
newCanvas ""
set animatephase 0
set undolevel 0
set redolevel 0
set undolog(0) ""
set changed 0
set badentry 0
set cursorState 0
set clock_seconds 0
set oper_mode edit
set grid 24
set showGrid 1
set zoom 1.0
set curcanvas [lindex $canvas_list 0]
set autorearrange_enabled 0
set num_canvases $g_prefs(gui_num_canvases)
while { $num_canvases > 1 } { newCanvas ""; incr num_canvases -1 }
# resize Oval/Rectangle, "false" or direction: north/west/east/...
set resizemode false
set thruplotResize false
# dictionary that maps cursor style to resize mode
set cursorToResizemode [dict create top_left_corner lu]
dict set cursorToResizemode bottom_left_corner ld
dict set cursorToResizemode left_side l
dict set cursorToResizemode top_right_corner ru
dict set cursorToResizemode bottom_right_corner rd
dict set cursorToResizemode right_side r
dict set cursorToResizemode top_side u
dict set cursorToResizemode bottom_side d
# dictionary that maps thruplot to color
set thruPlotColor [dict create default blue]
set thruPlotDragStart false
set thruPlotCur null
set curPlotLineColor blue
set curPlotFillColor "#7f9eee"
set curPlotBgColor "#EEEEFF"
# values for locking thruplot Max Height
set thruPlotMaxKBPS 10
set defThruPlotMaxKBPS 10
#
# Initialize a few variables to default values
#
set defLinkColor Red
set defFillColor Gray
set defLinkWidth 2
set defEthBandwidth 0
set defSerBandwidth 2048000
set defSerDelay 2500
set newoval ""
set defOvalColor #CFCFFF
set defOvalLabelFont "Arial 12"
set newrect ""
set defRectColor #C0C0FF
set defRectLabelFont "Arial 12"
set defTextFont "Arial 12"
set defTextFontFamily "Arial"
set defTextFontSize 12
set defTextColor #000000
set showIfNames 0
set showIfIPaddrs 1
set showIfIPv6addrs 1
set showNodeLabels 1
set showLinkLabels 1
set showBkgImage 0
set showAnnotations 1
set g_view_locked 0
set defSelectionColor #FEFFBA
set def_router_model router
set wlanLinkColors "#007000 #000070 #700000 #700070 #707070 #007070 #707000"
set g_twoNodeSelect "" ;# flag for editor.tcl:button1 when selecting two nodes
# assume displaying only 7 other distributed servers cpu usage
array set server_cpuusage {}
set cpu_palettes { black blue red yellow green magenta cyan white}
#
# Window / canvas setup section
#
wm minsize . 640 480
wm geometry . 1016x716-30+30
setGuiTitle ""
wm iconbitmap . @$CORE_DATA_DIR/icons/normal/core-icon.xbm
catch {
set g_core_icon [image create photo -file \
"$CORE_DATA_DIR/icons/normal/core-icon.png"]
wm iconphoto . -default $g_core_icon
}
menu .menubar
. config -menu .menubar -bg white
.menubar add cascade -label File -underline 0 -menu .menubar.file
.menubar add cascade -label Edit -underline 0 -menu .menubar.edit
.menubar add cascade -label Canvas -underline 0 -menu .menubar.canvas
.menubar add cascade -label View -underline 0 -menu .menubar.view
.menubar add cascade -label Tools -underline 0 -menu .menubar.tools
.menubar add cascade -label Widgets -underline 0 -menu .menubar.widgets
.menubar add cascade -label Session -underline 0 -menu .menubar.session
.menubar add cascade -label Help -underline 0 -menu .menubar.help
#
# File
#
menu .menubar.file -tearoff 0
.menubar.file add command -label New -underline 0 \
-accelerator "Ctrl+N" -command { fileNewDialogBox }
bind . <Control-n> "fileNewDialogBox"
.menubar.file add command -label "Open..." -underline 0 \
-accelerator "Ctrl+O" -command { fileOpenDialogBox }
bind . <Control-o> "fileOpenDialogBox"
.menubar.file add command -label "Reload" -underline 0 \
-command { openFile $currentFile }
.menubar.file add command -label Save -underline 0 \
-accelerator "Ctrl+S" -command { fileSaveDialogBox "" }
bind . <Control-s> "fileSaveDialogBox {}"
.menubar.file add command -label "Save As XML..." -underline 8 \
-command { fileSaveDialogBox xml }
.menubar.file add command -label "Save As imn..." -underline 8 \
-command { fileSaveDialogBox imn }
.menubar.file add separator
.menubar.file add command -label "Export Python script..." -command exportPython
.menubar.file add command -label "Execute XML or Python script..." \
-command { execPython false }
.menubar.file add command -label "Execute Python script with options..." \
-command { execPython true }
.menubar.file add separator
.menubar.file add command -label "Open current file in editor..." \
-underline 21 -command {
global currentFile
set ed [get_text_editor false]
set t [get_term_prog false]
if { [catch {eval exec $t "$ed $currentFile" & } err ] } {
puts "Error running editor '$ed' in terminal '$t': $err"
puts "Check the text editor setting under preferences."
}
}
.menubar.file add command -label "Print..." -underline 0 \
-command {
set w .entry1
catch {destroy $w}
toplevel $w
wm title $w "Printing options"
wm iconname $w "Printing options"
label $w.msg -wraplength 5i -justify left -text "Print command:"
pack $w.msg -side top
frame $w.buttons
pack $w.buttons -side bottom -fill x -pady 2m
button $w.buttons.print -text Print -command "printCanvas $w"
button $w.buttons.cancel -text "Cancel" -command "destroy $w"
pack $w.buttons.print $w.buttons.cancel -side left -expand 1
entry $w.e1 -bg white
$w.e1 insert 0 "lpr"
pack $w.e1 -side top -pady 5 -padx 10 -fill x
}
.menubar.file add command -label "Save screenshot..." -command {
global currentFile
set initialfile [file tail $currentFile]
# this chops off the .imn file extension
set ext [file extension $initialfile]
set extidx [expr {[string last $ext $initialfile] - 1}]
if { $ext != "" && $extidx > 0 } {
set initialfile [string range $initialfile 0 $extidx]
}
if { $initialfile == "" } { set initialfile "untitled" }
set fname [tk_getSaveFile -filetypes {{ "PostScript file" {.ps} }} \
-initialfile $initialfile -defaultextension .ps]
if { $fname != "" } {
.c postscript -file $fname
}
}
.menubar.file add separator
set g_mru_index 15 ;# index of first MRU list item
foreach f $g_mrulist {
.menubar.file add command -label "$f" -command "mrufile {$f}"
}
.menubar.file add separator
.menubar.file add command -label Quit -underline 0 -command { exit }
wm protocol . WM_DELETE_WINDOW exit
#
# Edit
#
menu .menubar.edit -tearoff 0
.menubar.edit add command -label "Undo" -underline 0 \
-accelerator "Ctrl+Z" -command undo -state disabled
bind . <Control-z> undo
.menubar.edit add command -label "Redo" -underline 0 \
-accelerator "Ctrl+Y" -command redo -state disabled
bind . <Control-y> redo
.menubar.edit add separator
.menubar.edit add command -label "Cut" -underline 2 \
-accelerator "Ctrl+X" -command cutSelection
bind . <Control-x> cutSelection
.menubar.edit add command -label "Copy" -underline 0 \
-accelerator "Ctrl+C" -command copySelection
bind . <Control-c> copySelection
bind . <Control-Insert> copySelection
.menubar.edit add command -label "Paste" -underline 0 \
-accelerator "Ctrl+V" -command pasteSelection
bind . <Control-v> pasteSelection
bind . <Shift-Insert> copySelection
.menubar.edit add separator
.menubar.edit add command -label "Select all" \
-accelerator "Ctrl+A" -command {
foreach obj [.c find withtag node] {
selectNode .c $obj
}
}
bind . <Control-a> {
foreach obj [.c find withtag node] {
selectNode .c $obj
}
}
.menubar.edit add command -label "Select adjacent" \
-accelerator "Ctrl+J" -command selectAdjacent
bind . <Control-j> selectAdjacent
.menubar.edit add separator
.menubar.edit add command -label "Find..." -underline 0 -accelerator "Ctrl+F" \
-command popupFind
bind . <Control-f> popupFind
.menubar.edit add command -label "Clear marker" -command clearMarker
.menubar.edit add command -label "Preferences..." -command popupPrefs
#
# Canvas
#
menu .menubar.canvas -tearoff 0
.menubar.canvas add command -label "New" -command {
newCanvas ""
switchCanvas last
set changed 1
updateUndoLog
}
.menubar.canvas add command -label "Manage..." -command {manageCanvasPopup 0 0}
.menubar.canvas add command -label "Delete" -command {
if { [llength $canvas_list] == 1 } {
return
}
foreach obj [.c find withtag node] {
selectNode .c $obj
}
deleteSelection
set i [lsearch $canvas_list $curcanvas]
set canvas_list [lreplace $canvas_list $i $i]
set curcanvas [lindex $canvas_list $i]
if { $curcanvas == "" } {
set curcanvas [lindex $canvas_list end]
}
switchCanvas none
set changed 1
updateUndoLog
}
.menubar.canvas add separator
.menubar.canvas add command -label "Size/scale..." -command resizeCanvasPopup
# Boeing
.menubar.canvas add command -label "Wallpaper..." -command wallpaperPopup
# end Boeing
.menubar.canvas add separator
.menubar.canvas add command -label "Previous" -accelerator "PgUp" \
-command { switchCanvas prev }
bind . <Prior> { switchCanvas prev }
.menubar.canvas add command -label "Next" -accelerator "PgDown" \
-command { switchCanvas next }
bind . <Next> { switchCanvas next }
.menubar.canvas add command -label "First" -accelerator "Home" \
-command { switchCanvas first }
bind . <Home> { switchCanvas first }
.menubar.canvas add command -label "Last" -accelerator "End" \
-command { switchCanvas last }
bind . <End> { switchCanvas last }
#
# Tools
#
menu .menubar.tools -tearoff 0
.menubar.tools add checkbutton -label "Auto rearrange all" -underline 0 \
-command { rearrange all }
.menubar.tools add checkbutton -label "Auto rearrange selected" -underline 0 \
-command { rearrange selected }
.menubar.tools add separator
.menubar.tools add command -label "Align to grid" -underline 0 \
-command { align2grid }
.menubar.tools add separator
.menubar.tools add command -label "Traffic..." -command popupTrafficDialog
# Boeing
#
.menubar.tools add command -label "IP addresses..." -underline 0 \
-command { popupAddressConfig }
.menubar.tools add command -label "MAC addresses..." -underline 0 \
-command { popupMacAddressConfig }
.menubar.tools add command -label "Build hosts file..." -underline 0 \
-command { popupBuildHostsFile }
.menubar.tools add command -label "Renumber nodes..." -underline 0 \
-command { popupRenumberNodes }
menu .menubar.tools.experimental
.menubar.tools add cascade -label "Experimental" \
-menu .menubar.tools.experimental
.menubar.tools.experimental add command -label "Plugins..." \
-underline 0 -command "popupPluginsConfig"
.menubar.tools.experimental add command -label "ns2imunes converter..." \
-underline 0 -command {
toplevel .ns2im-dialog
wm transient .ns2im-dialog .
wm title .ns2im-dialog "ns2imunes converter"
set f1 [frame .ns2im-dialog.entry1]
set f2 [frame .ns2im-dialog.buttons]
label $f1.l -text "ns2 file:"
entry $f1.e -width 25 -textvariable ns2srcfile
button $f1.b -text "Browse" -width 8 \
-command {
set srcfile [tk_getOpenFile -parent .ns2im-dialog \
-initialfile $ns2srcfile]
$f1.e delete 0 end
$f1.e insert 0 "$srcfile"
}
button $f2.b1 -text "OK" -command {
ns2im $srcfile
destroy .ns2im-dialog
}
button $f2.b2 -text "Cancel" -command { destroy .ns2im-dialog}
pack $f1.b $f1.e -side right
pack $f1.l -side right -fill x -expand true
pack $f2.b1 -side left -expand true -anchor e
pack $f2.b2 -side left -expand true -anchor w
pack $f1 $f2 -fill x
}
# Widgets
#
init_widget_menu
# end Boeing
#
# View
#
menu .menubar.view -tearoff 1
menu .menubar.view.show -tearoff 1
.menubar.view add cascade -label "Show" -menu .menubar.view.show
.menubar.view.show add command -label "All" -underline 5 -command {
set showIfNames 1
set showIfIPaddrs 1
set showIfIPv6addrs 1
set showNodeLabels 1
set showLinkLabels 1
redrawAllLinks
foreach object [.c find withtag linklabel] {
.c itemconfigure $object -state normal
}
}
.menubar.view.show add command -label "None" -underline 6 -command {
set showIfNames 0
set showIfIPaddrs 0
set showIfIPv6addrs 0
set showNodeLabels 0
set showLinkLabels 0
redrawAllLinks
foreach object [.c find withtag linklabel] {
.c itemconfigure $object -state hidden
}
}
.menubar.view.show add separator
.menubar.view.show add checkbutton -label "Interface Names" \
-underline 5 -variable showIfNames \
-command { redrawAllLinks }
.menubar.view.show add checkbutton -label "IPv4 Addresses " \
-underline 8 -variable showIfIPaddrs \
-command { redrawAllLinks }
.menubar.view.show add checkbutton -label "IPv6 Addresses " \
-underline 8 -variable showIfIPv6addrs \
-command { redrawAllLinks }
.menubar.view.show add checkbutton -label "Node Labels" \
-underline 5 -variable showNodeLabels -command {
foreach object [.c find withtag nodelabel] {
if { $showNodeLabels } {
.c itemconfigure $object -state normal
} else {
.c itemconfigure $object -state hidden
}
}
}
.menubar.view.show add checkbutton -label "Link Labels" \
-underline 5 -variable showLinkLabels -command {
foreach object [.c find withtag linklabel] {
if { $showLinkLabels } {
.c itemconfigure $object -state normal
} else {
.c itemconfigure $object -state hidden
}
}
}
# .menubar.view.show add checkbutton -label "Background Image" \
# -underline 5 -variable showBkgImage \
# -command { redrawAll }
.menubar.view.show add checkbutton -label "Annotations" \
-underline 5 -variable showAnnotations -command redrawAll
.menubar.view.show add checkbutton -label "Grid" \
-underline 5 -variable showGrid -command redrawAll
.menubar.view.show add checkbutton -label "API Messages" \
-underline 5 -variable showAPI
.menubar.view add command -label "Show hidden nodes" \
-command {
global node_list
foreach node $node_list { setNodeHidden $node 0 }
redrawAll
}
.menubar.view add checkbutton -label "Locked" -variable g_view_locked
.menubar.view add command -label "3D GUI..." -command {
global g_prefs
set gui ""
set guipref ""
if { [info exists g_prefs(gui_3d_path)] } {
set guipref $g_prefs(gui_3d_path)
set gui [auto_execok $guipref]
}
if { $gui == "" } {
set msg "The 3D GUI command was not valid ('$guipref').\n"
set msg "$msg Make sure that SDT3D is installed and that an appropriate"
set msg "$msg launch script is configured under preferences."
tk_messageBox -type ok -icon warning -message $msg -title "Error"
} else {
if { [catch { exec $gui & }] } {
puts "Error with 3D GUI command '$gui'."
}
statline "3D GUI command executed: $gui"
}
setSessionOption "enablesdt" 1 1
}
.menubar.view add separator
.menubar.view add command -label "Zoom In" -accelerator "+" \
-command "zoom up"
bind . "+" "zoom up"
.menubar.view add command -label "Zoom Out" -accelerator "-" \
-command "zoom down"
bind . "-" "zoom down"
#
# Session
#
menu .menubar.session -tearoff 1
.menubar.session add command -label "Stop" -underline 1 \
-command "setOperMode edit"
.menubar.session add command -label "Change sessions..." \
-underline 0 -command "requestSessions"
.menubar.session add separator
.menubar.session add command -label "Node types..." -underline 0 \
-command "popupNodesConfig"
.menubar.session add command -label "Comments..." -underline 0 \
-command "popupCommentsConfig"
.menubar.session add command -label "Hooks..." -underline 0 \
-command "popupHooksConfig"
.menubar.session add command -label "Reset node positions" -underline 0 \
-command "resetAllNodeCoords reset"
.menubar.session add command -label "Emulation servers..." \
-underline 0 -command "configRemoteServers"
.menubar.session add command -label "Options..." \
-underline 0 -command "sendConfRequestMessage -1 0 session 0x1 -1 \"\""
#
# Help
#
menu .menubar.help -tearoff 0
.menubar.help add command -label "CORE GitHub (www)" -command \
"_launchBrowser https://github.com/coreemu/core"
.menubar.help add command -label "CORE Documentation (www)" -command \
"_launchBrowser https://coreemu.github.io/core/"
.menubar.help add command -label "Mailing list (www)" -command \
"_launchBrowser https://publists.nrl.navy.mil/mailman/listinfo/core-users"
.menubar.help add command -label "About" -command popupAbout
#
# Left-side toolbar
#
frame .left
pack .left -side left -fill y
# Boeing: create images now, buttons in setOperMode
#foreach b {select delete link hub lanswitch router host pc rj45} {
foreach b {select } {
set imgf "$CORE_DATA_DIR/icons/tiny/$b.gif"
set image [image create photo -file $imgf]
radiobutton .left.$b -indicatoron 0 \
-variable activetool -value $b -selectcolor $defSelectionColor \
-width 32 -height 32 -image $image \
-command "popupMenuChoose \"\" $b $imgf"
pack .left.$b -side top
leftToolTip $b .left
}
foreach b {hub lanswitch router host pc rj45 \
tunnel wlan oval text antenna } {
set $b [image create photo -file "$CORE_DATA_DIR/icons/normal/$b.gif"]
createScaledImages $b
}
set activetool_prev select
set markersize 5
set markercolor black
# end Boeing changes
set pseudo [image create photo]
set text [image create photo]
. configure -background #808080
frame .grid
frame .hframe
frame .vframe
set c [canvas .c -bd 0 -relief sunken -highlightthickness 0\
-background gray \
-xscrollcommand ".hframe.scroll set" \
-yscrollcommand ".vframe.scroll set"]
canvas .hframe.t -width 300 -height 18 -bd 0 -highlightthickness 0 \
-background gray \
-xscrollcommand ".hframe.ts set"
bind .hframe.t <1> {
set canvas [lindex [.hframe.t gettags current] 1]
if { $canvas != "" && $canvas != $curcanvas } {
set curcanvas $canvas
switchCanvas none
}
}
bind .hframe.t <Double-1> {
set canvas [lindex [.hframe.t gettags current] 1]
if { $canvas != "" } {
if { $canvas != $curcanvas } {
set curcanvas $canvas
switchCanvas none
} else {
manageCanvasPopup %X %Y
}
}
}
scrollbar .hframe.scroll -orient horiz -command "$c xview" \
-bd 1 -width 14
scrollbar .vframe.scroll -command "$c yview" \
-bd 1 -width 14
scrollbar .hframe.ts -orient horiz -command ".hframe.t xview" \
-bd 1 -width 14
pack .hframe.ts .hframe.t -side left -padx 0 -pady 0
pack .hframe.scroll -side left -padx 0 -pady 0 -fill both -expand true
pack .vframe.scroll -side top -padx 0 -pady 0 -fill both -expand true
pack .grid -expand yes -fill both -padx 1 -pady 1
grid rowconfig .grid 0 -weight 1 -minsize 0
grid columnconfig .grid 0 -weight 1 -minsize 0
grid .c -in .grid -row 0 -column 0 \
-rowspan 1 -columnspan 1 -sticky news
grid .vframe -in .grid -row 0 -column 1 \
-rowspan 1 -columnspan 1 -sticky news
grid .hframe -in .grid -row 1 -column 0 \
-rowspan 1 -columnspan 1 -sticky news
frame .bottom
pack .bottom -side bottom -fill x
label .bottom.textbox -relief sunken -bd 1 -anchor w -width 999
label .bottom.zoom -relief sunken -bd 1 -anchor w -width 10
label .bottom.cpu_load -relief sunken -bd 1 -anchor w -width 9
label .bottom.mbuf -relief sunken -bd 1 -anchor w -width 9
label .bottom.indicators -relief sunken -bd 1 -anchor w -width 5
pack .bottom.indicators .bottom.mbuf .bottom.cpu_load \
.bottom.zoom .bottom.textbox -side right -padx 0 -fill both
#
# Event bindings and procedures for main canvas:
#
$c bind node <Any-Enter> "+nodeEnter $c"
$c bind nodelabel <Any-Enter> "nodeEnter $c"
$c bind link <Any-Enter> "linkEnter $c"
$c bind linklabel <Any-Enter> "linkEnter $c"
$c bind node <Any-Leave> "anyLeave $c"
$c bind nodelabel <Any-Leave> "anyLeave $c"
$c bind link <Any-Leave> "anyLeave $c"
$c bind linklabel <Any-Leave> "anyLeave $c"
$c bind node <Double-1> "popupConfigDialog $c"
$c bind nodelabel <Double-1> "popupConfigDialog $c"
$c bind grid <Double-1> "double1onGrid $c %x %y"
$c bind link <Double-1> "popupConfigDialog $c"
$c bind linklabel <Double-1> "popupConfigDialog $c"
$c bind node <3> "button3node $c %x %y \"\""
$c bind oval <Double-1> "popupConfigDialog $c"
$c bind rectangle <Double-1> "popupConfigDialog $c"
$c bind text <Double-1> "popupConfigDialog $c"
$c bind text <KeyPress> "textInsert $c %A"
$c bind text <Return> "textInsert $c \\n"
$c bind node <3> "button3node $c %x %y \"\""
$c bind nodelabel <3> "button3node $c %x %y \"\""
$c bind link <3> "button3link $c %x %y"
$c bind linklabel <3> "button3link $c %x %y"
$c bind oval <3> "button3annotation oval $c %x %y"
$c bind rectangle <3> "button3annotation rectangle $c %x %y"
$c bind text <3> "button3annotation text $c %x %y"
$c bind selectmark <Any-Enter> "selectmarkEnter $c %x %y"
$c bind selectmark <Any-Leave> "selectmarkLeave $c %x %y"
bind $c <1> "button1 $c %x %y none"
bind $c <Control-Button-1> "button1 $c %x %y ctrl"
bind $c <B1-Motion> "button1-motion $c %x %y"
bind $c <B1-ButtonRelease> "button1-release $c %x %y"
bind . <Delete> deleteSelection
bind .menubar <Destroy> {setOperMode edit}
# Scrolling and panning support
bind $c <2> "$c scan mark %x %y"
bind $c <B2-Motion> "$c scan dragto %x %y 1"
bind $c <4> "$c yview scroll -1 units"
bind $c <5> "$c yview scroll 1 units"
bind . <Right> ".c xview scroll 1 units"
bind . <Left> ".c xview scroll -1 units"
bind . <Down> ".c yview scroll 1 units"
bind . <Up> ".c yview scroll -1 units"
# Escape to Select mode
bind . <Key-Escape> "set activetool select"
$c bind node <Shift-Button-3> "button3node $c %x %y shift"
$c bind node <Control-Button-3> "button3node $c %x %y ctrl"
$c bind marker <3> "button3annotation marker $c %x %y"
bind .bottom.zoom <1> "zoom up"
bind .bottom.zoom <3> "zoom down"
bind .bottom.indicators <1> "popupExceptions"
#
# Popup-menu hierarchy
#
menu .button3menu -tearoff 0
menu .button3menu.connect -tearoff 0
menu .button3menu.assign -tearoff 0
menu .button3menu.moveto -tearoff 0
menu .button3menu.shell -tearoff 0
menu .button3menu.services -tearoff 0
menu .button3menu.ethereal -tearoff 0
menu .button3menu.tcpdump -tearoff 0
menu .button3menu.tshark -tearoff 0
menu .button3menu.wireshark -tearoff 0
menu .button3menu.tunnel -tearoff 0
menu .button3menu.color -tearoff 0
#
# Restore window position
#
if { ( [info exists g_prefs(gui_save_pos)] && $g_prefs(gui_save_pos) ) || \
( [info exists g_prefs(gui_save_size)] && $g_prefs(gui_save_size) ) } {
set newgeo ""
if { [info exists g_prefs(gui_save_size)] && $g_prefs(gui_save_size) && \
[info exists g_prefs(gui_window_size)] } {
set newgeo "$g_prefs(gui_window_size)"
}
if { [info exists g_prefs(gui_save_pos)] && $g_prefs(gui_save_pos) && \
[info exists g_prefs(gui_window_pos] } {
set newgeo "${newgeo}-$g_prefs(gui_window_pos)"
}
if { $newgeo != "" } { wm geometry . $newgeo }
}
#
# Invisible pseudo links
#
set invisible -1
bind . <Control-i> {
global invisible
set invisible [expr $invisible * -1]
redrawAll
}
#
# Don't show hidden files by default under Linux
#
catch { tk_getOpenFile foo bar }
set ::tk::dialog::file::showHiddenVar 0
set ::tk::dialog::file::showHiddenBtn 1
#
# Done with initialization, draw an empty canvas
#
switchCanvas first
focus -force .
#
# Fire up the animation loop - used basically for selectbox
#
animate