/* Written by Dan Heller and Paula Ferguson. * Copyright 1994, O'Reilly & Associates, Inc. * Permission to use, copy, and modify this program without * restriction is hereby granted, as long as this copyright * notice appears in each copy of the program source code. * This program is freely distributable without licensing fees and * is provided without guarantee or warrantee expressed or implied. * This program is -not- in the public domain. */ /* cut_paste.c -- demonstrate the text functions that handle * clipboard operations. These functions are convenience routines * that relieve the programmer of the need to use clipboard functions. * The functionality of these routines already exists in the Text * widget, yet it is common to place such features in the interface * via the MenuBar's "Edit" pulldown menu. */ #include <Xm/Text.h> #include <Xm/LabelG.h> #include <Xm/PushBG.h> #include <Xm/RowColumn.h> #include <Xm/MainW.h> Widget text_w, text_output; main(argc, argv) int argc; char *argv[]; { Widget toplevel, main_w, menubar, rowcol_v; XtAppContext app; void cut_paste(); XmString label, cut, clear, copy, paste; Arg args[10]; int n; XtSetLanguageProc (NULL, NULL, NULL); toplevel = XtVaAppInitialize (&app, "Demos", NULL, 0, &argc, argv, NULL, NULL); main_w = XtVaCreateWidget ("main_w", xmMainWindowWidgetClass, toplevel, NULL); /* Create a simple MenuBar that contains a single menu */ label = XmStringCreateLocalized ("Edit"); menubar = XmVaCreateSimpleMenuBar (main_w, "menubar", XmVaCASCADEBUTTON, label, 'E', NULL); XmStringFree (label); cut = XmStringCreateLocalized ("Cut"); /* create a simple */ copy = XmStringCreateLocalized ("Copy"); /* pulldown menu that */ clear = XmStringCreateLocalized ("Clear"); /* has these menu */ paste = XmStringCreateLocalized ("Paste"); /* items in it. */ XmVaCreateSimplePulldownMenu (menubar, "edit_menu", 0, cut_paste, XmVaPUSHBUTTON, cut, 't', NULL, NULL, XmVaPUSHBUTTON, copy, 'C', NULL, NULL, XmVaPUSHBUTTON, paste, 'P', NULL, NULL, XmVaSEPARATOR, XmVaPUSHBUTTON, clear, 'l', NULL, NULL, NULL); XmStringFree (cut); XmStringFree (clear); XmStringFree (copy); XmStringFree (paste); XtManageChild (menubar); /* create a standard vertical RowColumn... */ rowcol_v = XtVaCreateWidget ("rowcol_v", xmRowColumnWidgetClass, main_w, NULL); text_output = XtVaCreateManagedWidget ("text_output", xmTextWidgetClass, rowcol_v, XmNeditable, False, XmNcursorPositionVisible, False, XmNshadowThickness, 0, XmNhighlightThickness, 0, NULL); n = 0; XtSetArg (args[n], XmNrows, 10); n++; XtSetArg (args[n], XmNcolumns, 80); n++; XtSetArg (args[n], XmNeditMode, XmMULTI_LINE_EDIT); n++; XtSetArg (args[n], XmNscrollHorizontal, False); n++; XtSetArg (args[n], XmNwordWrap, True); n++; text_w = XmCreateScrolledText (rowcol_v, "text_w", args, n); XtManageChild (text_w); XtManageChild (rowcol_v); XtManageChild (main_w); XtRealizeWidget (toplevel); XtAppMainLoop (app); } /* cut_paste() -- the callback routine for the items in the edit menu */ void cut_paste(widget, client_data, call_data) Widget widget; XtPointer client_data; XtPointer call_data; { Boolean result = True; int reason = (int) client_data; XEvent *event = ((XmPushButtonCallbackStruct *) call_data)->event; Time when; XmTextSetString (text_output, NULL); /* clear message area */ if (event != NULL) { switch (event->type) { case ButtonRelease : when = event->xbutton.time; break; case KeyRelease : when = event->xkey.time; break; default: when = CurrentTime; break; } } switch (reason) { case 0 : result = XmTextCut (text_w, when); break; case 1 : result = XmTextCopy (text_w, when); break; case 2 : result = XmTextPaste (text_w); XmTextClearSelection (text_w, when); break; case 3 : XmTextClearSelection (text_w, when); break; } if (result == False) XmTextSetString (text_output, "There is no selection."); else XmTextSetString (text_output, NULL); }