#!/usr/local/tcl/bin/wish -f
#
# Program: printop2  Version 1.12
# Copyright by Olaf Gellert, 1995, 1996, 1997
# Olaf Gellert   <gellert@informatik.uni-hamburg.de>
#
# Tcl version: 7.4 (Tcl/Tk)
# Tk version: 4.0
# (also runs on Tcl/Tk 8.0)

global confLPC
global confLPQ
global confLPRM
global listprinter
global interval
global show_all_queues

# the paths of the called programs
set confLPC "lpc"
set confLPQ "lpq -ll"
set confLPRM "lprm"

# set the default printer
set listprinter {lp}

# set the rescan interval (in msec) for "lpc status all"
set interval 60000; # 60000 = 1 minute

# show all queues or just the busy ones?
set show_all_queues 1

# Confirm all actions?
set do_confirm 0

# behave like Motif or keep Tk's default behavior?
set tk_strictMotif 1

# Change default font for all widgets here, if desired
#option add "*font" {-misc-fixed-Bold-R-Normal--*-120-*}
option add "*font" {fixed}

# Change border width for widget shadows
option add "*BorderWidth" 1

##########################################################
# Do not change anything below this line!
##########################################################

# where is the menu of all the printers?
set main_printer_menu_button        ".frame12.frame8.frame25.menubutton34"
set queue_printer_menu_button       ".printop.frame12.frame12.frame15.menubutton1"
set move_printer_menu_button        ".printop.frame12.frame21.frame3.menubutton1"

# Global binding that makes all menubuttons go "down" like ordinary buttons
bind Menubutton <Button-1> {+%W configure -relief sunken}

############################################################
# procedures for the root window (displaying all queues)
############################################################

# procedure to show window .
proc ShowWindow. {args} {# xf ignore me 7

  global main_printer_menu_button

  # Window manager configurations
  global tkVersion
  wm title . {All Queues}
#  wm geometry . 600x400
  # build widget .frame2
  frame .frame2

  # build widget .frame2.label4
  label .frame2.label4 \
    -text {} \
    -textvariable {LPC-Status-Legend} \
    -borderwidth 5 -relief flat
#    -padx 10 \

  # build widget .frame2.frame0
  # frame for the big listbox (queue list)
  frame .frame2.frame0

  # build widget .frame2.frame0.frame1
  frame .frame2.frame0.frame1 
     
  # build widget .frame2.frame0.frame1.frame3
  frame .frame2.frame0.frame1.frame3

  # build widget .frame2.frame0.frame1.frame3.listbox8
  listbox .frame2.frame0.frame1.frame3.listbox8 \
    -height 6 -width 80 \
    -relief {sunken} \
    -xscrollcommand {.frame2.frame0.frame2.frame5.scrollbar10 set} \
    -yscrollcommand {.frame2.frame0.frame1.frame4.scrollbar9 set}

  # pack widget .frame2.frame0.frame1.frame3
  pack append .frame2.frame0.frame1.frame3 \
    .frame2.frame0.frame1.frame3.listbox8 {left frame center expand fill}

  bind .frame2.frame0.frame1.frame3.listbox8 <Double-Button-1> \
    {+OpenSingleQueue}

  # build widget .frame2.frame0.frame1.frame4
  frame .frame2.frame0.frame1.frame4

  # build widget .frame2.frame0.frame1.frame4.scrollbar9
  scrollbar .frame2.frame0.frame1.frame4.scrollbar9 \
    -command {.frame2.frame0.frame1.frame3.listbox8 yview} \
    -relief {sunken}

  # pack widget .frame2.frame0.frame1.frame4
  pack append .frame2.frame0.frame1.frame4 \
    .frame2.frame0.frame1.frame4.scrollbar9 {top frame center expand filly}

  # pack widget .frame2.frame0.frame1
  pack append .frame2.frame0.frame1 \
    .frame2.frame0.frame1.frame3 {left frame center expand fill} \
    .frame2.frame0.frame1.frame4 {right frame center filly}

  # build widget .frame2.frame0.frame2
  frame .frame2.frame0.frame2 

  # build widget .frame2.frame0.frame2.frame5
  frame .frame2.frame0.frame2.frame5

  # build widget .frame2.frame0.frame2.frame5.scrollbar10
  scrollbar .frame2.frame0.frame2.frame5.scrollbar10 \
    -command {.frame2.frame0.frame1.frame3.listbox8 xview} \
    -orient {horizontal} \
    -relief {sunken}

  # pack widget .frame2.frame0.frame2.frame5
  pack append .frame2.frame0.frame2.frame5 \
    .frame2.frame0.frame2.frame5.scrollbar10 {left frame center expand fillx}

  # pack widget .frame2.frame0.frame2
  pack append .frame2.frame0.frame2 \
    .frame2.frame0.frame2.frame5 {left frame center expand fillx} 

  # pack widget .frame2.frame0
  pack append .frame2.frame0 \
    .frame2.frame0.frame1 {top frame center expand fill} \
    .frame2.frame0.frame2 {bottom frame center fillx}

  # pack widget .frame2
  pack append .frame2 \
    .frame2.label4 {top frame w} \
    .frame2.frame0 {top frame center expand fill}

  # frame for the button-panel
  # build widget .frame12
  frame .frame12

  # frame with the radiobuttons show_all_queues and show_busy_queues
  # build widget .frame12.frame01
  frame .frame12.frame01; # -borderwidth {2}
  radiobutton .frame12.frame01.radio_all \
	-text {Show all queues} \
	-command {ListQueueRefresh} -value {1} -variable show_all_queues
  radiobutton .frame12.frame01.radio_busy \
	-text {Show busy queues} \
	-command {ListQueueRefresh} -value {0} -variable show_all_queues

##  # build widget .frame12.frame01.status
##  label .frame12.frame01.status \
##    -height {1} \
##    -textvariable is_busy \
##    -relief sunken
###    -width {16}
##
##  pack append .frame12.frame01 .frame12.frame01.status \
##	 {top frame w fillx}

  pack append .frame12.frame01 .frame12.frame01.radio_all \
	 {top frame w}

  pack append .frame12.frame01 .frame12.frame01.radio_busy \
	 {top frame w}

  pack append .frame12 .frame12.frame01 \
	 {bottom frame sw}

  # frame with buttons for printing operations (start, stop, enable, ...)
  # build widget .frame12.frame8
  frame .frame12.frame8

  # build the button for the menu of queues
  # build widget .frame12.frame8.frame25
  frame .frame12.frame8.frame25 -borderwidth {2}

  # build widget $main_printer_menu_button
  menubutton $main_printer_menu_button \
    -menu "$main_printer_menu_button.m" \
    -text {Choose Queue} \
    -relief {raised}

  # build widget $main_printer_menu_button.m
  menu $main_printer_menu_button.m \
    -tearoff {0}     

  # pack widget .frame12.frame8.frame25
  pack append .frame12.frame8.frame25 \
    $main_printer_menu_button {top frame center fillx expand}

  # frame for menubutton for the queue-commands
  frame .frame12.frame8.frame99 -borderwidth {2}

  menubutton .frame12.frame8.frame99.mbutton1 \
    -menu {.frame12.frame8.frame99.mbutton1.menu} \
    -text {Queue Commands} \
    -relief {raised}

  menu .frame12.frame8.frame99.mbutton1.menu \
    -tearoff {0}     

    .frame12.frame8.frame99.mbutton1.menu add command \
      -command {AbortQueue} \
      -label {Abort Daemon}
    .frame12.frame8.frame99.mbutton1.menu add command \
      -command {RestartQueue} \
      -label {Restart Daemon}
    .frame12.frame8.frame99.mbutton1.menu add separator
    .frame12.frame8.frame99.mbutton1.menu add command \
      -command {StartQueue} \
      -label {Enable Printing}
    .frame12.frame8.frame99.mbutton1.menu add command \
      -command {StopQueue} \
      -label {Disable Printing}
    .frame12.frame8.frame99.mbutton1.menu add separator
    .frame12.frame8.frame99.mbutton1.menu add command \
      -command {EnableQueue} \
      -label {Enable Spooling}
    .frame12.frame8.frame99.mbutton1.menu add command \
      -command {DisableQueue} \
      -label {Disable Spooling}

    pack append .frame12.frame8.frame99 \
      .frame12.frame8.frame99.mbutton1 \
       {top frame center fillx expand}

  # build widget .frame12.frame8.frame14
  frame .frame12.frame8.frame14 
  # build widget .frame12.frame8.frame14.button28
  button .frame12.frame8.frame14.button28 \
    -command {ListQueueRefresh} \
    -text {Rescan now!}
  # pack widget .frame12.frame8.frame14
  pack append .frame12.frame8.frame14 \
    .frame12.frame8.frame14.button28 {top frame center fillx expand}

  # build widget .frame12.frame8.label14
  label .frame12.frame8.label14 \
    -height {2} \
    -text {Queue} 

  # and a filling frame to get the window size a little bit bigger
  frame .frame12.frame8.frame98 -height {100}

  # pack widget .frame12.frame8
  pack append .frame12.frame8 \
    .frame12.frame8.label14 {top frame center fillx expand} \
    .frame12.frame8.frame14 {top frame center fillx expand} \
    .frame12.frame8.frame25 {top fillx expand} \
    .frame12.frame8.frame99 {top fillx expand} \
    .frame12.frame8.frame98 {top fillx expand}

  # frame with buttons "quit", "about", label "program"
  # build widget .frame12.frame11
  frame .frame12.frame11

  # build widget .frame12.frame11.frame26
  frame .frame12.frame11.frame26 

  # build widget .frame12.frame11.frame26.button33
  button .frame12.frame11.frame26.button33 \
    -command {exit} \
    -text {Quit}

  # pack widget .frame12.frame11.frame26
  pack append .frame12.frame11.frame26 \
    .frame12.frame11.frame26.button33 {top frame center fillx expand}

  # build widget .frame12.frame11.label20
  label .frame12.frame11.label20 \
    -text {Program}

  # build widget .frame12.frame11.frame23
  frame .frame12.frame11.frame23 

  # build widget .frame12.frame11.frame23.button33
  button .frame12.frame11.frame23.button33 \
    -command {show_about} \
    -text {About}

  # pack widget .frame12.frame11.frame23
  pack append .frame12.frame11.frame23 \
    .frame12.frame11.frame23.button33 {top frame center fillx expand}

  # pack widget .frame12.frame11
  pack append .frame12.frame11 \
    .frame12.frame11.label20 {top fillx expand} \
    .frame12.frame11.frame23 {top fillx expand} \
    .frame12.frame11.frame26 {top fillx expand}

  # pack widget .frame12
  pack append .frame12 \
    .frame12.frame11 {top frame center fill} \
    .frame12.frame8 {top frame center fill}

  # pack widget .
  pack append . \
    .frame12 {right frame center fill} \
    .frame2 {right frame center expand fill}

 # Und nun die Konfigurations-Dateien auslesen
 # und das Queue-Auswahlmenue aufbauen
 build_printer_menu choosequeue $main_printer_menu_button.m

}

