Blame tests/Performance/Startup/editor.c

Packit b099d7
/* 
Packit b099d7
 * Motif
Packit b099d7
 *
Packit b099d7
 * Copyright (c) 1987-2012, The Open Group. All rights reserved.
Packit b099d7
 *
Packit b099d7
 * These libraries and programs are free software; you can
Packit b099d7
 * redistribute them and/or modify them under the terms of the GNU
Packit b099d7
 * Lesser General Public License as published by the Free Software
Packit b099d7
 * Foundation; either version 2 of the License, or (at your option)
Packit b099d7
 * any later version.
Packit b099d7
 *
Packit b099d7
 * These libraries and programs are distributed in the hope that
Packit b099d7
 * they will be useful, but WITHOUT ANY WARRANTY; without even the
Packit b099d7
 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
Packit b099d7
 * PURPOSE. See the GNU Lesser General Public License for more
Packit b099d7
 * details.
Packit b099d7
 *
Packit b099d7
 * You should have received a copy of the GNU Lesser General Public
Packit b099d7
 * License along with these librararies and programs; if not, write
Packit b099d7
 * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
Packit b099d7
 * Floor, Boston, MA 02110-1301 USA
Packit b099d7
*/ 
Packit b099d7
/* 
Packit b099d7
 * HISTORY
Packit b099d7
*/ 
Packit b099d7
#ifdef REV_INFO
Packit b099d7
#ifndef lint
Packit b099d7
static char rcsid[] = "$XConsortium: editor.c /main/8 1995/07/14 12:04:07 drk $"
Packit b099d7
#endif
Packit b099d7
#endif
Packit b099d7
/**---------------------------------------------------------------------
Packit b099d7
***	
Packit b099d7
***	file:		editor.c
Packit b099d7
***	description:	This program demonstrates the Motif text, 
Packit b099d7
*** main_parent window, and dialog widgets, as well as the cut and paste
Packit b099d7
***	functions.
Packit b099d7
***	
Packit b099d7
***	defaults:	editor.c depends on these defaults:
Packit b099d7
***
Packit b099d7
#
Packit b099d7
*allowShellResize:		true
Packit b099d7
*borderWidth:			0
Packit b099d7
*highlightThickness:		2
Packit b099d7
*traversalOn:			true
Packit b099d7
***-------------------------------------------------------------------*/
Packit b099d7
Packit b099d7
Packit b099d7
/*-------------------------------------------------------------
Packit b099d7
**	Include Files
Packit b099d7
*/
Packit b099d7
Packit b099d7
#include <fcntl.h>
Packit b099d7
#include <errno.h>
Packit b099d7
#include <sys/types.h>
Packit b099d7
#include <sys/stat.h>
Packit b099d7
#include <X11/Xatom.h>
Packit b099d7
Packit b099d7
#include <testlib.h>
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
/*-------------------------------------------------------------
Packit b099d7
**	Global Variables
Packit b099d7
*/
Packit b099d7
Packit b099d7
#define MENU_HELP		200
Packit b099d7
#define MENU_EXIT		201
Packit b099d7
#define MENU_OPEN		202
Packit b099d7
#define MENU_NEW		203
Packit b099d7
#define MENU_CLOSE		204
Packit b099d7
#define MENU_SAVE		205
Packit b099d7
#define MENU_SAVE_AS		206
Packit b099d7
#define MENU_PRINT		207
Packit b099d7
#define MENU_CUT		208
Packit b099d7
#define MENU_COPY		209
Packit b099d7
#define MENU_PASTE		210
Packit b099d7
#define MENU_CLEAR		211
Packit b099d7
#define MENU_FILE		212
Packit b099d7
#define MENU_EDIT		213
Packit b099d7
Packit b099d7
#define DIALOG_FSELECT		300
Packit b099d7
#define DIALOG_CWARNING		301
Packit b099d7
#define DIALOG_XWARNING		302
Packit b099d7
#define DIALOG_NEW		303
Packit b099d7
#define DIALOG_SAVE		304
Packit b099d7
#define DIALOG_HELP		305
Packit b099d7
#define DIALOG_PRINT		306
Packit b099d7
Packit b099d7
#define	DEFAULT_WIDTH	500
Packit b099d7
#define	DEFAULT_HEIGHT	400
Packit b099d7
Packit b099d7
#define	MAX_NAME_LEN	50
Packit b099d7
Packit b099d7
static void CreateText ();
Packit b099d7
Packit b099d7
/* defines a temporary file for file transfers */
Packit b099d7
Packit b099d7
Widget text;			/* multi-line text widget		    */
Packit b099d7
Widget cut_button;		/* clipboard cut button 		    */
Packit b099d7
Widget copy_button;		/* clipboard copy button 		    */
Packit b099d7
Widget paste_button;		/* clipboard paste button 		    */
Packit b099d7
Widget clear_button;		/* clipboard clear button 		    */
Packit b099d7
Widget open_dialog;		/* file selection dialog 		    */
Packit b099d7
Widget new_dialog;		/* file name prompt dialog 		    */
Packit b099d7
Widget close_warning;		/* special internal selection dialog	    */
Packit b099d7
Widget exit_warning;		/* special internal selection dialog	    */
Packit b099d7
Widget general_warning;		/* warning dialog	 		    */
Packit b099d7
Widget save_dialog;		/* save as prompt dialog	 	    */
Packit b099d7
Widget print_warning;		/* warning dialog		 	    */
Packit b099d7
Boolean file_saved = True;	/* indicates that the present file is saved */
Packit b099d7
char *filename = NULL;		/* string containing file name 		    */
Packit b099d7
int start_pos, end_pos;		/* start and end position of last action    */
Packit b099d7
Packit b099d7
XmStringCharSet charset = (XmStringCharSet) XmSTRING_DEFAULT_CHARSET;
Packit b099d7
				/* used to set up XmStrings */
Packit b099d7
Packit b099d7
char Error[128];
Packit b099d7
Packit b099d7
Widget		main_parent;/*  MainWindow	 	*/
Packit b099d7
Widget		menu_bar;	/*  RowColumn	 		*/
Packit b099d7
Bool		text_first; /*  "Open"/"New" selected for the first time */
Packit b099d7
Bool		text_startup;
Packit b099d7
Bool		edit_startup;
Packit b099d7
Bool		file_startup;
Packit b099d7
Packit b099d7
/* bits for exclamation point in dialog */
Packit b099d7
char warningBits[] = {
Packit b099d7
   0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, 0xe0, 0x07, 0x00,
Packit b099d7
   0x00, 0xe0, 0x07, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, 0xe0, 0x07, 0x00,
Packit b099d7
   0x00, 0xe0, 0x07, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, 0xe0, 0x07, 0x00,
Packit b099d7
   0x00, 0xe0, 0x07, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, 0xe0, 0x07, 0x00,
Packit b099d7
   0x00, 0xe0, 0x07, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, 0xe0, 0x07, 0x00,
Packit b099d7
   0x00, 0xe0, 0x07, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, 0xe0, 0x07, 0x00,
Packit b099d7
   0x00, 0xe0, 0x07, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit b099d7
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x03, 0x00,
Packit b099d7
   0x00, 0xe0, 0x07, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0x00, 0xf0, 0x0f, 0x00,
Packit b099d7
   0x00, 0xf0, 0x0f, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0x00, 0xe0, 0x07, 0x00,
Packit b099d7
   0x00, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00};
Packit b099d7
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  CreateDefaultImage - create a default images for warning symbol.
Packit b099d7
 *
Packit b099d7
 **********************************<->***********************************/
