#!/bin/sh
#
#  XNewtl!  Newton/UNIX Communication System GUI!
#  Copyright (C) 1996-1997  A. E. Hall
#
#  This program is free software; you can redistribute it and/or modify
#  it under the terms of the GNU General Public License as published by
#  the Free Software Foundation; either version 2 of the License, or
#  (at your option) any later version.
#
#  This program is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#  GNU General Public License for more details.
#
#  You should have received a copy of the GNU General Public License
#  along with this program; if not, write to the Free Software
#  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#

#  $Id: xnewtl,v 1.4 1997/09/09 22:09:31 spoonman Exp $

# the next line restarts using wish \
exec wish "$0" "$@"

# The default options!
# Newton
set OPTdevice "/dev/newton"
# Baud Rate
set OPTbaudRate "9600"
# "menu" or "buttons" for displaying buttons on main window
set OPTdisplay "buttons"

# The version number!
set xnewtlVersion "1.60"


  # center a window
  proc centerWin { win } \
    {
    wm withdraw $win
    update idletasks
    set x [expr [winfo screenwidth $win]/2 - [winfo reqwidth $win]/2 \
            - [winfo vrootx [winfo parent $win]]]
    set y [expr [winfo screenheight $win]/2 - [winfo reqheight $win]/2 \
            - [winfo vrooty [winfo parent $win]]]
    wm geom $win +$x+$y
    wm deiconify $win
    update
    }

  # file selection box
  proc fileSelection {} \
    {
    global xnewtlVersion tkPriv

    toplevel .file -class Dialog
    wm title .file "XNewtl v$xnewtlVersion Install Package"
    wm iconname .file "XNewtl v$xnewtlVersion Install Package" 
    grab set .file

    frame .file.package
      label .file.package.label -text "Newton Package:"
      entry .file.package.entry -width 20 -relief sunken
      pack .file.package.label .file.package.entry -side left -expand 1

    frame .file.savcanc
      frame .file.defaultButton -relief sunken -bd 1
        button .file.save -text "Install Package" \
          -command "set tkPriv(button) set"
        raise .file.save
        pack .file.save -in .file.defaultButton -padx 2m -pady 2m
      # cancel button
      button .file.cancel -text "Cancel" -command "destroy .file"
      pack .file.defaultButton .file.cancel -in .file.savcanc -side left \
        -padx 1m

    pack .file.package .file.savcanc -padx 2m -pady 2m
    centerWin .file
    focus .file.package.entry

    tkwait variable tkPriv(button)
    set package none
    set package [.file.package.entry get]

    destroy .file
    return $package
    }

  # what to do when exiting xnewtl
  proc exitXnewtl {} \
    {
    exit
    }

  # read the setup file
  proc readSetup {} \
    {
    global OPTdevice OPTbaudRate OPTdisplay env

    if [file exists $env(HOME)/.xnewtlrc] \
      {
      set file [open $env(HOME)/.xnewtlrc r]
      while {[gets $file line] >= 0} \
        {
        if [regexp "^dev=" $line] \
          {
          regsub "dev=" "$line" "" OPTdevice
          }
        if [regexp "^baud=" $line] \
          {
          regsub "baud=" "$line" "" OPTbaudRate
          }
        if [regexp "^display=" $line] \
          {
          regsub "display=" "$line" "" OPTdisplay
          }
        }
      close $file
      }
    }

  # save the xnewtl setup
  proc saveSetup {} \
    {
    global xnewtlVersion OPTdevice OPTbaudRate OPTdisplay env

    set OPTdevice [.setup.device.entry get]

    set file [open $env(HOME)/.xnewtlrc w]
    puts $file "# XNewtl v$xnewtlVersion setup"
    puts $file "#"
    puts $file "dev=$OPTdevice"
    puts $file "baud=$OPTbaudRate"
    puts $file "display=$OPTdisplay"
    close $file
    }

  # display the setup window
  proc setupXnewtl {} \
    {
    global xnewtlVersion OPTdevice OPTbaudRate OPTdisplay

    toplevel .setup -class Dialog
    wm title .setup "XNewtl v$xnewtlVersion Setup"
    wm iconname .setup "XNewtl v$xnewtlVersion Setup"
    grab set .setup

    # newtl device entry
    frame .setup.device
      label .setup.device.label -text "Newton Device:"
      entry .setup.device.entry -width 20 -relief sunken
        .setup.device.entry insert 0 "$OPTdevice"
      pack .setup.device.label .setup.device.entry -side left -expand 1
    
    # baud rate radiobuttons 
    frame .setup.baud
      label .setup.baud.label -text "Baud Rate:"
      pack .setup.baud.label -side top
      foreach rate { 2400 9600 19200 38400 57600 } \
        {
        radiobutton .setup.baud.$rate -text "$rate" \
          -variable OPTbaudRate -relief flat -value $rate
        pack .setup.baud.$rate -side top -anchor w
        if { $rate == $OPTbaudRate } \
          {
          .setup.baud.$rate invoke
          }
        }

    # Buttons or menu?
    frame .setup.display
      label .setup.display.label -text "Newton Commands:"
      pack .setup.display.label -side top
      foreach option { buttons menu } \
        {
        radiobutton .setup.display.$option -text "$option" \
          -variable OPTdisplay -relief flat -value $option
        pack .setup.display.$option -side top -anchor w
        if { $option == $OPTdisplay } \
          {
          .setup.display.$option invoke
          }
        }

    # sunken save button
    frame .setup.savcanc
      frame .setup.defaultButton -relief sunken -bd 1
        button .setup.save -text "Save Setup" \
          -command "saveSetup ; destroy .setup"
        raise .setup.save
        pack .setup.save -in .setup.defaultButton -padx 2m -pady 2m
      # cancel button
      button .setup.cancel -text "Cancel" -command "destroy .setup"
      pack .setup.defaultButton .setup.cancel -in .setup.savcanc -side left \
        -padx 1m

    pack .setup.device .setup.baud .setup.display \
      .setup.savcanc -side top -expand 1 -padx 2m -pady 2m

    centerWin .setup
    focus .setup.device.entry
    }

  # Run newtl commands 
  proc newtlCommand { command } \
    {
    global OPTdevice OPTbaudRate

    set msg "Invalid newtl command!"
   
    # decide which options to give newtl and which
    # message to display
    switch $command \
      {
      email
        {
        set msg "Snagging Email from Newton...";
        set cmd "-e"
        }
      fax
        {
        set msg "Faxing from Newton...";
        set cmd "-f"
        }
      print
        {
        set msg "Printing from Newton...";
        set cmd "-p"
        }
      install
        {
        set file [fileSelection]
        set msg "Installing package $file on Newton...";
        set cmd "-l $file"
        }
      }

    # create a little popup window
    toplevel .msgWin -class Dialog
    wm title .msgWin "XNewtl"
    wm iconname .msgWin "XNewtl"
    grab set .msgWin
    label .msgWin.label -text $msg
    pack .msgWin.label -side top

    centerWin .msgWin

    # run newtl!
    exec newtl -d $OPTdevice -b $OPTbaudRate $cmd

    # get rid of the message window
    destroy .msgWin
    }

  # show cool information
  proc aboutXnewtl {} \
    {
    global xnewtlVersion

    after idle { .aboutXnewtl.msg configure -wraplength 6i }
    tk_dialog .aboutXnewtl "About XNewtl v$xnewtlVersion" \
      "XNewtl v$xnewtlVersion is a GUI for Newtl!\n\n\
      See the following URL for more information:
      http://www.tcel.com/~aehall/newtl/\n\n\
      or email aehall@netcom.com\n\n\
      RCS Id:\n\
      \$Id: xnewtl,v 1.4 1997/09/09 22:09:31 spoonman Exp $\n\n\
      Copyright (C) 1997 A. E. Hall" \
      info 0 OK
    }


