###########################################################################
#                                                                         #
#               Copyright (C) 1995, Silicon Graphics, Inc.                #
#                                                                         #
#   These coded instructions, statements, and computer programs  contain  #
#   unpublished  proprietary  information of Silicon Graphics, Inc., and  #
#   are protected by Federal copyright law.  They  may  not be disclosed  #
#   to  third  parties  or copied or duplicated in any form, in whole or  #
#   in part, without the prior written consent of Silicon Graphics, Inc.  #
#                                                                         #
###########################################################################

#%COMMENT_BEGIN
# Filename:	advEfsPnl
# Version:	$Revision: 1.5 $
# Synopsis:	Encapsulates the panel that displays advanced EFS options.
# Functions:	advEfs:realize
#		advEfs:manage
#		advEfs:setDefaults
#		advEfs:setData
#		advEfs:getData
#		advEfs:_create
#%COMMENT_END

#########################################
#		Public			#
#########################################
#%COMMENT_BEGIN
# Function:	advEfs:realize
# Synopsis:	Creates an instance of the panel.  On the first call, any
#		class-wide data is initialized.  If an instance of this
#		panel already exists for the given handle, no action is taken.
# Arguments:	- handle	An identifier that is used as a key for storing
#				(and later retrieving) the created widgets and
#				any instance specific data.
#		- parent	The parent for the created panel.
#%COMMENT_END

proc advEfs:realize { handle parent } \
{
	global		_GW_advEfs _GD_advEfs

	if {! [info exists _GD_advEfs(initialized)]} {
		set _GD_advEfs(toggles)	\
			{XFS_FS_OPTS_RO XFS_FS_OPTS_RW XFS_FS_OPTS_NOAUTO
			 XFS_FS_OPTS_GRPID XFS_FS_OPTS_NOSUID
			 XFS_FS_OPTS_NODEV XFS_FS_OPTS_QUOTA
			 EFS_RECOVER_FLAG EFS_ALIGN_FLAG}

		set _GD_advEfs(texts)	\
			{EFS_NO_INODES EFS_NO_BLOCKS EFS_SECTORS_TRACK
			 EFS_CYL_GRP_SIZE EFS_CGALIGN EFS_IALIGN
			 XFS_FS_DUMP_FREQ XFS_FS_OPTS_FSCK}

		####	Default Values
		set _GD_advEfs(XFS_FS_OPTS_RO,default)		true
		set _GD_advEfs(XFS_FS_OPTS_RW,default)		true
		set _GD_advEfs(XFS_FS_OPTS_NOAUTO,default)	false
		set _GD_advEfs(XFS_FS_OPTS_GRPID,default)	false
		set _GD_advEfs(XFS_FS_OPTS_NOSUID,default)	false
		set _GD_advEfs(XFS_FS_OPTS_NODEV,default)	false
		set _GD_advEfs(XFS_FS_OPTS_QUOTA,default)	false
		set _GD_advEfs(EFS_RECOVER_FLAG,default)	false
		set _GD_advEfs(EFS_ALIGN_FLAG,default)		false

		set _GD_advEfs(EFS_NO_INODES,default)		""
		set _GD_advEfs(EFS_NO_BLOCKS,default)		""
		set _GD_advEfs(EFS_SECTORS_TRACK,default)	""
		set _GD_advEfs(EFS_CYL_GRP_SIZE,default)	""
		set _GD_advEfs(EFS_CGALIGN,default)		""
		set _GD_advEfs(EFS_IALIGN,default)		""
		set _GD_advEfs(XFS_FS_DUMP_FREQ,default)	0
		set _GD_advEfs(XFS_FS_OPTS_FSCK,default)	0


		set _GD_advEfs(initialized) true
	}

	if {! [info exists _GW_advEfs($handle,panel)]} {
		set _GW_advEfs($handle,panel) [advEfs:_create $handle $parent]
		advEfs:setDefaults $handle
	}

	return $_GW_advEfs($handle,panel)
}

#%COMMENT_BEGIN
# Function:	advEfs:manage
# Synopsis:	Manages an instance of the panel.
# Arguments:	- handle	The identifier for the desired instance.
#%COMMENT_END
proc advEfs:manage { handle } \
{
	global	_GW_advEfs
	if {[info exists _GW_advEfs($handle,panel)]} {
		$_GW_advEfs($handle,panel) manageChild
	}
}

#%COMMENT_BEGIN
# Function:	advEfs:setDefaults
# Synopsis:	Sets all XmTextFields/XmToggleButton widgets to their defaults.
# Arguments:	- handle	The identifier for the desired instance.
#%COMMENT_END
proc advEfs:setDefaults { handle } \
{
	global	_GW_advEfs _GD_advEfs

	foreach key $_GD_advEfs(toggles) {
	    $_GW_advEfs($handle,$key) setValues -set $_GD_advEfs($key,default)
	}

	foreach key $_GD_advEfs(texts) {
	    $_GW_advEfs($handle,$key) setString $_GD_advEfs($key,default)
	}
}

#%COMMENT_BEGIN
# Function:	advEfs:setData
# Synopsis:	Given a list of keyword/value pairs, fill in the appropriate
#		field with the appropriate value.
# Arguments:	- handle	The identifier for the desired instance.
#		- lst		A list of keyword/value pairs.
#%COMMENT_END
proc advEfs:setData { handle lst } \
{
	global		_GW_advEfs _GD_advEfs

	foreach item $lst {
		set x   [split $item ":"]
		set key [string trim [lindex $x 0]]
		set val [string trim [lindex $x 1]]

		if {[lsearch -exact $_GD_advEfs(texts) $key] != -1} {
			$_GW_advEfs($handle,$key) setValues -value $val
		} elseif {[lsearch -exact $_GD_advEfs(toggles) $key] != -1} {
			$_GW_advEfs($handle,$key) setValues -set $val
		}
	}
}

#%COMMENT_BEGIN
# Function:	advEfs:getData
# Synopsis:	Reads the data from the panel and stores it in keyword/value
#		pair format.  If a field is currently set to its' default
#		value, then it is ignored.  If an XmTextField is empty, it
#		is assumed to be the default and is ignored.
# Arguments:	- handle	The identifier for the desired instance.
#		- data		A reference to an array variable in which
#				to store the data.
#		- check		An optional parameter that indicates whether
#				or not to check the data for completeness.
#				(default value: true)
#%COMMENT_END
proc advEfs:getData { handle data {check true} } \
{
	global		_GW_advEfs _GD_advEfs
	upvar $data	dat

	if {! [info exists _GW_advEfs($handle,panel)]} {
		return 1
	}

	foreach key $_GD_advEfs(texts) {
		set val [string trim [$_GW_advEfs($handle,$key) getString]]
		if {! [cequal $val ""] &&
		    ! [cequal $val $_GD_advEfs($key,default)]} {
			lappend dat "$key:$val"
		}
	}

	foreach key $_GD_advEfs(toggles) {
		$_GW_advEfs($handle,$key) getValues -set val
		if {! [cequal $val $_GD_advEfs($key,default)]} {
			lappend dat "$key:$val"
		}
	}

	####	Check data for correctness
	if {[cequal $check "true"] && [lmatch $dat "EFS_NO_BLOCKS:*"] != ""} {
	    foreach key {EFS_NO_INODES EFS_SECTORS_TRACK EFS_CYL_GRP_SIZE
			   EFS_CGALIGN EFS_IALIGN} {
		if {[lsearch $dat "$key:*"] == -1} {
		    $_GW_advEfs($handle,$key)-label getValues -labelString str
		    lappend errs $str
		}
	    }

	    if {[info exists errs]} {
		$_GW_advEfs($handle,EFS_NO_BLOCKS)-label getValues \
				-labelString str
		em:storeMsg fs error \
"Since a value was given for \"$str\"\nthe following fields are also required:\n\t[join $errs "\n\t"]"
		return 0
	    }
	}

	return 1
}

#########################################
#		Private			#
#########################################
#%COMMENT_BEGIN
# Function:	advEfs:_create
# Synopsis:	Creates an instance of the panel.
# Arguments:	- handle	The identifier for the desired instance.
#		- parent	The parent for the created panel.
#%COMMENT_END
proc advEfs:_create { handle parent } \
{
	global		_GW_advEfs _GD_advEfs
	set name	advEfs

	set panel [xmForm $parent.$name]
	set rc [xmRowColumn $panel.$handle -orientation vertical \
			-entryAlignment alignment_beginning \
			-topAttachment attach_form \
			-leftAttachment attach_form \
			-rightAttachment attach_none \
			-bottomAttachment attach_none]

	set grid [sgiGrid $panel.grid \
			-numColumns 2 \
			-numRows [llength $_GD_advEfs(texts)] \
			-defaultSpacing 2 \
			-topAttachment attach_form \
			-leftAttachment attach_widget \
			-rightAttachment attach_none \
			-bottomAttachment attach_none \
			-leftWidget $rc \
			-leftOffset 20]

	foreach item $_GD_advEfs(toggles) {
		set _GW_advEfs($handle,$item) [xmToggleButton $rc.$item managed]
	}


	set i 0
	foreach item $_GD_advEfs(texts) {
		xmLabel $grid.$item-label managed -row $i -column 0
		set _GW_advEfs($handle,$item) [xmTextField $grid.$item \
				 managed \
				-row $i -column 1 \
				-columns 8 \
				-maxLength 8]
		$_GW_advEfs($handle,$item) modifyVerifyCallback \
			"tfu:onlyIntsCb %w %ptr %length %startPos %endPos %doit"
		incr i
	}
	$_GW_advEfs($handle,XFS_FS_DUMP_FREQ) setValues \
			-columns 2 -maxLength 2 \
			-resizeHorizontal false
	$_GW_advEfs($handle,XFS_FS_OPTS_FSCK) setValues \
			-columns 2 -maxLength 2 \
			-resizeHorizontal false

	$rc manageChild
	$grid columnResizable 0 false
	$grid manageChild


	return $panel
}
