⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 editor.c

📁 `smith.motif.tar.Z includes the source code for the book "Designing X clients with Xt/Motif," by Je
💻 C
📖 第 1 页 / 共 2 页
字号:
/**** 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 + -