#############################################################
#############################################################
####
#### MAIN STUFF
####


# let's get the setup
readSetup

# create the menu bar
frame .menuBar -relief raised -bd 2
  menubutton .menuBar.xnewtl -text "Xnewtl" -menu .menuBar.xnewtl.m \
    -underline 0
  menu .menuBar.xnewtl.m
    .menuBar.xnewtl.m add command -label "Setup..." -underline 0 -command \
      { setupXnewtl }
    .menuBar.xnewtl.m add separator
    .menuBar.xnewtl.m add command -label "About..." -underline 0 -command \
      { aboutXnewtl }
    .menuBar.xnewtl.m add separator
    .menuBar.xnewtl.m add command -label "Exit" -command "exit" -underline 0 \
      -command { exitXnewtl }
  pack .menuBar.xnewtl -in .menuBar -side left
  pack .menuBar -side top -fill x

  if { $OPTdisplay == "menu" } \
    {
    menubutton .menuBar.newton -text "Newton" -menu .menuBar.newton.m \
      -underline 0
    menu .menuBar.newton.m
      .menuBar.newton.m add command -label "Snag Email" -underline 6 -command \
        { newtlCommand email }
      .menuBar.newton.m add command -label "Fax Queue" -underline 0 -command \
        { newtlCommand fax }
      .menuBar.newton.m add command -label "Print Queue" -underline 0 -command \
        { newtlCommand print }
      .menuBar.newton.m add command -label "Install Package" -underline 0 \
        -command { newtlCommand install }
    pack .menuBar.newton -in .menuBar -side left
    } \
  else \
    {
    frame .buttons
    button .buttons.email -text "Snag Email" -command { newtlCommand email }
    button .buttons.fax -text "Fax Queue" -command { newtlCommand fax }
    button .buttons.print -text "Print Queue" -command { newtlCommand print }
    button .buttons.install -text "Install Package" \
      -command { newtlCommand install }
    pack .buttons.email .buttons.fax .buttons.print .buttons.install \
      -in .buttons -side top -fill x
    pack .buttons -side top -fill x
    }

wm title . "XNewtl v$xnewtlVersion"
wm iconname . "XNewtl v$xnewtlVersion"