#############################################################
# Procedures that handle the lpc-commands (called by root window)
#############################################################

# Procedure: go_busy
proc go_busy {} {
  global is_busy
  set is_busy "- Busy -"
  . configure -cursor watch
  if {[winfo exists .printop]} {
    .printop configure -cursor watch
  }
  if {[winfo ismapped .]} {
    update idletasks
  }
  # puts -nonewline "busy..."
}

# Procedure: go_ready
proc go_ready {} {
  global is_busy
  set is_busy "- Ready -"
  . configure -cursor ""
  if {[winfo exists .printop]} {
    .printop configure -cursor ""
  }
  # update idletasks
  # puts "ok."
}

# Procedure: AbortQueue
proc AbortQueue {} {
# ruft lpc abort auf fuer die aktuelle Queue
global confLPC
set printername [lindex [lindex [GetEntrySelection LPCListbox] 0] 0]

if {$printername != ""} {
# erst requester ausgeben (nr. 1 = wirklich abort?)
  set doit [printop.req "abort" $printername]

  if {$doit} {
	go_busy
	eval "exec $confLPC abort $printername"
	go_ready
  }
  ListQueueRefresh
}}

# Procedure: DisableQueue
proc DisableQueue {} {
# ruft lpc disable auf fuer die aktuelle Queue
global confLPC
set printername [lindex [lindex [GetEntrySelection LPCListbox] 0] 0]

if {$printername != ""} {
# erst requester ausgeben (nr. 3 = wirklich disable?)
  set doit [printop.req "disable" $printername]
  if {$doit} {
	go_busy
	eval "exec $confLPC disable $printername"
	go_ready
  }
  ListQueueRefresh
}}

# Procedure: EnableQueue
proc EnableQueue {} {
# ruft lpc enable auf fuer die aktuelle Queue
global confLPC
set printername [lindex [lindex [GetEntrySelection LPCListbox] 0] 0]

if {$printername != ""} {
# erst requester ausgeben (nr. 4 = wirklich enable?)
  set doit [printop.req "enable" $printername]
  if {$doit} {
	go_busy
	eval "exec $confLPC enable $printername"
	go_ready
  }
  ListQueueRefresh
}}

# Procedure: RestartQueue
proc RestartQueue {} {
# ruft lpc kill auf fuer die aktuelle Queue
global confLPC
set printername [lindex [lindex [GetEntrySelection LPCListbox] 0] 0]

if {$printername != ""} {
# erst requester ausgeben (nr. 6 = wirklich restart?)
  set doit [printop.req "restart" $printername]
  if {$doit} {
	go_busy
	eval "exec $confLPC kill $printername"
	go_ready
  }
  ListQueueRefresh
}}

# Procedure: StartQueue
proc StartQueue {} {
# ruft lpc start auf fuer die aktuelle Queue
global confLPC
set printername [lindex [lindex [GetEntrySelection LPCListbox] 0] 0]

if {$printername != ""} {
# erst requester ausgeben (nr. 2 = wirklich start?)
  set doit [printop.req "start" $printername]
  if {$doit} {
	go_busy
	eval "exec $confLPC start $printername"
	go_ready
  }
  ListQueueRefresh
}}

# Procedure: StopQueue
proc StopQueue {} {
# ruft lpc stop auf fuer die aktuelle Queue
global confLPC
set printername [lindex [lindex [GetEntrySelection LPCListbox] 0] 0]

if {$printername != ""} {
# erst requester ausgeben (nr. 5 = wirklich stop?)
  set doit [printop.req "stop" $printername]
  if {$doit} {
	go_busy
	eval "exec $confLPC stop $printername"
	go_ready
  }
  ListQueueRefresh
}}

# Procedure: ListQueueRefresh
proc ListQueueRefresh {} {
# liest ausgabe von lpq, teilt ausgabe in
# statuszeilen und entries und zeigt
# diese in den listboxen an

global confLPC
global LPC-Status-Legend
global show_all_queues

set selected_line [[SymbolicName LPCListbox] curselection]; # save so we can restore selection later

# loesche listboxen (sofortiges User-Feedback... man kann
# sehen, dasz etwas passiert...)
[SymbolicName LPCListbox] delete 0 end
[SymbolicName LPCListbox] insert end "Getting the status of all queues."
[SymbolicName LPCListbox] insert end ""
[SymbolicName LPCListbox] insert end "Please wait..."
# update idletasks

# und nun lpc status einlesen
go_busy
set inlist [split [eval "exec $confLPC status all"] "\n"]
go_ready
# for debugging: don't exec "lpc status all" but get saved output
# from other host
#set inlist [split [eval "exec cat testfile"] "\n"]

# erstes element weglassen (gibt nur den drucker an)
set tmplist [lrange $inlist 1 [llength $inlist]]

# dafuer erstes element in titelzeile setzen
#set LPC-Status-Legend " [lindex $inlist 0]"

regsub {( *)([^ ]*)(.*)} [lindex $inlist 0] {\2\1\3} tmp_LPC-Status-Legend
if {[string compare ${tmp_LPC-Status-Legend} ""] != 0} {
  set LPC-Status-Legend ${tmp_LPC-Status-Legend}
}

set lpclist ""

foreach i $tmplist {
  if {!$show_all_queues} {
    if {([llength $i]>3) && ([lindex $i 3]!="0") &&
	[regexp {[0-9]+} [lindex $i 3]]} {
	lappend lpclist $i
    }
  } else {
   ;# if {([llength $i]>3) && ([regexp {[0-9]+} [lindex $i 3]])} {
      lappend lpclist $i
   ;# }
  }
}

# eintraege aus lpclist in listbox "LPC Status" eintragen
[SymbolicName LPCListbox] delete 0 end
foreach i $lpclist {
	[SymbolicName LPCListbox] insert end $i }
# und natuerlich das ganze anzeigen...
# update idletasks

if {[string compare $selected_line ""] != 0} {
  [SymbolicName LPCListbox] selection set $selected_line $selected_line
#  [SymbolicName LPCListbox] yview $selected_line
  [SymbolicName LPCListbox] see $selected_line
}

}

################################################
# procedures for both windows
################################################

# procedure to show window ShowWindow.message
proc ShowWindow.message { args} {

  # build widget .message
  catch "destroy .message"
  toplevel .message    

  # Window manager configurations
  global tkVersion
  wm title .message {Confirmation}

  # frame with message
  # build widget .message.frame1
  frame .message.frame1 ; #-borderwidth {2}
  # build widget .message.frame1.frame3
  frame .message.frame1.frame3 -relief {sunken}; #  -borderwidth {2}
  # build widget .message.frame1.frame3.message4
  message .message.frame1.frame3.message4  -aspect {2000} -padx {5}  -pady {7}  -text {}  -textvariable {MessageText}
  # pack widget .message.frame1.frame3
  pack append .message.frame1.frame3  .message.frame1.frame3.message4 {top frame center}
  # pack widget .message.frame1
  pack append .message.frame1  .message.frame1.frame3 {top frame center expand fill}

  # frame with Ok-Button
  # build widget .message.frame2
  frame .message.frame2; # -borderwidth {2}
  # build widget .message.frame2.frame5
  frame .message.frame2.frame5; # -borderwidth {2}
  # build widget .message.frame2.frame5.button7
  button .message.frame2.frame5.button7 -command {set mess_return 1
grab release .message
DestroyWindow.message} -height {1} -text {Ok - Do it!} -width {5}; # -relief {groove} 
  # pack widget .message.frame2.frame5
  pack append .message.frame2.frame5 .message.frame2.frame5.button7 {top frame center fillx}

  # frame with Cancel-Button
  # build widget .message.frame2.frame6
  frame .message.frame2.frame6; # -borderwidth {2}
  # build widget .message.frame2.frame6.button8
  button .message.frame2.frame6.button8 -command {set mess_return 0
grab release .message
DestroyWindow.message}  -height {1}  -text {Cancel}  -width {5}; # -relief {groove}  
  # pack widget .message.frame2.frame6
  pack append .message.frame2.frame6  .message.frame2.frame6.button8 {top frame center fillx}
  # pack widget .message.frame2
  pack append .message.frame2  .message.frame2.frame5 {left frame center expand fillx}  .message.frame2.frame6 {right frame center expand fillx}

  # pack widget .message
  pack append .message  .message.frame1 {top frame center expand fill}  .message.frame2 {top frame center fillx}

}

proc DestroyWindow.message {} {
    catch "destroy .message"
    update
}


######################################################
# procedures for single queue window
######################################################

