/*
 * TCPVIEW
 *
 * Author:	Martin Hunt
 *		Networks and Distributed Computing
 *		Computing & Communications
 *		University of Washington
 *		Administration Building, AG-44
 *		Seattle, WA  98195
 *		Internet: martinh@cac.washington.edu
 *
 *
 * Copyright 1992 by the University of Washington
 *
 * Permission to use, copy, modify, and distribute this software and its
 * documentation for any purpose and without fee is hereby granted, provided
 * that the above copyright notice appears in all copies and that both the
 * above copyright notice and this permission notice appear in supporting
 * documentation, and that the name of the University of Washington not be
 * used in advertising or publicity pertaining to distribution of the software
 * without specific, written prior permission.  This software is made
 * available "as is", and
 * THE UNIVERSITY OF WASHINGTON DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED,
 * WITH REGARD TO THIS SOFTWARE, INCLUDING WITHOUT LIMITATION ALL IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, AND IN
 * NO EVENT SHALL THE UNIVERSITY OF WASHINGTON BE LIABLE FOR ANY SPECIAL,
 * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
 * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, TORT
 * (INCLUDING NEGLIGENCE) OR STRICT LIABILITY, ARISING OUT OF OR IN CONNECTION
 * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 *
 */

#ifndef lint
static char rcsid[] =
    "@(#) $Header: /usr/staff/martinh/tcpview/RCS/text.c,v 1.1 1993/04/22 20:37:23 martinh Exp $ (UW)";
#endif

#include  <stdio.h>
#include  <sys/types.h>
#include  <sys/stat.h>
#include  <X11/Intrinsic.h>
#include  <X11/StringDefs.h>
#include  <Xm/Xm.h>
#include  <Xm/Frame.h>
#include  <Xm/Text.h>
#include  <Xm/RowColumn.h>
#include  <Xm/BulletinB.h>
#include  <Xm/MainW.h>
#include  <Xm/SelectioB.h>
#include  <Xm/CascadeB.h>

static Widget text_widget, parent;
extern char PrintCommand[];

#ifdef __STDC__
Widget simple_menu (Widget,char *,int);
#else
Widget simple_menu ();
#endif


static Boolean FillFileWithWidget( widget, filename )
Widget  widget;
char    filename[];
{
  FILE            *fp;
  char            *buffer;
  
  fp = fopen( filename, "w" );
  if ( fp == NULL ) {
    xperror( filename );
    return( False );
  }
   
  buffer = XmTextGetString( widget );
  if( fwrite( buffer, 1, strlen( buffer ), fp ) == 0 ) {
    xperror( "fwrite" );
    XtFree( buffer );
    fclose( fp );
    return( False );
  }
  XtFree( buffer );
  fclose( fp );
  return( True ); 
} 

static void print_callback( widget, client_data, call_data )
Widget     widget;
caddr_t    client_data;
caddr_t    call_data;
{       
  char *filename;
  char str[128];

  filename = tmpnam(NULL);
  FillFileWithWidget( text_widget, filename );
  sprintf( str, "%s %s",PrintCommand, filename );
  system( str );
  unlink( filename ); 
}       

static void save_response_callback( widget, data, foo )
     Widget  widget;
     caddr_t data;
     XmSelectionBoxCallbackStruct *foo;
{
  char *string;
  XtUnmanageChild(widget);

  XmStringGetLtoR( foo->value, XmSTRING_DEFAULT_CHARSET, &string); 
/*  fprintf(stderr,"Got %s\n",string); */
  FillFileWithWidget( text_widget, string );
}

static void save_callback( widget, client_data, call_data )
Widget     widget;
caddr_t    client_data;
caddr_t    call_data;
{       
  XmString ms;
  int n;
  Arg args[2];
  Widget w;

  ms = XmStringCreateSimple("Name Of File To Save");
  n = 0;
  XtSetArg (args[n], XmNselectionLabelString, ms); n++;
  w = XmCreatePromptDialog( widget, "Filename",args,n);
  XtManageChild( w );
  XtAddCallback( w, XmNokCallback, save_response_callback, (caddr_t)0);  
}       

Boolean FillWidgetWithFile( widget, filename )
Widget  widget;
char    filename[];
{
  FILE            *fp;
  struct stat     file_info;
  char            *buffer;
  long            bytes_read;
  
  fp = fopen( filename, "r" );

  if ( fp == NULL ) {
    return( False );
  }
   
  /*
   * Get file size 
   */
  if ( stat( filename, &file_info )  != 0 ) {
    fclose( fp );
    return( False );
  }
  
  buffer = (char *) XtMalloc( file_info.st_size + 5 );
  if ( buffer == (char *) NULL ) {
    fclose( fp );
    return( False );
  }
  
  bytes_read = fread( buffer, 1, file_info.st_size, fp );
  fclose( fp );
  
  buffer[ file_info.st_size -1 ] = '\0'; /* truncate */
  
  if ( bytes_read <  file_info.st_size ) {
    XtFree( buffer );
    return( False );
  }

  XmTextSetString( widget, buffer );
  XtFree( buffer );
  
  return( True );
}

void show_text( filename, name )
char filename[], name[];
{
  Widget  menu_bar, menu_widget,  main_window, frame_widget;
  Arg     args[10];
  int     n=0;
  XmString xm;

  parent = XtCreateApplicationShell( "ExternalShell",
				     topLevelShellWidgetClass,
				     args, n );
  n = 0;
  XtSetArg( args[n], XmNallowShellResize, True ); n++;
  XtSetArg( args[n], XmNtitle, name ); n++;
  XtSetValues( parent, args, n );

  n = 0;
  main_window = XmCreateMainWindow( parent, "main", args, n );
  XtManageChild( main_window ); 
  
  n=0;
  menu_bar    = XmCreateMenuBar( main_window, "menu_bar",args,n );
  menu_widget = simple_menu(menu_bar,"File  ",'F');
  FillMenu( menu_widget, "Save As...", save_callback );
  FillMenu( menu_widget, "Print...", print_callback );

  XtManageChild (menu_bar);   

  n = 0;
  XtSetArg( args[n], XmNshadowThickness, 4 ); n++;
  frame_widget = XmCreateFrame( main_window,
			       "frame",
			       args,
			       n );
  
  XtManageChild( frame_widget ); 

  n = 0;
  XtSetArg( args[n], XmNeditable, True ); n++;
  XtSetArg( args[n], XmNeditMode, XmMULTI_LINE_EDIT ); n++;
  text_widget = XmCreateScrolledText( frame_widget, "external_window", args, n );
  XtManageChild( text_widget ); 
  
  FillWidgetWithFile( text_widget, filename );

  XmMainWindowSetAreas( main_window,
		       menu_bar,
		       (Widget) NULL,
		       (Widget) NULL,
		       (Widget) NULL,
		       frame_widget );  /* work area */
  
  XtRealizeWidget( parent );
} 





syntax highlighted by Code2HTML, v. 0.9.1