#! /usr/dt/bin/dtksh
#####################################################################
###
###  (c) Copyright 1994, 1995 TriTeal Corporation
###  (c) Copyright 1993, 1994, 1995 Hewlett-Packard Company
###  (c) Copyright 1993, 1994, 1995 International Business Machines Corp.
###  (c) Copyright 1993, 1994, 1995 Sun Microsystems, Inc.
###  (c) Copyright 1993, 1994, 1995 Novell, Inc.
###
#####################################################################
###  File:              dtlp
###
###  Default Location:  /usr/dt/bin/dtlp
###
###  Purpose:           Set up print spooler options and print.
###
###  Description:       This shell script provides a graphical interface
###                     for a print spooler dialog by default.   If
###                     DTPRINTSILENT is "true", however, then it processes
###                     the file and directly invokes "lp".
###
###  Invoked by:        The default Print action or custom print actions.
###
###  Product:           @(#)TED 4.2 15-4200, dtlp 1.00
###                    (c) Copyright 1994  TriTeal Corporation
###
###  Note:              Please do not modify this file.
###                     Later product updates will overwrite this file.
###
###  Revision:          $XConsortium: dtlp.src /main/cde1_maint/3 1995/10/06 08:56:52 lehors $
###
#####################################################################


#####################################################################
# BUGFIX:  Porting of this script did not take into consideration
#          the differences of 'lp' and 'lpr' options.  Linux uses
#          'lpr' and functionality of this script has had the
#          changes made to fix this problem.
#
# FIXED:   August 20th 1997, Lefteris Tsintjeli  [email protected]
#
# TESTED:  Red Hat confirmed fix on August 25, 1997
#          [email protected]
#####################################################################

set -u

##################################################################
#
#  Following are the environmental options we support
#
##################################################################

# LPDEST
# DTPRINTCWD
# DTPRINTFILEREMOVE
# DTPRINTSILENT
# DTPRINTTESTOUTPUT
# DTPRINTUSERFILENAME

##################################################################
###  Internal Globals
###
###  Actually, most variables in this script are global.
###
###  Most are defined in the Initialize() routine.
###
##################################################################
COMMAND_NAME=dtlp


PATH=/bin:/usr/bin

export PATH

#
# Add /usr/dt/lib/nls/msg/%L/%N.cat to NLSPATH
#
NLSPATH=/usr/dt/lib/nls/msg/%L/%N.cat:$NLSPATH
export NLSPATH

#
# Exit/Return codes
#
CANCEL_EXIT=-1
SUCCESS=0
NO_PRINT_MESSAGE=1
USAGE_EXIT=2
NO_FILE_ERR=3
NO_INIT_FILE_ERR=4
NO_REGULAR_FILE_ERR=5
NO_READ_FILE_ERR=6

failure_flag=$SUCCESS

#
# For string processing
#
DOUBLE_QUOTE=\"
SINGLE_QUOTE=\'
MINUS_T="-T"

##################################################################
###  Initialize()
###
###         Set a number of key variables to their defaults.
###
###         Examples
###         ----------------------
###            File to print:                     Stdin
###            Formatted printing:                True
###            Number of copies:                  1
###
##################################################################
Initialize()
{
   typeset -u Uppercase_string

   LPOPTIONS=""

   format_flag=0

   print_page_allowed=1

#
#  Assume print file is stdin, unless told otherwise...
#
   print_file="-"
   print_file_flag=1

   simple_file_name=""

   print_man=""
   print_man_flag=0

   print_cwd=""
   print_cwd_flag=0

   print_raw_flag=0

   silent_flag=0

   remove_flag=0

   verbose_flag=0

   lpdest_flag=0
   lpdest=""

   banner_title_flag=0
   banner_title=""

   other_options_flag=0
   other_options=""

   print_command_flag=0


   print_command=lpr



   copy_count_flag=0
   copy_count="1"

   test_flag=0
   test_output_file=""

   user_filename_flag=0
   user_filename=""

   Uppercase_string=""

   copy_count_flag=0
   copy_count="1"

   CAT_MESG_STRING=""

   catopen CAT_ID $COMMAND_NAME

   SetPreEnvironment

}

