/*
 *	This program is Copyright (C) 1987 by the Board of Trustees of the
 *	University of Illinois, and by the author Dirk Grunwald.
 */

#include "texx2.h"

#include <errno.h>
#include <sys/param.h>
#include <assert.h>
#include "dvi-simple.h"
#include "texx2-page.h"
#include "texx2-mark.h"
#include "texx2-widgets.h"

char TeXInputFileNameString[MAXPATHLEN+40];
char *TeXInputFileName;

char TeXInputDirNameString[MAXPATHLEN+40];
char *TeXInputDirName;

char fileNameInput[MAXPATHLEN];

/*
 *	If it's a file name, set to the directory of that file,
 *	otherwise, set to the directory
 */
void
setDirectory(dir)
char *dir;
{
  Arg argList[20];
  Cardinal args;

  char pDir[MAXPATHLEN];
  char *endPDir;
  int len;

  strncpy(pDir,dir,MAXPATHLEN);
  len = strlen(pDir);
  endPDir = &pDir[len];

  while (chdir(pDir) < 0) {
    /* skip back to last slash */
    while (endPDir != pDir && *endPDir != '/') endPDir--;

    if (endPDir == pDir) {
      getwd(pDir);
    }
    else {
      *endPDir = 0;
    }

  }

  getwd(pDir);

  strcpy(TeXInputDirNameString, "Directory: ");
  TeXInputDirName = &TeXInputDirNameString[strlen(TeXInputDirNameString)];
  strncpy(TeXInputDirName, pDir, MAXPATHLEN);

  if ( directoryLabel != NULL ) {
    args = 0;
    XtSetArg(argList[args], XtNlabel, TeXInputDirNameString); args++;
    XtSetArg(argList[args], XtNmaximumLength, MAXPATHLEN); args++;

    XtSetValues( directoryLabel, argList, args);
  }
}

void
  setFileName(fileName)
char *fileName;
{
  if ( fileNameText && XtIsRealized( fileNameText ) ) {
    XtTextBlock tblk;
    int len = (fileName == 0) ? 0 : strlen(fileName);
    
    if ( len > 0 ) {
      XtTextPosition start = 0;
      XtTextPosition end = strlen(fileNameInput);;

      tblk.firstPos = 0;
      tblk.length = len;
      tblk.ptr = fileName;
      tblk.format = FMT8BIT;
      
      XtTextDisableRedisplay(fileNameText);

      XtTextReplace( fileNameText, start, end, &tblk );

      XtTextEnableRedisplay(fileNameText);
    }
  }
  else {
    int len = (fileName == 0) ? 0 : strlen(fileName);
    bzero(fileNameInput, MAXPATHLEN);
    if ( len > 0 ) {
      strncpy(fileNameInput, fileName, MAXPATHLEN);
    }
  }
}

void
setFile(fileName, copy)
char *fileName;
int copy;
{
  DviDpi = TeXxResources.dpi;

  TeXPageCloseFile();	/* close open pages stuff */

  if( DviInit(fileName, copy )) {
    disablePageLevel();
    TeXPageSlamPages();
    error(0, 0,"[fopen] Unable to open ``%s''", fileName);
  }
  else {
    enablePageLevel();

    error(0, 0, "Opened the %d page file ``%s''",
	  DviTotalPages, DviFileName);

    strcpy(TeXInputFileNameString, "File: ");
    TeXInputFileName = &TeXInputFileNameString[strlen(TeXInputFileNameString)];
    strcpy(TeXInputFileName, DviFileName, MAXPATHLEN);

    if ( fileLabel != NULL) {
      Arg argList[20];
      Cardinal args;
      
      args = 0;
      XtSetArg(argList[args], XtNlabel, TeXInputFileNameString); args++;
      XtSetArg(argList[args], XtNmaximumLength, MAXPATHLEN); args++;

      XtSetValues( fileLabel, argList, args );
    }
  }
  TeXFontNewFile();
  TeXMarkNewFile();
  TeXPageOpenFile();
}

static lastOpenKind = 0;

static void
pushOpenFileButton(w, clientData,  callData)
Widget w;
caddr_t clientData;	/* unused */
caddr_t callData; /* unused */
{
  char *fileName = fileNameInput;
  
  if ( fileName == NULL ) {
    error(0, 0, "No file specified?");
  } 
  else {
    if ( w == cdButton ) {
      setDirectory( fileName );
    }
    else if (w == openButton) {
      lastOpenKind = 0;
      setFile( fileName, 0);
    }
    else if (w == copyButton) {
      lastOpenKind = 1;
      setFile( fileName, 1);
    }
  }
}

void
pushReopenButton(w, clientData, callData)
Widget w;
caddr_t clientData;	/* unused */
caddr_t callData; /* unused */
{
  char *fileName = fileNameInput;
  
  if ( fileName == NULL ) {
    error(0, 0, "No file specified?");
  } 
  else {
    setFile( fileName, lastOpenKind);	/* open it same way they did */
  }
}

static void
pushCloseFileButton(w, clientData,  callData)
Widget w;
caddr_t clientData;	/* unused */
caddr_t callData; /* unused */
{
  DviFini();
  TeXFontNewFile();
  TeXMarkNewFile();
  TeXPageCloseFile();
  TeXPageSlamPages();
  disablePageLevel();
}

/*
 *	Page related callbacks & routines
 */