# procedure to show window ShowWindow.moverequest
proc ShowWindow.moverequest {preselected} {
  global move_dest_printer

  catch "destroy .moverequest"
  toplevel .moverequest    

  # Window manager configurations
  global tkVersion
  wm title .moverequest {Request}

  # frame with message
  # build widget .moverequest.frame1
  frame .moverequest.frame1; # -borderwidth {2}
  # build widget .moverequest.frame1.frame3
  frame .moverequest.frame1.frame3 -relief {sunken}; #  -borderwidth {2}
  # build widget .moverequest.frame1.frame3.message4
  message .moverequest.frame1.frame3.message4  -aspect {2000} -padx {5}  -pady {7}  -text {}  -textvariable {MessageText}
  # pack widget .moverequest.frame1.frame3
  pack append .moverequest.frame1.frame3  .moverequest.frame1.frame3.message4 {top frame center}
  # pack widget .moverequest.frame1
  pack append .moverequest.frame1  .moverequest.frame1.frame3 {top frame center expand fill}

  # frame with label & entry, to ask for the selection string for "lpc move"
  # build widget .moverequest.frame3
  frame .moverequest.frame3; # -borderwidth {2}
  # build widget .moverequest.frame3.frame0
  frame .moverequest.frame3.frame0
  # label "Selection-String:"
  # build widget .moverequest.frame3.frame0.label0
  label .moverequest.frame3.frame0.label0 \
    -text {Selection-String:}
  # entry for "selection-string"
  # build widget .moverequest.frame3.frame0.entry0
  entry .moverequest.frame3.frame0.entry0
  .moverequest.frame3.frame0.entry0 insert 0 $preselected
  # pack widget .moverequest.frame3.frame0
  pack append .moverequest.frame3.frame0 .moverequest.frame3.frame0.label0 {left frame center fillx}
  # pack widget .moverequest.frame3.frame0
  pack append .moverequest.frame3.frame0 .moverequest.frame3.frame0.entry0 {right frame center fillx}
  # pack widget .moverequest.frame3
  pack append .moverequest.frame3 .moverequest.frame3.frame0 {top frame center fillx}

  # frame with label & entry to ask for the destination printer of move
  # build widget .moverequest.frame4
  frame .moverequest.frame4; # -borderwidth {2}
  # build widget .moverequest.frame4.frame0
  frame .moverequest.frame4.frame0
  # label "Destination Printer:"
  # build widget .moverequest.frame4.frame0.label0
  label .moverequest.frame4.frame0.label0 \
    -text {Destination Printer:}
  # entry for "destination-printer"
  # build widget .moverequest.frame4.frame0.entry0
  entry .moverequest.frame4.frame0.entry0
  .moverequest.frame4.frame0.entry0 insert end $move_dest_printer
  # pack widget .moverequest.frame4.frame0
  pack append .moverequest.frame4.frame0 .moverequest.frame4.frame0.label0 {left frame center fillx}
  # pack widget .moverequest.frame4.frame0
  pack append .moverequest.frame4.frame0 .moverequest.frame4.frame0.entry0 {right frame center fillx}
  # pack widget .moverequest.frame4
  pack append .moverequest.frame4 .moverequest.frame4.frame0 {top frame center fillx}

  # frame with Ok-button
  # build widget .moverequest.frame2
  frame .moverequest.frame2; # -borderwidth {2}
  # build widget .moverequest.frame2.frame5
  frame .moverequest.frame2.frame5; # -borderwidth {2}
  # build widget .moverequest.frame2.frame5.button7
  button .moverequest.frame2.frame5.button7 -command {set movereq_return 1
set move_dest_printer [.moverequest.frame4.frame0.entry0 get]
set lpc_select_string [.moverequest.frame3.frame0.entry0 get]
grab release .moverequest
DestroyWindow.moverequest} -height {1} -text {Ok - Do it!} -width {5}; # -relief {groove} 
  # pack widget .moverequest.frame2.frame5
  pack append .moverequest.frame2.frame5 .moverequest.frame2.frame5.button7 {top frame center fillx}

  # frame with Cancel-button
  # build widget .moverequest.frame2.frame6
  frame .moverequest.frame2.frame6; # -borderwidth {2}
  # build widget .moverequest.frame2.frame6.button8
  button .moverequest.frame2.frame6.button8 -command {set movereq_return 0
grab release .moverequest
DestroyWindow.moverequest}  -height {1}  -text {Cancel}  -width {5}; # -relief {groove}  
  # pack widget .moverequest.frame2.frame6
  pack append .moverequest.frame2.frame6  .moverequest.frame2.frame6.button8 {top frame center fillx}
  # pack widget .moverequest.frame2
  pack append .moverequest.frame2  .moverequest.frame2.frame5 {left frame center expand fillx}  .moverequest.frame2.frame6 {right frame center expand fillx}

  # pack the whole window
  # pack widget .moverequest
  pack append .moverequest  .moverequest.frame1 {top frame center expand fill} .moverequest.frame3 {top frame center fillx}
  pack append .moverequest  .moverequest.frame4 {top frame center fillx} .moverequest.frame2 {top frame center fillx}

}

proc DestroyWindow.moverequest {} {
    catch "destroy .moverequest"
    update
}

# procedure to show window ShowWindow.selectrequest
proc ShowWindow.selectrequest {preselected} {

  catch "destroy .selectrequest"
  toplevel .selectrequest    

  # Window manager configurations
  global tkVersion
  wm title .selectrequest {Request}

  # frame with message
  # build widget .selectrequest.frame1
  frame .selectrequest.frame1; # -borderwidth {2}
  # build widget .selectrequest.frame1.frame3
  frame .selectrequest.frame1.frame3 -relief {sunken}; # -borderwidth {2}
  # build widget .selectrequest.frame1.frame3.message4
  message .selectrequest.frame1.frame3.message4  -aspect {2000} -padx {5}  -pady {7}  -text {}  -textvariable {MessageText}
  # pack widget .selectrequest.frame1.frame3
  pack append .selectrequest.frame1.frame3  .selectrequest.frame1.frame3.message4 {top frame center}
  # pack widget .selectrequest.frame1
  pack append .selectrequest.frame1  .selectrequest.frame1.frame3 {top frame center expand fill}

  # frame with label & entry, to ask for the selection string for "lpc move"
  # build widget .selectrequest.frame3
  frame .selectrequest.frame3; # -borderwidth {2}
  # build widget .selectrequest.frame3.frame0
  frame .selectrequest.frame3.frame0
  # label "Selection-String:"
  # build widget .selectrequest.frame3.frame0.label0
  label .selectrequest.frame3.frame0.label0 \
    -text {Selection-String:}
  # entry for "selection-string"
  # build widget .selectrequest.frame3.frame0.entry0
  entry .selectrequest.frame3.frame0.entry0
  .selectrequest.frame3.frame0.entry0 insert 0 $preselected
  # pack widget .selectrequest.frame3.frame0
  pack append .selectrequest.frame3.frame0 .selectrequest.frame3.frame0.label0 {left frame center fillx}
  # pack widget .selectrequest.frame3.frame0
  pack append .selectrequest.frame3.frame0 .selectrequest.frame3.frame0.entry0 {right frame center fillx}
  # pack widget .selectrequest.frame3
  pack append .selectrequest.frame3 .selectrequest.frame3.frame0 {top frame center fillx}

  # frame with Ok-button
  # build widget .selectrequest.frame2
  frame .selectrequest.frame2; # -borderwidth {2}
  # build widget .selectrequest.frame2.frame5
  frame .selectrequest.frame2.frame5; # -borderwidth {2}
  # build widget .selectrequest.frame2.frame5.button7
  button .selectrequest.frame2.frame5.button7 -command {set select_return 1
set lpc_select_string [.selectrequest.frame3.frame0.entry0 get]
grab release .selectrequest
DestroyWindow.selectrequest} -height {1} -text {Ok - Do it!} -width {5}; #  -relief {groove}
  # pack widget .selectrequest.frame2.frame5
  pack append .selectrequest.frame2.frame5 .selectrequest.frame2.frame5.button7 {top frame center fillx}

  # frame with Cancel-button
  # build widget .selectrequest.frame2.frame6
  frame .selectrequest.frame2.frame6; # -borderwidth {2}
  # build widget .selectrequest.frame2.frame6.button8
  button .selectrequest.frame2.frame6.button8 -command {set select_return 0
grab release .selectrequest
DestroyWindow.selectrequest}  -height {1}  -text {Cancel}  -width {5}; #   -relief {groove}
  # pack widget .selectrequest.frame2.frame6
  pack append .selectrequest.frame2.frame6  .selectrequest.frame2.frame6.button8 {top frame center fillx}
  # pack widget .selectrequest.frame2
  pack append .selectrequest.frame2  .selectrequest.frame2.frame5 {left frame center expand fillx}  .selectrequest.frame2.frame6 {right frame center expand fillx}

  # pack the whole window
  # pack widget .selectrequest
  pack append .selectrequest  .selectrequest.frame1 {top frame center expand fill} .selectrequest.frame3 {top frame center fillx}
  pack append .selectrequest  .selectrequest.frame2 {top frame center fillx}

}

proc DestroyWindow.selectrequest {} {
    catch "destroy .selectrequest"
    update
}

# procedure to show window ShowWindow.about
proc ShowWindow.about { args} {

  catch "destroy .about"
  toplevel .about    

  # Window manager configurations
  global tkVersion
  wm title .about {About}


  # build widget .about.frame1
  frame .about.frame1; #     -borderwidth {2}

  # build widget .about.frame1.frame3
  frame .about.frame1.frame3  -relief {sunken}; #     -borderwidth {2} 

  # build widget .about.frame1.frame3.message4
  message .about.frame1.frame3.message4  -aspect {2000} -padx {5}  -pady {7}  -text {
 PRINTOP		       Version 1.11b

 Written in 1995, 1996, 1997 by Olaf Gellert

 <gellert@informatik.uni-hamburg.de>


 Write me a postcard:

	Olaf Gellert
	Veerstuecken 9
	22297 Hamburg
	Germany

}

  # pack widget .about.frame1.frame3
  pack append .about.frame1.frame3  .about.frame1.frame3.message4 {top frame center}

  # pack widget .about.frame1
  pack append .about.frame1  .about.frame1.frame3 {top frame center expand fill}

  # build widget .about.frame2
  frame .about.frame2; # -borderwidth {2}

  # build widget .about.frame2.frame6
  frame .about.frame2.frame6; # -borderwidth {2}

  # build widget .about.frame2.frame6.button8
  button .about.frame2.frame6.button8  -command {grab release .about
DestroyWindow.about}  -height {1}  -text {Enough of that!}  -width {5}; #   -relief {groove}

  # pack widget .about.frame2.frame6
  pack append .about.frame2.frame6  .about.frame2.frame6.button8 {top frame center fillx}

  # pack widget .about.frame2
  pack append .about.frame2  .about.frame2.frame6 {right frame center expand fillx}

  # pack widget .about
  pack append .about  .about.frame1 {top frame center expand fill}  .about.frame2 {top frame center fillx}

}

proc DestroyWindow.about {} {
    catch "destroy .about"
    update
}



