📄 editor.c
字号:
/**** editor.c ****//*********************************************************************** Copyright (c) 1991, 1992 Iris Computing Laboratories.** This software is provided for demonstration purposes only. As* freely-distributed, modifiable source code, this software carries* absolutely no warranty. Iris Computing Laboratories disclaims* all warranties for this software, including any implied warranties* of merchantability and fitness, and shall not be liable for* damages of any type resulting from its use.* Permission to use, copy, modify, and distribute this source code* for any purpose and without fee is hereby granted, provided that* the above copyright and this permission notice appear in all copies* and supporting documentation, and provided that Iris Computing* Laboratories not be named in advertising or publicity pertaining* to the redistribution of this software without specific, written* prior permission.**********************************************************************//**************************************************************************An `Editor' object is a Motif XmText widget attached to a menubar.The menubar provides cut, copy, and paste functions in the editmenu and find-selection and search and replace functions in thefind menu. The search and replace function pops up a top-levelwindow with buttons and text entry areas for find and replaceoperations. Thus, the application must call the editor's realizefunction to realize the search and replace window hierarchy.Sample usage:#include "editor.h"......void main(argc, argv)int argc;char *argv[];{ XtAppContext app; Widget topLevel, pane, ...; Editor edit; char *startup_text = "Start-up text"; topLevel = XtAppInitialize(&app, "ApplicationClass", (XrmOptionDescList) NULL, 0, &argc, argv, (String *) NULL, (ArgList) NULL, 0); pane = XtCreateManagedWidget("pane", xmPanedWindowWidgetClass, topLevel, NULL, 0); ... ... edit = editor_create(pane, "ApplicationClass", "edit", 10, 40, 40, editor_SCROLL_DEFAULT, startup_text, XmSTRING_DEFAULT_CHARSET, "application", "label", editor_WIN_MGR_DECOR, editor_POPUP_MENU); XtRealizeWidget(topLevel); editor_realize(edit); // realize the search and replace pop-up // ... ...**************************************************************************/#include "editor.h"/*Private callback functions:*/static void CutText();static void CopyText();static void PasteText();static void ClearText();static void FindSelection();static void ReplaceText();static void ReplaceDismiss();static void ReplaceFind();static void ReplaceReplace();/*Private event handlers:*/static void PostMenu();/*Menu data -- the callback data is dynamic, specifically, the editorobject instance, so specify null callbacks here and use XtAddCallback()below.*/static menu_entry edit_menu[] = { {menu_ENTRY, "Cut", "menuCutButton", NULL, NULL, NULL, NULL}, {menu_ENTRY, "Copy", "menuCopyButton", NULL, NULL, NULL, NULL}, {menu_ENTRY, "Paste", "menuPasteButton", NULL, NULL, NULL, NULL}, {menu_SEPARATOR, NULL, NULL, NULL, NULL, NULL, NULL}, {menu_ENTRY, "Clear", "menuClearButton", NULL, NULL, NULL, NULL}, {menu_END, NULL, NULL, NULL, NULL, NULL, NULL},};static menu_entry find_menu[] = { {menu_ENTRY, "Find Selection", "menuSearchButton", NULL, NULL, NULL, NULL}, {menu_ENTRY, "Search and Replace...", "menuReplaceButton", NULL, NULL, NULL, NULL}, {menu_END, NULL, NULL, NULL, NULL, NULL, NULL},};static menu_entry menus[] = { {menu_SUBMENU, "Edit", "menuEditButton", NULL, NULL, edit_menu, NULL}, {menu_SUBMENU, "Find", "menuFindButton", NULL, NULL, find_menu, NULL}, {menu_END, NULL, NULL, NULL, NULL, NULL, NULL},};/*Private support functions:*/static int selection_to_clipboard();static char *retrieve_from_clipboard();static XmTextPosition get_text_cursor_position();/*Public functions:*//*editor_create() creates an editor object with a multi-lineedit window and a menubar that includes "Edit" and "Find"menus. The application can set the number of rows andcolumns for the edit window.*/Editor editor_create(parent, app_class, instance_name, num_rows, num_columns, replace_columns, special_scrolling, startup_text, char_set, app_name, label, win_mgr_behavior, menu_behavior)Widget parent;char *app_class;char *instance_name;int num_rows, num_columns, replace_columns, special_scrolling;char *startup_text;XmStringCharSet char_set;char *app_name, *label;int win_mgr_behavior, menu_behavior;{ Arg args[10]; int i; Dimension height, margin_height; Editor eObject; if (!(eObject = (Editor) XtMalloc((Cardinal) sizeof(_Editor)))) return 0; eObject->self = eObject; eObject->app_name = app_name; eObject->menuBar = eObject->popupMenu = NULL; /* instances have precedence over classes: */ eObject->instance = XtCreateManagedWidget(instance_name, xmFrameWidgetClass, parent, NULL, 0); eObject->class = XtCreateManagedWidget("Editor", xmFrameWidgetClass, eObject->instance, NULL, 0); i = 0; XtSetArg(args[i], XmNhorizontalSpacing, (XtArgVal) 5); i++; XtSetArg(args[i], XmNverticalSpacing, (XtArgVal) 5); i++; eObject->editBox = XtCreateManagedWidget("editBox", xmFormWidgetClass, eObject->class, args, i); if (menu_behavior == editor_MENU_BAR) { i = 0; XtSetArg(args[i], XmNleftAttachment, (XtArgVal) XmATTACH_FORM); i++; XtSetArg(args[i], XmNrightAttachment, (XtArgVal) XmATTACH_FORM); i++; XtSetArg(args[i], XmNtopAttachment, (XtArgVal) XmATTACH_FORM); i++; eObject->menuBar = XmCreateMenuBar(eObject->editBox, "menuBar", args, i); XtManageChild(eObject->menuBar); create_menus(eObject->menuBar, menus, char_set); } else { eObject->popupMenu = XmCreatePopupMenu(eObject->editBox, "popupMenu", NULL, 0); create_menus(eObject->popupMenu, menus, char_set); XtAddEventHandler(eObject->editBox, ButtonPressMask, FALSE, PostMenu, eObject->popupMenu); } i = 0; XtSetArg(args[i], XmNleftAttachment, (XtArgVal) XmATTACH_FORM); i++; XtSetArg(args[i], XmNrightAttachment, (XtArgVal) XmATTACH_FORM); i++; if (menu_behavior == editor_MENU_BAR) { XtSetArg(args[i], XmNtopAttachment, (XtArgVal) XmATTACH_WIDGET); i++; XtSetArg(args[i], XmNtopWidget, (XtArgVal) eObject->menuBar); i++; } else { XtSetArg(args[i], XmNtopAttachment, (XtArgVal) XmATTACH_FORM); i++; } XtSetArg(args[i], XmNbottomAttachment, (XtArgVal) XmATTACH_FORM); i++; eObject->editWindow = XtCreateManagedWidget("editWindow", xmScrolledWindowWidgetClass, eObject->editBox, args, i); i = 0; XtSetArg(args[i], XmNeditMode, (XtArgVal) XmMULTI_LINE_EDIT); i++; XtSetArg(args[i], XmNautoShowCursorPosition, (XtArgVal) True); i++; XtSetArg(args[i], XmNeditable, (XtArgVal) True); i++; if (special_scrolling == editor_SCROLL_LEFT_ONLY) { XtSetArg(args[i], XmNscrollHorizontal, (XtArgVal) False); i++; XtSetArg(args[i], XmNscrollVertical, (XtArgVal) True); i++; XtSetArg(args[i], XmNscrollLeftSide, (XtArgVal) True); i++; } else if (special_scrolling == editor_SCROLL_RIGHT_ONLY) { XtSetArg(args[i], XmNscrollHorizontal, (XtArgVal) False); i++; XtSetArg(args[i], XmNscrollVertical, (XtArgVal) True); i++; XtSetArg(args[i], XmNscrollLeftSide, (XtArgVal) False); i++; } if (num_rows > 0) { XtSetArg(args[i], XmNrows, (XtArgVal) num_rows); i++; } if (num_columns > 0) { XtSetArg(args[i], XmNcolumns, (XtArgVal) num_columns); i++; } if (startup_text) { XtSetArg(args[i], XmNvalue, (XtArgVal) startup_text); i++; } eObject->edit = XtCreateManagedWidget("edit", xmTextWidgetClass, eObject->editWindow, args, i); /* add callbacks and data for buttons using returned widget IDs: */ XtAddCallback(edit_menu[0].id, XmNactivateCallback, CutText, (XtPointer) eObject); XtAddCallback(edit_menu[1].id, XmNactivateCallback, CopyText, (XtPointer) eObject); XtAddCallback(edit_menu[2].id, XmNactivateCallback, PasteText, (XtPointer) eObject); XtAddCallback(edit_menu[4].id, XmNactivateCallback, ClearText, (XtPointer) eObject); XtAddCallback(find_menu[0].id, XmNactivateCallback, FindSelection, (XtPointer) eObject); XtAddCallback(find_menu[1].id, XmNactivateCallback, ReplaceText, (XtPointer) eObject); /* create the search and replace window: */ i = 0; XtSetArg(args[i], XmNallowShellResize, (XtArgVal) True); i++; XtSetArg(args[i], XmNmappedWhenManaged, (XtArgVal) False); i++; if (win_mgr_behavior == editor_WIN_MGR_DECOR) eObject->replaceShell = XtAppCreateShell(NULL, app_class, topLevelShellWidgetClass, XtDisplay(parent), args, i); else eObject->replaceShell = XtAppCreateShell(NULL, app_class, transientShellWidgetClass, XtDisplay(parent), args, i); eObject->replaceInstance = XtCreateManagedWidget(instance_name, xmFrameWidgetClass, eObject->replaceShell, NULL, 0); eObject->replaceClass = XtCreateManagedWidget("Editor", xmFrameWidgetClass, eObject->replaceInstance, NULL, 0); i = 0; XtSetArg(args[i], XmNsashWidth, (XtArgVal) 1); i++; XtSetArg(args[i], XmNsashHeight, (XtArgVal) 1); i++; eObject->replacePane = XtCreateManagedWidget("replacePane", xmPanedWindowWidgetClass, eObject->replaceClass, args, i); i = 0; eObject->replaceBox = XtCreateManagedWidget("replaceBox", xmFormWidgetClass, eObject->replacePane, args, i); i = 0; XtSetArg(args[i], XmNleftAttachment, (XtArgVal) XmATTACH_FORM); i++; XtSetArg(args[i], XmNrightAttachment, (XtArgVal) XmATTACH_FORM); i++; XtSetArg(args[i], XmNtopAttachment, (XtArgVal) XmATTACH_FORM); i++; XtSetArg(args[i], XmNlabelString, XmStringCreateLtoR(label, char_set)); i++; eObject->replaceLabel = XtCreateManagedWidget("replaceLabel", xmLabelWidgetClass, eObject->replaceBox, args, i); i = 0; XtSetArg(args[i], XmNalignment, (XtArgVal) XmALIGNMENT_CENTER); i++; XtSetValues(eObject->replaceLabel, args, i); i = 0; XtSetArg(args[i], XmNleftAttachment, (XtArgVal) XmATTACH_FORM); i++; XtSetArg(args[i], XmNrightAttachment, (XtArgVal) XmATTACH_FORM); i++; XtSetArg(args[i], XmNtopAttachment, (XtArgVal) XmATTACH_WIDGET); i++; XtSetArg(args[i], XmNtopWidget, (XtArgVal) eObject->replaceLabel); i++; XtSetArg(args[i], XmNborderWidth, (XtArgVal) 0); i++; XtSetArg(args[i], XmNorientation, (XtArgVal) XmHORIZONTAL); i++; eObject->replaceFindBox = XtCreateManagedWidget("replaceFindBox", xmFormWidgetClass, eObject->replaceBox, args, i); i = 0; XtSetArg(args[i], XmNleftAttachment, (XtArgVal) XmATTACH_FORM); i++; XtSetArg(args[i], XmNrightAttachment, (XtArgVal) XmATTACH_FORM); i++; XtSetArg(args[i], XmNtopAttachment, (XtArgVal) XmATTACH_WIDGET); i++; XtSetArg(args[i], XmNtopWidget, (XtArgVal) eObject->replaceFindBox); i++; XtSetArg(args[i], XmNborderWidth, (XtArgVal) 0); i++; XtSetArg(args[i], XmNorientation, (XtArgVal) XmHORIZONTAL); i++; eObject->replaceReplaceBox = XtCreateManagedWidget("replaceReplaceBox", xmFormWidgetClass, eObject->replaceBox, args, i); i = 0; XtSetArg(args[i], XmNleftAttachment, (XtArgVal) XmATTACH_FORM); i++; XtSetArg(args[i], XmNtopAttachment, (XtArgVal) XmATTACH_FORM); i++; XtSetArg(args[i], XmNbottomAttachment, (XtArgVal) XmATTACH_FORM); i++; XtSetArg(args[i], XmNborderWidth, (XtArgVal) 0); i++; XtSetArg(args[i], XmNlabelString, XmStringCreateLtoR(" Find: ", char_set)); i++; eObject->replaceFindLabel = XtCreateManagedWidget("replaceFindLabel", xmLabelWidgetClass, eObject->replaceFindBox, args, i); i = 0; XtSetArg(args[i], XmNleftAttachment, (XtArgVal) XmATTACH_FORM); i++; XtSetArg(args[i], XmNtopAttachment, (XtArgVal) XmATTACH_FORM); i++; XtSetArg(args[i], XmNbottomAttachment, (XtArgVal) XmATTACH_FORM); i++; XtSetArg(args[i], XmNborderWidth, (XtArgVal) 0); i++; XtSetArg(args[i], XmNlabelString, XmStringCreateLtoR("Replace: ", char_set)); i++; eObject->replaceReplaceLabel = XtCreateManagedWidget("replaceReplaceLabel", xmLabelWidgetClass, eObject->replaceReplaceBox, args, i); i = 0; XtSetArg(args[i], XmNleftAttachment, (XtArgVal) XmATTACH_WIDGET); i++; XtSetArg(args[i], XmNleftWidget, (XtArgVal) eObject->replaceFindLabel); i++; XtSetArg(args[i], XmNrightAttachment, (XtArgVal) XmATTACH_FORM); i++; XtSetArg(args[i], XmNtopAttachment, (XtArgVal) XmATTACH_FORM); i++; XtSetArg(args[i], XmNbottomAttachment, (XtArgVal) XmATTACH_FORM); i++; XtSetArg(args[i], XmNborderWidth, (XtArgVal) 0); i++; if (replace_columns > 0) { XtSetArg(args[i], XmNcolumns, (XtArgVal) replace_columns); i++; } eObject->replaceFindText = XtCreateManagedWidget("replaceFindText", xmTextWidgetClass, eObject->replaceFindBox, args, i); XtAddCallback(eObject->replaceFindText, XmNactivateCallback, ReplaceFind, (XtPointer) eObject); i = 0; XtSetArg(args[i], XmNleftAttachment, (XtArgVal) XmATTACH_WIDGET); i++; XtSetArg(args[i], XmNleftWidget, (XtArgVal) eObject->replaceReplaceLabel); i++; XtSetArg(args[i], XmNrightAttachment, (XtArgVal) XmATTACH_FORM); i++; XtSetArg(args[i], XmNtopAttachment, (XtArgVal) XmATTACH_FORM); i++; XtSetArg(args[i], XmNbottomAttachment, (XtArgVal) XmATTACH_FORM); i++; XtSetArg(args[i], XmNborderWidth, (XtArgVal) 0); i++; XtSetArg(args[i], XmNborderWidth, (XtArgVal) 0); i++; XtSetArg(args[i], XmNcolumns, (XtArgVal) 40); i++; eObject->replaceReplaceText = XtCreateManagedWidget("replaceReplaceText", xmTextWidgetClass, eObject->replaceReplaceBox, args, i); i = 0; XtSetArg(args[i], XmNborderWidth, (XtArgVal) 0); i++; XtSetArg(args[i], XmNorientation, (XtArgVal) XmHORIZONTAL); i++; eObject->replaceButtonBox = XtCreateManagedWidget("replaceButtonBox", xmRowColumnWidgetClass, eObject->replacePane, args, i); i = 0; XtSetArg(args[i], XmNlabelString, XmStringCreateLtoR(" Find ", char_set)); i++; eObject->replaceFindButton = XtCreateManagedWidget("replaceFindButton", xmPushButtonWidgetClass, eObject->replaceButtonBox, args, i); XtAddCallback(eObject->replaceFindButton, XmNactivateCallback, ReplaceFind, (XtPointer) eObject); i = 0; XtSetArg(args[i], XmNlabelString, XmStringCreateLtoR("Replace", char_set)); i++; eObject->replaceReplaceButton = XtCreateManagedWidget("replaceReplaceButton", xmPushButtonWidgetClass, eObject->replaceButtonBox, args, i); XtAddCallback(eObject->replaceReplaceButton, XmNactivateCallback, ReplaceReplace, (XtPointer) eObject); i = 0; XtSetArg(args[i], XmNlabelString, XmStringCreateLtoR("Dismiss", char_set)); i++; eObject->replaceDismissButton = XtCreateManagedWidget("replaceDismissButton", xmPushButtonWidgetClass, eObject->replaceButtonBox, args, i); XtAddCallback(eObject->replaceDismissButton, XmNactivateCallback, ReplaceDismiss, (XtPointer) eObject); /* restrict the height of the action area: */ i = 0; XtSetArg(args[i], XmNmarginHeight, &margin_height); i++; XtGetValues(eObject->replaceButtonBox, args, i); i = 0; XtSetArg(args[i], XmNheight, &height); i++; XtGetValues(eObject->replaceFindButton, args, i); i = 0; XtSetArg(args[i], XmNpaneMinimum, (XtArgVal) (height + (margin_height * 2))); i++; XtSetArg(args[i], XmNpaneMaximum, (XtArgVal) (height + (margin_height * 2))); i++; XtSetValues(eObject->replaceButtonBox, args, i); remove_sash_traversal(eObject->replacePane); return eObject;} /* editor_create *//*editor_destroy() frees the storage for an `Editor' object.*/void editor_destroy(eObject)Editor eObject;{ XtDestroyWidget(eObject->replaceShell); XtDestroyWidget(eObject->instance); XtFree(eObject->self);} /* editor_destroy *//*editor_realize() realizes the editor object, specifically, thetop-level shell window used by the search and replace window.*/void editor_realize(eObject)Editor eObject;{ XtRealizeWidget(eObject->replaceShell);} /* editor_realize *//*editor_set_sensitive() allows the application to set thesensitivity of the XmText widget to True.*/void editor_set_sensitive(eObject)Editor eObject;{ XtSetSensitive(eObject->edit, True);} /* editor_set_sensitive *//*editor_set_nonsensitive() allows the application to set thesensitivity of the XmText widget to False.*/void editor_set_nonsensitive(eObject)Editor eObject;{ XtSetSensitive(eObject->edit, False);} /* editor_set_nonsensitive *//*editor_get_text() returns the text for the text edit widget.The caller must free the text with XtFree().*/char *editor_get_text(eObject)Editor eObject;{ return (char *) XmTextGetString(eObject->edit);} /* editor_get_text *//*editor_set_text() sets the text for the text edit widget.*/void editor_set_text(eObject, text)Editor eObject;char *text;{ XmTextSetString(eObject->edit, text);} /* editor_set_text *//*For the following functions editor_<widget_name>() returnsthe widget IDs of the internal widgets. Many of thesearen't really needed and could be deleted. Using macros isanother possibility. And, of course, Xt provides functionsfor obtaining this information.*/#ifdef WIDGET_ACCESSWidget editor_instance(eObject)Editor eObject;{ return eObject->instance;} /* editor_instance */Widget editor_class(eObject)Editor eObject;{ return eObject->class;} /* editor_class */Widget editor_editBox(eObject)Editor eObject;{ return eObject->editBox;} /* editor_editBox */Widget editor_menuBar(eObject)Editor eObject;{ return eObject->menuBar;} /* editor_menuBar *//*ARGSUSED*/Widget editor_menuEditButton(eObject) /* maintain consistent interface */Editor eObject;{ return menus[0].id;} /* editor_menuEditButton *//*ARGSUSED*/Widget editor_menuFindButton(eObject) /* maintain consistent interface */Editor eObject;{ return menus[1].id;} /* editor_menuFindButton *//*ARGSUSED*/Widget editor_menuCutButton(eObject) /* maintain consistent interface */Editor eObject;{ return edit_menu[0].id;} /* editor_menuCutButton *//*ARGSUSED*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -