proc drawNode { node } {
global showNodeLabels
global router pc host lanswitch frswitch rj45 hub pseudo
+ global curcanvas
set type [nodeType $node]
set coords [getNodeCoords $node]
set pnode [getNodeName $node]
set pcanvas [getNodeCanvas $pnode]
set ifc [ifcByPeer $pnode [getNodeMirror $node]]
- set label [.c create text $x $y -fill blue \
- -text "$ifc@[getNodeName $pnode]\r([getCanvasName $pcanvas])" \
- -tags "nodelabel $node" -justify center]
+ if { $pcanvas != $curcanvas } {
+ set label [.c create text $x $y -fill blue \
+ -text "[getNodeName $pnode]:$ifc\r@[getCanvasName $pcanvas]" \
+ -tags "nodelabel $node" -justify center]
+ } else {
+ set label [.c create text $x $y -fill blue \
+ -text "[getNodeName $pnode]:$ifc" \
+ -tags "nodelabel $node" -justify center]
+ }
}
if { $showNodeLabels == 0} {
.c itemconfigure $label -state hidden
.c coords $limage1 $x1 $y1 $x2 $y2
.c coords $limage2 $x1 $y1 $x2 $y2
- set lx [expr ($x1 + $x2) / 2]
- set ly [expr ($y1 + $y2) / 2]
+ set lx [expr 0.5 * ($x1 + $x2)]
+ set ly [expr 0.5 * ($y1 + $y2)]
.c coords "linklabel && $link" $lx $ly
set n [expr sqrt (($x1 - $x2) * ($x1 - $x2) + \
- ($y1 - $y2) * ($y1 - $y2)) / 64]
+ ($y1 - $y2) * ($y1 - $y2)) * 0.015]
if { $n < 1 } { set n 1 }
calcDxDy $lnode1
}
+proc splitGUILink { link } {
+ global changed
+
+ set peer_nodes [linkPeers $link]
+ set new_nodes [splitLink $link pseudo]
+ set orig_node1 [lindex $peer_nodes 0]
+ set orig_node2 [lindex $peer_nodes 1]
+ set new_node1 [lindex $new_nodes 0]
+ set new_node2 [lindex $new_nodes 1]
+ set new_link1 [linkByPeers $orig_node1 $new_node1]
+ set new_link2 [linkByPeers $orig_node2 $new_node2]
+ setLinkMirror $new_link1 $new_link2
+ setLinkMirror $new_link2 $new_link1
+ setNodeMirror $new_node1 $new_node2
+ setNodeMirror $new_node2 $new_node1
+ setNodeName $new_node1 $orig_node2
+ setNodeName $new_node2 $orig_node1
+
+ set x1 [lindex [getNodeCoords $orig_node1] 0]
+ set y1 [lindex [getNodeCoords $orig_node1] 1]
+ set x2 [lindex [getNodeCoords $orig_node2] 0]
+ set y2 [lindex [getNodeCoords $orig_node2] 1]
+
+ setNodeCoords $new_node1 \
+ "[expr $x1 + 0.4 * ($x2 - $x1)] [expr $y1 + 0.4 * ($y2 - $y1)]"
+ setNodeCoords $new_node2 \
+ "[expr $x1 + 0.6 * ($x2 - $x1)] [expr $y1 + 0.6 * ($y2 - $y1)]"
+ setNodeLabelCoords $new_node1 [getNodeCoords $new_node1]
+ setNodeLabelCoords $new_node2 [getNodeCoords $new_node2]
+
+ set changed 1
+ updateUndoLog
+ redrawAll
+}
+
+
proc selectNode { c obj } {
set node [lindex [$c gettags $obj] 1]
$c addtag selected withtag "node && $node"
-state disabled
}
+ #
+ # Split link
+ #
+ if { $oper_mode != "exec" && [getLinkMirror $link] == "" } {
+ .button3menu add command -label "Split" \
+ -command "splitGUILink $link"
+ } else {
+ .button3menu add command -label "Split" \
+ -state disabled
+ }
+
set x [winfo pointerx .]
set y [winfo pointery .]
tk_popup .button3menu $x $y
return
}
}
+ set mirror_node [getNodeMirror $node]
if { [$c gettags "node && $node && selected"] == "" } {
$c dtag node selected
# Move to another canvas
#
.button3menu.moveto delete 0 end
- if { [nodeType $node] == "pseudo" } {
+ if { $oper_mode == "exec" || [nodeType $node] == "pseudo" } {
.button3menu add cascade -label "Move to" \
-menu .button3menu.moveto -state disabled
} else {
}
}
+ #
+ # Merge two pseudo nodes / links
+ #
+ if { [nodeType $node] == "pseudo" && \
+ [getNodeCanvas $mirror_node] == $curcanvas } {
+ .button3menu add command -label "Merge" \
+ -command "mergeGUINode $node"
+ } else {
+ .button3menu add command -label "Merge" \
+ -state disabled
+ }
+
#
# Delete selection
#
set p_fx [expr 1000.0 * $dx / ($d2 * $d + 100)]
set p_fy [expr 1000.0 * $dy / ($d2 * $d + 100)]
if {[linkByPeers $node $other] != ""} {
- set p_fx [expr $p_fx - $dx * $d2 / 2000000000.0]
- set p_fy [expr $p_fy - $dy * $d2 / 2000000000.0]
+ set p_fx [expr $p_fx - $dx * $d2 * .0000000005]
+ set p_fy [expr $p_fy - $dy * $d2 * .0000000005]
}
set fx_t($node) [expr $fx_t($node) + $p_fx]
set fy_t($node) [expr $fy_t($node) + $p_fy]
foreach link $link_list {
set nodes [linkPeers $link]
if { [getNodeCanvas [lindex $nodes 0]] != $curcanvas ||
- [getNodeCanvas [lindex $nodes 1]] != $curcanvas } {
+ [getNodeCanvas [lindex $nodes 1]] != $curcanvas ||
+ [getLinkMirror $link] != "" } {
continue
}
set peers [linkPeers $link]
set $b [image create photo -file $ROOTDIR/$LIBDIR/icons/normal/$b.gif]
}
set pseudo [image create photo]
+set text [image create photo]
+. configure -background #808080
frame .grid
-set c [canvas .c -relief sunken -bd 1 \
+frame .hframe
+frame .vframe
+set c [canvas .c -bd 0 -relief sunken -highlightthickness 0\
+ -background gray \
-scrollregion "-32 -32 [expr $sizex + 32] [expr $sizey + 32]" \
- -xscrollcommand ".hscroll set" -yscrollcommand ".vscroll set"]
-scrollbar .hscroll -orient horiz -command "$c xview"
-scrollbar .vscroll -command "$c yview"
-pack .grid -expand yes -fill both -padx 0 -pady 0
+ -xscrollcommand ".hframe.scroll set" \
+ -yscrollcommand ".vframe.scroll set"]
+canvas .hframe.t -width 250 -height 18 -bd 0 -highlightthickness 0 \
+ -background gray
+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 "" \
+ -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 -padx 1 -in .grid -pady 0 -padx 0 -row 0 -column 0 \
+grid .c -in .grid -row 0 -column 0 \
-rowspan 1 -columnspan 1 -sticky news
-grid .vscroll -in .grid -pady 0 -padx 0 -row 0 -column 1 \
+grid .vframe -in .grid -row 0 -column 1 \
-rowspan 1 -columnspan 1 -sticky news
-grid .hscroll -in .grid -pady 0 -padx 0 -row 1 -column 0 \
+grid .hframe -in .grid -row 1 -column 0 \
-rowspan 1 -columnspan 1 -sticky news
frame .bottom
label .bottom.mbuf -relief sunken -bd 1 -font helvetica -anchor w -width 15
label .bottom.oper_mode -relief sunken -bd 1 -font helvetica -anchor w -width 9
pack .bottom.oper_mode .bottom.mbuf .bottom.cpu_load .bottom.textbox \
- -side right -padx 1 -fill both
+ -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 link <Double-1> "popupConfigDialog $c"
$c bind linklabel <Double-1> "popupConfigDialog $c"
$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"
bind $c <1> "button1 $c %x %y none"
return [lindex $entry 1]
}
+
proc getLinkDelayString { link } {
global $link
return $delstr
}
+
proc setLinkDelay { link value } {
global $link
setNodeLabelCoords $new_node1 [getNodeCoords $orig_node2]
setNodeLabelCoords $new_node2 [getNodeCoords $orig_node1]
}
- lappend $new_node1 "interface-peer {0 $orig_node2}"
- lappend $new_node2 "interface-peer {0 $orig_node1}"
-
- # XXX TODO: copy properties of orig to new links
+ lappend $new_node1 "interface-peer {0 $orig_node1}"
+ lappend $new_node2 "interface-peer {0 $orig_node2}"
+
+ setLinkBandwidth $new_link1 [getLinkBandwidth $link]
+ setLinkBandwidth $new_link2 [getLinkBandwidth $link]
+ setLinkDelay $new_link1 [getLinkDelay $link]
+ setLinkDelay $new_link2 [getLinkDelay $link]
+ setLinkBER $new_link1 [getLinkBER $link]
+ setLinkBER $new_link2 [getLinkBER $link]
+ setLinkDup $new_link1 [getLinkDup $link]
+ setLinkDup $new_link2 [getLinkDup $link]
set i [lsearch -exact $link_list $link]
set link_list [lreplace $link_list $i $i]
return "$new_node1 $new_node2"
}
+
+
+proc mergeLink { link } {
+
+ set mirror_link [getLinkMirror $link]
+ if { $mirror_link == "" } {
+ puts "XXX mergeLink called for non-pseudo link!!!"
+ return
+ }
+}