# procedure to show window .printop
proc ShowWindow.printop {args} {
  global queue_printer_menu_button
  global move_printer_menu_button
  global listprinter

  # Window manager configurations
  global tkVersion

  if {[winfo exists .printop]} {
    wm title .printop "Queue: $listprinter"
    return
    ##pack propagate .printop 0
    ##foreach pwchild [winfo children .printop] {
    ##  destroy $pwchild
    ##}
    # pack propagate .printop 1
  } else {
    catch "destroy .printop"
    toplevel .printop
    wm title .printop "Queue: $listprinter"
  }


  # .printop.frame0: label "Jobs in Queue" and Queuename
  frame .printop.frame0

  # build widget .printop.frame0.label3
  label .printop.frame0.label3 \
    -text {Jobs in Queue:} \
    -borderwidth 5 -relief flat

  # build widget .printop.frame0.label0
  label .printop.frame0.label0 \
    -text {} \
    -textvariable {listprinter}

  # pack widget .printop.frame0
  pack append .printop.frame0 \
    .printop.frame0.label3 {left frame center} \
    .printop.frame0.label0 {left frame center}

  # build widget .printop.frame1
  frame .printop.frame1

  # build widget .printop.frame1.frame0
  frame .printop.frame1.frame0

  # build widget .printop.frame1.frame0.frame1
  frame .printop.frame1.frame0.frame1 
     
  # build widget .printop.frame1.frame0.frame1.frame3
  frame .printop.frame1.frame0.frame1.frame3

  # build widget .printop.frame1.frame0.frame1.frame3.listbox8
  listbox .printop.frame1.frame0.frame1.frame3.listbox8 \
    -width 80  -height 6 \
    -relief {sunken} \
    -xscrollcommand {.printop.frame1.frame0.frame2.frame5.scrollbar10 set} \
    -yscrollcommand {.printop.frame1.frame0.frame1.frame4.scrollbar9 set}

  # pack widget .printop.frame1.frame0.frame1.frame3
  pack append .printop.frame1.frame0.frame1.frame3 \
    .printop.frame1.frame0.frame1.frame3.listbox8 {left frame center expand fill}

  # build widget .printop.frame1.frame0.frame1.frame4
  frame .printop.frame1.frame0.frame1.frame4

  # build widget .printop.frame1.frame0.frame1.frame4.scrollbar9
  scrollbar .printop.frame1.frame0.frame1.frame4.scrollbar9 \
    -command {.printop.frame1.frame0.frame1.frame3.listbox8 yview} \
    -relief {sunken}

  # pack widget .printop.frame1.frame0.frame1.frame4
  pack append .printop.frame1.frame0.frame1.frame4 \
    .printop.frame1.frame0.frame1.frame4.scrollbar9 {top frame center expand filly}

  # pack widget .printop.frame1.frame0.frame1
  pack append .printop.frame1.frame0.frame1 \
    .printop.frame1.frame0.frame1.frame3 {left frame center expand fill} \
    .printop.frame1.frame0.frame1.frame4 {right frame center fill}

  # build widget .printop.frame1.frame0.frame2
  frame .printop.frame1.frame0.frame2 

  # build widget .printop.frame1.frame0.frame2.frame5
  frame .printop.frame1.frame0.frame2.frame5

  # build widget .printop.frame1.frame0.frame2.frame5.scrollbar10
  scrollbar .printop.frame1.frame0.frame2.frame5.scrollbar10 \
    -command {.printop.frame1.frame0.frame1.frame3.listbox8 xview} \
    -orient {horizontal} \
    -relief {sunken}

  # pack widget .printop.frame1.frame0.frame2.frame5
  pack append .printop.frame1.frame0.frame2.frame5 \
    .printop.frame1.frame0.frame2.frame5.scrollbar10 {left frame center expand fillx}

  # pack widget .printop.frame1.frame0.frame2
  pack append .printop.frame1.frame0.frame2 \
    .printop.frame1.frame0.frame2.frame5 {left frame center expand fill}

  # pack widget .printop.frame1.frame0
  pack append .printop.frame1.frame0 \
    .printop.frame1.frame0.frame1 {top frame center expand fill} \
    .printop.frame1.frame0.frame2 {bottom frame center fillx}

  # build widget .printop.frame1.label0
  label .printop.frame1.label0 \
    -text {Queue Status} \
    -borderwidth 5 -relief flat

  # pack widget .printop.frame1
  pack append .printop.frame1 \
    .printop.frame1.label0 {top frame w} \
    .printop.frame1.frame0 {top frame center expand fill}

  # build widget .printop.frame3
  frame .printop.frame3

  # build widget .printop.frame3.label5
  label .printop.frame3.label5 \
    -text {} \
    -textvariable {LPC-Jobs-Legend} \
    -borderwidth 5 -relief flat

  # build widget .printop.frame3.frame0
  frame .printop.frame3.frame0

  # build widget .printop.frame3.frame0.frame1
  frame .printop.frame3.frame0.frame1 
     

  # build widget .printop.frame3.frame0.frame1.frame3
  frame .printop.frame3.frame0.frame1.frame3

  # build widget .printop.frame3.frame0.frame1.frame3.listbox8
  listbox .printop.frame3.frame0.frame1.frame3.listbox8 \
    -width 80   -height 6 \
    -relief {sunken} \
    -xscrollcommand {.printop.frame3.frame0.frame2.frame5.scrollbar10 set} \
    -yscrollcommand {.printop.frame3.frame0.frame1.frame4.scrollbar9 set}

  # pack widget .printop.frame3.frame0.frame1.frame3
  pack append .printop.frame3.frame0.frame1.frame3 \
    .printop.frame3.frame0.frame1.frame3.listbox8 {left frame center expand fill}

  # build widget .printop.frame3.frame0.frame1.frame4
  frame .printop.frame3.frame0.frame1.frame4

  # build widget .printop.frame3.frame0.frame1.frame4.scrollbar9
  scrollbar .printop.frame3.frame0.frame1.frame4.scrollbar9 \
    -command {.printop.frame3.frame0.frame1.frame3.listbox8 yview} \
    -relief {sunken}

  # pack widget .printop.frame3.frame0.frame1.frame4
  pack append .printop.frame3.frame0.frame1.frame4 \
    .printop.frame3.frame0.frame1.frame4.scrollbar9 {top frame center expand filly}

  # pack widget .printop.frame3.frame0.frame1
  pack append .printop.frame3.frame0.frame1 \
    .printop.frame3.frame0.frame1.frame3 {left frame center expand fill} \
    .printop.frame3.frame0.frame1.frame4 {right frame center filly}

  # build widget .printop.frame3.frame0.frame2
  frame .printop.frame3.frame0.frame2

  # build widget .printop.frame3.frame0.frame2.frame5
  frame .printop.frame3.frame0.frame2.frame5

  # build widget .printop.frame3.frame0.frame2.frame5.scrollbar10
  scrollbar .printop.frame3.frame0.frame2.frame5.scrollbar10 \
    -command {.printop.frame3.frame0.frame1.frame3.listbox8 xview} \
    -orient {horizontal} \
    -relief {sunken}

  # pack widget .printop.frame3.frame0.frame2.frame5
  pack append .printop.frame3.frame0.frame2.frame5 \
    .printop.frame3.frame0.frame2.frame5.scrollbar10 {left frame center expand fillx}

  # pack widget .printop.frame3.frame0.frame2
  pack append .printop.frame3.frame0.frame2 \
    .printop.frame3.frame0.frame2.frame5 {left frame center expand fill}

  # pack widget .printop.frame3.frame0
  pack append .printop.frame3.frame0 \
    .printop.frame3.frame0.frame1 {top frame center expand fill} \
    .printop.frame3.frame0.frame2 {bottom frame center fillx}

  # pack widget .printop.frame3
  pack append .printop.frame3 \
    .printop.frame3.label5 {top frame w} \
    .printop.frame3.frame0 {top frame center expand fill}

  # build widget .printop.frame2
  frame .printop.frame2

#  # build widget .printop.frame2.label4
#  label .printop.frame2.label4 \
#    -text {LPC Status Summary}

  # build widget .printop.frame2.label5; # Headings
  label .printop.frame2.label5 \
    -text {} \
    -textvariable {LPC-Status-Legend} \
    -borderwidth 5 -relief flat

  # build widget .printop.frame2.frame0
  frame .printop.frame2.frame0

  # build widget .printop.frame2.frame0.frame1
  frame .printop.frame2.frame0.frame1 

  # build widget .printop.frame2.frame0.frame1.frame3
  frame .printop.frame2.frame0.frame1.frame3

  # build widget .printop.frame2.frame0.frame1.frame3.listbox8
  listbox .printop.frame2.frame0.frame1.frame3.listbox8 \
    -height 1 -width 80 \
    -relief {sunken} \
    -xscrollcommand {.printop.frame2.frame0.frame2.frame5.scrollbar10 set} \
    -yscrollcommand {.printop.frame2.frame0.frame1.frame4.scrollbar9 set}

  # pack widget .printop.frame2.frame0.frame1.frame3
  pack append .printop.frame2.frame0.frame1.frame3 \
    .printop.frame2.frame0.frame1.frame3.listbox8 {left frame center expand fill}

  # build widget .printop.frame2.frame0.frame1.frame4
  frame .printop.frame2.frame0.frame1.frame4

  # build widget .printop.frame2.frame0.frame1.frame4.scrollbar9
  scrollbar .printop.frame2.frame0.frame1.frame4.scrollbar9 \
    -command {.printop.frame2.frame0.frame1.frame3.listbox8 yview} \
    -relief {sunken}

  # pack widget .printop.frame2.frame0.frame1.frame4
  pack append .printop.frame2.frame0.frame1.frame4 \
    .printop.frame2.frame0.frame1.frame4.scrollbar9 {top frame center expand filly}

  # pack widget .printop.frame2.frame0.frame1
  pack append .printop.frame2.frame0.frame1 \
    .printop.frame2.frame0.frame1.frame3 {left frame center expand fill} \
    .printop.frame2.frame0.frame1.frame4 {right frame center filly}

  # build widget .printop.frame2.frame0.frame2
  frame .printop.frame2.frame0.frame2 

  # build widget .printop.frame2.frame0.frame2.frame5
  frame .printop.frame2.frame0.frame2.frame5 

  # build widget .printop.frame2.frame0.frame2.frame5.scrollbar10
  scrollbar .printop.frame2.frame0.frame2.frame5.scrollbar10 \
    -command {.printop.frame2.frame0.frame1.frame3.listbox8 xview} \
    -orient {horizontal} \
    -relief {sunken}

  # pack widget .printop.frame2.frame0.frame2.frame5
  pack append .printop.frame2.frame0.frame2.frame5 \
    .printop.frame2.frame0.frame2.frame5.scrollbar10 {left frame center expand fillx}

  # pack widget .printop.frame2.frame0.frame2
  pack append .printop.frame2.frame0.frame2 \
    .printop.frame2.frame0.frame2.frame5 {left frame center expand fill} 

  # pack widget .printop.frame2.frame0
  pack append .printop.frame2.frame0 \
    .printop.frame2.frame0.frame1 {top frame center expand fill} \
    .printop.frame2.frame0.frame2 {bottom frame center fillx}

  # pack widget .printop.frame2
  pack append .printop.frame2 \
    .printop.frame2.label5 {top frame w} \
    .printop.frame2.frame0 {top frame center expand fillx}

  # build widget .printop.frame12
  frame .printop.frame12

  # build widget .printop.frame12.frame12
  frame .printop.frame12.frame12

  # build widget .printop.frame12.frame12.frame14
  frame .printop.frame12.frame12.frame14 

  # build widget .printop.frame12.frame12.frame14.button28
  button .printop.frame12.frame12.frame14.button28 \
    -command {ListQueue2Refresh} \
    -text {Rescan now!}

  # pack widget .printop.frame12.frame12.frame14
  pack append .printop.frame12.frame12.frame14 \
    .printop.frame12.frame12.frame14.button28 {top frame center fillx expand}

  # build the button for the menu of queues
  # build widget .printop.frame12.frame12.frame15
  frame .printop.frame12.frame12.frame15 -borderwidth {2}

  # build widget $queue_printer_menu_button
  menubutton $queue_printer_menu_button \
    -menu "$queue_printer_menu_button.m" \
    -text {Choose Queue} \
    -relief {raised}

  # pack widget .printop.frame12.frame12.frame15
  pack append .printop.frame12.frame12.frame15 \
    $queue_printer_menu_button {top frame center fillx expand}

  # build widget $queue_printer_menu_button.m
  menu $queue_printer_menu_button.m \
    -tearoff {0}     

  # frame for menubutton for the queue-commands
  frame .printop.frame12.frame12.frame99 -borderwidth {2}

  menubutton .printop.frame12.frame12.frame99.mbutton1 \
    -menu {.printop.frame12.frame12.frame99.mbutton1.menu} \
    -text {Queue Commands} \
    -relief {raised}

  menu .printop.frame12.frame12.frame99.mbutton1.menu \
    -tearoff {0}     

    .printop.frame12.frame12.frame99.mbutton1.menu add command \
      -command {Abort2Queue} \
      -label {Abort Daemon}
    .printop.frame12.frame12.frame99.mbutton1.menu add command \
      -command {Restart2Queue} \
      -label {Restart Daemon}
    .printop.frame12.frame12.frame99.mbutton1.menu add separator
    .printop.frame12.frame12.frame99.mbutton1.menu add command \
      -command {Start2Queue} \
      -label {Enable Printing}
    .printop.frame12.frame12.frame99.mbutton1.menu add command \
      -command {Stop2Queue} \
      -label {Disable Printing}
    .printop.frame12.frame12.frame99.mbutton1.menu add separator
    .printop.frame12.frame12.frame99.mbutton1.menu add command \
      -command {Enable2Queue} \
      -label {Enable Spooling}
    .printop.frame12.frame12.frame99.mbutton1.menu add command \
      -command {Disable2Queue} \
      -label {Disable Spooling}

    pack append .printop.frame12.frame12.frame99 \
      .printop.frame12.frame12.frame99.mbutton1 \
       {top frame center fillx expand}

  # build widget .printop.frame12.frame12.label17
  label .printop.frame12.frame12.label17 \
    -text {Queue}

  # pack widget .printop.frame12.frame12
  pack append .printop.frame12.frame12 \
    .printop.frame12.frame12.label17 {top frame center fillx expand} \
    .printop.frame12.frame12.frame14 {top frame center fillx expand} \
    .printop.frame12.frame12.frame15 {top frame center fillx expand} \
    .printop.frame12.frame12.frame99 {top frame center fillx expand}

  # build widget .printop.frame12.frame21
  frame .printop.frame12.frame21

  # build widget .printop.frame12.frame11
  frame .printop.frame12.frame11

  # build widget .printop.frame12.frame11.frame26
  frame .printop.frame12.frame11.frame26 

  # build widget .printop.frame12.frame11.frame26.button33
  button .printop.frame12.frame11.frame26.button33 \
    -command {destroy .printop} \
    -text {Close}

  # pack widget .printop.frame12.frame11.frame26
  pack append .printop.frame12.frame11.frame26 \
    .printop.frame12.frame11.frame26.button33 {top frame center fillx expand}

  # build widget .printop.frame12.frame11.label20
  label .printop.frame12.frame11.label20 \
    -text {Program}

  # build widget .printop.frame12.frame11.frame23
  frame .printop.frame12.frame11.frame23 

  # build widget .printop.frame12.frame11.frame23.button33
  button .printop.frame12.frame11.frame23.button33 \
    -command {show_about} \
    -text {About}

  # pack widget .printop.frame12.frame11.frame23
  pack append .printop.frame12.frame11.frame23 \
    .printop.frame12.frame11.frame23.button33 {top frame center fillx expand}

  # pack widget .printop.frame12.frame11
  pack append .printop.frame12.frame11 \
    .printop.frame12.frame11.label20 {top frame center fillx expand} \
    .printop.frame12.frame11.frame23 {top frame center fillx expand} \
    .printop.frame12.frame11.frame26 {top frame center fillx expand}


  # in Frame .printop.frame12.frame21 liegen die Knoepfe
  # Entry->Top, Remove-Entry, Hold-Entry und Release-Entry
  # je in frame 0,15,1,2

  # build widget .printop.frame12.frame21.frame1
  frame .printop.frame12.frame21.frame1

  # build widget .printop.frame12.frame21.frame1.button1
  button .printop.frame12.frame21.frame1.button1 \
    -command {ReleaseEntries} \
    -text {Release Job}

  # pack widget .printop.frame12.frame21.frame1
  pack append .printop.frame12.frame21.frame1 \
    .printop.frame12.frame21.frame1.button1 {top frame center fillx expand}

  # build widget .printop.frame12.frame21.frame2
  frame .printop.frame12.frame21.frame2 

  # build widget .printop.frame12.frame21.frame2.button1
  button .printop.frame12.frame21.frame2.button1 \
    -command {HoldEntries} \
    -text {Hold Job}

  # pack widget .printop.frame12.frame21.frame2
  pack append .printop.frame12.frame21.frame2 \
    .printop.frame12.frame21.frame2.button1 {top frame center fillx expand}

  # build widget .printop.frame12.frame21.frame0
  frame .printop.frame12.frame21.frame0 

  # build widget .printop.frame12.frame21.frame0.button1
  button .printop.frame12.frame21.frame0.button1 \
    -command {TopQueueEntries} \
    -text {Job -> Top}

  # pack widget .printop.frame12.frame21.frame0
  pack append .printop.frame12.frame21.frame0 \
    .printop.frame12.frame21.frame0.button1 {top frame center fillx expand}

  # build widget .printop.frame12.frame21.frame3
  frame .printop.frame12.frame21.frame3 -borderwidth {2}

  # build widget $move_printer_menu_button
  menubutton $move_printer_menu_button \
    -menu "$move_printer_menu_button.m" \
    -text {Move Job} \
    -relief {raised}

  # pack widget .printop.frame12.frame21.frame3
  pack append .printop.frame12.frame21.frame3 \
    $move_printer_menu_button {top frame center fillx expand}

  # build widget $move_printer_menu_button.m
  menu $move_printer_menu_button.m \
    -tearoff {0}     

  # build widget .printop.frame12.frame21.frame15
  frame .printop.frame12.frame21.frame15 

  # build widget .printop.frame12.frame21.frame15.button29
  button .printop.frame12.frame21.frame15.button29 \
    -command {RemoveEntries} \
    -text {Remove Job}

  # pack widget .printop.frame12.frame21.frame15
  pack append .printop.frame12.frame21.frame15 \
    .printop.frame12.frame21.frame15.button29 {top frame center fillx expand}

  # build widget .printop.frame12.frame21.label22
  label .printop.frame12.frame21.label22 \
    -text {Jobs}

  # pack widget .printop.frame12.frame21
  pack append .printop.frame12.frame21 \
    .printop.frame12.frame21.label22 {top frame center fillx expand} \
    .printop.frame12.frame21.frame0 {top frame center fillx expand} \
    .printop.frame12.frame21.frame15 {top frame center fillx expand} \
    .printop.frame12.frame21.frame2 {top frame center fillx expand} \
    .printop.frame12.frame21.frame1 {top frame center fillx expand} \
    .printop.frame12.frame21.frame3 {top frame center fillx expand}

  # pack widget .printop.frame12
  pack append .printop.frame12 \
    .printop.frame12.frame11 {top frame center fillx expand} \
    .printop.frame12.frame12 {top frame center fillx expand} \
    .printop.frame12.frame21 {top frame center fillx expand}

#  # pack widget .printop.frame12
#  pack append .printop.frame12 \
#    .printop.frame12.frame26 {left frame n fillx expand} \
#    .printop.frame12.frame25 {left frame n fillx expand}

  # pack widget .printop
  pack append .printop \
    .printop.frame12 {right frame n} \
    .printop.frame0 {top frame center fillx} \
    .printop.frame3 {top frame center expand fill} \
    .printop.frame1 {top frame center expand fill} \
    .printop.frame2 {right frame center expand fill}


 # Und nun die Konfigurations-Dateien auslesen
 # und die Queue-Auswahlmenues aufbauen
 build_printer_menu choosequeue $queue_printer_menu_button.m
 build_printer_menu move $move_printer_menu_button.m
  
}


