#         Portable Batch System (PBS) Software License
# 
# Copyright (c) 1999, MRJ Technology Solutions.
# All rights reserved.
# 
# Acknowledgment: The Portable Batch System Software was originally developed
# as a joint project between the Numerical Aerospace Simulation (NAS) Systems
# Division of NASA Ames Research Center and the National Energy Research
# Supercomputer Center (NERSC) of Lawrence Livermore National Laboratory.
# 
# Redistribution of the Portable Batch System Software and use in source
# and binary forms, with or without modification, are permitted provided
# that the following conditions are met:
# 
# - Redistributions of source code must retain the above copyright and
#   acknowledgment notices, this list of conditions and the following
#   disclaimer.
# 
# - Redistributions in binary form must reproduce the above copyright and 
#   acknowledgment notices, this list of conditions and the following
#   disclaimer in the documentation and/or other materials provided with the
#   distribution.
# 
# - All advertising materials mentioning features or use of this software must
#   display the following acknowledgment:
# 
#   This product includes software developed by NASA Ames Research Center,
#   Lawrence Livermore National Laboratory, and MRJ Technology Solutions.
# 
#         DISCLAIMER OF WARRANTY
# 
# THIS SOFTWARE IS PROVIDED BY MRJ TECHNOLOGY SOLUTIONS ("MRJ") "AS IS" WITHOUT 
# WARRANTY OF ANY KIND, AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
# BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
# FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT ARE EXPRESSLY DISCLAIMED.
# 
# IN NO EVENT, UNLESS REQUIRED BY APPLICABLE LAW, SHALL MRJ, NASA, NOR
# THE U.S. GOVERNMENT BE LIABLE FOR ANY DIRECT DAMAGES WHATSOEVER,
# NOR ANY INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# 
# This license will be governed by the laws of the Commonwealth of Virginia,
# without reference to its choice of law rules.

###############################################################################
# buildCmdButtons: creates a row or column of command buttons on 'frame_name' 
#	following the arrangement specified in 'cmdbutton_list'.
#
# INPUT FORMATS:
#	'cmdbutton_list' - 
#		{ {group1_button1_name group1_button1_label group1_button1_assoc}
#		  {group1_button2_name group1_button2_label group1_button1_assoc}
#		   . . . }
#		{ {group2_button1_name group2_button1_label group2_button1_assoc}
#		  {group2_button2_name group2_button2_label group2_button1_assoc}
#		   . . . }
#		}
#		
#	'orient' - how the group of cmd buttons are to be arranged: x (lie in
#		a horizontal line), y (line in a vertical line), xy (row of columned
#		buttons).
#	'spacing' - amount of spacing between groups of checkbuttons (in Get_Pixels
#		    format).
#       'button_width'      - the width of a command button (in Get_Pixels format)
#        'button_height'     - the height of a command button(in Get_Pixels format)
# OPTIONS:
#        'first_group_spacing' - an optional boolean value that says to put
#                             a button spacing before the 1st group of buttons
#	'spread_out_buttons' - if 1 (true), then the buttons will be spread out
#                            in the frame
#	'group_spacing'	   - spacing between groups of cmd buttons.
#	'cmdbutton_labelstr' - if the entire groups of cmdbuttons are to be given one
#		 label string.
###############################################################################
proc buildCmdButtons {frame_name cmdbutton_list orient spacing button_width\
                      button_height {first_group_spacing 0} \
                      {spread_out_buttons 1} {group_spacing "10m"} \
		      {cmdButton_labelstr ""} {place_buttonAssoc_right 1} \
		      {place_labelstr_top 0} {button_assoc_groove_relief 0} } {
  global canvas

  set procname "buildCmdboxes"


## Let's be defensive about the input
  if { ![regexp "\\." $frame_name] || \
        ([string compare $orient "x"] != 0 &&   \
         [string compare $orient "y"] != 0 &&   \
         [string compare $orient "xy"] != 0) || \
	 ![regexp "\[0-9]+" $button_width]  ||  \
	 ![regexp "\[0-9]+" $button_height] } {
        puts "Error $BADPARAM in \{$procname $frame_name\}: $errmsg(BADPARAM)"
        exit $BADPARAM
  }
  
  if { [string compare $frame_name "."] == 0 } {
       set frame_name ""	
  }
  if { [string compare $cmdButton_labelstr ""] != 0 } {
    message $frame_name.clabel -text $cmdButton_labelstr \
            -aspect 1000
    pack $frame_name.clabel -side top -anchor nw
  }

  if {$spread_out_buttons} {
    pack forget $frame_name
    pack $frame_name -fill both -expand 1 -ipadx 5m -ipady 5m
  }

  set i 1
  set allButtonsList ""
  foreach group [lrange $cmdbutton_list 0 end] {
    frame $frame_name.$i -class Plain

    set buttonList ""
    foreach button_entry $group {
      set buttonName  [lindex $button_entry 0]
      set buttonLabel [lindex $button_entry 1]
      set buttonAssoc [lindex $button_entry 2]

      if {[string compare $buttonAssoc ""] != 0} {
 
        if {$button_assoc_groove_relief} {  
	  frame $frame_name.$i.f$buttonName -relief groove -borderwidth 2 -bg blue
        } else {
	  frame $frame_name.$i.f$buttonName -class Plain
        }
        button $frame_name.$i.f$buttonName.$buttonName -anchor nw \
		    -text $buttonLabel -width $button_width \
		    -relief raised -borderwidth 2 \
		    -height $button_height -padx 1 -pady 1

	if {$place_buttonAssoc_right} {
	  pack $frame_name.$i.f$buttonName.$buttonName -side left -anchor nw \
		-side left -anchor nw -fill x

	} else {
	  pack $frame_name.$i.f$buttonName.$buttonName -side top -anchor nw \
		-side top -anchor nw -fill y
	}

        pack forget $buttonAssoc
	if { $place_buttonAssoc_right } {
          pack $buttonAssoc -in $frame_name.$i.f$buttonName -side right \
		-anchor nw -fill x
        } else {
          pack $buttonAssoc -in $frame_name.$i.f$buttonName -side bottom \
		-anchor nw -fill y
        }
        raise $buttonAssoc $frame_name.$i.f$buttonName
        append buttonList " " $frame_name.$i.f$buttonName
        append allButtonsList " " $frame_name.$i.f$buttonName.$buttonName
      } else {	
	button $frame_name.$i.$buttonName -anchor c \
                  -text $buttonLabel -width $button_width \
		  -relief raised -borderwidth 2 \
		  -height $button_height -padx 1 -pady 1

	append buttonList " " $frame_name.$i.$buttonName
	append allButtonsList " " $frame_name.$i.$buttonName
      }	
    }

    if { [string compare $orient "y"] == 0 } {  
	eval pack "$buttonList" -side top -anchor nw -pady $spacing
    } else {
	eval pack "$buttonList" -side left -anchor c -padx $spacing -expand 1
    }
    if {$i == 1 && $first_group_spacing} {   ;# put an extra spacing before 1st
      label $frame_name.empty$i -width $button_width -height $button_height \
	    -padx 1 -pady 1

      if { [string compare $orient "x"] == 0 } {

	if {$spread_out_buttons} {
          eval pack "$frame_name.empty$i $frame_name.$i" -anchor c \
	            -expand 1 -fill both
        } else {
          eval pack "$frame_name.empty$i $frame_name.$i" -anchor c 
        }

      } else {
	if {$spread_out_buttons} {
          eval pack "$frame_name.empty$i $frame_name.$i" -side top -anchor c \
		-fill both -expand 1
	} else {
          eval pack "$frame_name.empty$i $frame_name.$i" -side top -anchor c
	}
      }
    } elseif { [expr $i % 2] == 0 } {	   ;# space even number buttons
      if { [string compare $orient "x"] == 0 } {
	if {$spread_out_buttons} {
          eval pack "$frame_name.$i" -padx $group_spacing  -side left -anchor c \
	             -fill both -expand 1
        } else {
          eval pack "$frame_name.$i" -padx $group_spacing -side left -anchor c
        }
      } else {
	if {$spread_out_buttons} {
          eval pack "$frame_name.$i" -pady $group_spacing -side top -anchor c \
	            -fill both -expand 1
	} else {
          eval pack "$frame_name.$i" -pady $group_spacing -side top -anchor c
        }
      }
    } else {
      if { [string compare $orient "x"] == 0 } {
	if {$spread_out_buttons} {
          eval pack "$frame_name.$i" -side left -anchor c -fill both -expand 1
	} else {
          eval pack "$frame_name.$i" -side left -anchor c
	}
      } else {
	if {$spread_out_buttons} {
          eval pack "$frame_name.$i" -side top -anchor c -fill both -expand 1
        } else {
          eval pack "$frame_name.$i" -side top -anchor c
        }
      }
    }

    incr i
  }
  if {[string compare $cmdButton_labelstr ""] != 0} {
    return [concat $frame_name $allButtonsList $frame_name.clabel]
  } else {
    return [concat $frame_name $allButtonsList]
  }
}

# disable_button: disables a command button.
proc disable_button button_name {
  global sysinfo

  set state [lindex [$button_name configure -state] 4]

  if {[string compare $state "disabled"] == 0} {
    return		;# ignore if already disabled
  }

  $button_name configure -state disabled
}

# enable_button: enables a command button.
proc enable_button button_name {

  $button_name configure -state normal
}
