#!wish8.2 -f
#  descpie - Graph pie chart of expenses by description inside given category
#
#  Written by Alexandr E. Bravo (abravo@tctube.spb.su)
#  Copyright (C) 1997  Alexandr E. Bravo (abravo@tctube.spb.su)
#  Based on script graphpie written by Arlindo L. Oliveira (aml@inesc.pt)
#                  Copyright (C) 1996  Arlindo L. Oliveira (aml@inesc.pt)
#
# $Id: descpie,v 1.1.1.1 1999/12/18 02:06:43 curt Exp $

if { [file exists "$env(HOME)/.cbbrc.tcl"] } {
      source "$env(HOME)/.cbbrc.tcl"
   }

set data(0,1) " "
set desc " "
set cnt 1
set dcnt 1
frame .check
set iter 1

frame .check.list_$iter
button .check.ok -text Ok -command {destroy .check}
pack .check.ok -side top -fill x
pack .check.list_$iter -side left -anchor n

while {[gets stdin line] >= 1 && [lindex $line 0] != "!" } {
     set desc [lindex $line 0]
     
# This line here is different for the ones that take both pos and neg

# option add *font "-cronyx-helvetica-bold-r-normal-*-*-130-*-*-*-*-*-*"

         option add *font $cbb(msg_text_font)
         radiobutton .check.list_$iter.but_$cnt \
               -text $desc \
               -variable desc -relief flat -value $desc \
	       -relief flat 

#               -font "-cronyx-helvetica-bold-r-normal-*-*-130-*-*-*-*-*-*" 

         pack .check.list_$iter.but_$cnt -anchor w

         if {$cnt % 20 == 0} {
             incr iter
             frame .check.list_$iter
             pack .check.list_$iter -side left -anchor n
         }
         incr cnt   
     
}
pack .check
tkwait window .check

             while {[gets stdin line] >= 1 } {
                if { [lindex $line 0] == $desc } { 
		  set data($dcnt,0) [lindex $line 1]
                  set data($dcnt,1) [lindex $line 2]
		  incr dcnt
                }
             }

set cnt $dcnt

proc graphData {graph row col} {
    global data


    return $data($row,$col)
}

proc graphCols {canvas} {
    return 1
}

proc graphRows {canvas} {
    global cnt
    return [expr $cnt-1]
}

#
# createPieChart
# rows : number of data rows 1 ... rows
# cols : number of data cols 1 ... cols
# data(0,i) contains data labels
# data(i,0) contains abcissa labels
#

set barColors(0) "darkgreen"
set barColors(1) "gray40"
set barColors(2) "IndianRed3"
set barColors(3) "blue3"
set barColors(4) "red"
set barColors(5) "chartreuse4"
set barColors(6) "SkyBlue4"
set barColors(7) "gold4"

proc graphColor {i} {
    global barColors

    return $barColors([expr $i % 8])
}

proc defGraphMargin {} {
    return 120
}

proc defGraphHeight {} {
    return 450
}

proc defGraphWidth {} {
    return 450
}

proc defGraphWinHeight {} {
    return [expr [defGraphHeight]+2*[defGraphMargin]]
}

proc defGraphWinWidth {} {
    return [expr [defGraphWidth]+[defGraphMargin]+[defGraphMargin]]
}

