#!/home/tcltk/bin/itcl_wish -f
#
# Uses [incr Tcl]

# Statecharts Editor

# Stephen Edwards for CS 260

set auto_path "[pwd] /home/tcltk/library $auto_path"

# bitmap directory

set bmd [pwd]

source defaults.tcl
source bindings.tcl

wm title . "StateCharts"

button .bnew -text "New" -command "buttonNew"
button .bopen -text "Open" -command "buttonOpen"
button .bsave -text "Save" -command "buttonSave"
button .bsaveas -text "Save As" -command "buttonSaveAs"
button .bnewview -text "New View" -command "buttonNewView"
button .bquit -text "Quit" -command "buttonQuit"

pack .bnew .bopen .bsave .bsaveas .bnewview .bquit -ipadx 3 -ipady 5 -side left

#set ed1 [Editor \#auto .a]
#set ed2 [Editor \#auto .b]

#State st0 "" -xw 10 -yn 10 -xe 100 -ys 100
#State st1 st0 -xw 20 -yn 20 -xe 60 -ys 60 -nameX 40 -nameY 40
#State st2 st0 -xw 70 -yn 30 -xe 90 -ys 60 -nameX 80 -nameY 40
#State st3 st1 -xw 30 -yn 30 -xe 40 -ys 60 -nameX 35 -nameY 45

#Trans t1 st1 st2

#[$ed1 viewOf] setView st0 3 4
#[$ed2 viewOf] setView st1 1 1.5

#TransDialog \#auto t1
#StateDialog \#auto st0

set currentFile ""
trace variable currentFile w currentFileChanged

proc currentFileChanged {name element op} {
    foreach e [itcl_info object -class Editor] {
	$e setView
    }
}

proc databaseContents {} {

    set d "# sc database\n"
    append d "\#\n"

    append d "# States\n"
    dumpStates d [State :: rootStateOf]
    
    append d "# Transitions\n"
    dumpTransitions d

    append d "# Editors\n"
    dumpEditors d

    return $d
}

proc dumpStates {d state} {
    upvar $d de
    append de "[$state recreate]\n"
    foreach s [$state childrenOf] { dumpStates de $s }
}

proc dumpTransitions {d} {
    upvar $d de
    foreach t [itcl_info object -class Trans] {
	append de "[$t recreate]\n"
    }
}

proc dumpEditors {d} {
    upvar $d de
    foreach e [itcl_info object -class Editor] {
	append de "[$e recreate]\n"
    }
}

##############################
#
# Main menu button procedures
#

proc buttonNew {} {
    clearDatabase
    State \#auto ""
    buttonNewView
}

proc buttonOpen {} {
    global currentFile
    set newFile [fileDialog .open Open "Statechart to open:" "Open" \
			 $currentFile ]
    if { $newFile != "" } {
	clearDatabase
	loadFile $newFile
    }
}

proc buttonSave {} {
    global currentFile

    if { $currentFile == "(untitled)" } {
	set newFile [fileDialog .save Save "Save as Statechart:" "Save" \
			 "untitled.sc"]
	if { $newFile != "" } {
	    saveFile $newFile
	}
    } else {
	saveFile $currentFile
    }

}

proc buttonSaveAs {} {
    global currentFile

	set newFile [fileDialog .save Save "Save as Statechart:" "Save" \
			 "untitled.sc"]
	if { $newFile != "" } {
	    saveFile $newFile
	}

}

proc buttonNewView {} {
    Editor \#auto [State :: rootStateOf] 1 1.0
}

proc clearDatabase {} {
    global currentFile
    set currentFile "(untitled)"

    foreach e [itcl_info object -class Editor] {
	$e delete
    }

    set rootstate [State :: rootStateOf]
    if { $rootstate != "" } { $rootstate delete }

    State :: restart

}

proc delStates {s} {
    foreach st [$s childrenOf] { delStates $st }
    $s delete
}

proc buttonQuit {} {
    destroy .
}

proc loadFile {filename} {
    global currentFile

    if { [file exists $filename] } {
	if { [file readable $filename] } {

	    set f [open $filename]
	    gets $f line
	    close $f
	    if {$line == "# sc database"} {
		source $filename
		set currentFile $filename	       
	    } else {
		tk_dialog .d "Load error" \
		    "Error: ``$filename'' is not in sc format." \
		    error 0 {Dismiss}
	    }
	} else {
	    tk_dialog .d "Load error" \
		"Error: You do not have read permission for ``$filename.''" \
		error 0 {Dismiss}
	}
    } else {
	tk_dialog .d "Load error" \
	    "Error: ``$filename'' cannot be accessed." \
	    error 0 {Dismiss}
    }

}

proc saveFile {filename} {
    global c itemtype
    global currentFile

    if { [file writable $filename] || [file exists $filename] == 0 } {

	set f [open $filename w]
	puts $f [databaseContents]
	close $f

	set currentFile $filename
    }
}

buttonNew

# Local Variables:
# mode: tcl
# End:
