#!/bin/sh
# \
    exec itkwish "$0" ${1+"$@"}
#
# mkitclman "4 Dec 1995"
# mkitclman - generate a man page from an itcl class
#
# SYNOPSIS
#   mkitclman classfile
#
# DESCRIPTION
#   Reads an [incr Tcl] or [incr Tk] class file as input, and outputs nroff.
#   mkitclman generates a standard format used for [incr Widget] classes. It
#   locates the class name, inheritance to one level, widget specific options,
#   and widget specific methods. Areas that the script cannot handle it 
#   places and uppercased name delimited by leading and trailing '_' characters.
#
#   [incr Tcl/Tk] 2.0 is the supported class format. 
#
# CAVEATS
#   mkitlcman does not work with normal Tk or Tcl script files. 
#   It expects only one class per file. In addition, it does not work on
#   namespace files.

proc init { } {
	global _className
	global _inheritClass
    global _publicMethod
    global _publicVariable
    global _protectedMethod
    global _protectedVariable
    global _privateMethod
    global _privateVariable
	global _options

	set _className {}
	set _inheritClass {}

}
proc namespace { args } {
	global _className

	set _className [lindex $args 0]
	set classBody [lindex $args 1]

	eval $classBody
}
proc class { args } {
	global _className

	set _className [lindex $args 0]
	set classBody [lindex $args 1]

	eval $classBody
}
proc itk_option { action switch args } {
	global _options

	if { $action == "define" } {
		set _options($switch) $args
	}
}
proc inherit { inheritClass } {
	global _inheritClass
	set _inheritClass $inheritClass
}

# default is public method
proc method { name args } {
	global _publicMethod

	set _publicMethod($name) $args
}

# pick up arrays later...
proc common { name args } {
	global _commonVariable

	# set to defaults
	set _commonVariable($name) $args
}

proc public { type args } {
	global _publicMethod
	global _publicVariable

	switch $type {
		method {
			set _publicMethod([lindex $args 0]) [lindex $args 1]
		}
		variable {
			# _publicVariable(varName) = defaultValue
			set _publicVariable([lindex $args 0]) [lindex $args 1]
		}
	}
}

proc protected { type args } {
	global _protectedMethod
	global _protectedVariable

	switch $type {
		method {
			# _protectedMethod(methodName) = argList
			set _protectedMethod([lindex $args 0]) [lrange $args 1 end]
		}
		variable {
			# _protectedVariable(varName) = defaultValue
			set _protectedVariable([lindex $args 0]) [lindex $args 1]
		}
	}
}

proc private { type args } {
	global _privateMethod
	global _privateVariable

	switch $type {
		method {
			# _privateMethod(methodName) = argList
			set _privateMethod([lindex $args 0]) [lrange $args 1 end]
		}
		variable {
			# _privateVariable(varName) = defaultValue
			set _privateVariable([lindex $args 0]) [lindex $args 1]
		}
	}
}

proc body { args } {
}

proc configbody { args } {
}

proc destructor { args } {
}
proc constructor { args } {
}

proc gen { } {
	global _className
    global _classBody
	global _inheritClass
    global _publicMethod
    global _publicVariable
    global _protectedMethod
    global _protectedVariable
    global _privateMethod
    global _privateVariable
    global _methodSection
    global _optionSection
	global _manpage
	global _optionManFmt
	global _methodManFmt
	global _method
	global _options
	global _optionSwitch
	global _optionName
	global _optionClass

	if { $_inheritClass != {} } {
		set _inheritClass "$_inheritClass <-"
	}
	set _optionManFmt {}
	set _methodManFmt {}
	set _methodArgs {}
	foreach pbv [lsort [array names _publicVariable]]  {
		set _optionSwitch "-$pbv"
		set _optionName $pbv
		set _optionClass "[string toupper [string index $pbv 0]][string range $pbv 1 end]"
		lappend _optionManFmt [subst -nobackslash -nocommand $_optionSection]
	}

	foreach opt [lsort [array names _options]] {
		set _optionSwitch $opt
		set _optionName [lindex $_options($opt) 0]
		set _optionClass [lindex $_options($opt) 1]
		lappend _optionManFmt [subst -nobackslash -nocommand $_optionSection]
	}
	foreach pbm [lsort [array names _publicMethod]] {
		set _method $pbm
		eval set _methodArgs [list $_publicMethod($pbm)]
		lappend _methodManFmt [subst -nobackslash -nocommand $_methodSection]
	}
	foreach ptm [lsort [array names _protectedMethod]] {
	}
	foreach ptv [lsort [array names _protectedVariable]] {
	}
	foreach pvm [lsort [array names _privateMethod]] {
	}
	foreach pvv [lsort [array names _privateVariable]] {
	}

	set _methodManFmt [join $_methodManFmt " "]
	set _optionManFmt [join $_optionManFmt " "]

	set _manpage [subst -nobackslash -nocommand $_manpage]

	puts $_manpage
}

set _manpage {
'\"
'\" Copyright (c) _AUTHOR_
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\"
'\" @(#) $_className.n
'/"
.so man.macros
.HS $_className iwid
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
'\"
'\"
.SH NAME
$_className \- _NAME_DESCRIPTION_
.SH SYNOPSIS
\fB$_className\fI \fIpathName\fR ?\fIoptions\fR?
.SH "INHERITANCE"
$_inheritClass $_className
.SH "STANDARD OPTIONS"
.LP
.nf
.ta 4c 8c 12c
_STANDARD_OPTIONS_
.fi
.LP
See the "options" manual entry for details on the standard options.
.SH "ASSOCIATED OPTIONS"
.LP
.nf
.ta 4c 8c 12c
_ASSOCIATED_OPTIONS_
.fi
.LP
See the "_ASSOCIATED_WIDGET_" widget manual entry for details on the above
associated options.
.SH "INHERITED OPTIONS"
.LP
.nf
.ta 4c 8c 12c
_INHERITED_OPTIONS_
.fi
.LP
See the "_INHERITED_WIDGET_" class manual entry for details on the inherited options.
.SH "WIDGET-SPECIFIC OPTIONS"
.LP
$_optionManFmt
.BE
.SH DESCRIPTION
.PP
_DESCRIPTION_
.SH "METHODS"
.PP
The \fB$_className\fR command creates a new Tcl command whose
name is \fIpathName\fR.  This
command may be used to invoke various
operations on the widget.  It has the following general form:
.DS C
\fIpathName option \fR?\fIarg arg ...\fR?
.DE
\fIOption\fR and the \fIarg\fRs
determine the exact behavior of the command.  The following
commands are possible for $_className widgets:
.SH "ASSOCIATED METHODS"
.LP
.nf
.ta 4c 8c 12c
_ASSOCIATED_METHODS_
.fi
.LP
See the "_ASSOCIATED_WIDGET_" manual entry for details on the standard methods.
.SH "WIDGET-SPECIFIC METHODS"
$_methodManFmt
.SH "COMPONENTS"
.LP
.nf
Name:   \fB_COMPONENT_NAME_\fR
Class:  \fB_COMPONENT_CLASS_\fR
.fi
.IP
_COMPONENT_DESCRIPTION_
See the "_COMPONENT_TYPE_" widget manual entry for details on the _COMPONENT_NAME_ component item.
.fi
.SH EXAMPLE
.DS
_EXAMPLE_CODE_
.DE
.SH AUTHOR
_AUTHOR_
.SH KEYWORDS
_KEYWORDS_
}

set _optionSection {
.nf
Name:	\fB$_optionName\fR
Class:	\fB$_optionClass\fR
Command-Line Switch:	\fB$_optionSwitch\fR
.fi
.IP
_OPTION_DESCRIPTION_
.LP
}

set _methodSection {
.TP
\fIpathName\fR \fB$_method\fR \fI$_methodArgs\fR
_METHOD_DESCRIPTION_
}

# Add these two lines up into the man page above to enable

init
source [lindex $argv 0]
gen
exit