proc createPieChart {graphName {canv 0}} {
    global graphCnt use canvas cbb

    set cols [graphCols $graphName]
    set rows [graphRows $graphName]

    wm withdraw .
    if {$canv == 0} {
        toplevel .graph$graphCnt
        set canvas [canvas .graph$graphCnt.graph -width [defGraphWinWidth] \
                -height [defGraphWinHeight] -bg gray80]
        button .graph$graphCnt.dismiss -text dismiss \
                -command {destroy .}
        button .graph$graphCnt.print -text Print \
                -command {
                        toplevel .m
                        message .m.msg -font 12x24 -text "Printing to file pie.ps"
                        pack .m.msg
                        wm geometry .m +300+300
                        after 2000 {destroy .m}
                        $canvas postscript -file pie.ps -pagewidth 19c
                }


    }

    pack $canvas 
    pack .graph$graphCnt.dismiss -fill x
    pack .graph$graphCnt.print -fill x

    
    #
    # Width of each bar
    #
    
    set gw [defGraphWidth]
    set gh [defGraphHeight]
    set gm [defGraphMargin]

    #
    # Find total
    #
    
    set total 0
    for {set j 1} {$j <= $cols} {incr j} {
        for {set i 1} {$i <= $rows} {incr i} {
            set total [expr $total+[graphData $graphName $i 1]]
        }
    }

    #
    # Draw total
    #

    set x2 [expr $gm + $gw/2.0]
    set total2 [expr $total]
    if { $total < 0 } {
    			set total2 [expr -1.0*$total]
		      }
    $canvas create text $x2 40 -fill "red" \
                  -font $cbb(button_font) -text "$graphName=$total2" 

      
    #
    # Draw axes
    # 

#    $canvas create rect $gm $gm [expr $gm+$gw] [expr $gm+$gh] \
#            -fill gray80 -outline gray80
    
    #
    # Draw legends
    #
    
    for {set i 1} {$i <= $cols} {incr i} {
#        $canvas create rect \
#                [expr $gm+$gw+$gm/2] [expr $gm+40*$i] \
#                [expr $gm+$gw+$gm+$gm/2] [expr $gm+40*$i+15] \
#                -fill [graphColor $i]
        $canvas create text \
                [expr $gm+$gw+$gm/2+10] [expr $gm+40*$i+18] \
                -anchor n -text [graphData $graphName 0 $i]
        
    }
    
    #
    # Draw pie slices
    #
    
        set parcial 0
        for {set i 1} {$i <= $rows} {incr i} {
            set x [expr -[graphData $graphName $i 1]]

            set offset 50
            
            
            set tmp [$canvas create arc [expr $gm-$offset] [expr $gm-$offset] \
                [expr $gm+$gw+$offset] [expr $gm+$gh+$offset] \
                -extent 2 \
                -start [expr 360.0*($parcial+$x/2.0)/$total] \
                -tag [graphData $graphName $i 0] \
                -style arc -outline gray80]
            set xx [$canvas bbox [graphData $graphName $i 0]]
            $canvas create arc $gm $gm [expr $gm+$gw] [expr $gm+$gh] \
                -extent [expr 360.0*$x/$total] \
                -start [expr 360.0*$parcial/$total] \
                -fill [graphColor $i]
             set parcial [expr $parcial+$x]
            #
            # Draw labels
            #

            set x1 [expr ([lindex $xx 0]+[lindex $xx 2])/2]
            set y1 [expr ([lindex $xx 1]+[lindex $xx 3])/2]
            $canvas delete $tmp

            set s "[graphData $graphName $i 0] [format "%4.1f" [expr -(1.0*$x/$total*100)]]"

            set offset 0
            set sign 1
            while {1} {
                set a [$canvas create text $x1 [expr $y1+($offset*$sign)]\
                  -font $cbb(fixed_font) \
                        -text "$s%" \
                        -fill [graphColor $i]]
                set x [$canvas bbox $a]
                set ll [$canvas find overlap \
                        [lindex $x 0] [lindex $x 1] \
                        [lindex $x 2] [lindex $x 3]]
                if {[llength $ll] == 1} {break}
                $canvas delete $a
                set sign [expr -$sign]
                incr offset
             }
            
#                  -font "-cronyx-helvetica-bold-r-normal-*-*-130-*-*-*-*-*-*" \
#            set tx [expr $cols*$cw/2+($i-1)*$rs+$gm]
#            set tt [graphData $graphName $i 0] 
#            set tt [string range $tt 0 7]
#            $canvas create text $tx \
#                        [expr $zero+6+(($i-1) % $nlevels)*13] -anchor n  \
#                        -text $tt
        }

}
set graphCnt 0
#createPieChart lixo 0
createPieChart $desc 0