############################################################
# User defined procedures for single queue window
############################################################

# procedure get_the_printers (parses output of "lpc status all")
proc get_the_printers {} {
 ;# diese procedure schaut sich den output von
 ;# "lpc status all" an und traegt die aufgefuehrten
 ;# Drucker in die globale Liste printcap_list ein

 global confLPC

 ;# erstmal ausgabe von "lpc status all" holen
 go_busy
 set preprinterlist [split [eval "exec $confLPC status all"] "\n"]
 go_ready
 # delete headerline
 set preprinterlist [lreplace $preprinterlist 0 0]

 ;# Die Druckerliste wird Global deklariert.
 global printcap_list

 ;# jetzt wird jeder Druckereintrag der vorlaeufigen Liste geprueft, ob der
 ;# zugeh"orige Drucker remote oder local ist. Die Druckerliste hat das
 ;# Format: firstname
 ;# [, secondname, remote (true/false), remote-host-name] who cares?
 foreach i $preprinterlist {
   set entry ""
   set presult [split $i]
   set printer_names [split [lindex $presult 0] "@"]
   set short_name_of_printer [lindex $printer_names 0]
   lappend entry $short_name_of_printer
   lappend printcap_list $entry
 }

}
# Ende von Procedure scan_printcap


# procedure name2widget: Erhaelt einen beliebigen String (mit Spaces,
# Punkten, was auch immer) und macht daraus einen gueltigen Widget-Namen.
# Dazu wird jedes Zeichen des Strings in eine (natuerlich zweistellige)
# Hex-Zahl konvertiert und diese dann als Strings aneindandergehaengt.
proc name2widget {instring} {

  set marked 0
  set tmpname "cbx"
  for {set i 0} {$i < [string length $instring]} {incr i} {
    scan [string index $instring $i] "%c" num_of_char
    if $marked {
      set marked 0
      if {($num_of_char==46)} {
        append tmpname [format "%02x" $num_of_char]
      } else {
        append tmpname "." [format "%02x" $num_of_char]
      }  
    } else {
      if {($num_of_char==46)} {
	set marked 1
      } else {
	append tmpname [format "%02x" $num_of_char]
      }
    }
  }
  return $tmpname
}