##################################################################
###  ReconcileOptions()
###
###       Arbitrate when there are two or more conflicting
###       print options.
###
##################################################################
ReconcileOptions()
{
#
# The RAW option takes precedence over all others.
#
   if (( $print_raw_flag ))
   then
       format_flag=0
       print_man_flag=0
       print_page_allowed=0
#
# Next, this MAN option comes into play
#
   elif (( $print_man_flag ))
   then
       format_flag=0
       print_page_allowed=0

   fi

}

##################################################################
###  DoParameterCollectionSilent()
###
###       Collect the silent lp options, mimicking the GUI
###       collection process.
###
##################################################################
DoParameterCollectionSilent()
{
   if (( $lpdest_flag ))
   then
        LPOPTIONS=-P${lpdest}" "
   fi

   if (( $banner_title_flag ))
   then
     LPOPTIONS=${LPOPTIONS}${MINUS_T}${SINGLE_QUOTE}${banner_title}${SINGLE_QUOTE}" "
   fi

   if (( $copy_count_flag ))
   then
      LPOPTIONS=${LPOPTIONS}"-#${copy_count} "
   fi

   if (( $other_options_flag ))
   then
      LPOPTIONS=${LPOPTIONS}"${other_options} "
   fi

   if (( $verbose_flag ))
   then
       echo Options are $LPOPTIONS
   fi
}


##################################################################
###  EchoTestOptions()
###
###         Echo all the command settings.
###          If dtlp is run stand-alone, the invoker may redirect
###          the test output to a log file. Under the test harness
###          this is done automatically by the "record" function.
###
##################################################################
EchoLpSetupOptions()
{
       if (( $remove_flag ))
       then
               echo Remove file flag is SET.
       fi
       if (( $print_man_flag ))
       then
               echo Manpage flag is SET.
       fi
       if (( $print_raw_flag ))
       then
               echo Raw print flag is SET.
       fi
       if (( $print_cwd_flag ))
       then
               echo Print working directory is $print_cwd.
       fi
       if (( $print_page_allowed ))
       then
               echo Page printing is allowed.
       else
               echo Page printing is NOT allowed.
       fi
       if (( $format_flag ))
       then
               echo Format flag is SET.
       fi
       if (( $silent_flag ))
       then
               echo Silent flag is SET.
       fi
       if (( $user_filename_flag ))
       then
               echo User-visible filename is \"$user_filename\".
       fi
       if (( $verbose_flag ))
       then
               echo Verbose flag is SET.
       fi
       if (( $other_options_flag ))
       then
               echo Other options include \"$other_options\".
       fi
}


##################################################################
###  PostErrorDialog()
###
###         Bring up an error dialog, using the first argument
###         to the function as the error message.
###
##################################################################
PostErrorDialog()
{
       catgets CAT_MESG_STRING $CAT_ID 1 150 "Print Error"

       DtDisplayErrorDialog "$CAT_MESG_STRING" "$1"                 DIALOG_PRIMARY_APPLICATION_MODAL

       XtMainLoop
}


##################################################################
###  PrintIt()
###
###         Do the actual spooling, based on the value of LPOPTIONS.
###
###         If possible, log the results.
##################################################################
PrintIt()
{
   if (( $banner_title_flag ))
   then
       PAGEHEADER="$banner_title"
   elif (( $user_filename_flag ))
   then
       PAGEHEADER="$user_filename"
   else
       PAGEHEADER=$print_file
   fi

   if (( $print_cwd_flag )) && [[ (-d $print_cwd) && (-x $print_cwd) ]]
   then
       cd $print_cwd
   fi

   if (( $test_flag ))
   then
       # then don't do any printing--instead log the results

       EchoLpSetupOptions
       echo ""
       echo "Command that will be invoked is..."
       INVOKER='echo'
   else
       INVOKER='sh -c'
   fi

   if (( $print_raw_flag ))
   then

       # Nothing special is required for raw mode on this platform.
       LPOPTIONS="${LPOPTIONS}"

   fi

   if (( $format_flag ))
   then
       $INVOKER "cat $print_file | pr -f -h ${PAGEHEADER} | ${print_command} ${LPOPTIONS}"

   elif (( $print_man_flag ))
   then

       $INVOKER "cat $print_file | tbl | nroff -man | col | ${print_command} ${LPOPTIONS}"


   else
       if [ $print_file = "-" ]
       then
           $INVOKER "cat $print_file | ${print_command} ${LPOPTIONS}"
       else
           $INVOKER "${print_command} ${LPOPTIONS} $print_file"
       fi

#
# Check status of the print command.  Show error dialog on failure
#
       if [ $? -ne 0 ]
       then
               catgets TEMP_MESG_STRING $CAT_ID 1 140                 "Print failed, please check input parameters and printer status"

               PostErrorDialog "$TEMP_MESG_STRING"
       fi

   fi
}

