/* * 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 #include #include #include #include #include #include #include #include #include #include #include #include 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 ); }