# procedure space2underscore: Erhaelt einen String, gibt einen String
# zurueck der statt spaces underscores enthaelt. Da dadurch aus unter-
# schiedlichen Strings identische werden koennten, werden underscores
# dupliziert (characterstuffing), um eindeutige Namen zu erhalten.
# Und das ganze deswegen, weil Spaces in Widgetnamen nicht erlaubt sind.
proc space2underscore {instring} {

  set tmpname ""
  for {set i 0} {$i < [string length $instring]} {incr i} {
# aus ' ' wird '_'; aus '_' wird '__'!
# aus '.' wird '-'; aus '-' wird '--'!
# aus '[' wird ':'; aus ':' wird '::'!
# aus ']' wird ';'; aus ';' wird ';;'!
    switch -exact -- [string index $instring $i] {
    " " {append tmpname "_"}
    "_" {append tmpname "__"}
    "-" {append tmpname "--"}
    "[" {append tmpname ":"}

    ":" {append tmpname "::"}
    "]" {append tmpname ";"}
    ";" {append tmpname ";;"}
    default {append tmpname [string index $instring $i]}
    }
  }
  return $tmpname
}


# procedure make_normal_button
proc make_normal_button {name_of_menu label command} {

# richtet einen neuen Button im Menu "name_of_menu" ein
# mit Label "label" und Kommando "command"

  if [catch {$name_of_menu add command -command $command -label $label} ] {
    puts stderr "Couldn't create button [lindex $label 0]"
    puts stderr "in menu $name_of_menu."
  }
}

# procedure make_cascade_button
proc make_cascade_button {submenu name_of_menu label} {

# richtet einen Cascade-Button ein im Menu "name_of_menu"
# mit Label "label", der das Submenu "submenu" anzeigt.

  if [catch {$name_of_menu add cascade -label $label -menu $submenu} ] {
    puts stderr "Couldn't create cascade-button $label"
    puts stderr "in menu $name_of_menu."}
}

# procedure make_menu
proc make_menu {name_of_menu} {
# richtet des Menue "name_of_menu" ein.

  if [catch {menu $name_of_menu -tearoff {0}  } ] {
    puts stderr "Couldn't create menu $name_of_menu."
    puts stderr "Either this menu is more than once in the config-file,"
    puts stderr "the upper menu in wich this menu should be created"
    puts stderr "doesn't exist or it's name is invalid."
    exit 1
  }
}


# Procedure: GetEntrySelection
proc GetEntrySelection { listbox} {
# welche entries sind in der listbox selektiert?
set my_selection_index [[SymbolicName $listbox] curselection]

# entries holen
set my_list {}
foreach i $my_selection_index {
	lappend my_list [[SymbolicName $listbox] get $i]
	}
return $my_list
}


# Procedure: ListQueue2Refresh
proc ListQueue2Refresh {} {
# liest ausgabe von lpq, teilt ausgabe in
# statuszeilen und entries und zeigt
# diese in den listboxen an

global listprinter
global confLPQ
global confLPC

global LPC-Jobs-Legend

# loesche listboxen (sofortiges User-Feedback... man kann
# sehen, dasz etwas passiert...)
[SymbolicName StatQueueList] delete 0 end
[SymbolicName EntryList] delete 0 end
[SymbolicName EntryList] insert end "Getting queue status."
[SymbolicName EntryList] insert end ""
#[SymbolicName EntryList] insert end "Please wait...    Please wait..."
[SymbolicName EntryList] insert end "Please wait..."
[SymbolicName LPCSingleListbox] delete 0 end
# update idletasks


# read output of lpq and split after newline at begin of a line
go_busy
set inlist [split [eval "exec $confLPQ -P$listprinter"] "\n"]
go_ready
# and add an empty line to the end
lappend inlist ""

set beginpointer 0
for {set i 0} {$i < [llength $inlist]} {incr i} {
  set tmpitem [lindex $inlist $i]
  if {[regexp "^ *$" $tmpitem]} {
    lappend tmplist [lrange $inlist $beginpointer [expr $i - 1]]
    set beginpointer $i}
  }

# throw away original list and just save the new one
set inlist $tmplist

# now extract the entries of the first displayed queue (the
# generic queue, not the entries of the subservers)
set tmplist [lindex $inlist 0]
set 1st_entry [lsearch -regexp $tmplist { *Rank *}]

# wenn headerzeile nicht gefunden, dann ganze liste
# statuszeilen, also zeiger auf ende
if {$1st_entry < 0} {set 1st_entry [llength $tmplist]}

# statlist = liste der statuszeilen
foreach i [lrange $tmplist 0 [expr $1st_entry - 1]] {
  lappend statlist $i}

# if there are some subservers then append the output for
# them to the status list
if {[llength $inlist]>1} {
  foreach i [lrange $inlist 1 end] {
    foreach j $i {
      lappend statlist $j}
    }
  }

# Legende extrahieren (die Zeile mit dem { *Rank *}) und als Legende anzeigen
regsub {( *)([^ ]*)(.*)} [lindex $tmplist $1st_entry] {\2\1\3} tmp_LPC-Jobs-Legend

if {[string compare ${tmp_LPC-Jobs-Legend} ""] != 0} {
  set LPC-Jobs-Legend ${tmp_LPC-Jobs-Legend}
}

# entrylist = liste der entries der queue
set entrylist ""
foreach i [lrange $tmplist [expr $1st_entry + 1] [expr [llength [lindex $inlist 0]] - 1]] {
  lappend entrylist $i}

# und nun lpc status einlesen
go_busy
set inlist [split [eval "exec $confLPC status $listprinter"] "\n"]
go_ready
 
# erstes element loeschen (gibt nur den drucker an)
set lpclist [lrange $inlist 1 [llength $inlist]]

# nochmals die listbox-eintraege loeschen, um bei
# zeitlicher ueberlagerung mehrerer aufrufe dieser
# routine die folgen zu eleminieren.

# eintraege aus statlist in listbox "Status of Queue" eintragen
[SymbolicName StatQueueList] delete 0 end
foreach i $statlist {
	[SymbolicName StatQueueList] insert end $i }
# eintraege aus entrylist in listbox "Entries of Queue" eintragen
[SymbolicName EntryList] delete 0 end
foreach i $entrylist {
	[SymbolicName EntryList] insert end $i }
# eintraege aus lpclist in listbox "LPC Status" eintragen
[SymbolicName LPCSingleListbox] delete 0 end
foreach i $lpclist {
	[SymbolicName LPCSingleListbox] insert end $i }
# und natuerlich das ganze anzeigen...
# update idletasks
}


##########################################################
## Commands for the buttons: Field Queues
##########################################################

# Procedure: Abort2Queue
proc Abort2Queue {} {
# ruft lpc abort auf fuer die aktuelle Queue
global listprinter
global confLPC

# erst requester ausgeben (nr. 3 = wirklich abort?)
  set doit [printop.req "abort" $listprinter]
  if {$doit} {
	go_busy
	eval "exec $confLPC abort $listprinter"
	go_ready
  }
  ListQueue2Refresh
}


# Procedure: Disable2Queue
proc Disable2Queue {} {
# ruft lpc disable auf fuer die aktuelle Queue
global listprinter
global confLPC

# erst requester ausgeben (nr. 5 = wirklich disable?)
set doit [printop.req "disable" $listprinter]
if {$doit} {
	go_busy
	eval "exec $confLPC disable $listprinter"
	go_ready
  }
ListQueue2Refresh
}


# Procedure: Enable2Queue
proc Enable2Queue {} {
# ruft lpc enable auf fuer die aktuelle Queue
global listprinter
global confLPC

# erst requester ausgeben (nr. 6 = wirklich enable?)
set doit [printop.req "enable" $listprinter]
if {$doit} {
	go_busy
	eval "exec $confLPC enable $listprinter"
	go_ready
  }
ListQueue2Refresh
}


# Procedure: Restart2Queue
proc Restart2Queue {} {
# ruft lpc kill auf fuer die aktuelle Queue
global listprinter
global confLPC

# requester ausgeben (nr. 8 = wirklich restart?)
set doit [printop.req "restart" $listprinter]
if {$doit} {
	go_busy
	eval "exec $confLPC kill $listprinter"
	go_ready
  }
ListQueue2Refresh
}


# Procedure: Start2Queue
proc Start2Queue {} {
# ruft lpc start auf fuer die aktuelle Queue
global listprinter
global confLPC

# erst requester ausgeben (nr. 4 = wirklich start?)
set doit [printop.req "start" $listprinter]
if {$doit} {
	go_busy
	eval "exec $confLPC start $listprinter"
	go_ready
  }
ListQueue2Refresh
}


# Procedure: Stop2Queue
proc Stop2Queue {} {
# ruft lpc stop auf fuer die aktuelle Queue
global listprinter
global confLPC

# erst requester ausgeben (nr. 7 = wirklich stop?)
set doit [printop.req "stop" $listprinter]
if {$doit} {
	go_busy
	eval "exec $confLPC stop $listprinter"
	go_ready
  }
ListQueue2Refresh
}


############################################################
## Procedures for the buttons: Field Entries
############################################################

# Procedure: RemoveEntries
proc RemoveEntries {} {
global listprinter
global confLPRM
global lpc_select_string


if {[llength [[SymbolicName EntryList] get 0 end]] >= 1} {

 # selektierte entries holen
 set sel_list [GetEntrySelection {EntryList}]

 if {[llength $sel_list] == 0} {
  set doit [printop.entryreq "rm" ""]
 } else {
  set doit [printop.entryreq "rm" [lindex [lindex $sel_list 0] 3]]
 }

# und jobs entfernen
	if {$doit} {
		go_busy
		eval "exec $confLPRM -P$listprinter $lpc_select_string"
		go_ready
	}
	ListQueue2Refresh
}
}


# Procedure: TopQueueEntries
proc TopQueueEntries {} {
# ruft lpc topq auf fuer selektierte Druck-Jobs
global listprinter
global confLPC
global lpc_select_string

# selektierte entries holen
set sel_list [GetEntrySelection {EntryList}]

if {[llength [[SymbolicName EntryList] get 0 end]] >= 1} {

 # selektierte entries holen
 set sel_list [GetEntrySelection {EntryList}]

 if {[llength $sel_list] == 0} {
  set doit [printop.entryreq "topq" ""]
 } else {
  set doit [printop.entryreq "topq" [lindex [lindex $sel_list 0] 3]]
 }

	if {$doit} {
		go_busy
		eval "exec $confLPC topq $listprinter $lpc_select_string"
		go_ready
	  }
	ListQueue2Refresh
}
}

# Procedure: HoldEntries
proc HoldEntries {} {
# ruft lpc topq auf fuer selektierte Druck-Jobs
global listprinter
global confLPC
global lpc_select_string

if {[llength [[SymbolicName EntryList] get 0 end]] >= 1} {

 # selektierte entries holen
 set sel_list [GetEntrySelection {EntryList}]

 if {[llength $sel_list] == 0} {
  set doit [printop.entryreq "hold" ""]
 } else {
  set doit [printop.entryreq "hold" [lindex [lindex $sel_list 0] 3]]
 }
	if {$doit} {
		go_busy
		eval "exec $confLPC hold $listprinter $lpc_select_string"
		go_ready
	  }
	ListQueue2Refresh
}
}

# Procedure: ReleaseEntries
proc ReleaseEntries {} {
# ruft lpc topq auf fuer selektierte Druck-Jobs
global listprinter
global confLPC
global lpc_select_string

if {[llength [[SymbolicName EntryList] get 0 end]] >= 1} {

 # selektierte entries holen
 set sel_list [GetEntrySelection {EntryList}]

 if {[llength $sel_list] == 0} {
  set doit [printop.entryreq "release" ""]
 } else {
  set doit [printop.entryreq "release" [lindex [lindex $sel_list 0] 3]]
 }
	if {$doit} {
		go_busy
		eval "exec $confLPC release $listprinter $lpc_select_string"
		go_ready
	  }
	ListQueue2Refresh
}
}

# Procedure: MoveEntries
proc MoveEntries {} {
# ruft lpc move auf fuer selektierte Druck-Jobs
global listprinter
global confLPC
global lpc_select_string
global move_dest_printer

if {[llength [[SymbolicName EntryList] get 0 end]] >= 1} {

 # selektierte entries holen
 set sel_list [GetEntrySelection {EntryList}]

 if {[llength $sel_list] == 0} {
  set doit [printop.moverequest ""]
 } else {
  set doit [printop.moverequest [lindex [lindex $sel_list 0] 3]]
 }

	if {$doit} {
		go_busy
		eval "exec $confLPC move $listprinter $lpc_select_string $move_dest_printer"
		go_ready
	  }
	ListQueue2Refresh
# end of if
}
}


#Procedure: show_about
proc show_about {} {
# Zeigt About-Fenster an.
ShowWindow.about
# tkwait visibility .about
[SymbolicName AboutAway] configure -state normal
}

# Procedure: printop.req
proc printop.req { kind_of_request printername} {
# gibt requester aus, wartet auf Antwort (mittels GRAB) und
# gibt true oder false zurueck, je nachdem ob die Aktion
# bestaetigt oder zurueckgenommen wird.
global MessageText
global do_confirm

if {$do_confirm == 0} {
  return 1  
}

set MessageText "Do you really want to $kind_of_request the queue $printername ?"

global mess_return
set mess_return {}
ShowWindow.message
# tkwait visibility .message
[SymbolicName MessageOk] configure -state normal
[SymbolicName MessageCancel] configure -state normal
grab set .message

# leider gibt es keine Moeglichkeit, das Ergebnis (welcher
# Knopf gedrueckt wurde) an die Procedure zurueckzuliefern,
# die den Requester geoeffnet hat (die widerum ja das Ergebnis
# an die Procedure zurueckgeben sollte, die den Requester
# anzeigen wollte und das Ergebnis davon auswerten...).
# Also muessen wir leider eine globale Variable nehmen, die
# von den Knoepfen auf den Rueckgabewert gesetzt wird. Waehrend
# der Requester also noch nicht bedient wurde, warten wir
# auf ein Aendern der Ergebnis-Variable.
tkwait window .message
return $mess_return
}

# Procedure: printop.entryreq
proc printop.entryreq { kind_of_request preselected} {
# gibt requester aus, wartet auf Antwort (mittels GRAB) und
# gibt true oder false zurueck, je nachdem ob die Aktion
# bestaetigt oder zurueckgenommen wird.
global MessageText
global listprinter

global do_confirm
global select_return
global lpc_select_string

if {($do_confirm == 0) && ([string compare $preselected ""] != 0)} {
  set lpc_select_string $preselected
  return 1
}

switch $kind_of_request {
	"rm" {set MessageText "Enter identifier for job to be removed\n from queue $listprinter."}
	"topq" {set MessageText "Enter identifier for job to be moved to top\n in queue $listprinter."}
	"release" {set MessageText "Enter identifier for job to be released\n in queue $listprinter."}
	"hold" {set MessageText "Enter identifier for job to be held\n in queue $listprinter."}
}

set select_return {}
set lpc_select_string {}
ShowWindow.selectrequest $preselected
# tkwait visibility .selectrequest
[SymbolicName SelectMessageOk] configure -state normal
[SymbolicName SelectMessageCancel] configure -state normal
grab set .selectrequest

# leider gibt es keine Moeglichkeit, das Ergebnis (welcher
# Knopf gedrueckt wurde) an die Procedure zurueckzuliefern,
# die den Requester geoeffnet hat (die widerum ja das Ergebnis
# an die Procedure zurueckgeben sollte, die den Requester
# anzeigen wollte und das Ergebnis davon auswerten...).
# Also muessen wir leider eine globale Variable nehmen, die
# von den Knoepfen auf den Rueckgabewert gesetzt wird. Waehrend
# der Requester also noch nicht bedient wurde, warten wir
# auf ein Aendern der Ergebnis-Variable.
tkwait window .selectrequest
return $select_return
}


# Procedure: printop.moverequest
proc printop.moverequest {preselected} {
# gibt requester aus, wartet auf Antwort (mittels GRAB) und
# gibt true oder false zurueck, je nachdem ob die Aktion
# bestaetigt oder zurueckgenommen wird.
global MessageText
global listprinter

set MessageText "Enter selection criteria and destination printer!"

global movereq_return
global move_dest_printer
global lpc_select_string

global do_confirm

if {($do_confirm == 0) && ([string compare $move_dest_printer ""] != 0) \
                       && ([string compare $preselected ""] != 0)} {
  set lpc_select_string $preselected
  return 1
}

# hier kommt der Rueckgabewert des Requesters (Ok/Cancel) hinein.
set movereq_return {}
# hier schreibt der requester den Destination Printer hinein.
###set move_dest_printer {}
# und hier den String zur Job-Anwahl...
set lpc_select_string {}
ShowWindow.moverequest $preselected
# tkwait visibility .moverequest
[SymbolicName MoveMessageOk] configure -state normal
[SymbolicName MoveMessageCancel] configure -state normal
grab set .moverequest

# leider gibt es keine Moeglichkeit, das Ergebnis (welcher
# Knopf gedrueckt wurde) an die Procedure zurueckzuliefern,
# die den Requester geoeffnet hat (die widerum ja das Ergebnis
# an die Procedure zurueckgeben sollte, die den Requester
# anzeigen wollte und das Ergebnis davon auswerten...).
# Also muessen wir leider eine globale Variable nehmen, die
# von den Knoepfen auf den Rueckgabewert gesetzt wird. Waehrend
# der Requester also noch nicht bedient wurde, warten wir
# auf ein Aendern der Ergebnis-Variable.
tkwait window .moverequest
return $movereq_return
}

# Procedure exist_printer? (liefert true, wenn printer beim parsen der
# printcap-Datei gefunden wurde, sonst false).
proc exist_printer? {name} {
	global printcap_list
	if {([lsearch -regexp $printcap_list ^$name]<0)} {
		return 0
	} else {
		return 1
	}
}

