#! ../mofe --f

mergeResources topLevel \
    *background gainsboro \
    *foreground black \
    *mp2*activateCallback "sV g orientation %w; refreshCurrentPage g" \
    *pages*browseSelectionCallback "setPage g %p "

 set default_ps_doc /home/sylvester/http-spec.ps
 set default_ps_doc wafedoc.ps

 set psscan /usr/local/bin/psscan
 set psscan psscan


XmMainWindow main topLevel   width 600 height 550

  XmMenuBar menu_bar main
  sV main menuBar menu_bar
    XmPulldownMenu mp1 menu_bar unmanaged
      XmPushButton Load      mp1 activateCallback "manageChild fs"
      XmPushButton Next-Page mp1 activateCallback "nextPage g +1"
      XmPushButton Previous-Page mp1 activateCallback "nextPage g -1"
     XmPushButton Quit      mp1 activateCallback quit
    XmCascadeButton File menu_bar subMenuId mp1  mnemonic F

    XmPulldownMenu mp2 menu_bar unmanaged
      XmPushButton portrait    mp2
      XmPushButton landscape   mp2
      XmPushButton upside-down mp2
      XmPushButton seascape    mp2
    XmCascadeButton Orientation menu_bar subMenuId mp2 mnemonic O

    XmPulldownMenu mp3 menu_bar unmanaged
      XmPushButton Zoom-in     mp3 activateCallback "zoom g 1.2"
      XmPushButton Zoom-out    mp3 activateCallback "zoom g 1/1.2"
    XmCascadeButton Zoom menu_bar subMenuId mp3  mnemonic Z

    XmPulldownMenu mph menu_bar unmanaged
      XmPushButton Help    mph activateCallback "manageChild helpbox"
      XmPushButton Version mph activateCallback "manageChild versionbox"
    XmCascadeButton Help menu_bar subMenuId mph  mnemonic H

proc setFile {f} {
  global GSV psscan  

  set GSV(pagedescr)    {}
  set GSV(pagelabels)   {}
  set GSV(setup_start)  0
  set GSV(setup_len)    0
  set GSV(prolog_start) 0
  set GSV(prolog_len)   0

  set label ""

  foreach line [split [exec $psscan $f] \n] {
    if [regexp {^Page: ([0-9]*) ([0-9]*) ([0-9]*)} $line pl s e l] {
      lappend GSV(pagedescr) [list $s $l]
      #	echo $label = $s  $l
      lappend GSV(pagelabels) "$label     "
      set label ""
    } elseif [regexp {^PageLabel: (.*)} $line pl label] {
    } elseif [regexp {^Setup: ([0-9]*) ([0-9]*) ([0-9]*)} $line pl s e l] {
      set GSV(setup_start) $s
      set GSV(setup_len)   $l
    } elseif [regexp {^Prolog: ([0-9]*) ([0-9]*) ([0-9]*)} $line pl s e l] {
      set GSV(prolog_start) $s
      set GSV(prolog_len)   $l
    }
  }

  set GSV(maxpage) [llength $GSV(pagelabels)]
  sV pages items $GSV(pagelabels) itemCount $GSV(maxpage)
  # we count starting from 0
  incr  GSV(maxpage) -1

  set GSV(filename) $f
  if [info exists GSV(filehandle)] {
    close $GSV(filehandle) 
  }
  set GSV(filehandle) [open $f]
  set GSV(currentpage) 0
  GhostviewDisableInterpreter g
  refreshCurrentPage g
}

proc refreshCurrentPage {w} {
  global GSV
  setRawPage g $GSV(currentpage)
}

proc setRawPage {w page} {
  global GSV

  if [GhostviewIsInterpreterReady $w] {
    GhostviewNextPage $w
  } else {
    # puts stderr the-interpreter-is-NOT-ready
    GhostviewEnableInterpreter $w
    GhostviewSendPS $w $GSV(filehandle) $GSV(prolog_start) $GSV(prolog_len) 0
    GhostviewSendPS $w $GSV(filehandle) $GSV(setup_start)  $GSV(setup_len)  0
  }

  set pgdes [lindex $GSV(pagedescr) $page]
  GhostviewSendPS $w $GSV(filehandle) [lindex $pgdes 0] [lindex $pgdes 1] 0
  set GSV(currentpage) $page
}

proc setPage {w p} {
  setRawPage $w [incr p -1]
}

proc nextPage {w offset} {
  global GSV
  incr GSV(currentpage) $offset
  if {$GSV(currentpage) < 0} { 
    set GSV(currentpage) 0 
  } elseif {$GSV(currentpage) > $GSV(maxpage)} { 
    set GSV(currentpage) $GSV(maxpage)
  }
  refreshCurrentPage $w
}


if {[lsearch $PACKAGES GHOSTVIEW] == -1} {
  set msg {
    This program can only be used, when mofe was compiled with Ghostview
    support. Your version of mofe supports only the following packages
  }
  append msg $PACKAGES
  XmLabel g main labelString $msg recomputeSize false width 500 height 300
  sV Load sensitive false
  XmMainWindowSetAreas main menu_bar NULL NULL NULL g
  sV menu_bar menuHelpWidget Help
  realize
} else {
  XmForm form main
  XmScrolledList pages form \
      bottomAttachment ATTACH_FORM topAttachment ATTACH_FORM \
      items {"        "} itemCount 1
  XmScrolledWindow gvwin form \
      scrollingPolicy AUTOMATIC \
      bottomAttachment ATTACH_FORM topAttachment ATTACH_FORM \
      leftAttachment ATTACH_WIDGET leftWidget pages \
      rightAttachment ATTACH_FORM
  Ghostview g gvwin
  #  XmMainWindowSetAreas main menu_bar NULL NULL NULL g
  sV menu_bar menuHelpWidget Help
  realize
  if [info exists default_ps_doc] {
    setFile $default_ps_doc
  }
}

regexp {[^/]*$} $argv0 progName
XmMessageDialog versionbox mph unmanaged \
    dialogTitle "Motif Demo Program using the Ghostview widget" \
    okLabelString "Close" \
    messageString "$progName Version 0.00001, Jun 19, 1994"

XmMessageDialog helpbox mph unmanaged \
    dialogTitle "$progName Help" \
    okLabelString "Close" \
    messageString "This program is a simple demo program for the Ghostview Widget."

XmFileSelectionDialog fs mp1 unmanaged \
    dialogTitle "Select a Postscript File for Viewing" \
    okLabelString "Load" \
    pattern "*ps" \
    autoUnmanage true \
    okCallback "setFile %s"

unmanageChild \
    [XmMessageBoxGetChild versionbox DIALOG_CANCEL_BUTTON] \
    [XmMessageBoxGetChild versionbox DIALOG_HELP_BUTTON]
unmanageChild \
    [XmMessageBoxGetChild helpbox DIALOG_CANCEL_BUTTON] \
    [XmMessageBoxGetChild helpbox DIALOG_HELP_BUTTON]
unmanageChild \
    [XmFileSelectionBoxGetChild fs DIALOG_HELP_BUTTON]

proc zoom {w factor} {
  sV $w \
      xdpi [expr [gV $w xdpi]*$factor] \
      ydpi [expr [gV $w ydpi]*$factor]
  refreshCurrentPage $w
}

#register term {puts stderr ignore}