##################################################################
###  Cleanup()
###
###         End the show
##################################################################
Cleanup()
{
   if [ $remove_flag -eq 1 -a $print_file != "-" ]
   then
       rm -f $print_file
   fi

   if (( $verbose_flag ))
   then
       PrintEndLog
   fi
}

##################################################################
###  CheckOptions()
###
###         Ensure that the necessary minimum parameters are
###         supplied.
###
##################################################################
CheckOptions() {

   if (( $print_file_flag == 0 ))
   then
       failure_flag=1
       echo Sorry--missing a file name to print.
   fi

   if (( $failure_flag ))
   then
       if (( $verbose_flag ))
       then
           PrintEndLog
       fi
       Exit $NO_FILE_ERR
   fi
}

##################################################################
###  CheckValidFile()
###
###         Ensure that the supplied file name references a
###         valid file.
###
###         Returns true or false.
##################################################################
CheckValidFile() {
       if [[ $1 == "-" ]]
       then
               return $SUCCESS
       fi

       if [[ ! -f $1 ]]
       then
               return $NO_REGULAR_FILE_ERR
       fi
       if [[ ! -r $1 ]]
       then
               return $NO_READ_FILE_ERR
       fi
       return $SUCCESS
}


##################################################################
###  PrintStartLog()
###
###         Print the start of the log
###
##################################################################
PrintStartLog() {
   print "$COMMAND_NAME..."
   print ""
}

##################################################################
###  PrintEndLog()
###
###         Print the values of the variables.
###
##################################################################
PrintEndLog() {
   print ""
   if (( $failure_flag ==0 ))
   then
       print "...successfully completed."
   else
       print "...completed unsuccessfully."
   fi
   print ""
}

##################################################################
###  PrintUsage()
###
###        Print a usage message.
###
##################################################################
PrintUsage() {
   print ""
   print "Usage: $COMMAND_NAME  [-b <banner_title>] [-d <lpdest>]"
   print "             [-m <print_command>] [-n <copy_count>]"
   print "             [-o <other_options>] [-u <user_filename>]"
   print "             [-a] [-e] [-h] [-r] [-s] [-v] [-w]"
   print "             <print_file>"
   print "  where:"
   print ""
   print "  <banner_title>"
   print "      Specifies the title to put on the banner page."
   print ""
   print "  <lpdest>"
   print "      Specifies the printer name as known to the lp spooler."
   print ""
   print "  <print_command>"
   print "      Specifies the command with which to invoke the printer."
   print ""
   print "  <copy_count>"
   print "      Specifies the number of copies to print."
   print ""
   print "  <other_options>"
   print "      Specifies the other print options."
   print ""
   print "  <user_filename>"
   print "      Specifies the title of the file to display to the user."
   print ""
   print "  -a"
   print "      Formats the file with "man" before printing."
   print ""
   print "  -e"
   print "      Removes the file after printing."
   print ""
   print "  -h"
   print "      Displays this help message."
   print ""
   print "  -r"
   print "      Formats the file with "pr -f" before printing."
   print ""
   print "  -s"
   print "      Prints silently (no dialog box)."
   print ""
   print "  -v"
   print "      Directs verbose messages to standard output."
   print ""
   print "  -w"
   print "      Prints the data raw (uninterpreted)."
   print ""
   print "  <print_file>"
   print "      Specifies the file name to print."

}

##################################################################
###  Exit()
###
###     All exits should go through this routine.
###
##################################################################
Exit() {
       exit $1
}

##################   GUI Callbacks  ####################

#
# This is the 'Help' callback; it will post a help dialog
#
DoHelp()
{

  DtkshDisplayQuickHelpDialog "dtlp_help" HELP_TYPE_TOPIC                             "Printmgr" "StartJobTA"

}

