# File draw_l.tcl (draw_logical)
#
# Diese Prozeduren zeichnen nix, sie speichern nur die Werte von Kanten und
# Token und Rules

proc draw_edge {name id start end label status extension children args} {
    
    global chart edge token map draw
    
    my_trace "Entering proc draw_edge $name $id $start $end $label $status $extension $children $args"

    # falls nicht result oder sowieso neue Kante...
    if { $chart(result) == 0 || [info exists edge($name,$id,label)] != 1 } {

	# erhoehe Gesamtkantenanzahl
	incr chart($name,max_edges)
	
	# Mapping von durchnummerierten Kanten auf IDs
	set map($name,$chart($name,max_edges),id) $id
	
	my_trace "Mapping von $chart($name,max_edges) auf $id"
	
	# speichere Kanten mit gleicher ID nicht zweimal !
	if { [info exists edge($name,$id,label)] == 1 } {
	    my_trace "Dropping drawing of edge because it already exists"
	    
	    set map($name,$chart($name,max_edges),original) 0
	    # watch the blinkenlights
	    if { $chart(colormodel) == 1 } {
		set blink $chart(color,blink_color)
	    } else {
		set blink $chart(bw,blink_color)
	    }
	    if { $chart(blink) == 1 } {
		.chart$name.canvas.draw create text $edge($name,$id,xtext) $edge($name,$id,ytext) -text $edge($name,$id,label) -justify center -tags "remove" -font $chart(defaultfont) -fill $blink
		update
		after 20
		.chart$name.canvas.draw delete remove
		update
		after 20
	    }
	    return
	}
	
	set map($name,$chart($name,max_edges),original) 1
	
	# Kante gibt es noch nicht => Werte speichern
	set edge($name,$id,start) $start
	set edge($name,$id,end) $end
	set edge($name,$id,label) $label
	set edge($name,$id,status) $status
	set edge($name,$id,extension) $extension

	# new: give edges a marker toggle (0=unmarked, 1=marked)
        set edge($name,$id,mark) 0
        # 990528: speichere Markierungsfarbe, am Anfang default
        set edge($name,$id,mark_color) $chart($name,color,mark_color)

        # NEW990527: toggle fuer gefaerbte Kinder (0=undyed, 1=dyed)
        set edge($name,$id,dye) 0

	# damit Regel-Kanten auch Span haben
	set edge($name,$id,span) -1
	
	# damit auch kinderlose Kanten einen Wert haben
	set edge($name,$id,children) -1
	
	# falls Kinder vorhanden, ansonsten bleibt die -1
	if { [llength $children] != 0 } {
	    set edge($name,$id,children) $children
	    for { set i 0 } { $i < [llength $children] } { incr i } {
		set child [lindex $children $i]
		lappend edge($name,$child,parents) $id
	    }
	}
	
	# erhoehe Anzahl der gezeichneten Kanten
	incr chart($name,drawn_edges)
	
	# aktuelle Kante wird gezeichnet
	set draw($name,$chart($name,drawn_edges)) $id
	
	show_in_window "draw_edge $name $id $start $end $label $status $extension $children $args\n" $name
	
	# Kante ist eine Regel
	if { $start == -1 } {
	    draw_rule $name $id
	    return
	}

	# Ueberpruefe, welche Token die Kante ueberspannt
	if {$edge($name,$id,start) > $edge($name,$id,end)} {
	    
	    # Starttoken > Endtoken
	    set maxnewtoken $edge($name,$id,start)
	    set differenz [expr $start - $end]
	} else {
	    set maxnewtoken $edge($name,$id,end)
	    set differenz [expr $end - $start]
	}
	
	# speichere den Span der Kante
	set edge($name,$id,span) $differenz
	
	# sind davon noch welche nicht gezeichnet ?
	if { $maxnewtoken > $chart($name,max_token) } {
	    my_trace "Fuege neue Knoten ein..."
	    for { set i [expr $chart($name,max_token) + 1] } { $i <= $maxnewtoken } { incr i } {
		
		# create new tokens
		draw_token $name $i
	    }
	    
	    # set max_token to new value
	    set chart($name,max_token) $maxnewtoken
	    
	}
	
	# trage Kante in Liste des Starttokens ein
	lappend token($name,$start,edges_start) $id
    } 



	
    # zeichne die Kante physikalisch
    physical_draw_edge $name $id $edge($name,$id,start) $edge($name,$id,end) $edge($name,$id,label) $edge($name,$id,status) $edge($name,$id,extension) $edge($name,$id,children) $args

    my_trace "Leaving draw_edge"
	
}

proc draw_token { name id } {

    global chart token

    my_trace "Entering proc draw_token $name $id"

    # Initial height is 0
    set token($name,$id,height) 0

    # Initial depth is 0
    set token($name,$id,depth) 0

    # hier ist der Abstand zum linken Rand definiert
    set token($name,$id,x1) [expr $chart($name,leftspace) + $id * $chart($name,default_minimum_space)]
    set token($name,$id,x2) [expr $chart($name,leftspace) + $chart(defaulttokendiameter) + $id * $chart($name,default_minimum_space)]

    # hier ist der Abstand zum Boden definiert
    set token($name,$id,y1) [expr $chart(defaultscrollheight) - $chart($name,downspace)]
    set token($name,$id,y2) [expr $chart(defaultscrollheight) - $chart($name,downspace) - $chart(defaulttokendiameter)]

    # Mittelpunkt des Kreises: x0,y0
    set token($name,$id,x0) [expr $token($name,$id,x2) - round($chart(defaulttokendiameter) / 2)]
    set token($name,$id,y0) [expr $token($name,$id,y2) + round($chart(defaulttokendiameter) / 2)]
    
    show_in_window "Token $id: x0 = $token($name,$id,x0), y0 = $token($name,$id,y0)" $name

    # new Token out of bounds ?
    if { $token($name,$id,x2) > $chart(defaultscrollwidth) } {
	# enlarge scrollable width
	incr chart(defaultscrollwidth) $chart(defaultwidthincrement)
	# enlarge the canvas scrollable area
	.chart$name.canvas.draw configure -scrollregion "0 0 $chart(defaultscrollwidth) $chart(defaultscrollheight)"
	my_trace "Enlarging scrollable width by $chart(defaultwidthincrement)"
    }

    # bestimme die Tokenfarbe anhand des Colormodels
    if { $chart(colormodel) == 1 } {
	set t_color $chart(color,token_color)
    } else {
	set t_color $chart(bw,token_color)
    }

    my_trace "Drawing token at $token($name,$id,x0),$token($name,$id,y0)"
    
    .chart$name.canvas.draw create oval $token($name,$id,x1) $token($name,$id,y1) $token($name,$id,x2) $token($name,$id,y2) -width $chart(defaulttokenwidth) -tags "token$id token" -fill $t_color
    
    
    .chart$name.canvas.draw bind token$id <Button-1> "make_tokenpopup $name $id;tk_popup .chart$name.tokenpopup %X %Y"

    raise_text $name
    update

    my_trace "Leaving draw_edge"
}

proc draw_rule { name id } {

    global chart edge token

    my_trace "Entering proc draw_rule $name $id"

    # nur, wenn eine "neue" Regel
    if { $chart(result) == 0 } {
	incr chart($name,max_rules)
    }
    
    draw_physical_rule $name $id

    my_trace "Leaving draw_rule"

}