enablePageLevel()
{
  Arg argList[20];
  Cardinal args;
      
  args = 0;
  XtSetArg(argList[args], XtNsensitive, True); args++;

  XtSetValues(pageButton, argList, args);
  XtSetValues(printAllButton, argList, args);
  XtSetValues(printMarkedButton, argList, args);
  XtSetValues(printUnmarkedButton, argList, args);
  XtSetValues(clearMarksButton, argList, args);
}

disablePageLevel()
{
  Arg argList[20];
  Cardinal args;
      
  args = 0;
  XtSetArg(argList[args], XtNsensitive, False); args++;

  XtSetValues(pageButton, argList, args);
  XtSetValues(printAllButton, argList, args);
  XtSetValues(printMarkedButton, argList, args);
  XtSetValues(printUnmarkedButton, argList, args);
  XtSetValues(clearMarksButton, argList, args);
}

static void
pushPageButton(w, clientData,  callData)
Widget w;
caddr_t clientData;	/* unused */
caddr_t callData; /* unused */
{
  if (DviFile != 0 ) {
    TeXPageBuild();
  }
} 

static void
pushPrintButton(w, clientData,  callData)
Widget w;
caddr_t clientData;	/* unused */
caddr_t callData; /* unused */
{
  PrintDirective what = (PrintDirective) clientData;
  assert( what == printAll || what == printMarked || what == printUnmarked );

  if (DviFile != 0) {
    TeXMarkPrint( what );
  }

} 

static void
pushClearMarksButton(w, clientData,  callData)
Widget w;
caddr_t clientData;	/* unused */
caddr_t callData; /* unused */
{
  if (DviFile != 0 ) {
    TeXMarkNone();
  }
} 

static void
pushQuitButton(w, clientData,  callData)
Widget w;
caddr_t clientData;	/* unused */
caddr_t callData; /* unused */
{
  exit(0);
} 

void
  BuildFileLevel()
{
  Arg argList[20];
  Cardinal args;
  int len = strlen(fileNameInput);

  args = 0;
  XtSetArg(argList[args], XtNeditType,XttextEdit); args++;
  XtSetArg(argList[args], XtNstring, fileNameInput); args++;
  XtSetArg(argList[args], XtNlength, MAXPATHLEN); args++;
  XtSetArg(argList[args], XtNtextOptions, (resizeWidth | wordBreak)); args++;
  fileNameText =
    XtCreateManagedWidget("fileName",
			  asciiStringWidgetClass, topPane,
			  argList, args);

  quitButton =
    XtCreateManagedWidget("Quit",
			  commandWidgetClass, topPane,
			  0,0);
  XtAddCallback( quitButton, XtNcallback, pushQuitButton, NULL);

  openButton =
    XtCreateManagedWidget("Open",
			  commandWidgetClass, topPane,
			  0,0);
  XtAddCallback( openButton, XtNcallback, pushOpenFileButton, NULL);

  copyButton =
    XtCreateManagedWidget("Copy",
			  commandWidgetClass, topPane,
			  0,0);
  XtAddCallback( copyButton, XtNcallback, pushOpenFileButton, NULL);

  closeButton =
    XtCreateManagedWidget("Close",
			  commandWidgetClass, topPane,
			  0,0);
  XtAddCallback( closeButton, XtNcallback, pushCloseFileButton, NULL);

  cdButton =
    XtCreateManagedWidget("Cd",
			  commandWidgetClass, topPane,
			  0,0);
  XtAddCallback( cdButton, XtNcallback, pushOpenFileButton, NULL);


  pageButton
    = XtCreateManagedWidget("Page",
			    commandWidgetClass, topPane,
			    0,0);
  XtAddCallback( pageButton, XtNcallback, pushPageButton, NULL);
  
  printAllButton
    = XtCreateManagedWidget("Print All",
			    commandWidgetClass, topPane,
			    0,0);
  XtAddCallback( printAllButton, XtNcallback, pushPrintButton, printAll);
  
  printMarkedButton
    = XtCreateManagedWidget("Print Marked",
			    commandWidgetClass, topPane,
			    0,0);
  XtAddCallback( printMarkedButton, XtNcallback, pushPrintButton, printMarked);
  
  printUnmarkedButton
    = XtCreateManagedWidget("Print Unmarked",
			    commandWidgetClass, topPane,
			    0,0);
  XtAddCallback( printUnmarkedButton, XtNcallback,
		pushPrintButton, printUnmarked);


  clearMarksButton
    = XtCreateManagedWidget("Clear Marks",
			    commandWidgetClass, topPane,
			    0,0);
  XtAddCallback( clearMarksButton, XtNcallback,
		pushClearMarksButton, 0);

  disablePageLevel();
  
  args = 0;
  XtSetArg(argList[args], XtNlabel, TeXInputDirNameString); args++;
  XtSetArg(argList[args], XtNmaximumLength, MAXPATHLEN); args++;
  XtSetArg(argList[args], XtNresize, True); args++;
  directoryLabel = 
    XtCreateManagedWidget("Cwd",
			  labelWidgetClass, topPane,
			  argList, args);

  args = 0;
  XtSetArg(argList[args], XtNlabel, TeXInputFileNameString); args++;
  XtSetArg(argList[args], XtNmaximumLength, MAXPATHLEN); args++;
  XtSetArg(argList[args], XtNresize, True); args++;
  fileLabel = 
    XtCreateManagedWidget("FileLabel",
			  labelWidgetClass, topPane,
			  argList, args);
}