Packit b099d7
static XImage * CreateDefaultImage (bits, width, height)
Packit b099d7
char *bits;
Packit b099d7
int   width, height;
Packit b099d7
{
Packit b099d7
    XImage *image;
Packit b099d7
Packit b099d7
    image = (XImage *) XtMalloc (sizeof (XImage));
Packit b099d7
    image->width = width;
Packit b099d7
    image->height = height;
Packit b099d7
    image->data = bits;
Packit b099d7
    image->depth = 1;
Packit b099d7
    image->xoffset = 0;
Packit b099d7
    image->format = XYBitmap;
Packit b099d7
    image->byte_order = LSBFirst;
Packit b099d7
    image->bitmap_unit = 8;
Packit b099d7
    image->bitmap_bit_order = LSBFirst;
Packit b099d7
    image->bitmap_pad = 8;
Packit b099d7
    image->bytes_per_line = (width+7)/8;
Packit b099d7
    return (image);
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
/*-------------------------------------------------------------
Packit b099d7
**	OpenFile
Packit b099d7
**		Open the present file.  Returns true if file 
Packit b099d7
**  exists and open is sucessful.
Packit b099d7
*/
Packit b099d7
Boolean OpenFile()
Packit b099d7
{
Packit b099d7
   struct stat statbuf;		/* Information on a file. */
Packit b099d7
   int file_length;		/* Length of file. 	  */
Packit b099d7
   char * file_string;		/* Contents of file. 	  */
Packit b099d7
   FILE *fp = NULL;		/* Pointer to open file   */
Packit b099d7
   
Packit b099d7
   if ((fp = fopen(filename, "r+")) == NULL)
Packit b099d7
	if ((fp = fopen(filename, "r")) != NULL) {
Packit b099d7
	    fprintf(stderr, "Warning: file opened read only.\n");
Packit b099d7
	} else {
Packit b099d7
	    return(False);
Packit b099d7
	}
Packit b099d7
Packit b099d7
   if (stat(filename, &statbuf) == 0)
Packit b099d7
	 file_length = statbuf.st_size;
Packit b099d7
   else
Packit b099d7
	 file_length = 1000000; /* arbitrary file length */
Packit b099d7
Packit b099d7
   /* read the file string */
Packit b099d7
   file_string =  XtMalloc((unsigned)file_length);
Packit b099d7
   fread(file_string, sizeof(char), file_length, fp);
Packit b099d7
Packit b099d7
   /* close up the file */
Packit b099d7
   if (fclose(fp) != NULL) fprintf(stderr, "Warning: unable to close file.\n");
Packit b099d7
Packit b099d7
   /* added the file string to the text widget */
Packit b099d7
   XmTextSetString(text, file_string);
Packit b099d7
Packit b099d7
   file_saved = True; /* intialize to True */
Packit b099d7
	 
Packit b099d7
   /* make appropriate item sensitive */
Packit b099d7
   XtSetSensitive(text, True);
Packit b099d7
   XtSetSensitive(cut_button, True);
Packit b099d7
   XtSetSensitive(copy_button, True);
Packit b099d7
   XtSetSensitive(clear_button, True);
Packit b099d7
Packit b099d7
   return(True);
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
/*-------------------------------------------------------------
Packit b099d7
**	SaveFile
Packit b099d7
**		Save the present file.
Packit b099d7
*/
Packit b099d7
Boolean SaveFile()
Packit b099d7
{
Packit b099d7
    char   * file_string = NULL;    /* Contents of file.		   */
Packit b099d7
    FILE   *tfp;	            /* Pointer to open temporary file.     */
Packit b099d7
    char   namebuf[BUFSIZ];         /* for "system" call below             */
Packit b099d7
    int	   status;
Packit b099d7
    char   *tempname = (char *)XtMalloc(25); /* Temporary file name. 	   */
Packit b099d7
Packit b099d7
    strcpy(tempname, "/tmp/xmeditXXXXXX");
Packit b099d7
    
Packit b099d7
    if ((tfp = fopen(mktemp(tempname), "w")) == NULL) {
Packit b099d7
       fprintf(stderr, "Warning: unable to open temp file, text not saved.\n");
Packit b099d7
       return(False);;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    /* get the text string */
Packit b099d7
    file_string = XmTextGetString(text);
Packit b099d7
Packit b099d7
    /* write to a temp file */
Packit b099d7
    fwrite(file_string, sizeof(char), strlen(file_string) + 1, tfp);
Packit b099d7
Packit b099d7
    /* flush and close the temp file */
Packit b099d7
    if (fflush(tfp) != NULL) fprintf(stderr,"Warning: unable to flush file.\n");
Packit b099d7
    if (fclose(tfp) != NULL) fprintf(stderr,"Warning: unable to close file.\n");
Packit b099d7
Packit b099d7
    if (file_string != NULL) {
Packit b099d7
        XtFree(file_string); /* free the text string */
Packit b099d7
    }
Packit b099d7
Packit b099d7
    /* move the tempname to the saved file, but do it independent
Packit b099d7
	   of filesystem boundaries */
Packit b099d7
	sprintf (namebuf, "cp %s %s\0", tempname, filename);
Packit b099d7
	status = system(namebuf);
Packit b099d7
	unlink (tempname);
Packit b099d7
	if (status == 0) {
Packit b099d7
        file_saved = True;
Packit b099d7
    } else {
Packit b099d7
        fprintf(stderr, "Warning: unable to save file.\n");
Packit b099d7
        XtFree(tempname);
Packit b099d7
        return(False);
Packit b099d7
    }
Packit b099d7
           
Packit b099d7
    XtFree(tempname);
Packit b099d7
    return(True);
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
/*-------------------------------------------------------------
Packit b099d7
**      CloseFile
Packit b099d7
**              Close the present file.
Packit b099d7
*/
Packit b099d7
void CloseFile()
Packit b099d7
{
Packit b099d7
    /* zero out the text string in the text widget.
Packit b099d7
       caution: is causes a value changed callack. */
Packit b099d7
	/* Do this only if text widget is created. */
Packit b099d7
	if (text_first != True)
Packit b099d7
    	XmTextSetString(text, "");
Packit b099d7
Packit b099d7
    file_saved = True; /* reinitialize file_saved flag */
Packit b099d7
Packit b099d7
    /* free the file name */
Packit b099d7
    if (filename != NULL) {
Packit b099d7
	XtFree(filename);
Packit b099d7
        filename = NULL;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    /* set text to insensitive */
Packit b099d7
	/* Do this only if text widget is created. */
Packit b099d7
	if (text_first != True)
Packit b099d7
    	XtSetSensitive(text, False);
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
/*-------------------------------------------------------------
Packit b099d7
**	CopyFileToClipboard
Packit b099d7
**		Copy the present file to the clipboard.
Packit b099d7
*/
Packit b099d7
void CopyFileToClipboard(time)
Packit b099d7
Time time;
Packit b099d7
{
Packit b099d7
   char *selected_string = XmTextGetSelection (text); /* text selection    */
Packit b099d7
   long item_id = 0;			      /* clipboard item id */
Packit b099d7
   long data_id = 0;			      /* clipboard data id */
Packit b099d7
   long status = 0;			      /* clipboard status  */
Packit b099d7
   XmString clip_label;
Packit b099d7
Packit b099d7
   /* using the clipboard facilities, copy the selected text to the clipboard */
Packit b099d7
   if (selected_string != NULL) {
Packit b099d7
	clip_label = XmStringCreateLtoR ("NEW_EDITOR", charset);
Packit b099d7
	/* start copy to clipboard, and continue till
Packit b099d7
	   a sucessful start copy is made */
Packit b099d7
	status = 0;
Packit b099d7
	while (status != ClipboardSuccess)
Packit b099d7
	    status = XmClipboardStartCopy (XtDisplay(text), XtWindow(text),
Packit b099d7
				       	clip_label, time,
Packit b099d7
				       	text, NULL, &item_id);
Packit b099d7
Packit b099d7
   	/* move the data to the clipboard, and
Packit b099d7
	   continue till a sucessful copy is made */
Packit b099d7
	status = 0;
Packit b099d7
	while (status != ClipboardSuccess)
Packit b099d7
	    status = XmClipboardCopy (XtDisplay(text), XtWindow(text),
Packit b099d7
				      item_id, "STRING", selected_string,
Packit b099d7
                       	     	      (long)strlen(selected_string)+1, 0,
Packit b099d7
				      &data_id);
Packit b099d7
Packit b099d7
	/* end the copy to the clipboard and continue till
Packit b099d7
	   a sucessful end copy is made */
Packit b099d7
	status = 0;
Packit b099d7
	while (status != ClipboardSuccess)
Packit b099d7
	    status = XmClipboardEndCopy (XtDisplay(text), XtWindow(text),
Packit b099d7
					 item_id);
Packit b099d7
Packit b099d7
	/* allow pasting when an item is sucessfully copied to the clipboard */
Packit b099d7
	XtSetSensitive(paste_button, True);
Packit b099d7
Packit b099d7
   }
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
/*-------------------------------------------------------------
Packit b099d7
**	DeletePrimarySelection
Packit b099d7
**		Deletes the primary selection.
Packit b099d7
*/
Packit b099d7
void DeletePrimarySelection()
Packit b099d7
{
Packit b099d7
   XClientMessageEvent cm;
Packit b099d7
   XEvent *event;
Packit b099d7
Packit b099d7
   /* send a client message to the text widget
Packit b099d7
      to delete the current selection */
Packit b099d7
   cm.type = ClientMessage;
Packit b099d7
   cm.display = XtDisplay(text);
Packit b099d7
   cm.message_type = XmInternAtom(XtDisplay(text), "KILL_SELECTION", FALSE);
Packit b099d7
   cm.window = XtWindow(text);
Packit b099d7
   cm.format = 32;
Packit b099d7
   cm.data.l[0] = XA_PRIMARY;
Packit b099d7
Packit b099d7
   event = (XEvent *) &cm;
Packit b099d7
   XSendEvent(XtDisplay(text), cm.window, TRUE, NoEventMask, event);
Packit b099d7
}
Packit b099d7
Packit b099d7
/*-------------------------------------------------------------
Packit b099d7
**	PasteItemFromClipboard
Packit b099d7
**		paste item from the clipboard to the current cursor location
Packit b099d7
*/
Packit b099d7
void PasteItemFromClipboard()
Packit b099d7
{
Packit b099d7
   /* retrieve the current data from the clipboard
Packit b099d7
      and paste it at the current cursor position */
Packit b099d7
   char * selected_string = XmTextGetSelection (text);
Packit b099d7
					      /* containts of selection  */
Packit b099d7
   int status = 0;			      /* clipboard status	 */
Packit b099d7
   char *buffer;			      /* temporary text buffer 	 */
Packit b099d7
   unsigned long length;		      /* length of buffer     	 */
Packit b099d7
   unsigned long outlength = 0;		      /* length of bytes copied	 */
Packit b099d7
   long private_id = 0;	      		      /* id of item on clipboard */
Packit b099d7
   XmTextPosition cursorPos;		      /* text cursor position 	 */
Packit b099d7
   register int n;			      /* arg count  	      	 */
Packit b099d7
   Arg args[10];			      /* arg list	      	 */
Packit b099d7
Packit b099d7
   /* find the length of the paste item, continue till the length is found */
Packit b099d7
   while (status != ClipboardSuccess) {
Packit b099d7
     status = XmClipboardInquireLength(XtDisplay(text), XtWindow(text),
Packit b099d7
				      "STRING", &length);
Packit b099d7
     if (status == ClipboardNoData) {
Packit b099d7
	length = 0;
Packit b099d7
	break;
Packit b099d7
     }
Packit b099d7
   }
Packit b099d7
			
Packit b099d7
   if (length == 0) {
Packit b099d7
	fprintf(stderr, "Warning: paste failed, no items to paste.\n");	
Packit b099d7
	return;
Packit b099d7
   }
Packit b099d7
Packit b099d7
   /* malloc to necessary space */
Packit b099d7
   buffer = XtMalloc(length);
Packit b099d7
Packit b099d7
   status = XmClipboardRetrieve (XtDisplay(text), XtWindow(text), "STRING",
Packit b099d7
				 buffer, length, &outlength, &private_id);
Packit b099d7
			
Packit b099d7
   /* Dialogs need to be added to indicate errors in pasting */
Packit b099d7
   if (status != ClipboardSuccess) {
Packit b099d7
	fprintf(stderr, "Warning: paste failed, status = %d\n", status);	
Packit b099d7
	return;
Packit b099d7
   }
Packit b099d7
Packit b099d7
   /* get cursor position for pasting */
Packit b099d7
   n = 0;
Packit b099d7
   XtSetArg(args[n], XmNcursorPosition, &cursorPos); n++;
Packit b099d7
   XtGetValues(text, args, n);
Packit b099d7
			
Packit b099d7
   /* add new text */
Packit b099d7
   XmTextReplace(text, cursorPos, cursorPos, buffer);
Packit b099d7
}
Packit b099d7
Packit b099d7
/*-------------------------------------------------------------
Packit b099d7
**	FileChangedCB
Packit b099d7
**		Process callback from Text.
Packit b099d7
*/
Packit b099d7
void FileChangedCB (w, client_data, call_data) 
Packit b099d7
Widget		w;		/*  widget id		*/
Packit b099d7
XtPointer		client_data;	/*  data from application   */
Packit b099d7
XtPointer		call_data;	/*  data from widget class  */
Packit b099d7
{
Packit b099d7
    /* set the file_saved flag to indicate that the
Packit b099d7
       file has been modified and the user should be
Packit b099d7
       notified before exiting. */
Packit b099d7
Packit b099d7
    file_saved = False;
Packit b099d7
}
Packit b099d7
Packit b099d7
/*-------------------------------------------------------------
Packit b099d7
**	MenuCB
Packit b099d7
**		Process callback from PushButtons in PulldownMenus.
Packit b099d7
*/
Packit b099d7
void MenuCB (w, client_data, call_data) 
Packit b099d7
Widget		w;		/*  widget id		*/
Packit b099d7
XtPointer		client_data;	/*  data from application   */
Packit b099d7
XtPointer		call_data;	/*  data from widget class  */
Packit b099d7
{
Packit b099d7
	register int n;		/* arg count		    */
Packit b099d7
	Arg args[10];			/* arg list		    */
Packit b099d7
	char *command;			/* command used in printing */
Packit b099d7
Packit b099d7
	switch ((int)client_data)
Packit b099d7
	{
Packit b099d7
		case MENU_OPEN:
Packit b099d7
		case MENU_NEW:
Packit b099d7
Packit b099d7
			/*	
Packit b099d7
			 * Create Text if not already created.
Packit b099d7
			 */
Packit b099d7
			if (text_first == True) {
Packit b099d7
				CreateText (main_parent);
Packit b099d7
				XtManageChild (text);
Packit b099d7
Packit b099d7
				XmAddTabGroup(text);
Packit b099d7
Packit b099d7
				XtSetSensitive(text, False);
Packit b099d7
				text_first = False;
Packit b099d7
			}
Packit b099d7
			/* if "Open", display the file selection dialog */
Packit b099d7
			if ((int)client_data == MENU_OPEN)
Packit b099d7
				XtManageChild (open_dialog);
Packit b099d7
			/* else, display the prompt dialog */
Packit b099d7
			else
Packit b099d7
				XtManageChild (new_dialog);
Packit b099d7
			break;
Packit b099d7
Packit b099d7
		case MENU_CLOSE:
Packit b099d7
	 		/* the present file has not been saved since
Packit b099d7
			   the last modification */
Packit b099d7
			if (!file_saved) /* display the 'save' message dialog */
Packit b099d7
			   XtManageChild (close_warning);
Packit b099d7
			else
Packit b099d7
			   CloseFile();
Packit b099d7
			break;
Packit b099d7
Packit b099d7
		case MENU_SAVE:
Packit b099d7
			/* open a temp file for writing */
Packit b099d7
			SaveFile();
Packit b099d7
			break;
Packit b099d7
Packit b099d7
		case MENU_SAVE_AS:
Packit b099d7
			/* Display the 'save as' dialog with the
Packit b099d7
			   present filename displayed in it. */
Packit b099d7
			n = 0;
Packit b099d7
			XtSetArg(args[n], XmNtextString,
Packit b099d7
			     XmStringCreateLtoR (filename, charset));  n++;
Packit b099d7
			XtSetValues(save_dialog, args, n);
Packit b099d7
			XtManageChild (save_dialog);
Packit b099d7
			break;
Packit b099d7
Packit b099d7
		case MENU_PRINT:
Packit b099d7
			if (!file_saved)
Packit b099d7
			   XtManageChild(print_warning);
Packit b099d7
			else if (filename != NULL) {
Packit b099d7
				/* malloc space for the command name. 
Packit b099d7
			   	   Note: command = size of the filename +
Packit b099d7
			   	   "lp " + null terminator */
Packit b099d7
				command = XtMalloc(strlen(filename) + 4);
Packit b099d7
				sprintf(command, "lp %s\0", filename);
Packit b099d7
				if (system(command) != NULL)
Packit b099d7
					fprintf(stderr, "print failed");
Packit b099d7
				XtFree(command);
Packit b099d7
			}
Packit b099d7
			break;
Packit b099d7
Packit b099d7
		case MENU_EXIT:
Packit b099d7
			/* exit if there is no files open */
Packit b099d7
			if (!file_saved) /* display the 'save' message dialog */
Packit b099d7
			   XtManageChild (exit_warning);
Packit b099d7
			else {
Packit b099d7
			   /* close up file pointers and descriptors */
Packit b099d7
			   CloseFile();
Packit b099d7
Packit b099d7
			   /* exit this program */
Packit b099d7
			   exit (0);
Packit b099d7
			}
Packit b099d7
			break;
Packit b099d7
Packit b099d7
		case MENU_CUT:
Packit b099d7
			{
Packit b099d7
			   /* needed to get the event time */
Packit b099d7
                           XmAnyCallbackStruct * cb =
Packit b099d7
					    (XmAnyCallbackStruct *) call_data;
Packit b099d7
Packit b099d7
			   /* call routine to copy selection to clipboard */
Packit b099d7
			   CopyFileToClipboard(cb->event->xbutton.time);
Packit b099d7
Packit b099d7
			   /* call routine to delete primary selection */
Packit b099d7
			   DeletePrimarySelection();
Packit b099d7
    			}
Packit b099d7
			break;
Packit b099d7
Packit b099d7
		case MENU_COPY:
Packit b099d7
    			{
Packit b099d7
			   /* needed to get the event time */
Packit b099d7
                           XmAnyCallbackStruct * cb =
Packit b099d7
					    (XmAnyCallbackStruct *) call_data;
Packit b099d7
Packit b099d7
			   /* call routine to copy selection to clipboard */
Packit b099d7
			   CopyFileToClipboard(cb->event->xbutton.time);
Packit b099d7
Packit b099d7
    			}
Packit b099d7
			break;
Packit b099d7
Packit b099d7
		case MENU_PASTE:
Packit b099d7
			/* call the routine that pastes the
Packit b099d7
			   text at the cursor position */
Packit b099d7
			PasteItemFromClipboard();
Packit b099d7
			break;
Packit b099d7
Packit b099d7
		case MENU_CLEAR:
Packit b099d7
			/* call routine to delete primary selection */
Packit b099d7
			DeletePrimarySelection();
Packit b099d7
			break;
Packit b099d7
Packit b099d7
		case MENU_HELP:
Packit b099d7
			/* no help at this time */
Packit b099d7
			break;
Packit b099d7
Packit b099d7
		default:
Packit b099d7
			/* unknown client_data was recieved and
Packit b099d7
			   there is no setup to handle this */
Packit b099d7
			fprintf(stderr, "Warning: in menu callback\n");
Packit b099d7
			break;
Packit b099d7
	}
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
/*-------------------------------------------------------------
Packit b099d7
**	DialogApplyCB
Packit b099d7
**		Process callback from Dialog apply actions.
Packit b099d7
*/
Packit b099d7
static void DialogApplyCB (w, client_data, call_data) 
Packit b099d7
Widget		w;		/*  widget id		*/
Packit b099d7
XtPointer		client_data;	/*  data from application   */
Packit b099d7
XtPointer		call_data;	/*  data from widget class  */
Packit b099d7
{
Packit b099d7
	char *command;			/* command used in printing */
Packit b099d7
Packit b099d7
	switch ((int)client_data)
Packit b099d7
	{
Packit b099d7
		case DIALOG_PRINT:
Packit b099d7
			if (filename != NULL) {
Packit b099d7
			       /* malloc space for the command name. 
Packit b099d7
			          Note: command = size of the filename +
Packit b099d7
			          "lp " + null terminator */
Packit b099d7
				command = XtMalloc(strlen(filename) + 4);
Packit b099d7
				sprintf(command, "lp %s\0", filename);
Packit b099d7
				if (system(command) != NULL)
Packit b099d7
					fprintf(stderr, "print failed");
Packit b099d7
				XtFree(command);
Packit b099d7
			}
Packit b099d7
		case DIALOG_CWARNING:
Packit b099d7
			CloseFile();
Packit b099d7
			file_saved = True; /* reset the default */
Packit b099d7
			break;
Packit b099d7
Packit b099d7
		case DIALOG_XWARNING:
Packit b099d7
			CloseFile();
Packit b099d7
			exit(0);
Packit b099d7
			break;		
Packit b099d7
Packit b099d7
		default:
Packit b099d7
			/* unknown client_data was recieved and
Packit b099d7
			   there is no setup to handle this */
Packit b099d7
			fprintf (stderr, "Warning: in apply callback\n");
Packit b099d7
			break;
Packit b099d7
Packit b099d7
	}
Packit b099d7
}
Packit b099d7
Packit b099d7
/*-------------------------------------------------------------
Packit b099d7
**	DialogCancelCB
Packit b099d7
**		Process callback from Dialog cancel actions.
Packit b099d7
*/
Packit b099d7
static void DialogCancelCB (w, client_data, call_data) 
Packit b099d7
Widget		w;		/*  widget id		*/
Packit b099d7
XtPointer		client_data;	/*  data from application   */
Packit b099d7
XtPointer		call_data;	/*  data from widget class  */
Packit b099d7
{
Packit b099d7
	switch ((int)client_data)
Packit b099d7
	{
Packit b099d7
		case DIALOG_FSELECT:
Packit b099d7
			/* popdown the file selection box */
Packit b099d7
		  	XtUnmanageChild (open_dialog);
Packit b099d7
			break;
Packit b099d7
Packit b099d7
		case DIALOG_CWARNING:
Packit b099d7
		case DIALOG_XWARNING:
Packit b099d7
		case DIALOG_NEW:
Packit b099d7
		case DIALOG_PRINT:
Packit b099d7
		case DIALOG_SAVE:
Packit b099d7
		case DIALOG_HELP:
Packit b099d7
			/* no action is necessary at this time */
Packit b099d7
			break;
Packit b099d7
Packit b099d7
		default:
Packit b099d7
			/* a unknown client_data was recieved and
Packit b099d7
			   there is no setup to handle this */
Packit b099d7
			fprintf (stderr, "Warning: in cancel callback\n");
Packit b099d7
			break;
Packit b099d7
	}
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
/*-------------------------------------------------------------
Packit b099d7
**	DialogAcceptCB
Packit b099d7
**		Process callback from Dialog actions.
Packit b099d7
*/
Packit b099d7
static void DialogAcceptCB (w, client_data, call_data) 
Packit b099d7
Widget		w;		/*  widget id		*/
Packit b099d7
XtPointer		client_data;	/*  data from application   */
Packit b099d7
XtPointer		call_data;	/*  data from widget class  */
Packit b099d7
{
Packit b099d7
	char *command;		/* command used in printing */
Packit b099d7
Packit b099d7
	switch ((int)client_data)
Packit b099d7
	{
Packit b099d7
		case DIALOG_FSELECT:
Packit b099d7
		        /* open the file and read it into the text widget */
Packit b099d7
			if (filename != NULL) {
Packit b099d7
			   XtFree(filename);
Packit b099d7
			   filename = NULL;
Packit b099d7
                        }
Packit b099d7
			{
Packit b099d7
			   XmFileSelectionBoxCallbackStruct *fcb =
Packit b099d7
				 (XmFileSelectionBoxCallbackStruct *) call_data;
Packit b099d7
Packit b099d7
			   /* get the filename from the file selection box */
Packit b099d7
			   XmStringGetLtoR(fcb->value, charset, &filename);
Packit b099d7
Packit b099d7
			   /* Open file, print error if it does not exist. */
Packit b099d7
			   if (!OpenFile())
Packit b099d7
	   		      fprintf(stderr, "Warning: unable to open file\n");
Packit b099d7
Packit b099d7
			   /* popdown the file selection box */
Packit b099d7
		  	   XtUnmanageChild (open_dialog);
Packit b099d7
			}
Packit b099d7
			break;
Packit b099d7
Packit b099d7
		case DIALOG_NEW:
Packit b099d7
		        /* open the file and read it into the text widget */
Packit b099d7
			if (filename != NULL) {
Packit b099d7
			   XtFree(filename);
Packit b099d7
			   filename = NULL;
Packit b099d7
                        }
Packit b099d7
			{
Packit b099d7
			   XmSelectionBoxCallbackStruct *scb =
Packit b099d7
				 (XmSelectionBoxCallbackStruct *) call_data;
Packit b099d7
Packit b099d7
			   /* get the filename string from the file
Packit b099d7
			      name prompt box */
Packit b099d7
			   XmStringGetLtoR(scb->value, charset, &filename);
Packit b099d7
Packit b099d7
			   /* open file if it exists,
Packit b099d7
			      if not set items sensitive */
Packit b099d7
			   if (!OpenFile(True)) {
Packit b099d7
   			   	/* make appropriate item sensitive */
Packit b099d7
   			   	XtSetSensitive(text, True);
Packit b099d7
   			   	XtSetSensitive(cut_button, True);
Packit b099d7
   			   	XtSetSensitive(copy_button, True);
Packit b099d7
   			   	XtSetSensitive(clear_button, True);
Packit b099d7
			   }
Packit b099d7
Packit b099d7
			   /* popdown the file selection box */
Packit b099d7
		  	   XtUnmanageChild (new_dialog);
Packit b099d7
			}
Packit b099d7
			break;
Packit b099d7
Packit b099d7
		case DIALOG_CWARNING:
Packit b099d7
			/* save the file */
Packit b099d7
			if (SaveFile()) {
Packit b099d7
			   CloseFile(); /* close the file */
Packit b099d7
			} else
Packit b099d7
			   fprintf(stderr, 
Packit b099d7
			       "Warning: unable to save file, file not closed");
Packit b099d7
			break;
Packit b099d7
Packit b099d7
		case DIALOG_XWARNING:
Packit b099d7
			/* save the file */
Packit b099d7
			if (SaveFile()) {
Packit b099d7
			   CloseFile(); /* close the file */
Packit b099d7
			   exit(0);
Packit b099d7
                        } else
Packit b099d7
			   fprintf(stderr,
Packit b099d7
				 "Warning: unable to save file, exit aborted");
Packit b099d7
			break;
Packit b099d7
Packit b099d7
		case DIALOG_SAVE:
Packit b099d7
			{
Packit b099d7
			   XmSelectionBoxCallbackStruct *scb =
Packit b099d7
				 (XmSelectionBoxCallbackStruct *) call_data;
Packit b099d7
Packit b099d7
			   /* get the filename string from the file
Packit b099d7
			      selection box */
Packit b099d7
			   XmStringGetLtoR(scb->value, charset, &filename);
Packit b099d7
			
Packit b099d7
			   SaveFile();
Packit b099d7
Packit b099d7
			   XtUnmanageChild (save_dialog);
Packit b099d7
			}
Packit b099d7
			break;
Packit b099d7
Packit b099d7
		case DIALOG_PRINT:
Packit b099d7
			/* save the file */
Packit b099d7
			if (SaveFile()) {
Packit b099d7
			   if (filename != NULL) {
Packit b099d7
			       /* malloc space for the command name. 
Packit b099d7
			          Note: command = size of the filename +
Packit b099d7
			          "lp " + null terminator */
Packit b099d7
				command = XtMalloc(strlen(filename) + 4);
Packit b099d7
				sprintf(command, "lp %s\0", filename);
Packit b099d7
				if (system(command) != NULL)
Packit b099d7
					fprintf(stderr, "print failed");
Packit b099d7
				XtFree(command);
Packit b099d7
				}
Packit b099d7
			} else
Packit b099d7
			   fprintf(stderr, 
Packit b099d7
			      "Warning: unable to save file, file not printed");
Packit b099d7
			break;
Packit b099d7
Packit b099d7
		case DIALOG_HELP:
Packit b099d7
			/* no help at this time */
Packit b099d7
			break;
Packit b099d7
Packit b099d7
		default:
Packit b099d7
			/* unknown callback type */
Packit b099d7
			fprintf (stderr, "Warning: in accept callback\n");
Packit b099d7
			break;
Packit b099d7
	}
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
/*-------------------------------------------------------------
Packit b099d7
**	CreateSpecialWarningDialog
Packit b099d7
**		Create special 4 button message box out of a
Packit b099d7
**	Selection box.
Packit b099d7
*/
Packit b099d7
static Widget CreateSpecialWarningDialog (parent, name, image_string, message,
Packit b099d7
					  arglist, argcount)
Packit b099d7
Widget		parent;
Packit b099d7
String		name;
Packit b099d7
String		image_string;
Packit b099d7
String		message;
Packit b099d7
ArgList		arglist;
Packit b099d7
int		argcount;
Packit b099d7
{
Packit b099d7
	Widget 		warning_dialog;	/*  special warning selection box */
Packit b099d7
	Widget 		work_area;	/*  rowcolumn for pixmap and text */
Packit b099d7
	Widget 		pixmap_label;	/*  pixmap label 		  */
Packit b099d7
	Widget 		text_label;	/*  text label 			  */
Packit b099d7
	Widget 		apply_button;	/*  apply button		  */
Packit b099d7
	Widget 		ok_button;	/*  ok button			  */
Packit b099d7
        Widget          kid[5];         /*  buttons		          */
Packit b099d7
	Pixel		foreground;	/*  dialog foreground		  */
Packit b099d7
	Pixel		background;	/*  dialog background		  */
Packit b099d7
	Pixmap		pixmap;		/*  dialog pixmap		  */
Packit b099d7
        register int    i;              /*  kid index			  */
Packit b099d7
        Arg             args[10];         /*  arg list		          */
Packit b099d7
        register int    n;             /*  arg count		          */
Packit b099d7
Packit b099d7
Packit b099d7
	warning_dialog = XmCreatePromptDialog(parent, name, arglist, argcount);
Packit b099d7
Packit b099d7
	n = 0;
Packit b099d7
	XtSetArg(args[n], XmNorientation, XmHORIZONTAL); n++;
Packit b099d7
	work_area = XmCreateRowColumn(warning_dialog, "workarea", args, n);
Packit b099d7
	XtManageChild(work_area);
Packit b099d7
Packit b099d7
	n = 0;
Packit b099d7
	XtSetArg(args[n], XmNforeground, &foreground); n++;
Packit b099d7
	XtSetArg(args[n], XmNbackground, &background); n++;
Packit b099d7
	XtGetValues(warning_dialog, args, n);
Packit b099d7
Packit b099d7
	n = 0;
Packit b099d7
	XtSetArg(args[n], XmNlabelType, XmPIXMAP); n++;
Packit b099d7
	pixmap = XmGetPixmap(XtScreen(warning_dialog), image_string,
Packit b099d7
			     foreground, background);
Packit b099d7
	XtSetArg(args[n], XmNlabelPixmap, pixmap); n++;
Packit b099d7
	pixmap_label = XmCreateLabel(work_area, "pixmap_label", args, n);
Packit b099d7
	XtManageChild(pixmap_label);
Packit b099d7
Packit b099d7
	n = 0;
Packit b099d7
	XtSetArg(args[n], XmNlabelString,
Packit b099d7
		 XmStringCreateLtoR(message, charset)); n++;
Packit b099d7
	text_label = XmCreateLabel(work_area, "text_label", args, n);
Packit b099d7
	XtManageChild(text_label);
Packit b099d7
Packit b099d7
        apply_button = XmSelectionBoxGetChild (warning_dialog,
Packit b099d7
							 XmDIALOG_APPLY_BUTTON);
Packit b099d7
	
Packit b099d7
	n = 0;
Packit b099d7
	XtSetArg(args[n], XmNlabelString,
Packit b099d7
		 XmStringCreateLtoR("Discard", charset)); n++;
Packit b099d7
	XtSetValues(apply_button, args, n);
Packit b099d7
	XtManageChild(apply_button);
Packit b099d7
Packit b099d7
        ok_button = XmSelectionBoxGetChild (warning_dialog,
Packit b099d7
							 XmDIALOG_OK_BUTTON);
Packit b099d7
	n = 0;
Packit b099d7
	XtSetArg(args[n], XmNlabelString,
Packit b099d7
		 XmStringCreateLtoR("Save", charset)); n++;
Packit b099d7
	XtSetValues(ok_button, args, n);
Packit b099d7
Packit b099d7
	
Packit b099d7
        /*      Unmanage unneeded children.
Packit b099d7
        */
Packit b099d7
        i = 0;
Packit b099d7
        kid[i++] = XmSelectionBoxGetChild (warning_dialog, XmDIALOG_TEXT);
Packit b099d7
        kid[i++] = XmSelectionBoxGetChild (warning_dialog,
Packit b099d7
						     XmDIALOG_SELECTION_LABEL);
Packit b099d7
        XtUnmanageChildren (kid, i);
Packit b099d7
Packit b099d7
	return(warning_dialog);
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
static void CreateFileMenuCB (w, client_data, call_data) 
Packit b099d7
Widget		w;		/*  widget id		*/
Packit b099d7
XtPointer		client_data;	/*  data from application   */
Packit b099d7
XtPointer		call_data;	/*  data from widget class  */
Packit b099d7
Packit b099d7
{
Packit b099d7
Packit b099d7
	CreateFileMenu((Widget)client_data);
Packit b099d7
	XtDestroyWidget(w);
Packit b099d7
	return;
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7
CreateFileMenu(file_button)
Packit b099d7
Widget	file_button;
Packit b099d7
Packit b099d7
{
Packit b099d7
Packit b099d7
	Widget			menu_pane;
Packit b099d7
	XImage			*image;		/*  image for warning pixmap	*/
Packit b099d7
	Widget			button;		/*  PushButton			*/
Packit b099d7
	register int 	n;			/* arg count 	      	 */
Packit b099d7
	Arg 			args[10];		/* arg list		   	 */
Packit b099d7
Packit b099d7
	/*	Create "File" PulldownMenu.
Packit b099d7
	*/
Packit b099d7
	n = 0;
Packit b099d7
	menu_pane = XmCreatePulldownMenu (menu_bar, "menu_pane", args, n);
Packit b099d7
Packit b099d7
    image = CreateDefaultImage (warningBits, 32, 32);
Packit b099d7
    XmInstallImage (image, "warning_image");
Packit b099d7
					
Packit b099d7
	n = 0;
Packit b099d7
	XtSetArg(args[n], XmNlabelString,
Packit b099d7
		 XmStringCreateLtoR("Open", charset)); n++;
Packit b099d7
	XtSetArg(args[n], XmNmnemonic, 'O'); n++;
Packit b099d7
	button = XmCreatePushButton (menu_pane, "Open", args, n);
Packit b099d7
	XtAddCallback (button, XmNactivateCallback, MenuCB, (XtPointer) MENU_OPEN);
Packit b099d7
	XtManageChild (button);
Packit b099d7
Packit b099d7
	open_dialog = XmCreateFileSelectionDialog(menu_pane,
Packit b099d7
			   "file selection dialog", NULL, 0);
Packit b099d7
Packit b099d7
	XtAddCallback (open_dialog, XmNokCallback,
Packit b099d7
			DialogAcceptCB, (XtPointer) DIALOG_FSELECT);
Packit b099d7
	XtAddCallback (open_dialog, XmNcancelCallback,
Packit b099d7
			DialogCancelCB, (XtPointer) DIALOG_FSELECT);
Packit b099d7
Packit b099d7
	n = 0;
Packit b099d7
	XtSetArg(args[n], XmNlabelString,
Packit b099d7
		 XmStringCreateLtoR("New", charset)); n++;
Packit b099d7
	XtSetArg(args[n], XmNmnemonic, 'N'); n++;
Packit b099d7
	button = XmCreatePushButton (menu_pane, "New", args, n);
Packit b099d7
	XtAddCallback (button, XmNactivateCallback, MenuCB, (XtPointer) MENU_NEW);
Packit b099d7
	XtManageChild (button);
Packit b099d7
Packit b099d7
	n = 0;
Packit b099d7
	XtSetArg(args[n], XmNselectionLabelString, XmStringCreateLtoR
Packit b099d7
	   ("Enter name of new file.", charset));  n++;
Packit b099d7
	new_dialog = XmCreatePromptDialog(menu_pane,
Packit b099d7
			   "new file dialog", args, n);
Packit b099d7
	XtAddCallback (new_dialog, XmNokCallback,
Packit b099d7
			DialogAcceptCB, (XtPointer) DIALOG_NEW);
Packit b099d7
	XtAddCallback (new_dialog, XmNcancelCallback,
Packit b099d7
			DialogCancelCB, (XtPointer) DIALOG_NEW);
Packit b099d7
Packit b099d7
	n = 0;
Packit b099d7
	XtSetArg(args[n], XmNlabelString,
Packit b099d7
		 XmStringCreateLtoR("Close", charset)); n++;
Packit b099d7
	XtSetArg(args[n], XmNmnemonic, 'C'); n++;
Packit b099d7
	button = XmCreatePushButton (menu_pane, "Close", args, n);
Packit b099d7
	XtAddCallback (button, XmNactivateCallback, MenuCB, (XtPointer) MENU_CLOSE);
Packit b099d7
	XtManageChild (button);
Packit b099d7
Packit b099d7
	n = 0;
Packit b099d7
	close_warning = CreateSpecialWarningDialog(menu_pane, "save_warning",
Packit b099d7
				      "warning_image", "Save Changes?", args, n);
Packit b099d7
Packit b099d7
	XtAddCallback (close_warning, XmNapplyCallback,
Packit b099d7
		       DialogApplyCB, (XtPointer) DIALOG_CWARNING);
Packit b099d7
	XtAddCallback (close_warning, XmNokCallback,
Packit b099d7
		       DialogAcceptCB, (XtPointer) DIALOG_CWARNING);
Packit b099d7
Packit b099d7
Packit b099d7
	n = 0;
Packit b099d7
	XtSetArg(args[n], XmNlabelString,
Packit b099d7
		 XmStringCreateLtoR("Save", charset)); n++;
Packit b099d7
	XtSetArg(args[n], XmNmnemonic, 'S'); n++;
Packit b099d7
	button = XmCreatePushButton (menu_pane, "Save", args, n);
Packit b099d7
	XtAddCallback (button, XmNactivateCallback, MenuCB, (XtPointer) MENU_SAVE);
Packit b099d7
	XtManageChild (button);
Packit b099d7
Packit b099d7
Packit b099d7
	n = 0;
Packit b099d7
	XtSetArg(args[n], XmNlabelString,
Packit b099d7
		 XmStringCreateLtoR("Save As...", charset)); n++;
Packit b099d7
	XtSetArg(args[n], XmNmnemonic, 'A'); n++;
Packit b099d7
	button = XmCreatePushButton (menu_pane, "Save As...", args, n);
Packit b099d7
	XtAddCallback (button, XmNactivateCallback, MenuCB, (XtPointer) MENU_SAVE_AS);
Packit b099d7
	XtManageChild (button);
Packit b099d7
Packit b099d7
	n = 0;
Packit b099d7
	XtSetArg(args[n], XmNselectionLabelString, XmStringCreateLtoR
Packit b099d7
	   ("Save As...", charset));  n++;
Packit b099d7
	save_dialog = XmCreatePromptDialog(menu_pane, "save dialog", args, n);
Packit b099d7
	XtAddCallback (save_dialog, XmNokCallback,
Packit b099d7
		       DialogAcceptCB, (XtPointer) DIALOG_SAVE);
Packit b099d7
Packit b099d7
Packit b099d7
	n = 0;
Packit b099d7
	XtSetArg(args[n], XmNlabelString,
Packit b099d7
		 XmStringCreateLtoR("Print", charset)); n++;
Packit b099d7
	XtSetArg(args[n], XmNmnemonic, 'P'); n++;
Packit b099d7
	button = XmCreatePushButton (menu_pane, "Print", args, n);
Packit b099d7
	XtAddCallback (button, XmNactivateCallback, MenuCB, (XtPointer) MENU_PRINT);
Packit b099d7
	XtManageChild (button);
Packit b099d7
Packit b099d7
	n = 0;
Packit b099d7
	XtSetArg(args[n], XmNselectionLabelString, XmStringCreateLtoR
Packit b099d7
	   ("Save file before printing?", charset));  n++;
Packit b099d7
	print_warning = CreateSpecialWarningDialog(menu_pane, "print_warning",
Packit b099d7
			 "warning_image", "Save file before printing?", args, n);
Packit b099d7
	XtAddCallback (print_warning, XmNokCallback,
Packit b099d7
		       DialogAcceptCB, (XtPointer) DIALOG_PRINT);
Packit b099d7
Packit b099d7
	n = 0;
Packit b099d7
	XtSetArg(args[n], XmNlabelString,
Packit b099d7
		 XmStringCreateLtoR("Exit", charset)); n++;
Packit b099d7
	XtSetArg(args[n], XmNmnemonic, 'E'); n++;
Packit b099d7
	XtSetArg(args[n], XmNacceleratorText,
Packit b099d7
		 XmStringCreateLtoR("F3", charset)); n++;
Packit b099d7
	XtSetArg(args[n], XmNaccelerator, "<Key>F3:"); n++;
Packit b099d7
	button = XmCreatePushButton (menu_pane, "Exit", args, n);
Packit b099d7
	XtAddCallback (button, XmNactivateCallback, MenuCB, (XtPointer) MENU_EXIT);
Packit b099d7
	XtManageChild (button);
Packit b099d7
Packit b099d7
	n = 0;
Packit b099d7
	exit_warning = CreateSpecialWarningDialog(menu_pane, "exit warning",
Packit b099d7
				      "warning_image", "Save Changes?", args, n);
Packit b099d7
	XtAddCallback (exit_warning, XmNapplyCallback,
Packit b099d7
		       DialogApplyCB, (XtPointer) DIALOG_XWARNING);
Packit b099d7
	XtAddCallback (exit_warning, XmNokCallback,
Packit b099d7
			DialogAcceptCB, (XtPointer) DIALOG_XWARNING);
Packit b099d7
Packit b099d7
	n = 0;
Packit b099d7
	XtSetArg (args[n], XmNsubMenuId, menu_pane);  n++;
Packit b099d7
	XtSetValues(file_button, args, n);
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
static void CreateEditMenuCB (w, client_data, call_data) 
Packit b099d7
Widget		w;		/*  widget id		*/
Packit b099d7
XtPointer		client_data;	/*  data from application   */
Packit b099d7
XtPointer		call_data;	/*  data from widget class  */
Packit b099d7
Packit b099d7
{
Packit b099d7
Packit b099d7
	CreateEditMenu((Widget)client_data);
Packit b099d7
	XtDestroyWidget(w);
Packit b099d7
	return;
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
CreateEditMenu (edit_button) 
Packit b099d7
Widget		edit_button;
Packit b099d7
Packit b099d7
{
Packit b099d7
Packit b099d7
	Widget			menu_pane;
Packit b099d7
	XImage			*image;		/*  image for warning pixmap	*/
Packit b099d7
	Widget			button;		/*  PushButton			*/
Packit b099d7
	register int 	n;			/* arg count 	      	 */
Packit b099d7
	Arg 			args[10];		/* arg list		   	 */
Packit b099d7
Packit b099d7
	/*	Create "Edit" PulldownMenu.
Packit b099d7
	*/
Packit b099d7
	n = 0;
Packit b099d7
	menu_pane = XmCreatePulldownMenu (menu_bar, "menu_pane", args, n);
Packit b099d7
Packit b099d7
    image = CreateDefaultImage (warningBits, 32, 32);
Packit b099d7
    XmInstallImage (image, "warning_image");
Packit b099d7
Packit b099d7
	n = 0;
Packit b099d7
	XtSetArg(args[n], XmNlabelString,
Packit b099d7
		 XmStringCreateLtoR("Cut", charset)); n++;
Packit b099d7
	XtSetArg(args[n], XmNmnemonic, 't'); n++;
Packit b099d7
	XtSetArg(args[n], XmNacceleratorText,
Packit b099d7
		 XmStringCreateLtoR("Shift+Del", charset)); n++;
Packit b099d7
#ifdef hpux
Packit b099d7
	XtSetArg(args[n], XmNaccelerator, "Shift<Key>DeleteChar:"); n++;
Packit b099d7
#else /* hpux */
Packit b099d7
	XtSetArg(args[n], XmNaccelerator, "Shift<Key>Delete:"); n++;
Packit b099d7
#endif /* hpux */
Packit b099d7
	cut_button = XmCreatePushButton (menu_pane, "Cut", args, n);
Packit b099d7
	XtAddCallback (cut_button, XmNactivateCallback, MenuCB, (XtPointer) MENU_CUT);
Packit b099d7
	XtManageChild (cut_button);
Packit b099d7
	XtSetSensitive(cut_button, False);
Packit b099d7
Packit b099d7
	n = 0;
Packit b099d7
	XtSetArg(args[n], XmNlabelString,
Packit b099d7
		 XmStringCreateLtoR("Copy", charset)); n++;
Packit b099d7
	XtSetArg(args[n], XmNmnemonic, 'C'); n++;
Packit b099d7
	XtSetArg(args[n], XmNacceleratorText,
Packit b099d7
		 XmStringCreateLtoR("Ctrl+Ins", charset)); n++;
Packit b099d7
#ifdef hpux
Packit b099d7
	XtSetArg(args[n], XmNaccelerator, "Ctrl<Key>InsertChar:"); n++;
Packit b099d7
#else /* hpux */
Packit b099d7
	XtSetArg(args[n], XmNaccelerator, "Ctrl<Key>Insert:"); n++;
Packit b099d7
#endif /* hpux */
Packit b099d7
	copy_button = XmCreatePushButton (menu_pane, "Copy", args, n);
Packit b099d7
	XtAddCallback (copy_button, XmNactivateCallback, MenuCB, (XtPointer) MENU_COPY);
Packit b099d7
	XtManageChild (copy_button);
Packit b099d7
	XtSetSensitive(copy_button, False);
Packit b099d7
Packit b099d7
	n = 0;
Packit b099d7
	XtSetArg(args[n], XmNlabelString,
Packit b099d7
		 XmStringCreateLtoR("Paste", charset)); n++;
Packit b099d7
	XtSetArg(args[n], XmNmnemonic, 'P'); n++;
Packit b099d7
	XtSetArg(args[n], XmNacceleratorText,
Packit b099d7
		 XmStringCreateLtoR("Shift+Ins", charset)); n++;
Packit b099d7
#ifdef hpux
Packit b099d7
	XtSetArg(args[n], XmNaccelerator, "Shift<Key>InsertChar:"); n++;
Packit b099d7
#else /* hpux */
Packit b099d7
	XtSetArg(args[n], XmNaccelerator, "Shift<Key>Insert:"); n++;
Packit b099d7
#endif /* hpux */
Packit b099d7
	paste_button = XmCreatePushButton (menu_pane, "Paste", args, n);
Packit b099d7
	XtAddCallback (paste_button, XmNactivateCallback, MenuCB, (XtPointer) MENU_PASTE);
Packit b099d7
	XtManageChild (paste_button);
Packit b099d7
	XtSetSensitive(paste_button, False);
Packit b099d7
Packit b099d7
	n = 0;
Packit b099d7
	XtSetArg(args[n], XmNlabelString,
Packit b099d7
		 XmStringCreateLtoR("Clear", charset)); n++;
Packit b099d7
	XtSetArg(args[n], XmNmnemonic, 'e'); n++;
Packit b099d7
	/* pseudo accelerator - Text already handles
Packit b099d7
	   this action appropriately */
Packit b099d7
	XtSetArg(args[n], XmNacceleratorText,
Packit b099d7
		 XmStringCreateLtoR("Del", charset)); n++;
Packit b099d7
	clear_button = XmCreatePushButton (menu_pane, "Clear", args, n);
Packit b099d7
	XtAddCallback (clear_button, XmNactivateCallback, MenuCB, (XtPointer) MENU_CLEAR);
Packit b099d7
	XtManageChild (clear_button);
Packit b099d7
	XtSetSensitive(clear_button, False);
Packit b099d7
Packit b099d7
	n = 0;
Packit b099d7
	XtSetArg (args[n], XmNsubMenuId, menu_pane);  n++;
Packit b099d7
	XtSetValues(edit_button, args, n);
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
/*-------------------------------------------------------------
Packit b099d7
**	CreateMenuBar
Packit b099d7
**		Create MenuBar in MainWindow
Packit b099d7
*/
Packit b099d7
static Widget CreateMenuBar (parent)
Packit b099d7
Widget		parent;
Packit b099d7
{
Packit b099d7
	Widget		cascade;	/*  CascadeButton		*/
Packit b099d7
	Widget		file_cascade;	/*  CascadeButton		*/
Packit b099d7
	Widget		edit_cascade;	/*  CascadeButton		*/
Packit b099d7
	Widget		menu_pane;	/*  RowColumn	 		*/
Packit b099d7
	Widget		button;		/*  PushButton			*/
Packit b099d7
Packit b099d7
	XImage		*image;		/*  image for warning pixmap	*/
Packit b099d7
Packit b099d7
	Arg		args[10];		/*  arg list			*/
Packit b099d7
	register int	n;		/*  arg count			*/
Packit b099d7
Packit b099d7
	/*	Create MenuArea.
Packit b099d7
	*/
Packit b099d7
	n = 0;
Packit b099d7
	menu_bar = XmCreateMenuBar (parent, "menu_bar", args, n);
Packit b099d7
Packit b099d7
Packit b099d7
	XtSetArg(args[n], XmNlabelString,
Packit b099d7
		 XmStringCreateLtoR("File", charset)); n++;
Packit b099d7
	XtSetArg(args[n], XmNmnemonic, 'F'); n++;
Packit b099d7
	file_cascade = XmCreateCascadeButton (menu_bar, "File", args, n);
Packit b099d7
	XtManageChild (file_cascade);
Packit b099d7
Packit b099d7
	XtSetArg(args[n], XmNlabelString,
Packit b099d7
		 XmStringCreateLtoR("Edit", charset)); n++;
Packit b099d7
	XtSetArg(args[n], XmNmnemonic, 'E'); n++;
Packit b099d7
	edit_cascade= XmCreateCascadeButton (menu_bar, "Edit", args, n);
Packit b099d7
	XtManageChild (edit_cascade);
Packit b099d7
Packit b099d7
	/*	Create "Help" button.
Packit b099d7
	*/
Packit b099d7
	n = 0;
Packit b099d7
	cascade = XmCreateCascadeButton (menu_bar, "Help", args, n);
Packit b099d7
	XtAddCallback (cascade, XmNactivateCallback, MenuCB, (XtPointer) MENU_HELP);
Packit b099d7
	XtManageChild (cascade);
Packit b099d7
	n = 0;
Packit b099d7
	XtSetArg (args[n], XmNmenuHelpWidget, cascade);  n++;
Packit b099d7
	XtSetValues (menu_bar, args, n);
Packit b099d7
Packit b099d7
	/*	
Packit b099d7
	 * Create "Create File Menu" button if File menu not created at
Packit b099d7
	 * startup time.
Packit b099d7
	 */
Packit b099d7
	if (file_startup == True)
Packit b099d7
		CreateFileMenu(file_cascade);
Packit b099d7
	else {
Packit b099d7
Packit b099d7
		n = 0;
Packit b099d7
		cascade = XmCreateCascadeButton (menu_bar, "Create File Menu", args, n);
Packit b099d7
		XtAddCallback (cascade, XmNactivateCallback, CreateFileMenuCB, 
Packit b099d7
				   	    (XtPointer) file_cascade);
Packit b099d7
		XtManageChild (cascade);
Packit b099d7
Packit b099d7
	}
Packit b099d7
Packit b099d7
	/*	
Packit b099d7
	 * Create "Create Edit Menu" button if Edit menu not created at
Packit b099d7
	 * startup time.
Packit b099d7
	 */
Packit b099d7
Packit b099d7
	if (edit_startup == True)
Packit b099d7
		CreateEditMenu(edit_cascade);
Packit b099d7
	else {
Packit b099d7
Packit b099d7
		n = 0;
Packit b099d7
		cascade = XmCreateCascadeButton (menu_bar, "Create Edit Menu", args, n);
Packit b099d7
		XtAddCallback (cascade, XmNactivateCallback, CreateEditMenuCB, 
Packit b099d7
				   	    (XtPointer) edit_cascade);
Packit b099d7
		XtManageChild (cascade);
Packit b099d7
Packit b099d7
	}
Packit b099d7
Packit b099d7
	return (menu_bar);
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
/*-------------------------------------------------------------
Packit b099d7
**	CreateText
Packit b099d7
**		Create Text.
Packit b099d7
*/
Packit b099d7
static void CreateText (parent)
Packit b099d7
Widget		parent;
Packit b099d7
{
Packit b099d7
	Arg		args[10];		/*  arg list		*/
Packit b099d7
	register int	n;		/*  arg count		*/
Packit b099d7
	register int	i;		/*  counter		*/
Packit b099d7
   	XFontStruct * newfont;
Packit b099d7
Packit b099d7
	/* create text widget */
Packit b099d7
	n = 0;
Packit b099d7
	XtSetArg (args[n], XmNrows, 24);  n++;
Packit b099d7
	XtSetArg (args[n], XmNcolumns, 80);  n++;
Packit b099d7
	XtSetArg (args[n], XmNresizeWidth, False);  n++;
Packit b099d7
	XtSetArg (args[n], XmNresizeHeight, False);  n++;
Packit b099d7
	XtSetArg (args[n], XmNscrollVertical, True);  n++;
Packit b099d7
	XtSetArg (args[n], XmNscrollHorizontal, True);  n++;
Packit b099d7
	XtSetArg (args[n], XmNeditMode, XmMULTI_LINE_EDIT);  n++;
Packit b099d7
Packit b099d7
	text = XmCreateScrolledText (parent, "text", args, n);
Packit b099d7
Packit b099d7
	/* add value changed callback */
Packit b099d7
	XtAddCallback (text, XmNmodifyVerifyCallback, FileChangedCB, NULL);
Packit b099d7
Packit b099d7
	return;
Packit b099d7
}
Packit b099d7
Packit b099d7
/*-------------------------------------------------------------
Packit b099d7
**	main
Packit b099d7
**		Initialize toolkit.
Packit b099d7
**		Create MainWindow and subwidgets.
Packit b099d7
**		Realize Shell1 widgets.
Packit b099d7
**		Process events.
Packit b099d7
*/
Packit b099d7
void main (argc,argv)
Packit b099d7
unsigned int	argc;
Packit b099d7
char 		**argv;
Packit b099d7
{
Packit b099d7
	Widget		form;		/*  Form		*/
Packit b099d7
Packit b099d7
	Arg		args[10];		/*  arg list		*/
Packit b099d7
	register int	n;		/*  arg count		*/
Packit b099d7
	register int	i;		/*  counter		*/
Packit b099d7
	char	c;
Packit b099d7
	char	progname[MAX_NAME_LEN + 1];
Packit b099d7
Packit b099d7
Packit b099d7
	text_first = True;
Packit b099d7
	file_startup = False;
Packit b099d7
	edit_startup = False;
Packit b099d7
	text_startup = False;
Packit b099d7
Packit b099d7
	strncpy(progname, argv[0], MAX_NAME_LEN);
Packit b099d7
	if (argc > 1) {
Packit b099d7
Packit b099d7
		while (--argc > 0) {
Packit b099d7
Packit b099d7
			argv++;
Packit b099d7
			c = **argv;
Packit b099d7
			if (c != '-')
Packit b099d7
				continue;
Packit b099d7
			c = *(*argv + 1);
Packit b099d7
			switch(c) {
Packit b099d7
Packit b099d7
				case 'a':
Packit b099d7
					file_startup = True;
Packit b099d7
					edit_startup = True;
Packit b099d7
					text_startup = True;
Packit b099d7
					break;
Packit b099d7
Packit b099d7
				case 'e':
Packit b099d7
					edit_startup = True;
Packit b099d7
					break;
Packit b099d7
Packit b099d7
				case 'f':
Packit b099d7
					file_startup = True;
Packit b099d7
					break;
Packit b099d7
Packit b099d7
				case 'T':
Packit b099d7
					text_startup = True;
Packit b099d7
					break;
Packit b099d7
Packit b099d7
				case 'h':
Packit b099d7
					print_usage();
Packit b099d7
					exit(0);
Packit b099d7
					break;
Packit b099d7
Packit b099d7
			}
Packit b099d7
		}
Packit b099d7
Packit b099d7
	}
Packit b099d7
Packit b099d7
	/*	Initialize toolkit and open display.
Packit b099d7
	*/
Packit b099d7
    CommonTestInit(argc, argv);
Packit b099d7
    
Packit b099d7
Packit b099d7
Packit b099d7
	/*	Create MainWindow.
Packit b099d7
	*/
Packit b099d7
	n = 0;
Packit b099d7
	XtSetArg (args[n], XmNshadowThickness, 0);  n++;
Packit b099d7
	XtSetArg (args[n], XmNwidth, DEFAULT_WIDTH);  n++;
Packit b099d7
	XtSetArg (args[n], XmNheight, DEFAULT_HEIGHT);  n++;
Packit b099d7
	main_parent = XmCreateMainWindow (Shell1, "main_parent", args, n);
Packit b099d7
	XtManageChild (main_parent);
Packit b099d7
Packit b099d7
Packit b099d7
	/*	Create MenuBar in MainWindow.
Packit b099d7
	*/
Packit b099d7
	CreateMenuBar (main_parent);
Packit b099d7
	XtManageChild (menu_bar);
Packit b099d7
Packit b099d7
	if (text_startup == True) {
Packit b099d7
Packit b099d7
		CreateText (main_parent);
Packit b099d7
		XtManageChild (text);
Packit b099d7
		XmAddTabGroup(text);
Packit b099d7
		XtSetSensitive(text, False);
Packit b099d7
		text_first = False;
Packit b099d7
Packit b099d7
	}
Packit b099d7
	/*	Realize Shell1 widgets.
Packit b099d7
	*/
Packit b099d7
	XtRealizeWidget (Shell1);
Packit b099d7
Packit b099d7
	/*	Process events.
Packit b099d7
	*/
Packit b099d7
	XtAppMainLoop (app_context);
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
print_usage()
Packit b099d7
{
Packit b099d7
Packit b099d7
	printf("Usage: editor [-e -f -T -a -h]\n\tWhere :\n");
Packit b099d7
	printf("\t\ta - Create all the required widgets at startup time\n");
Packit b099d7
	printf("\t\te - Create Edit Menu pane widget at startup time\n");
Packit b099d7
	printf("\t\tf - Create File Menu pane widget at startup time\n");
Packit b099d7
	printf("\t\tT - Create Text widget at startup time\n");
Packit b099d7
	printf("\t\th - print this message\n");
Packit b099d7
Packit b099d7
}