|
|
DataMuseum.dkPresents historical artifacts from the history of: Regnecentalen RC-900 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Regnecentalen RC-900 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T U x
Length: 33874 (0x8452)
Types: TextFile
Notes: UNIX file
Names: »xmeditor.c«
└─⟦a85bd4a7c⟧ Bits:30004636/disk2.imd INTERACTIVE Motif Environment Development System
└─⟦a85bd4a7c⟧ UNIX Filesystem
└─⟦this⟧ »xt/new/usr/lib/X11/examples/xmsamplers/xmeditor.c«
#ifdef REV_INFO
#ifndef lint
static char SCCSID[] = "OSF/Motif: @(#)xmeditor.c 1.2 - 89/08/31 - 11:18:29";
#endif /* lint */
#endif /* REV_INFO */
/**---------------------------------------------------------------------
***
*** file: xmeditor.c
***
*** project: Motif Widgets example programs
***
*** description: This program demonstrates the Motif text, main window,
*** and dialog widgets, as well as the cut and paste
*** functions.
***
***
*** (c) Copyright 1989 by Open Software Foundation, Inc.
*** All Rights Reserved.
***
*** (c) Copyright 1989 by Hewlett-Packard Company.
***
***
*** defaults: xmeditor.c depends on these defaults:
***
#
*allowShellResize: true
*borderWidth: 0
*highlightThickness: 2
*traversalOn: true
*keyboardFocusPolicy: explicit
*menuAccelerator: <Key>KP_F2
#
xmeditor*menu_bar*background: #58f
#
***-------------------------------------------------------------------*/
\f
/*-------------------------------------------------------------
** Include Files
*/
#include <stdio.h>
#ifndef __CNTL__
#define __CNTL__
#include <fcntl.h>
#endif /* __CNTL__ */
#include <errno.h>
#ifndef __TYPES__
#define __TYPES__
#include <sys/types.h>
#endif /* __TYPES__ */
#include <sys/stat.h>
#include <X11/Xatom.h>
#include <X11/Intrinsic.h>
#include <X11/Shell.h>
#include <Xm/Xm.h>
#include <Xm/CascadeB.h>
#include <Xm/DialogS.h>
#include <Xm/BulletinB.h>
#include <Xm/FileSB.h>
#include <Xm/MainW.h>
#include <Xm/MessageB.h>
#include <Xm/Label.h>
#include <Xm/PushB.h>
#include <Xm/RowColumn.h>
#include <Xm/SelectioB.h>
#include <Xm/Text.h>
#include <Xm/CutPaste.h>
\f
/*-------------------------------------------------------------
** Global Variables
*/
#define MENU_HELP 200
#define MENU_EXIT 201
#define MENU_OPEN 202
#define MENU_NEW 203
#define MENU_CLOSE 204
#define MENU_SAVE 205
#define MENU_SAVE_AS 206
#define MENU_PRINT 207
#define MENU_CUT 208
#define MENU_COPY 209
#define MENU_PASTE 210
#define MENU_CLEAR 211
#define DIALOG_FSELECT 300
#define DIALOG_CWARNING 301
#define DIALOG_XWARNING 302
#define DIALOG_NEW 303
#define DIALOG_SAVE 304
#define DIALOG_HELP 305
#define DIALOG_PRINT 306
/* defines a temporary file for file transfers */
Widget text; /* multi-line text widget */
Widget cut_button; /* clipboard cut button */
Widget copy_button; /* clipboard copy button */
Widget paste_button; /* clipboard paste button */
Widget clear_button; /* clipboard clear button */
Widget open_dialog; /* file selection dialog */
Widget new_dialog; /* file name prompt dialog */
Widget close_warning; /* special internal selection dialog */
Widget exit_warning; /* special internal selection dialog */
Widget general_warning; /* warning dialog */
Widget save_dialog; /* save as prompt dialog */
Widget print_warning; /* warning dialog */
Boolean file_saved = True; /* indicates that the present file is saved */
char *filename = NULL; /* string containing file name */
int start_pos, end_pos; /* start and end position of last action */
XmStringCharSet charset = (XmStringCharSet) XmSTRING_DEFAULT_CHARSET;
/* used to set up XmStrings */
char Error[128];
/* bits for exclamation point in dialog */
char warningBits[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, 0xe0, 0x07, 0x00,
0x00, 0xe0, 0x07, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, 0xe0, 0x07, 0x00,
0x00, 0xe0, 0x07, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, 0xe0, 0x07, 0x00,
0x00, 0xe0, 0x07, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, 0xe0, 0x07, 0x00,
0x00, 0xe0, 0x07, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, 0xe0, 0x07, 0x00,
0x00, 0xe0, 0x07, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, 0xe0, 0x07, 0x00,
0x00, 0xe0, 0x07, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x03, 0x00,
0x00, 0xe0, 0x07, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0x00, 0xf0, 0x0f, 0x00,
0x00, 0xf0, 0x0f, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0x00, 0xe0, 0x07, 0x00,
0x00, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00};
/************************************************************************
*
* CreateDefaultImage - create a default images for warning symbol.
*
**********************************<->***********************************/
static XImage * CreateDefaultImage (bits, width, height)
char *bits;
int width, height;
{
XImage *image;
image = (XImage *) XtMalloc (sizeof (XImage));
image->width = width;
image->height = height;
image->data = bits;
image->depth = 1;
image->xoffset = 0;
image->format = XYBitmap;
image->byte_order = LSBFirst;
image->bitmap_unit = 8;
image->bitmap_bit_order = LSBFirst;
image->bitmap_pad = 8;
image->bytes_per_line = (width+7)/8;
return (image);
}
\f
/*-------------------------------------------------------------
** OpenFile
** Open the present file. Returns true if file
** exists and open is sucessful.
*/
Boolean OpenFile()
{
struct stat statbuf; /* Information on a file. */
int file_length; /* Length of file. */
unsigned char * file_string; /* Contents of file. */
FILE *fp = NULL; /* Pointer to open file */
if ((fp = fopen(filename, "r+")) == NULL)
if ((fp = fopen(filename, "r")) != NULL) {
fprintf(stderr, "Warning: file opened read only.\n");
} else {
return(False);
}
if (stat(filename, &statbuf) == 0)
file_length = statbuf.st_size;
else
file_length = 1000000; /* arbitrary file length */
/* read the file string */
file_string = (unsigned char *) XtMalloc((unsigned)file_length);
fread(file_string, sizeof(char), file_length, fp);
/* close up the file */
if (fclose(fp) != NULL) fprintf(stderr, "Warning: unable to close file.\n");
/* added the file string to the text widget */
XmTextSetString(text, file_string);
file_saved = True; /* intialize to True */
/* make appropriate item sensitive */
XtSetSensitive(text, True);
XtSetSensitive(cut_button, True);
XtSetSensitive(copy_button, True);
XtSetSensitive(clear_button, True);
return(True);
}
\f
/*-------------------------------------------------------------
** SaveFile
** Save the present file.
*/
Boolean SaveFile()
{
unsigned char * file_string = NULL; /* Contents of file. */
FILE *tfp; /* Pointer to open temporary file. */
char *tempname = (char *)XtMalloc(25); /* Temporary file name. */
strcpy(tempname, mktemp("/tmp/xmeditXXXXXX"));
if ((tfp = fopen(tempname, "w")) == NULL) {
fprintf(stderr, "Warning: unable to open temp file, text not saved.\n");
return(False);;
}
/* get the text string */
file_string = (unsigned char *)XmTextGetString(text);
/* write to a temp file */
fwrite(file_string, sizeof(char), strlen(file_string) + 1, tfp);
/* flush and close the temp file */
if (fflush(tfp) != NULL) fprintf(stderr,"Warning: unable to flush file.\n");
if (fclose(tfp) != NULL) fprintf(stderr,"Warning: unable to close file.\n");
if (file_string != NULL) {
XtFree(file_string); /* free the text string */
}
/* move the tempname to the saved file */
if (rename(tempname, filename) == 0) {
file_saved = True;
} else {
fprintf(stderr, "Warning: unable to save file.\n");
XtFree(tempname);
return(False);
}
XtFree(tempname);
return(True);
}
\f
/*-------------------------------------------------------------
** CloseFile
** Close the present file.
*/
void CloseFile()
{
/* zero out the text string in the text widget.
caution: is causes a value changed callack. */
XmTextSetString(text, "");
file_saved = True; /* reinitialize file_saved flag */
/* free the file name */
if (filename != NULL) {
XtFree(filename);
filename = NULL;
}
/* set text to insensitive */
XtSetSensitive(text, False);
}
\f
/*-------------------------------------------------------------
** CopyFileToClipboard
** Copy the present file to the clipboard.
*/
void CopyFileToClipboard(time)
Time time;
{
char *selected_string = XmTextGetSelection (text); /* text selection */
unsigned long item_id = 0; /* clipboard item id */
int data_id = 0; /* clipboard data id */
int status = 0; /* clipboard status */
XmString clip_label;
/* using the clipboard facilities, copy the selected text to the clipboard */
if (selected_string != NULL) {
clip_label = XmStringCreateLtoR ("XM_EDITOR", charset);
/* start copy to clipboard, and continue till
a sucessful start copy is made */
status = 0;
while (status != ClipboardSuccess)
status = XmClipboardStartCopy (XtDisplay(text), XtWindow(text),
clip_label, time,
text, NULL, &item_id);
/* move the data to the clipboard, and
continue till a sucessful copy is made */
status = 0;
while (status != ClipboardSuccess)
status = XmClipboardCopy (XtDisplay(text), XtWindow(text),
item_id, "STRING", selected_string,
(long)strlen(selected_string)+1, 0,
&data_id);
/* end the copy to the clipboard and continue till
a sucessful end copy is made */
status = 0;
while (status != ClipboardSuccess)
status = XmClipboardEndCopy (XtDisplay(text), XtWindow(text),
item_id);
/* allow pasting when an item is sucessfully copied to the clipboard */
XtSetSensitive(paste_button, True);
}
}
\f
/*-------------------------------------------------------------
** DeletePrimarySelection
** Deletes the primary selection.
*/
void DeletePrimarySelection()
{
XClientMessageEvent cm;
/* send a client message to the text widget
to delete the current selection */
cm.type = ClientMessage;
cm.display = XtDisplay(text);
cm.message_type = XmInternAtom(XtDisplay(text), "KILL_SELECTION", FALSE);
cm.window = XtWindow(text);
cm.format = 32;
cm.data.l[0] = XA_PRIMARY;
XSendEvent(XtDisplay(text), cm.window, TRUE, NoEventMask, &cm);
}
\f
/*-------------------------------------------------------------
** PasteItemFromClipboard
** paste item from the clipboard to the current cursor location
*/
void PasteItemFromClipboard()
{
/* retrieve the current data from the clipboard
and paste it at the current cursor position */
char * selected_string = XmTextGetSelection (text);
/* containts of selection */
int status = 0; /* clipboard status */
char *buffer; /* temporary text buffer */
int length; /* length of buffer */
int outlength = 0; /* length of bytes copied */
int private_id = 0; /* id of item on clipboard */
XmTextPosition cursorPos; /* text cursor position */
register int ac; /* arg count */
Arg al[10]; /* arg list */
/* find the length of the paste item, continue till the length is found */
while (status != ClipboardSuccess) {
status = XmClipboardInquireLength(XtDisplay(text), XtWindow(text),
"STRING", &length);
if (status == ClipboardNoData) {
length = 0;
break;
}
}
if (length == 0) {
fprintf(stderr, "Warning: paste failed, no items to paste.\n");
return;
}
/* malloc to necessary space */
buffer = XtMalloc(length);
status = XmClipboardRetrieve (XtDisplay(text), XtWindow(text), "STRING",
buffer, length, &outlength, &private_id);
/* Dialogs need to be added to indicate errors in pasting */
if (status != ClipboardSuccess) {
fprintf(stderr, "Warning: paste failed, status = %d\n", status);
return;
}
/* get cursor position for pasting */
XtSetArg(al[0], XmNcursorPosition, &cursorPos);
XtGetValues(text, al, 1);
/* add new text */
XmTextReplace(text, cursorPos, cursorPos, buffer);
}
\f
/*-------------------------------------------------------------
** FileChangedCB
** Process callback from Text.
*/
void FileChangedCB (w, client_data, call_data)
Widget w; /* widget id */
caddr_t client_data; /* data from application */
caddr_t call_data; /* data from widget class */
{
/* set the file_saved flag to indicate that the
file has been modified and the user should be
notified before exiting. */
file_saved = False;
}
\f
/*-------------------------------------------------------------
** MenuCB
** Process callback from PushButtons in PulldownMenus.
*/
void MenuCB (w, client_data, call_data)
Widget w; /* widget id */
caddr_t client_data; /* data from application */
caddr_t call_data; /* data from widget class */
{
register int ac; /* arg count */
Arg al[10]; /* arg list */
char *command; /* command used in printing */
switch ((int)client_data)
{
case MENU_OPEN:
/* display the file selection dialog */
XtManageChild (open_dialog);
break;
case MENU_NEW:
/* display the prompt dialog */
XtManageChild (new_dialog);
break;
case MENU_CLOSE:
/* the present file has not been saved since
the last modification */
if (!file_saved) /* display the 'save' message dialog */
XtManageChild (close_warning);
else
CloseFile();
break;
case MENU_SAVE:
/* open a temp file for writing */
SaveFile();
break;
case MENU_SAVE_AS:
/* Display the 'save as' dialog with the
present filename displayed in it. */
ac = 0;
XtSetArg(al[ac], XmNtextString,
XmStringCreateLtoR (filename, charset)); ac++;
XtSetValues(save_dialog, al, ac);
XtManageChild (save_dialog);
break;
case MENU_PRINT:
if (!file_saved)
XtManageChild(print_warning);
else if (filename != NULL) {
/* malloc space for the command name.
Note: command = size of the filename +
"lp " + null terminator */
command = XtMalloc(sizeof(filename) + 4);
sprintf(command, "lp %s", filename);
if (system(command) != NULL)
fprintf(stderr, "print failed");
}
break;
case MENU_EXIT:
/* exit if there is no files open */
if (!file_saved) /* display the 'save' message dialog */
XtManageChild (exit_warning);
else {
/* close up file pointers and descriptors */
CloseFile();
/* exit this program */
exit (0);
}
break;
case MENU_CUT:
{
/* needed to get the event time */
XmAnyCallbackStruct * cb =
(XmAnyCallbackStruct *) call_data;
/* call routine to copy selection to clipboard */
CopyFileToClipboard(cb->event->xbutton.time);
/* call routine to delete primary selection */
DeletePrimarySelection();
}
break;
case MENU_COPY:
{
/* needed to get the event time */
XmAnyCallbackStruct * cb =
(XmAnyCallbackStruct *) call_data;
/* call routine to copy selection to clipboard */
CopyFileToClipboard(cb->event->xbutton.time);
}
break;
case MENU_PASTE:
/* call the routine that pastes the
text at the cursor position */
PasteItemFromClipboard();
break;
case MENU_CLEAR:
/* call routine to delete primary selection */
DeletePrimarySelection();
break;
case MENU_HELP:
/* no help at this time */
break;
default:
/* unknown client_data was recieved and
there is no setup to handle this */
fprintf(stderr, "Warning: in menu callback\n");
break;
}
}
\f
/*-------------------------------------------------------------
** DialogApplyCB
** Process callback from Dialog apply actions.
*/
static void DialogApplyCB (w, client_data, call_data)
Widget w; /* widget id */
caddr_t client_data; /* data from application */
caddr_t call_data; /* data from widget class */
{
char *command; /* command used in printing */
switch ((int)client_data)
{
case DIALOG_PRINT:
if (filename != NULL) {
/* malloc space for the command name.
Note: command = size of the filename +
"lp " + null terminator */
command = XtMalloc(sizeof(filename) + 4);
sprintf(command, "lp %s", filename);
if (system(command) != NULL)
fprintf(stderr, "print failed");
}
case DIALOG_CWARNING:
CloseFile();
file_saved = True; /* reset the default */
break;
case DIALOG_XWARNING:
CloseFile();
exit();
break;
default:
/* unknown client_data was recieved and
there is no setup to handle this */
fprintf (stderr, "Warning: in apply callback\n");
break;
}
}
\f
/*-------------------------------------------------------------
** DialogCancelCB
** Process callback from Dialog cancel actions.
*/
static void DialogCancelCB (w, client_data, call_data)
Widget w; /* widget id */
caddr_t client_data; /* data from application */
caddr_t call_data; /* data from widget class */
{
switch ((int)client_data)
{
case DIALOG_FSELECT:
/* popdown the file selection box */
XtUnmanageChild (open_dialog);
break;
case DIALOG_CWARNING:
case DIALOG_XWARNING:
case DIALOG_NEW:
case DIALOG_PRINT:
case DIALOG_SAVE:
case DIALOG_HELP:
/* no action is necessary at this time */
break;
default:
/* a unknown client_data was recieved and
there is no setup to handle this */
fprintf (stderr, "Warning: in cancel callback\n");
break;
}
}
\f
/*-------------------------------------------------------------
** DialogAcceptCB
** Process callback from Dialog actions.
*/
static void DialogAcceptCB (w, client_data, call_data)
Widget w; /* widget id */
caddr_t client_data; /* data from application */
caddr_t call_data; /* data from widget class */
{
char *command; /* command used in printing */
switch ((int)client_data)
{
case DIALOG_FSELECT:
/* open the file and read it into the text widget */
if (filename != NULL) {
XtFree(filename);
filename = NULL;
}
{
XmFileSelectionBoxCallbackStruct *fcb =
(XmFileSelectionBoxCallbackStruct *) call_data;
/* get the filename from the file selection box */
XmStringGetLtoR(fcb->value, charset, &filename);
/* Open file, print error if it does not exist. */
if (!OpenFile())
fprintf(stderr, "Warning: unable to open file\n");
/* popdown the file selection box */
XtUnmanageChild (open_dialog);
}
break;
case DIALOG_NEW:
/* open the file and read it into the text widget */
if (filename != NULL) {
XtFree(filename);
filename = NULL;
}
{
XmSelectionBoxCallbackStruct *scb =
(XmSelectionBoxCallbackStruct *) call_data;
/* get the filename string from the file
name prompt box */
XmStringGetLtoR(scb->value, charset, &filename);
/* open file if it exists,
if not set items sensitive */
if (!OpenFile(True)) {
/* make appropriate item sensitive */
XtSetSensitive(text, True);
XtSetSensitive(cut_button, True);
XtSetSensitive(copy_button, True);
XtSetSensitive(clear_button, True);
}
/* popdown the file selection box */
XtUnmanageChild (new_dialog);
}
break;
case DIALOG_CWARNING:
/* save the file */
if (SaveFile()) {
CloseFile(); /* close the file */
} else
fprintf(stderr,
"Warning: unable to save file, file not closed");
break;
case DIALOG_XWARNING:
/* save the file */
if (SaveFile()) {
CloseFile(); /* close the file */
exit(0);
} else
fprintf(stderr,
"Warning: unable to save file, exit aborted");
break;
case DIALOG_SAVE:
{
XmSelectionBoxCallbackStruct *scb =
(XmSelectionBoxCallbackStruct *) call_data;
/* get the filename string from the file
selection box */
XmStringGetLtoR(scb->value, charset, &filename);
SaveFile();
XtUnmanageChild (save_dialog);
}
break;
case DIALOG_PRINT:
/* save the file */
if (SaveFile()) {
if (filename != NULL) {
/* malloc space for the command name.
Note: command = size of the filename +
"lp " + null terminator */
command = XtMalloc(sizeof(filename) + 4);
sprintf(command, "lp %s", filename);
if (system(command) != NULL)
fprintf(stderr, "print failed");
}
} else
fprintf(stderr,
"Warning: unable to save file, file not printed");
break;
case DIALOG_HELP:
/* no help at this time */
break;
default:
/* unknown callback type */
fprintf (stderr, "Warning: in accept callback\n");
break;
}
}
\f
/*-------------------------------------------------------------
** CreateSpecialWarningDialog
** Create special 4 button message box out of a
** Selection box.
*/
static Widget CreateSpecialWarningDialog (parent, name, image_string, message,
arglist, argcount)
Widget parent;
String name;
String image_string;
String message;
Arg arglist;
int argcount;
{
Widget warning_dialog; /* special warning selection box */
Widget work_area; /* rowcolumn for pixmap and text */
Widget pixmap_label; /* pixmap label */
Widget text_label; /* text label */
Widget apply_button; /* apply button */
Widget ok_button; /* ok button */
Widget kid[5]; /* buttons */
Pixel foreground; /* dialog foreground */
Pixel background; /* dialog background */
Pixmap pixmap; /* dialog pixmap */
register int i; /* kid index */
Arg al[10]; /* arg list */
register int ac; /* arg count */
warning_dialog = XmCreatePromptDialog(parent, name, arglist, argcount);
ac = 0;
XtSetArg(al[ac], XmNorientation, XmHORIZONTAL); ac++;
work_area = XmCreateRowColumn(warning_dialog, "workarea", al, ac);
XtManageChild(work_area);
ac = 0;
XtSetArg(al[ac], XmNforeground, &foreground); ac++;
XtSetArg(al[ac], XmNbackground, &background); ac++;
XtGetValues(warning_dialog, al, ac);
ac = 0;
XtSetArg(al[ac], XmNlabelType, XmPIXMAP); ac++;
pixmap = XmGetPixmap(XtScreen(warning_dialog), image_string,
foreground, background);
XtSetArg(al[ac], XmNlabelPixmap, pixmap); ac++;
pixmap_label = XmCreateLabel(work_area, "pixmap_label", al, ac);
XtManageChild(pixmap_label);
ac = 0;
XtSetArg(al[ac], XmNlabelString,
XmStringCreateLtoR(message, charset)); ac++;
text_label = XmCreateLabel(work_area, "text_label", al, ac);
XtManageChild(text_label);
apply_button = XmSelectionBoxGetChild (warning_dialog,
XmDIALOG_APPLY_BUTTON);
ac = 0;
XtSetArg(al[ac], XmNlabelString,
XmStringCreateLtoR("Discard", charset)); ac++;
XtSetValues(apply_button, al, ac);
XtManageChild(apply_button);
ok_button = XmSelectionBoxGetChild (warning_dialog,
XmDIALOG_OK_BUTTON);
ac = 0;
XtSetArg(al[ac], XmNlabelString,
XmStringCreateLtoR("Save", charset)); ac++;
XtSetValues(ok_button, al, ac);
/* Unmanage unneeded children.
*/
i = 0;
kid[i++] = XmSelectionBoxGetChild (warning_dialog, XmDIALOG_TEXT);
kid[i++] = XmSelectionBoxGetChild (warning_dialog,
XmDIALOG_SELECTION_LABEL);
XtUnmanageChildren (kid, i);
return(warning_dialog);
}
\f
/*-------------------------------------------------------------
** CreateMenuBar
** Create MenuBar in MainWindow
*/
static Widget CreateMenuBar (parent)
Widget parent;
{
Widget menu_bar; /* RowColumn */
Widget cascade; /* CascadeButton */
Widget menu_pane; /* RowColumn */
Widget button; /* PushButton */
XImage *image; /* image for warning pixmap */
Arg al[10]; /* arg list */
register int ac; /* arg count */
/* Create MenuArea.
*/
ac = 0;
menu_bar = XmCreateMenuBar (parent, "menu_bar", al, ac);
/* Create "Options" PulldownMenu.
*/
ac = 0;
menu_pane = XmCreatePulldownMenu (menu_bar, "menu_pane", al, ac);
image = CreateDefaultImage (warningBits, 32, 32);
XmInstallImage (image, "warning_image");
ac = 0;
XtSetArg(al[ac], XmNlabelString,
XmStringCreateLtoR("Open", charset)); ac++;
XtSetArg(al[ac], XmNmnemonic, 'O'); ac++;
button = XmCreatePushButton (menu_pane, "Open", al, ac);
XtAddCallback (button, XmNactivateCallback, MenuCB, MENU_OPEN);
XtManageChild (button);
open_dialog = XmCreateFileSelectionDialog(menu_pane,
"file selection dialog", NULL, 0);
XtAddCallback (open_dialog, XmNokCallback,
DialogAcceptCB, DIALOG_FSELECT);
XtAddCallback (open_dialog, XmNcancelCallback,
DialogCancelCB, DIALOG_FSELECT);
ac = 0;
XtSetArg(al[ac], XmNlabelString,
XmStringCreateLtoR("New", charset)); ac++;
XtSetArg(al[ac], XmNmnemonic, 'N'); ac++;
button = XmCreatePushButton (menu_pane, "New", al, ac);
XtAddCallback (button, XmNactivateCallback, MenuCB, MENU_NEW);
XtManageChild (button);
ac = 0;
XtSetArg(al[ac], XmNselectionLabelString, XmStringCreateLtoR
("Enter name of new file.", charset)); ac++;
new_dialog = XmCreatePromptDialog(menu_pane,
"new file dialog", al, ac);
XtAddCallback (new_dialog, XmNokCallback,
DialogAcceptCB, DIALOG_NEW);
XtAddCallback (new_dialog, XmNcancelCallback,
DialogCancelCB, DIALOG_NEW);
ac = 0;
XtSetArg(al[ac], XmNlabelString,
XmStringCreateLtoR("Close", charset)); ac++;
XtSetArg(al[ac], XmNmnemonic, 'C'); ac++;
button = XmCreatePushButton (menu_pane, "Close", al, ac);
XtAddCallback (button, XmNactivateCallback, MenuCB, MENU_CLOSE);
XtManageChild (button);
close_warning = CreateSpecialWarningDialog(menu_pane, "save_warning",
"warning_image", "Save Changes?", al, ac);
XtAddCallback (close_warning, XmNapplyCallback,
DialogApplyCB, DIALOG_CWARNING);
XtAddCallback (close_warning, XmNokCallback,
DialogAcceptCB, DIALOG_CWARNING);
ac = 0;
XtSetArg(al[ac], XmNlabelString,
XmStringCreateLtoR("Save", charset)); ac++;
XtSetArg(al[ac], XmNmnemonic, 'S'); ac++;
button = XmCreatePushButton (menu_pane, "Save", al, ac);
XtAddCallback (button, XmNactivateCallback, MenuCB, MENU_SAVE);
XtManageChild (button);
ac = 0;
XtSetArg(al[ac], XmNlabelString,
XmStringCreateLtoR("Save As...", charset)); ac++;
XtSetArg(al[ac], XmNmnemonic, 'A'); ac++;
button = XmCreatePushButton (menu_pane, "Save As...", al, ac);
XtAddCallback (button, XmNactivateCallback, MenuCB, MENU_SAVE_AS);
XtManageChild (button);
ac = 0;
XtSetArg(al[ac], XmNselectionLabelString, XmStringCreateLtoR
("Save As...", charset)); ac++;
save_dialog = XmCreatePromptDialog(menu_pane, "save dialog", al, ac);
XtAddCallback (save_dialog, XmNokCallback,
DialogAcceptCB, DIALOG_SAVE);
ac = 0;
XtSetArg(al[ac], XmNlabelString,
XmStringCreateLtoR("Print", charset)); ac++;
XtSetArg(al[ac], XmNmnemonic, 'P'); ac++;
button = XmCreatePushButton (menu_pane, "Print", al, ac);
XtAddCallback (button, XmNactivateCallback, MenuCB, MENU_PRINT);
XtManageChild (button);
ac = 0;
XtSetArg(al[ac], XmNselectionLabelString, XmStringCreateLtoR
("Save file before printing?", charset)); ac++;
print_warning = CreateSpecialWarningDialog(menu_pane, "print_warning",
"warning_image", "Save file before printing?", al, ac);
XtAddCallback (print_warning, XmNokCallback,
DialogAcceptCB, DIALOG_PRINT);
ac = 0;
XtSetArg(al[ac], XmNlabelString,
XmStringCreateLtoR("Exit", charset)); ac++;
XtSetArg(al[ac], XmNmnemonic, 'E'); ac++;
XtSetArg(al[ac], XmNacceleratorText,
XmStringCreateLtoR("F3", charset)); ac++;
XtSetArg(al[ac], XmNaccelerator, "<Key>F3:"); ac++;
button = XmCreatePushButton (menu_pane, "Exit", al, ac);
XtAddCallback (button, XmNactivateCallback, MenuCB, MENU_EXIT);
XtManageChild (button);
exit_warning = CreateSpecialWarningDialog(menu_pane, "exit warning",
"warning_image", "Save Changes?", al, ac);
XtAddCallback (exit_warning, XmNapplyCallback,
DialogApplyCB, DIALOG_XWARNING);
XtAddCallback (exit_warning, XmNokCallback,
DialogAcceptCB, DIALOG_XWARNING);
ac = 0;
XtSetArg (al[ac], XmNsubMenuId, menu_pane); ac++;
XtSetArg(al[ac], XmNlabelString,
XmStringCreateLtoR("File", charset)); ac++;
XtSetArg(al[ac], XmNmnemonic, 'F'); ac++;
cascade = XmCreateCascadeButton (menu_bar, "File", al, ac);
XtManageChild (cascade);
/* Create "Options" PulldownMenu.
*/
ac = 0;
menu_pane = XmCreatePulldownMenu (menu_bar, "menu_pane", al, ac);
ac = 0;
XtSetArg(al[ac], XmNlabelString,
XmStringCreateLtoR("Cut", charset)); ac++;
XtSetArg(al[ac], XmNmnemonic, 't'); ac++;
XtSetArg(al[ac], XmNacceleratorText,
XmStringCreateLtoR("Shift+Del", charset)); ac++;
#ifdef hpux
XtSetArg(al[ac], XmNaccelerator, "Shift<Key>DeleteChar:"); ac++;
#else /* hpux */
XtSetArg(al[ac], XmNaccelerator, "Shift<Key>Delete:"); ac++;
#endif /* hpux */
cut_button = XmCreatePushButton (menu_pane, "Cut", al, ac);
XtAddCallback (cut_button, XmNactivateCallback, MenuCB, MENU_CUT);
XtManageChild (cut_button);
XtSetSensitive(cut_button, False);
ac = 0;
XtSetArg(al[ac], XmNlabelString,
XmStringCreateLtoR("Copy", charset)); ac++;
XtSetArg(al[ac], XmNmnemonic, 'C'); ac++;
XtSetArg(al[ac], XmNacceleratorText,
XmStringCreateLtoR("Ctrl+Ins", charset)); ac++;
#ifdef hpux
XtSetArg(al[ac], XmNaccelerator, "Ctrl<Key>InsertChar:"); ac++;
#else /* hpux */
XtSetArg(al[ac], XmNaccelerator, "Ctrl<Key>Insert:"); ac++;
#endif /* hpux */
copy_button = XmCreatePushButton (menu_pane, "Copy", al, ac);
XtAddCallback (copy_button, XmNactivateCallback, MenuCB, MENU_COPY);
XtManageChild (copy_button);
XtSetSensitive(copy_button, False);
ac = 0;
XtSetArg(al[ac], XmNlabelString,
XmStringCreateLtoR("Paste", charset)); ac++;
XtSetArg(al[ac], XmNmnemonic, 'P'); ac++;
XtSetArg(al[ac], XmNacceleratorText,
XmStringCreateLtoR("Shift+Ins", charset)); ac++;
#ifdef hpux
XtSetArg(al[ac], XmNaccelerator, "Shift<Key>InsertChar:"); ac++;
#else /* hpux */
XtSetArg(al[ac], XmNaccelerator, "Shift<Key>Insert:"); ac++;
#endif /* hpux */
paste_button = XmCreatePushButton (menu_pane, "Paste", al, ac); ac++;
XtAddCallback (paste_button, XmNactivateCallback, MenuCB, MENU_PASTE);
XtManageChild (paste_button);
XtSetSensitive(paste_button, False);
ac = 0;
XtSetArg(al[ac], XmNlabelString,
XmStringCreateLtoR("Clear", charset)); ac++;
XtSetArg(al[ac], XmNmnemonic, 'e'); ac++;
/* pseudo accelerator - Text already handles
this action appropriately */
XtSetArg(al[ac], XmNacceleratorText,
XmStringCreateLtoR("Del", charset)); ac++;
clear_button = XmCreatePushButton (menu_pane, "Clear", al, ac);
XtAddCallback (clear_button, XmNactivateCallback, MenuCB, MENU_CLEAR);
XtManageChild (clear_button);
XtSetSensitive(clear_button, False);
ac = 0;
XtSetArg (al[ac], XmNsubMenuId, menu_pane); ac++;
XtSetArg(al[ac], XmNlabelString,
XmStringCreateLtoR("Edit", charset)); ac++;
XtSetArg(al[ac], XmNmnemonic, 'E'); ac++;
cascade= XmCreateCascadeButton (menu_bar, "Edit", al, ac);
XtManageChild (cascade);
/* Create "Help" button.
*/
ac = 0;
cascade = XmCreateCascadeButton (menu_bar, "Help", al, ac);
XtAddCallback (cascade, XmNactivateCallback, MenuCB, MENU_HELP);
XtManageChild (cascade);
ac = 0;
XtSetArg (al[ac], XmNmenuHelpWidget, cascade); ac++;
XtSetValues (menu_bar, al, ac);
return (menu_bar);
}
\f
/*-------------------------------------------------------------
** CreateText
** Create Text.
*/
static void CreateText (parent)
Widget parent;
{
Arg al[10]; /* arg list */
register int ac; /* arg count */
register int i; /* counter */
XFontStruct * newfont;
/* create text widget */
ac = 0;
XtSetArg (al[ac], XmNrows, 24); ac++;
XtSetArg (al[ac], XmNcolumns, 80); ac++;
XtSetArg (al[ac], XmNresizeWidth, False); ac++;
XtSetArg (al[ac], XmNresizeHeight, False); ac++;
XtSetArg (al[ac], XmNscrollVertical, True); ac++;
XtSetArg (al[ac], XmNscrollHorizontal, True); ac++;
XtSetArg (al[ac], XmNeditMode, XmMULTI_LINE_EDIT); ac++;
text = XmCreateScrolledText (parent, "text", al, ac);
/* add value changed callback */
XtAddCallback (text, XmNmodifyVerifyCallback, FileChangedCB, NULL);
return;
}
\f
/*-------------------------------------------------------------
** main
** Initialize toolkit.
** Create MainWindow and subwidgets.
** Realize toplevel widgets.
** Process events.
*/
void main (argc,argv)
unsigned int argc;
char **argv;
{
Display *display; /* Display */
Widget app_shell; /* ApplicationShell */
Widget main; /* MainWindow */
Widget menu_bar; /* RowColumn */
Widget form; /* Form */
Arg al[10]; /* arg list */
register int ac; /* arg count */
register int i; /* counter */
/* Initialize toolkit and open display.
*/
XtToolkitInitialize ();
display = XtOpenDisplay (NULL, NULL, argv[0], "XMdemos",
NULL, 0, &argc, argv);
if (!display)
{
XtWarning ("xmeditor: can't open display, exiting...");
exit (0);
}
/* Create ApplicationShell.
*/
app_shell = XtAppCreateShell (argv[0], "XMdemos",
applicationShellWidgetClass, display, NULL, 0);
/* Create MainWindow.
*/
ac = 0;
XtSetArg (al[ac], XmNshadowThickness, 0); ac++;
main = XmCreateMainWindow (app_shell, "main", al, ac);
XtManageChild (main);
/* Create MenuBar in MainWindow.
*/
menu_bar = CreateMenuBar (main);
XtManageChild (menu_bar);
/* Create Text.
*/
CreateText (main);
XtManageChild (text);
XmAddTabGroup(text);
XtSetSensitive(text, False);
/* Realize toplevel widgets.
*/
XtRealizeWidget (app_shell);
/* Process events.
*/
XtMainLoop ();
}