#         OpenPBS (Portable Batch System) v2.3 Software License
# 
# Copyright (c) 1999-2000 Veridian Information Solutions, Inc.
# All rights reserved.
# 
# ---------------------------------------------------------------------------
# For a license to use or redistribute the OpenPBS software under conditions
# other than those described below, or to purchase support for this software,
# please contact Veridian Systems, PBS Products Department ("Licensor") at:
# 
#    www.OpenPBS.org  +1 650 967-4675                  sales@OpenPBS.org
#                        877 902-4PBS (US toll-free)
# ---------------------------------------------------------------------------
# 
# This license covers use of the OpenPBS v2.3 software (the "Software") at
# your site or location, and, for certain users, redistribution of the
# Software to other sites and locations.  Use and redistribution of
# OpenPBS v2.3 in source and binary forms, with or without modification,
# are permitted provided that all of the following conditions are met.
# After December 31, 2001, only conditions 3-6 must be met:
# 
# 1. Commercial and/or non-commercial use of the Software is permitted
#    provided a current software registration is on file at www.OpenPBS.org.
#    If use of this software contributes to a publication, product, or
#    service, proper attribution must be given; see www.OpenPBS.org/credit.html
# 
# 2. Redistribution in any form is only permitted for non-commercial,
#    non-profit purposes.  There can be no charge for the Software or any
#    software incorporating the Software.  Further, there can be no
#    expectation of revenue generated as a consequence of redistributing
#    the Software.
# 
# 3. Any Redistribution of source code must retain the above copyright notice
#    and the acknowledgment contained in paragraph 6, this list of conditions
#    and the disclaimer contained in paragraph 7.
# 
# 4. Any Redistribution in binary form must reproduce the above copyright
#    notice and the acknowledgment contained in paragraph 6, this list of
#    conditions and the disclaimer contained in paragraph 7 in the
#    documentation and/or other materials provided with the distribution.
# 
# 5. Redistributions in any form must be accompanied by information on how to
#    obtain complete source code for the OpenPBS software and any
#    modifications and/or additions to the OpenPBS software.  The source code
#    must either be included in the distribution or be available for no more
#    than the cost of distribution plus a nominal fee, and all modifications
#    and additions to the Software must be freely redistributable by any party
#    (including Licensor) without restriction.
# 
# 6. All advertising materials mentioning features or use of the Software must
#    display the following acknowledgment:
# 
#     "This product includes software developed by NASA Ames Research Center,
#     Lawrence Livermore National Laboratory, and Veridian Information
#     Solutions, Inc.
#     Visit www.OpenPBS.org for OpenPBS software support,
#     products, and information."
# 
# 7. DISCLAIMER OF WARRANTY
# 
# THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. 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 SHALL VERIDIAN CORPORATION, ITS AFFILIATED COMPANIES, OR THE
# U.S. GOVERNMENT OR ANY OF ITS AGENCIES BE LIABLE FOR ANY DIRECT OR 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
}