# Procedure newlsearch. Das Tcl-Search liefert aus einer Liste nur den
# Index des ersten Elements, das vom Pattern gematched wird. Dieses
# newsearch liefert eine Liste aller gematchten Indizes zur"uck.
proc newlsearch {liste pattern} {

  set zusaetzliche 0
  set indexliste ""
  set act_index [lsearch -regexp $liste $pattern]
  if {$act_index<0} {
    return ""
  } else {
    while {$act_index>=0} {
      lappend indexliste [expr $act_index + $zusaetzliche]
      set liste [lreplace $liste $act_index $act_index]
      set zusaetzliche [expr $zusaetzliche + 1]
      set act_index [lsearch -regexp $liste $pattern]
    }
    return $indexliste
  }
}

# Procedure insert_select_button. Erh"alt Drucker-Namen, einen
# widget-Pfad zu dem Men"u, in das der Button eingef"ugt werden
# soll.
proc insert_choosequeue_button {in_menu button} {
  make_normal_button $in_menu $button "[SymbolicName LPCListbox] selection clear 0 end; set listprinter $button; OpenSingleQueue"
}

# Procedure insert_move_button. Erh"alt Drucker-Namen, einen
# widget-Pfad zu dem Men"u, in das der Button eingef"ugt werden
# soll.
proc insert_move_button {in_menu button} {
  make_normal_button $in_menu $button "set move_dest_printer $button; MoveEntries"
}

# Procedure insert_buttons. Erh"alt Drucker-Pattern und
# Menu-Namen. Richtet in dem angegebenen Menu einen Knopf
# f"ur jeden Drucker ein, auf den Pattern pa"st.
proc insert_buttons {in_menu type this_printer_menu pattern} {


global printcap_list

  ;# ben"otigte Variablen werden initialisiert (auf leer)
  set tmpname_list ""
  set index_list ""
  ;# f"ur die Suche wird eine Liste erstellt, in der nur die
  ;# Namen der Drucker sind (gleiche Reihenfolge wie in der
  ;# Printcap-Liste).
  foreach i $printcap_list {
    lappend tmpname_list [lindex $i 0]}
  ;# jetzt werden die indizes aller gematchten Drucker geholt
  set index_list [newlsearch $tmpname_list $pattern]
  ;# Und jetzt wird f"ur jeden gefundenen Drucker ein Eintrag
  ;# in das Untermen"u eingesetzt (ggf. mit Remote-Kennung)
  foreach i $index_list {
    set tempdruck [lindex [lindex $printcap_list $i] 0]
    insert_${type}_button $this_printer_menu$in_menu $tempdruck
  }
}


# Procedure build_printer_menu
proc build_printer_menu {type this_printer_menu} {
# Diese Procedure liest die Defaults aus den entsprechenden
# Files aus. Hier wird das Drucker-Menue gebastelt, entweder nach der
# Datei "~/.printop.cfg" oder, wenn's die nicht gibt, dann nach
# "printop.cfg" im printop-Verzeichnis.

  global appcfg
  global usercfg

  if {[file exists $usercfg]} {
    if {![read_configs $type $this_printer_menu $usercfg]} {
	puts stderr "User config file $usercfg is not ok."
	puts stderr "Wrong file permissions or so."
	exit 1
    }
  } else {
    if {[file exists $appcfg]} {
      if {![read_configs $type $this_printer_menu $appcfg]} {
	puts stderr "System config file $appcfg is not ok."
	puts stderr "Tell your system administrator!"
	exit 1
      }
    }
  }
}

# procedure parse_error, gibt Fehlermeldung aus, keine Fehlerbehandlung.
# falsches Kommando wird einfach nicht ausgef"uhrt.
proc parse_error {line line_nr fehlermeldung datei} {
	puts stderr "Error in config-file $datei!"
	puts stderr $fehlermeldung
	puts stderr $line
	puts stderr "Error occurred in line $line_nr."
	puts stderr ""
}

# Procedure read_configs
proc read_configs {type this_printer_menu configfile} {
# hier werden aus der Datei, deren Name uebergeben wird, die
# Printer-Defaults ausgelesen. Dazu gehoert der voreingestellte
# Drucker (beim Start) und die Menu-Eintrage im Drucker-Menue.

global listprinter
#global main_printer_menu_name

# datei oeffnen, bei fehler 0 zurueckgeben
if [catch {open $configfile r} fileID] {
	return 0
} else {
# Zeilennummer auf 0 setzen (fuer Fehlerausgabe: wo ist der Fehler?)
set line_no 0
# solange lesen, bis eof
  while {![eof $fileID]} {
# leerzeilen und kommentarzeilen uebergehen
    set line [gets $fileID]
    set line_no [expr $line_no + 1] 
    if {(($line!="") && ([string index $line 0]!="#"))} {
      switch -exact -- [lindex $line 0] {
	printer {
	  switch -exact -- [lindex $line 1] {
	    button {
	      set pattern [lindex $line 2]
	      set path [lindex $line 3]
	      if {($path!="")} {
		set tmppath $path
		set path "."
		append path $tmppath }
	      insert_buttons $path $type $this_printer_menu $pattern
	    }
	    menu {
	      ;# kein dritter Eintrag in der Zeile (also kein Label)
	      if {([lindex $line 2] == "")} {
		parse_error $line $line_no "No menu-label specified:" $configfile
	      } else {
		;# kein vierter Eintrag in der Zeile (also kein Name)
		if {([lindex $line 3] == "")} {
		  parse_error $line $line_no "No menu-name specified:" $configfile
		} else {
		  ;# Zeile wird aufgedr"oselt in einzelne Argumente
		  set label [lindex $line 2]
		  set name [lindex $line 3]
		  set path [lindex $line 4]
		  ;# ein Button und ein damit verbundenes Men"u werden
		  ;# eingerichtet, in dem Men"u werden dann die Drucker
		  ;# (als Kn"opfe) eingerichtet.
		  if {($path!="")} {
		    set tmppath $path
		    set path "."
		    append path $tmppath }
		  make_menu $this_printer_menu$path.$name
		  make_cascade_button $this_printer_menu$path.$name $this_printer_menu$path "$label"
		}
	      }
	    }
	    default {
	      parse_error $line $line_no "Error in 'printer'-command:" $configfile
	    }
	  }
	}
	default {
	  parse_error $line $line_no "Unknown command:" $configfile
	  if {([llength $line]==2)} {
	    puts stderr "Maybe it's an old version of the config-file?"
	  }
	}
      }
    }
  }

close $fileID
return 1
}
}

# Internal procedures

# Procedure: SymbolicName
if {"[info procs SymbolicName]" == ""} {
proc SymbolicName { {xfName ""}} {
##########
# Procedure: SymbolicName
# Description: map a symbolic name to the widget path
# Arguments: xfName
# Returns: the symbolic name
# Sideeffects: none
##########

  global symbolicName

  if {"$xfName" != ""} {
    set xfArrayName ""
    append xfArrayName symbolicName ( $xfName )
    if {![catch "set \"$xfArrayName\"" xfValue]} {
      return $xfValue
    } {
      if {"[info commands XFProcError]" != ""} {
        XFProcError "Unknown symbolic name:\n$xfName"
      } {
        puts stderr "XF error: unknown symbolic name:\n$xfName"
      }
    }
  }
  return ""
}
}

# Startup for single queue part
proc StartupSingleSrc {args} {

  get_the_printers
}

# end source
proc EndSrc {} {
 # erst mal die Command-Line-Argumente anschauen
 global argc
 global argv
 
 # mehr als ein Argument? So ein Unsinn... und exit!
 if {$argc >0} {
	puts stderr "Usage of printop is: printop"
	exit 1 }
}

proc OpenSingleQueue {} {

 # which queue was chosen?
 global listprinter

if {[GetEntrySelection LPCListbox] != ""} {
set listprinter [lindex [split [lindex [lindex \
  [GetEntrySelection LPCListbox] 0] 0] "@"] 0]
}

 # first open the window
 ShowWindow.printop
# update idletasks
# tkwait visibility .printop
# [SymbolicName MessageOk] configure -state normal
# [SymbolicName MessageCancel] configure -state normal
# grab set .printop


 global listprinter
 if {!([exist_printer? $listprinter])} {
	puts stderr "Configured default-printer doesn't exist!"
	puts stderr "Please change listprinter-entry in config-file."
	exit 1 }

 # Und einmal die aktuelle Queue auslesen
 ListQueue2Refresh
}

# initialize global variables
proc InitGlobals {} {

  global env

  ;# path to the directory where printop resides
  ;#set printop_path "/usr/local/operator/bin/"
  global printop_path
  set printop_path [string range [info script] 0 [string last "/" [info script]]]

  global usercfg
  set {usercfg} "$env(HOME)/.printop.cfg"
  global appcfg
  set {appcfg} "$printop_path/printop.cfg"
  global {MessageText}
  set {MessageText} {}
  global {mess_return}
  set {mess_return} {}

  global {symbolicName}

  set {symbolicName(LPCListbox)} {.frame2.frame0.frame1.frame3.listbox8}

  set {symbolicName(EntryList)} {.printop.frame3.frame0.frame1.frame3.listbox8}
  set {symbolicName(LPCSingleListbox)} {.printop.frame2.frame0.frame1.frame3.listbox8}
  set {symbolicName(MessageCancel)} {.message.frame2.frame6.button8}
  set {symbolicName(MessageOk)} {.message.frame2.frame5.button7}
  set {symbolicName(MoveMessageOk)} {.moverequest.frame2.frame5.button7}
  set {symbolicName(MoveMessageCancel)} {.moverequest.frame2.frame6.button8}
  set {symbolicName(SelectMessageOk)} {.selectrequest.frame2.frame5.button7}
  set {symbolicName(SelectMessageCancel)} {.selectrequest.frame2.frame6.button8}
  set {symbolicName(StatQueueList)} {.printop.frame1.frame0.frame1.frame3.listbox8}
  set {symbolicName(AboutAway)} {.about.frame2.frame6.button8}
  set {symbolicName(root)} {.}
}


##########################################################
# the init routines (like c-style "MAIN")
##########################################################

# prepare auto loading
global auto_path
global tk_library

catch "unset auto_index"
catch "unset auto_oldpath"
catch "unset auto_execs"


# startup source
StartupSingleSrc

# initialize global variables
InitGlobals

# display/remove toplevel windows.
ShowWindow.

# end source
EndSrc

while 1 {
	ListQueueRefresh
	set wait_signal 0
	after $interval set wait_signal 1
	vwait wait_signal
 }

# eof
#

