/*
* 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