Index: art/syntax/bubble-generator.tcl ================================================================== --- art/syntax/bubble-generator.tcl +++ art/syntax/bubble-generator.tcl @@ -39,10 +39,25 @@ set RADIUS 9 ;# default turn radius set HSEP 17 ;# horizontal separation set VSEP 9 ;# vertical separation set DPI 80 ;# dots per inch +# Move all widgets with $tag and/or $tag-txt +# +proc move_glyphs {tag dx dy} { + .c move $tag $dx $dy + .c move $tag-txt $dx $dy +} + +# Change all widgets tagged with $old to $new or with $old-txt to $new-txt +# +proc retag {old new} { + .c addtag $new withtag $old + .c addtag $new-txt withtag $old-txt + .c dtag $old + .c dtag $old-txt +} # Draw a right-hand turn around. Approximately a ")" # proc draw_right_turnback {tag x y0 y1} { global RADIUS @@ -128,11 +143,11 @@ set istoken 0 } else { set font $::font1 set istoken 1 } - set id1 [.c create text 0 0 -anchor c -text $txt -font $font -tags $tag] + set id1 [.c create text 0 0 -anchor c -text $txt -font $font -tags $tag-txt] foreach {x0 y0 x1 y1} [.c bbox $id1] break set h [expr {$y1-$y0+2}] set rad [expr {($h+1)/2}] set top [expr {$y0-2}] set btm [expr {$y1}] @@ -142,27 +157,25 @@ set right [expr {$x1-$fudge}] if {$left>$right} { set left [expr {($x0+$x1)/2}] set right $left } - set tag2 x$tagcnt-box - set tags [list $tag $tag2] if {$istoken} { .c create arc [expr {$left-$rad}] $top [expr {$left+$rad}] $btm \ - -width 2 -start 90 -extent 180 -style arc -tags $tags + -width 2 -start 90 -extent 180 -style arc -tags $tag .c create arc [expr {$right-$rad}] $top [expr {$right+$rad}] $btm \ - -width 2 -start -90 -extent 180 -style arc -tags $tags + -width 2 -start -90 -extent 180 -style arc -tags $tag if {$left<$right} { - .c create line $left $top $right $top -width 2 -tags $tags - .c create line $left $btm $right $btm -width 2 -tags $tags + .c create line $left $top $right $top -width 2 -tags $tag + .c create line $left $btm $right $btm -width 2 -tags $tag } } else { - .c create rect $left $top $right $btm -width 2 -tags $tags + .c create rect $left $top $right $btm -width 2 -tags $tag } - foreach {x0 y0 x1 y1} [.c bbox $tag2] break + foreach {x0 y0 x1 y1} [.c bbox $tag] break set width [expr {$x1-$x0}] - .c move $tag [expr {-$x0}] 0 + move_glyphs $tag [expr {-$x0}] 0 # Entry is always 0 0 # Return: TAG EXIT_X EXIT_Y # return [list $tag $width 0] @@ -182,20 +195,19 @@ foreach term $lx { set m [draw_diagram $term] foreach {t texx texy} $m break if {$exx>0} { set xn [expr {$exx+$sep}] - .c move $t $xn $exy + move_glyphs $t $xn $exy .c create line [expr {$exx-1}] $exy $xn $exy \ -tags $tag -width 2 -arrow last set exx [expr {$xn+$texx}] } else { set exx $texx } set exy $texy - .c addtag $tag withtag $t - .c dtag $t $t + retag $t $tag } if {$exx==0} { set exx [expr {$sep*2}] .c create line 0 0 $sep 0 -width 2 -tags $tag -arrow last .c create line $sep 0 $exx 0 -width 2 -tags $tag @@ -224,19 +236,18 @@ foreach {t texx texy} $m break foreach {tx0 ty0 tx1 ty1} [.c bbox $t] break set w [expr {$tx1-$tx0}] if {$exx>0} { set xn [expr {$exx+$sep}] - .c move $t $xn 0 + move_glyphs $t $xn 0 .c create line $exx $exy $xn $exy -tags $tag -width 2 -arrow first set exx [expr {$xn+$texx}] } else { set exx $texx } set exy $texy - .c addtag $tag withtag $t - .c dtag $t $t + retag $t $tag } if {$exx==0} { .c create line 0 0 $sep 0 -width 2 -tags $tag set exx $sep } @@ -283,11 +294,11 @@ .c create line $bypass_x $bypass_y $bypass_x $mid_y \ -width 2 -tags $tag -arrow last .c create line $bypass_x $mid_y $bypass_x [expr {$back_y+$RADIUS}] \ -tags $tag -width 2 } - .c move $t $enter_x $enter_y + move_glyphs $t $enter_x $enter_y set e2 [expr {$exit_x + $sep}] .c create line $exit_x $exit_y $e2 $exit_y \ -width 2 -tags $tag draw_right_turnback $tag $e2 $exit_y $back_y set e3 [expr {$enter_x-$sep}] @@ -302,12 +313,11 @@ .c create line $e3 $enter_y $enter_x $enter_y \ -arrow last -width 2 -tags $tag set exit_x [expr {$enter_x + $exx}] set exit_y [expr {$enter_y + $exy}] } - .c addtag $tag withtag $t - .c dtag $t $t + retag $t $tag set btm [lindex [.c bbox $tag] 3] incr i } if {$bypass} { set fwd_y [expr {$btm + $sep + 1}] @@ -358,45 +368,43 @@ set fw [expr {$fx1-$fx0}] foreach {bt bexx bexy} [draw_backwards_line $back] break foreach {bx0 by0 bx1 by1} [.c bbox $bt] break set bw [expr {$bx1-$bx0}] set dy [expr {$fy1 - $by0 + $vsep}] - .c move $bt 0 $dy + move_glyphs $bt 0 $dy set biny $dy set bexy [expr {$dy+$bexy}] set by0 [expr {$dy+$by0}] set by1 [expr {$dy+$by1}] if {$fw>$bw} { if {$fexx<$fw && $fexx>=$bw} { set dx [expr {($fexx-$bw)/2}] - .c move $bt $dx 0 + move_glyphs $bt $dx 0 set bexx [expr {$dx+$bexx}] .c create line 0 $biny $dx $biny -width 2 -tags $bt .c create line $bexx $bexy $fexx $bexy -width 2 -tags $bt -arrow first set mxx $fexx } else { set dx [expr {($fw-$bw)/2}] - .c move $bt $dx 0 + move_glyphs $bt $dx 0 set bexx [expr {$dx+$bexx}] .c create line 0 $biny $dx $biny -width 2 -tags $bt .c create line $bexx $bexy $fx1 $bexy -width 2 -tags $bt -arrow first set mxx $fexx } } elseif {$bw>$fw} { set dx [expr {($bw-$fw)/2}] - .c move $ft $dx 0 + move_glyphs $ft $dx 0 set fexx [expr {$dx+$fexx}] .c create line 0 0 $dx $fexy -width 2 -tags $ft -arrow last .c create line $fexx $fexy $bx1 $fexy -width 2 -tags $ft set mxx $bexx } - .c addtag $tag withtag $bt - .c addtag $tag withtag $ft - .c dtag $bt $bt - .c dtag $ft $ft - .c move $tag $sep 0 + retag $bt $tag + retag $ft $tag + move_glyphs $tag $sep 0 set mxx [expr {$mxx+$sep}] .c create line 0 0 $sep 0 -width 2 -tags $tag draw_left_turnback $tag $sep 0 $biny up draw_right_turnback $tag $mxx $fexy $bexy foreach {x0 y0 x1 y1} [.c bbox $tag] break @@ -417,36 +425,34 @@ set fw [expr {$fx1-$fx0}] foreach {bt bexx bexy} [draw_backwards_line $back] break foreach {bx0 by0 bx1 by1} [.c bbox $bt] break set bw [expr {$bx1-$bx0}] set dy [expr {-($by1 - $fy0 + $vsep)}] - .c move $bt 0 $dy + move_glyphs $bt 0 $dy set biny $dy set bexy [expr {$dy+$bexy}] set by0 [expr {$dy+$by0}] set by1 [expr {$dy+$by1}] if {$fw>$bw} { set dx [expr {($fw-$bw)/2}] - .c move $bt $dx 0 + move_glyphs $bt $dx 0 set bexx [expr {$dx+$bexx}] .c create line 0 $biny $dx $biny -width 2 -tags $bt .c create line $bexx $bexy $fx1 $bexy -width 2 -tags $bt -arrow first set mxx $fexx } elseif {$bw>$fw} { set dx [expr {($bw-$fw)/2}] - .c move $ft $dx 0 + move_glyphs $ft $dx 0 set fexx [expr {$dx+$fexx}] .c create line 0 0 $dx $fexy -width 2 -tags $ft .c create line $fexx $fexy $bx1 $fexy -width 2 -tags $ft set mxx $bexx } - .c addtag $tag withtag $bt - .c addtag $tag withtag $ft - .c dtag $bt $bt - .c dtag $ft $ft - .c move $tag $sep 0 + retag $bt $tag + retag $ft $tag + move_glyphs $tag $sep 0 set mxx [expr {$mxx+$sep}] .c create line 0 0 $sep 0 -width 2 -tags $tag draw_left_turnback $tag $sep 0 $biny down draw_right_turnback $tag $mxx $fexy $bexy foreach {x0 y0 x1 y1} [.c bbox $tag] break @@ -485,11 +491,11 @@ foreach {t texx texy} $m($i) break foreach {tx0 ty0 tx1 ty1} [.c bbox $t] break set w [expr {$tx1-$tx0}] set dx [expr {($mxw-$w)/2 + $x2}] if {$w>10 && $dx>$x2+10} {set dx [expr {$x2+10}]} - .c move $t $dx 0 + move_glyphs $t $dx 0 set texx [expr {$texx+$dx}] set m($i) [list $t $texx $texy] foreach {tx0 ty0 tx1 ty1} [.c bbox $t] break if {$i==0} { if {$dx>$x2} {set ax last} {set ax none} @@ -500,11 +506,11 @@ -width 2 -start 90 -extent -90 -tags $tag -style arc set btm $ty1 } else { set dy [expr {$btm - $ty0 + $vsep}] if {$dy<2*$sep} {set dy [expr {2*$sep}]} - .c move $t 0 $dy + move_glyphs $t 0 $dy set texy [expr {$texy+$dy}] if {$dx>$x2} { .c create line $x2 $dy $dx $dy -width 2 -tags $tag -arrow last if {$dx<$xc-2} {set ax last} {set ax none} .c create line $texx $texy $x3 $texy -width 2 -tags $tag -arrow $ax @@ -522,12 +528,11 @@ .c create line $x4 [expr {$texy-$sep}] $x4 [expr {$exy+$sep}] \ -width 2 -tags $tag } set btm [expr {$ty1+$dy}] } - .c addtag $tag withtag $t - .c dtag $t $t + retag $t $tag } return [list $tag $x5 $exy] } proc draw_tail_branch {lx} { @@ -549,21 +554,21 @@ for {set i 0} {$i<$n} {incr i} { foreach {t texx texy} $m($i) break foreach {tx0 ty0 tx1 ty1} [.c bbox $t] break set dx [expr {$x2+10}] - .c move $t $dx 0 + move_glyphs $t $dx 0 foreach {tx0 ty0 tx1 ty1} [.c bbox $t] break if {$i==0} { .c create line 0 0 $dx 0 -width 2 -tags $tag -arrow last .c create arc -$sep 0 $sep [expr {$sep*2}] \ -width 2 -start 90 -extent -90 -tags $tag -style arc set btm $ty1 } else { set dy [expr {$btm - $ty0 + $vsep}] if {$dy<2*$sep} {set dy [expr {2*$sep}]} - .c move $t 0 $dy + move_glyphs $t 0 $dy if {$dx>$x2} { .c create line $x2 $dy $dx $dy -width 2 -tags $tag -arrow last } set y1 [expr {$dy-2*$sep}] .c create arc $x1 $y1 [expr {$x1+2*$sep}] $dy \ @@ -571,12 +576,11 @@ if {$i==$n-1} { .c create line $x1 [expr {$dy-$sep}] $x1 $sep -width 2 -tags $tag } set btm [expr {$ty1+$dy}] } - .c addtag $tag withtag $t - .c dtag $t $t + retag $t $tag } return [list $tag 0 0] } proc draw_diagram {spec} { @@ -637,11 +641,11 @@ .c delete all wm deiconify . wm title . $name draw_diagram "line bullet [list $spec] bullet" foreach {x0 y0 x1 y1} [.c bbox all] break - .c move all [expr {2-$x0}] [expr {2-$y0}] + move_glyphs all [expr {2-$x0}] [expr {2-$y0}] foreach {x0 y0 x1 y1} [.c bbox all] break .c create rect -100 -100 [expr {$x1+100}] [expr {$y1+100}] \ -fill white -outline white -tags bgrect .c lower bgrect .c config -width $x1 -height $y1