#
# This is the 'OK' callback; it will unpost the main application window,
# print to stdout the resulting string or to a printer, and then exit;
#
DoParameterCollection()
{

#
# We need the form to stick around until a successful
# print OR the user hits cancel, so "XtUnmanageChild $FORM" and
# "XSync $DISPLAY True" have been removed
#



#
# Need to clear this each time because if the printer device is "Default"
# the previous setting for LPOPTIONS remains
#
  LPOPTIONS=""


  XmTextGetString DEVICE_VAL $DEVICE
  XmTextGetString TITLE_VAL $TITLE
  XmTextGetString COPIES_VAL $COPIES

  if (( $other_options_flag == 0 ))
  then
       XmTextGetString COMMAND_OPTIONS_VAL $OPTIONS
  else
       COMMAND_OPTIONS_VAL=$other_options
  fi

  XtGetValues $PNUM_TOGGLE             set:PNUM_PRINT_VAL

  if [[ $PNUM_PRINT_VAL = "true" ]]
  then
       format_flag=1
  else
       format_flag=0
  fi

  catgets CAT_MESG_STRING $CAT_ID 1 10 "Default"

#  Strip any leading or trailing spaces
  DEVICE_VAL=${DEVICE_VAL##+( )}
  DEVICE_VAL=${DEVICE_VAL%%+( )}

  if [[ ("$DEVICE_VAL" != "") && "$DEVICE_VAL" != "$CAT_MESG_STRING" ]]
  then
     LPOPTIONS="-P"$DEVICE_VAL
  fi

#  Strip any leading or trailing spaces
  TITLE_VAL=${TITLE_VAL##+( )}
  TITLE_VAL=${TITLE_VAL%%+( )}
  if [ "$TITLE_VAL" != "" ] ; then
     if [ ${#LPOPTIONS} -gt 0 ] ; then
        LPOPTIONS=${LPOPTIONS}" "
     fi
     banner_title=${SINGLE_QUOTE}${TITLE_VAL}${SINGLE_QUOTE}
     banner_title_flag=1
     LPOPTIONS=${LPOPTIONS}${MINUS_T}${SINGLE_QUOTE}${TITLE_VAL}${SINGLE_QUOTE}
  fi

#  Strip any leading or trailing spaces
#  This should be validated, to make sure it is a valid integer.
  COPIES_VAL=${COPIES_VAL##+( )}
  COPIES_VAL=${COPIES_VAL%%+( )}
  if [ "$COPIES_VAL" != "" ] ; then
     if [ ${#LPOPTIONS} -gt 0 ] ; then
        LPOPTIONS=${LPOPTIONS}" "
     fi
      copy_count=$COPIES_VAL
      copy_count_flag=1
      LPOPTIONS=${LPOPTIONS}"-#$COPIES_VAL"
  fi

#  Strip any leading or trailing spaces
  COMMAND_OPTIONS_VAL=${COMMAND_OPTIONS_VAL##+( )}
  COMMAND_OPTIONS_VAL=${COMMAND_OPTIONS_VAL%%+( )}
  if  [ "$COMMAND_OPTIONS_VAL" != "" ]
  then
      LPOPTIONS=${LPOPTIONS}" $COMMAND_OPTIONS_VAL"
  fi

  if (( $verbose_flag ))
  then
       echo The LP options are \"${LPOPTIONS}\".
  fi

  PrintIt

  Cleanup

  Exit $failure_flag
}

#
# This is the callback for the 'Cancel' button.  It will send an empty
# string to stdout, and will then exit with a value of -1.
#
CancelPrint()
{
 echo ""
 Exit $CANCEL_EXIT
}

##################################################################
###  _DetermineColumns()
###
###         Determine the XmNcolumns value from the current LANG
###         ( This is AIX only )
###
##################################################################
_DetermineColumns()
{
 if [ ! -z "$LANG" ]
 then
     case $LANG in
               ja_JP | ja_JP.IBM-eucJP |                Ja_JP | Ja_JP.IBM-932   |                Jp_JP | Jp_JP.pc932     |                zh_TW | zh_TW.IBM-eucTW |                zh_CN | zh_CN.IBM-eucCN |                ZH_CN | ZH_CN.UTF-8     |                ko_KR | ko_KR.IBM-eucKR  )
                  return $2;;
               *)
                  return $1;;
     esac
 fi
 return $1
}

##################################################################
###  UseGui()
###
###         Create the Main UI and set up the callbacks.
###
##################################################################
UseGui()
{

       catgets CAT_MESG_STRING $CAT_ID 1 20 "Print"

       XmCreateFormDialog FORM $TOPLEVEL form

       XtSetValues $(XtParent "-" $FORM)                   title:"$CAT_MESG_STRING"
       #
       #  Ensure that we won't unmap when 'Help' is pressed.
       #  Our FORM widget is a subclass of XmBulletinBoard.
       #
       XtSetValues $FORM               autoUnmanage:False

       XtGetValues $FORM               foreground:FOREGROUND

       XtGetValues $FORM               background:BACKGROUND

       XtSetValues $FORM               noResize:True

       catgets CAT_MESG_STRING $CAT_ID 1 30 "File:"

       XtCreateManagedWidget FILE_LABEL file_label XmLabel $FORM           labelString:"${CAT_MESG_STRING}"        alignment:ALIGNMENT_BEGINNING           $(DtkshAnchorTop 15)            $(DtkshAnchorLeft 20)

       if (( $user_filename_flag ))
       then
           LABEL_STRING="${user_filename}"
       else
       #
       #  Remove all path components except the last.
       #
           simple_file_name=${print_file##*/}

           LABEL_STRING="${simple_file_name}"
       fi

       XtCreateManagedWidget PFILENAME pfilename XmLabel $FORM             labelString:"${LABEL_STRING}"           $(DtkshAnchorTop 15)            $(DtkshRightOf $FILE_LABEL 10)

       catgets CAT_MESG_STRING $CAT_ID 1 40 "Printer:"

       XtCreateManagedWidget DEVICE_LABEL device_label XmLabel $FORM       labelString:"$CAT_MESG_STRING"          $(DtkshUnder $FILE_LABEL 22)            $(DtkshAnchorLeft 20)

       #
       #  Decide the appropriate XmNcolumns
       #
       # XtCreateManagedWidget DEVICE device XmTextField $FORM         \#     columns:10       \#     $(DtkshUnder $FILE_LABEL 15)     \#     $(DtkshRightOf $DEVICE_LABEL 20)         \#     $(DtkshAnchorLeft 110)   \#     navigationType:EXCLUSIVE_TAB_GROUP
       _DetermineColumns 10 5
       _columns=$?
       XtCreateManagedWidget DEVICE device XmTextField $FORM       columns:"$_columns"             $(DtkshUnder $FILE_LABEL 15)            $(DtkshRightOf $DEVICE_LABEL 20)        $(DtkshFloatRight 50)           navigationType:EXCLUSIVE_TAB_GROUP

       catgets CAT_MESG_STRING $CAT_ID 1 50 "Default"

       DEFAULT_LP=${lpdest:-""}

       if [ "$DEFAULT_LP" != "" ]
       then
          XtSetValues $DEVICE          value:$DEFAULT_LP               cursorPosition:${#DEFAULT_LP}
       else
          XtSetValues $DEVICE          value:"$CAT_MESG_STRING"                cursorPosition:${#CAT_MESG_STRING}
       fi

       catgets CAT_MESG_STRING $CAT_ID 1 60 "Copies:"

       XtCreateManagedWidget COPIES_LABEL copies_label XmLabel $FORM           labelString:"$CAT_MESG_STRING"          $(DtkshUnder $FILE_LABEL 22)            $(DtkshRightOf $DEVICE 55)

       #
       #  Decide the appropriate XmNcolumns
       #
       # XtCreateManagedWidget COPIES copies XmTextField $FORM         \#      columns:4       \#      value:"${copy_count}"   \#      cursorPosition:${\#copy_count}  \#      $(DtkshUnder $FILE_LABEL 15)    \#      $(DtkshRightOf $COPIES_LABEL 15)        \#      $(DtkshAnchorRight 10)  \#      navigationType:EXCLUSIVE_TAB_GROUP
       _DetermineColumns 4 2
       _columns=$?
       XtCreateManagedWidget COPIES copies XmTextField $FORM           columns:"$_columns"             value:"${copy_count}"           cursorPosition:${#copy_count}           $(DtkshUnder $FILE_LABEL 15)            $(DtkshRightOf $COPIES_LABEL 15)                navigationType:EXCLUSIVE_TAB_GROUP

       catgets CAT_MESG_STRING $CAT_ID 1 70 "Banner Page Title:"

       XtCreateManagedWidget TITLE_LABEL title_label XmLabel $FORM             labelString:"$CAT_MESG_STRING"          $(DtkshUnder $DEVICE_LABEL 33)          $(DtkshAnchorLeft 20)

       #
       #  Decide the appropriate XmNcolumns
       #
       # XtCreateManagedWidget TITLE title XmTextField $FORM   \#      columns:10      \#      $(DtkshUnder $DEVICE_LABEL 25)  \#      $(DtkshRightOf $TITLE_LABEL 20)         \#      $(DtkshAnchorRight 10)  \#      navigationType:EXCLUSIVE_TAB_GROUP
       _DetermineColumns 10 5
       _columns=$?
       XtCreateManagedWidget TITLE title XmTextField $FORM             columns:"$_columns"             $(DtkshUnder $DEVICE_LABEL 25)          $(DtkshRightOf $TITLE_LABEL 20)                 $(DtkshAnchorRight 10)          navigationType:EXCLUSIVE_TAB_GROUP

       #
       # if banner_title is set, then use it as the default value
       #
       if (( $banner_title_flag ))
       then
          TEMP_VALUE=$banner_title

          XtSetValues $TITLE           value:"${TEMP_VALUE}"           cursorPosition:${#TEMP_VALUE}
       fi

       XtCreateManagedWidget SEP sep XmSeparator $FORM                 $(DtkshUnder $TITLE 10)                 $(DtkshSpanWidth)

       catgets CAT_MESG_STRING $CAT_ID 1 80 "Print Page Numbers"

       XtCreateManagedWidget PNUM_TOGGLE pnum_toggle XmToggleButton $FORM              $(DtkshUnder $SEP 8)            $(DtkshAnchorLeft 20)           labelString:"$CAT_MESG_STRING"          navigationType:EXCLUSIVE_TAB_GROUP

       if (( $print_page_allowed == 0 ))
       then
          XtSetValues $PNUM_TOGGLE             sensitive:"False"
       elif (( $format_flag ))
       then
          XtSetValues $PNUM_TOGGLE             set:"True"
       fi

       catgets CAT_MESG_STRING $CAT_ID 1 90 "Print Command Options:"

       XtCreateManagedWidget OPTIONS_LABEL options_label XmLabel $FORM                 labelString:"$CAT_MESG_STRING"          $(DtkshUnder $PNUM_TOGGLE 13)           $(DtkshAnchorLeft 20)

       #
       #  Decide the appropriate XmNcolumns
       #
       # XtCreateManagedWidget OPTIONS options XmTextField $FORM       \#      columns:20      \#      $(DtkshUnder $PNUM_TOGGLE 6)    \#      $(DtkshRightOf $OPTIONS_LABEL 20)       \#      $(DtkshAnchorRight 10)  \#      navigationType:EXCLUSIVE_TAB_GROUP
       _DetermineColumns 20 10
       _columns=$?
       XtCreateManagedWidget OPTIONS options XmTextField $FORM                 columns:"$_columns"             $(DtkshUnder $PNUM_TOGGLE 6)            $(DtkshRightOf $OPTIONS_LABEL 20)               $(DtkshAnchorRight 10)          navigationType:EXCLUSIVE_TAB_GROUP

       if (( $other_options_flag == 1 ))
       then
          XtSetValues $OPTIONS_LABEL           sensitive:"False"
          XtSetValues $OPTIONS                 sensitive:"False"
       fi

       XtCreateManagedWidget SEP1 sep XmSeparator $FORM                $(DtkshUnder $OPTIONS_LABEL 14)                 $(DtkshSpanWidth)

       catgets CAT_MESG_STRING $CAT_ID 1 100 "Print"

       XtCreateManagedWidget OK ok XmPushButton $FORM          labelString:"$CAT_MESG_STRING"          $(DtkshUnder $SEP1 5)           $(DtkshFloatLeft 10)            $(DtkshFloatRight 30)           $(DtkshAnchorBottom 5)

       XtAddCallback $OK activateCallback "DoParameterCollection"

       catgets CAT_MESG_STRING $CAT_ID 1 110 "Cancel"

       XtCreateManagedWidget CANCEL cancel XmPushButton $FORM          labelString:"$CAT_MESG_STRING"          $(DtkshUnder $SEP1 5)           $(DtkshFloatLeft 40)            $(DtkshFloatRight 60)           $(DtkshAnchorBottom 5)
       XtAddCallback $CANCEL activateCallback "CancelPrint"

       catgets CAT_MESG_STRING $CAT_ID 1 120 "Help"

       XtCreateManagedWidget HELP help XmPushButton $FORM              labelString:"$CAT_MESG_STRING"          $(DtkshUnder $SEP1 5)           $(DtkshFloatLeft 70)            $(DtkshFloatRight 90)           $(DtkshAnchorBottom 5)
       XtAddCallback $HELP activateCallback "DoHelp"

       #XtAddCallback $HELP activateCallback   \#       "DtkshDisplayQuickHelpDialog 'Using The Find Command' HELP_TYPE_FILE   \#      './Find.help' "

       XtSetValues $FORM               initialFocus:$OK                defaultButton:$OK               cancelButton:$CANCEL            navigationType:EXCLUSIVE_TAB_GROUP

       DtkshSetReturnKeyControls $DEVICE $TITLE $FORM $OK
       DtkshSetReturnKeyControls $TITLE $COPIES $FORM $OK

       XtManageChild $FORM


       XmInternAtom wm_delete_window $DISPLAY "WM_DELETE_WINDOW" False
       XmAddWMProtocolCallback $(XtParent "-" $FORM) $wm_delete_window            "CancelPrint"


       XtMainLoop

}

##################################################################
###  DoNoFileMessage()
###
###         We have determined that we have no valid file
###         to print.  Write out a message to that effect.
###
##################################################################
DoNoFileMessage()
{
   catgets CAT_MESG_STRING $CAT_ID 1 130 "Sorry--Unable to print:"

   GetNoFileMessageString

   print ""
   print `date`
   print "${CAT_MESG_STRING}"
   print ""
}

#
# This is the 'NoFile' callback.  It will exit the program.
#
NoFileCallback()
{
       Exit $NO_FILE_ERR
}

GetNoFileMessageString()
{
   catgets CAT_MESG_STRING $CAT_ID 1 130 "Sorry--Unable to print:"

   if (( $user_filename_flag ))
   then
       CAT_MESG_STRING=${CAT_MESG_STRING}"  \"$user_filename\"."
   else
       simple_file_name=${print_file##*/}

       CAT_MESG_STRING=${CAT_MESG_STRING}"  \"$simple_file_name\"."
   fi

   if (( $failure_flag == $NO_REGULAR_FILE_ERR ))
   then
       catgets TEMP_MESG_STRING $CAT_ID 1 132 "This is not a printable file or doesn't exist."
   elif (( $failure_flag == $NO_READ_FILE_ERR ))
   then
       catgets TEMP_MESG_STRING $CAT_ID 1 134 "You don't have permission to read that file."
   else
       catgets TEMP_MESG_STRING $CAT_ID 1 136 "Please check whether this file exists."
   fi

   CAT_MESG_STRING="${CAT_MESG_STRING}""
   ${TEMP_MESG_STRING}"
}

##################################################################
###  DoNoFileMessageGUI()
###
###         We have determined that we have no valid file
###         to print.  Post a dialog to that effect and exit
###         as a result.
###
###         Upon entry, check the failure_flag value for
###         the proper message to print.
###
##################################################################
DoNoFileMessageGui()
{

   XmCreateInformationDialog INFORMATION $TOPLEVEL information

   catgets CAT_MESG_STRING $CAT_ID 1 160 "Print Information"

   XtSetValues $(XtParent "-" $INFORMATION)            title:"$CAT_MESG_STRING"

   GetNoFileMessageString

   XtSetValues $INFORMATION        okCallback:"NoFileCallback"             messageString:"${CAT_MESG_STRING}"      noResize:True           defaultButtonType:DIALOG_OK_BUTTON      messageAlignment:ALIGNMENT_CENTER

    XtUnmanageChild $(XmMessageBoxGetChild "-" $INFORMATION     DIALOG_CANCEL_BUTTON)

    XtUnmanageChild $(XmMessageBoxGetChild "-" $INFORMATION     DIALOG_HELP_BUTTON)

   XtManageChild $INFORMATION


   XmInternAtom wm_delete_window $DISPLAY "WM_DELETE_WINDOW" False
   XmAddWMProtocolCallback $(XtParent "-" $INFORMATION) $wm_delete_window        "NoFileCallback"


   XtMainLoop
}

##################################################################
###  SetPreEnvironment()
###
###         Check the ENVIRONMENT values we care about, and
###         set the corresponding internal variable values.
###
##################################################################
SetPreEnvironment()
{
   if (( ${#LPDEST} ))
   then
       lpdest=$LPDEST
       lpdest_flag=1
   fi

   if (( ${#DTPRINTCWD} ))
   then
       print_cwd=$DTPRINTCWD
       print_cwd_flag=1
   fi

   if (( ${#DTPRINTFILEREMOVE} ))
   then
       # check for True
       Uppercase_string=$DTPRINTFILEREMOVE
       if [[ $Uppercase_string = "TRUE" ]]
       then
           remove_flag=1
       fi
       Uppercase_string=""
   fi

   if (( ${#DTPRINTSILENT} ))
   then
       # check for True
       Uppercase_string=$DTPRINTSILENT
       if [[ $Uppercase_string = "TRUE" ]]
       then
           silent_flag=1
       fi
       Uppercase_string=""
   fi

   if (( ${#DTPRINTUSERFILENAME} ))
   then
       user_filename=$DTPRINTUSERFILENAME
       user_filename_flag=1
   fi

   if (( ${#DTPRINTTESTOUTPUT} ))
   then
       test_output_file=$DTPRINTTESTOUTPUT
       test_flag=1
   fi

}

##################################################################
###  Main()
###
###  Set up and call either the silent or the GUI routines.
###
###
##################################################################

Initialize

while getopts b:d:m:n:o:u:aehrsvw argument
do
   case $argument in
           a)  print_man_flag=1
               ;;
           b)  banner_title=$OPTARG
               banner_title_flag=1
               ;;
           d)  lpdest=$OPTARG
               lpdest_flag=1
               ;;
           e)  remove_flag=1
               ;;
           h)  PrintUsage
               Exit $SUCCESS
               ;;
           m)  print_command=$OPTARG
               print_command_flag=1
               ;;
           n)  copy_count=$OPTARG
               copy_count_flag=1
               ;;
           o)  other_options=$OPTARG
               other_options_flag=1
               ;;
           r)  format_flag=1
               ;;
           s)  silent_flag=1
               ;;
           u)  user_filename=$OPTARG
               user_filename_flag=1
               ;;
           v)  verbose_flag=1
               ;;
           w)  print_raw_flag=1
               ;;
           \?) PrintUsage
               Exit $USAGE_EXIT
               ;;
   esac
done

((shift_positions = OPTIND - 1))

if (( $shift_positions < $# ))
then
#
# We have at least one remaining non-switch command line argument
#
       shift $shift_positions
       #
       # We assume that any remaining arguments constitute the
       # filename.
       # At some later point, may want to parse a list of filenames.
       #
       print_file=$*
       print_file_flag=1
fi

#
#  Make sure all these settings line up consistently.
#
ReconcileOptions

if (( $verbose_flag ))
then
   PrintStartLog
fi

#
#  Do we have enough information to do our job?
#  This step may cause us to exit.
#
CheckOptions

#
#  Have we been given a valid file?
#
CheckValidFile "$print_file"

failure_flag=$?


if (( $silent_flag ))
then
   if (( $failure_flag == $SUCCESS ))
   then
       DoParameterCollectionSilent

       PrintIt

       Cleanup

       Exit $failure_flag
   else
       DoNoFileMessage

       Exit $NO_FILE_ERR
   fi
else
   if [[ -r /usr/dt/lib/dtksh/DtFuncs.dtsh ]]
   then
       . /usr/dt/lib/dtksh/DtFuncs.dtsh
   else
       failure_flag=1
       echo Sorry--cannot find initialization file.
       Exit $NO_INIT_FILE_ERR
   fi

   XtInitialize TOPLEVEL printerConfig Dtlp "${@:-}"

   XtDisplay DISPLAY $TOPLEVEL

   if (( $failure_flag == $SUCCESS ))
   then
       UseGui
   else
       DoNoFileMessageGui
   fi
fi

#
#  Never reached.
#
#####################         eof       ##############################