📄 xrolo.c
字号:
static void create_dialogs(app, parent, resource_data)XtAppContext app;Widget parent;ApplicationData *resource_data;{ static DialogButtonItem quit_unsaved_items[] = { {"Save", SaveUnsavedChanges, (XtPointer) xrolo_QUIT_WARNING}, {"Discard", DiscardUnsavedChanges, (XtPointer) xrolo_QUIT_WARNING}, {"Cancel", CancelUnsavedChanges, (XtPointer) xrolo_QUIT_WARNING}, {NULL, NULL, NULL}, }; static DialogButtonItem open_warning_items[] = { {"Save", SaveUnsavedChanges, (XtPointer) xrolo_OPEN_WARNING}, {"Discard", DiscardUnsavedChanges, (XtPointer) xrolo_OPEN_WARNING}, {"Cancel", CancelUnsavedChanges, (XtPointer) xrolo_OPEN_WARNING}, {NULL, NULL, NULL}, }; static DialogButtonItem overwrite_items[] = { {"Overwrite", OverwriteOK, NULL}, {"Cancel", OverwriteCancel, NULL}, {NULL, NULL, NULL}, }; static DialogButtonItem message_items[] = { {" OK ", NULL, NULL}, {NULL, NULL, NULL}, }; static menu_entry toggle_menu[] = { {menu_TOG_ENTRY, "Case insensitive", "findInsensitiveButton", InsensitiveSearch, NULL, NULL, NULL}, {menu_TOG_ENTRY, "Case sensitive", "findSensitiveButton", SensitiveSearch, NULL, NULL, NULL}, {menu_END, NULL, NULL, NULL, NULL, NULL, NULL}, }; char dir_mask[xrolo_DIR_MASK_MAX_LEN + 2], *home; Arg args[10]; int i; Dimension height, margin_height; Widget findPane, findBox, findLabel, findButtonBox, findForwardButton, findReverseButton, findDismissButton, findRadioBox; if (*resource_data->dir_mask) strncpy(dir_mask, resource_data->dir_mask, xrolo_DIR_MASK_MAX_LEN); else if ((home = (char *) getenv("HOME")) == NULL) strcpy(dir_mask, xrolo_DIR_MASK); else { strncpy(dir_mask, home, xrolo_DIR_MASK_MAX_LEN); strncat(dir_mask, "/", xrolo_DIR_MASK_MAX_LEN - strlen(home)); strncat(dir_mask, xrolo_DIR_MASK, xrolo_DIR_MASK_MAX_LEN - strlen(home) - 1); } i = 0; XtSetArg(args[i], XmNdialogTitle, XmStringCreateLtoR("xrolodex", char_set)); i++; XtSetArg(args[i], XmNdirMask, XmStringCreateLtoR(dir_mask, char_set)); i++; fileSelectionDialog = (Widget) XmCreateFileSelectionDialog(parent, "fileSelectionDialog", args, i); XtAddCallback(fileSelectionDialog, XmNokCallback, FileSelectionOK, NULL); XtAddCallback(fileSelectionDialog, XmNcancelCallback, FileSelectionCancel, NULL); XtUnmanageChild((Widget) XmFileSelectionBoxGetChild(fileSelectionDialog, XmDIALOG_HELP_BUTTON));/*********************************************************************** dialog_create(app, parent, instance_name, items, num_columns, title, prompt, char_set, dialog_position, modal_dialog, max_win_mgr, string_input, auto_popdown, default_button);***********************************************************************/ quitUnsavedDialog = dialog_create(app, parent, "quitUnsavedDialog", quit_unsaved_items, 0, "xrolodex", xrolo_QUIT_WARNING_MSG, char_set, (resource_data->center_dialogs) ? dialog_CENTER : dialog_DEFAULT, FALSE, FALSE, FALSE, FALSE, 0); openUnsavedDialog = dialog_create(app, parent, "openUnsavedDialog", open_warning_items, 0, "xrolodex", xrolo_OPEN_WARNING_MSG, char_set, (resource_data->center_dialogs) ? dialog_CENTER : dialog_DEFAULT, FALSE, FALSE, FALSE, FALSE, 0); overwriteDialog = dialog_create(app, parent, "overwriteDialog", overwrite_items, 0, "xrolodex", "File already exists!", char_set, (resource_data->center_dialogs) ? dialog_CENTER : dialog_DEFAULT, FALSE, FALSE, FALSE, TRUE, 0); messageDialog = dialog_create(app, parent, "messageDialog", message_items, 0, "xrolodex", "", char_set, (resource_data->center_dialogs) ? dialog_CENTER : dialog_DEFAULT, FALSE, FALSE, FALSE, TRUE, 0); i = 0; XtSetArg(args[i], XmNallowShellResize, (XtArgVal) True); i++; XtSetArg(args[i], XmNmappedWhenManaged, (XtArgVal) False); i++; findShell = XtAppCreateShell(NULL, xrolo_APP_CLASS, topLevelShellWidgetClass, XtDisplay(parent), args, i); i = 0; XtSetArg(args[i], XmNsashWidth, (XtArgVal) 1); i++; XtSetArg(args[i], XmNsashHeight, (XtArgVal) 1); i++; findPane = XtCreateManagedWidget("findPane", xmPanedWindowWidgetClass, findShell, args, i); i = 0; XtSetArg(args[i], XmNhorizontalSpacing, (XtArgVal) 5); i++; XtSetArg(args[i], XmNverticalSpacing, (XtArgVal) 5); i++; findBox = XtCreateManagedWidget("findBox", xmFormWidgetClass, findPane, 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("Search for the next entry containing:", char_set)); i++; XtSetArg(args[i], XmNalignment, (XtArgVal) XmALIGNMENT_CENTER); i++; findLabel = XtCreateManagedWidget("findLabel", xmLabelWidgetClass, findBox, 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) findLabel); i++; XtSetArg(args[i], XmNcolumns, (XtArgVal) 40); i++; findText = XtCreateManagedWidget("findText", xmTextWidgetClass, findBox, args, i); XtAddCallback(findText, XmNactivateCallback, FindForward, NULL); 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) findText); i++; XtSetArg(args[i], XmNborderWidth, (XtArgVal) 0); i++; XtSetArg(args[i], XmNorientation, (XtArgVal) XmHORIZONTAL); i++; XtSetArg(args[i], XmNradioBehavior, (XtArgVal) True); i++; XtSetArg(args[i], XmNradioAlwaysOne, (XtArgVal) True); i++; findRadioBox = XtCreateManagedWidget("findRadioBox", xmRowColumnWidgetClass, findBox, args, i); create_menus(findRadioBox, toggle_menu, char_set); i = 0; XtSetArg(args[i], XmNset, (XtArgVal) True); i++; XtSetValues(toggle_menu[0].id, args, i); i = 0; XtSetArg(args[i], XmNborderWidth, (XtArgVal) 0); i++; XtSetArg(args[i], XmNorientation, (XtArgVal) XmHORIZONTAL); i++; findButtonBox = XtCreateManagedWidget("findButtonBox", xmRowColumnWidgetClass, findPane, args, i); i = 0; XtSetArg(args[i], XmNlabelString, XmStringCreateLtoR("Forward", char_set)); i++; findForwardButton = XtCreateManagedWidget("findForwardButton", xmPushButtonWidgetClass, findButtonBox, args, i); XtAddCallback(findForwardButton, XmNactivateCallback, FindForward, NULL); i = 0; XtSetArg(args[i], XmNlabelString, XmStringCreateLtoR("Reverse", char_set)); i++; findReverseButton = XtCreateManagedWidget("findReverseButton", xmPushButtonWidgetClass, findButtonBox, args, i); XtAddCallback(findReverseButton, XmNactivateCallback, FindReverse, NULL); i = 0; XtSetArg(args[i], XmNlabelString, XmStringCreateLtoR("Dismiss", char_set)); i++; findDismissButton = XtCreateManagedWidget("findDismissButton", xmPushButtonWidgetClass, findButtonBox, args, i); XtAddCallback(findDismissButton, XmNactivateCallback, FindDismiss, NULL); i = 0; XtSetArg(args[i], XmNmarginHeight, &margin_height); i++; XtGetValues(findButtonBox, args, i); i = 0; XtSetArg(args[i], XmNheight, &height); i++; XtGetValues(findDismissButton, 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(findButtonBox, args, i); remove_sash_traversal(findPane);} /* create_dialogs *//*Private callback functions:*//*Close() terminates the application after freeing dynamicresources and processing unsaved changes.*//*ARGSUSED*/static void Close(w, client_data, call_data)Widget w;XtPointer client_data;XtPointer call_data;{ if (check_for_unsaved_changes(quitUnsavedDialog)) return; cleanup_and_exit((Widget) client_data);} /* Close *//*UnmapWindow() provides "Close" button functionality for pop-ups.*//*ARGSUSED*/static void UnmapWindow(w, client_data, call_data)Widget w;XtPointer client_data;XtPointer call_data;{ XtUnmapWidget((Widget) client_data);} /* UnmapWindow *//*UnmanageWindow() provides "Close" button functionality for Motif dialogs.*//*ARGSUSED*/static void UnmanageWindow(w, client_data, call_data)Widget w;XtPointer client_data;XtPointer call_data;{ XtUnmanageChild((Widget) client_data);} /* UnmanageWindow *//*DialogCancel() provides "Close" button functionality for`Dialog' dialogs. Because `xrolodex' does NOT interpretdata associated with any of its dialogs' buttons, itdoesn't matter which button we interpret the "Close"operation as being equivalent to; thus, the 0th buttonis used; see dialog_cancel() in `dialog.c'.*//*ARGSUSED*/static void DialogCancel(w, client_data, call_data)Widget w;XtPointer client_data;XtPointer call_data;{ dialog_cancel((Dialog) client_data, 0);} /* DialogCancel *//*Quit() terminates the application after freeing dynamicresources. It first checks with the user via a dialog box.*//*ARGSUSED*/static void Quit(w, client_data, call_data)Widget w;XtPointer client_data;XtPointer call_data;{ if (check_for_unsaved_changes(quitUnsavedDialog)) return; cleanup_and_exit(w);} /* Quit *//*Exit() terminates the application after saving changes.*//*ARGSUSED*/static void Exit(w, client_data, call_data)Widget w;XtPointer client_data;XtPointer call_data;{ if (!is_rolodex_active()) return; save_first_time(); save_current_text(); xrolo_db_save(); cleanup_and_exit(w);} /* Exit *//*Open() prompts regarding unsaved changes and thenactivates the file selection box for loading a rolodexfile. FileSelectionOK() manages the actual open/loadoperation for the rolodex file.*//*ARGSUSED*/static void Open(w, client_data, call_data)Widget w;XtPointer client_data;XtPointer call_data;{ Arg arg; static XtCallbackRec open_cb_list[] = { {FileSelectionOK, (XtPointer) xrolo_OPEN}, /* ptr warning */ {(XtCallbackProc) NULL, (XtPointer) NULL}, }; if (check_for_unsaved_changes(openUnsavedDialog)) return; XtSetArg(arg, XmNokCallback, (XtArgVal) open_cb_list); XtSetValues(fileSelectionDialog, &arg, 1); XtManageChild(fileSelectionDialog);} /* Open *//*Save() saves changes to the currently open rolodex database.*//*ARGSUSED*/static void Save(w, client_data, call_data)Widget w;XtPointer client_data;XtPointer call_data;{ if (!is_rolodex_active()) return; save_first_time(); save_current_text(); xrolo_db_save();} /* Save *//*SaveAs() activates the file selection box for specifyinga rolodex file. FileSelectionOK() manages the actual saveoperation for the rolodex file.*//*ARGSUSED*/static void SaveAs(w, client_data, call_data)Widget w;XtPointer client_data;XtPointer call_data;{ Arg arg; static XtCallbackRec save_as_cb_list[] = { {FileSelectionOK, (XtPointer) xrolo_SAVE_AS}, /* ptr warning */ {(XtCallbackProc) NULL, (XtPointer) NULL}, }; if (!is_rolodex_active()) return; XtSetArg(arg, XmNokCallback, (XtArgVal) save_as_cb_list); XtSetValues(fileSelectionDialog, &arg, 1); XtManageChild(fileSelectionDialog);} /* SaveAs *//*EntryModified() signals modifications to the rolodex entry viewport.It is registered with the editor pseudo-widget's modify callback.*//*ARGSUSED*/static void EntryModified(w, client_data, call_data)Widget w;XtPointer client_data;XtPointer call_data;{ if (!is_rolodex_active()) return; entry_modified = TRUE;} /* EntryModified *//*InsensitiveSearch() signals modifications to the rolodex entrysearch case sensitivity. It is registered with the togglebutton's value-changed callback.*//*ARGSUSED*/static void InsensitiveSearch(w, client_data, call_data)Widget w;XtPointer client_data;XtPointer call_data;{ case_sensitive_search = FALSE;} /* InsensitiveSearch *//*SensitiveSearch() signals modifications to the rolodex entrysearch case sensitivity. It is registered with the togglebutton's value-changed callback.*//*ARGSUSED*/static void SensitiveSearch(w, client_data, call_data)Widget w;XtPointer client_data;XtPointer call_data;{ case_sensitive_search = TRUE;} /* SensitiveSearch *//*FileSelectionOK() responds to a user's file selection. Itmust handle rolodex file "Open" and "SaveAs" operations.*//*ARGSUSED*/static void FileSelectionOK(w, client_data, call_data)Widget w;XtPointer client_data;XtPointer call_data;{ Arg args[5]; int i; char *filename; XmString xmstring; i = 0; XtSetArg(args[i], XmNtextString, &xmstring); i++; XtGetValues(fileSelectionDialog, args, i); if (!XmStringGetLtoR(xmstring, char_set, &filename)) return; XtUnmanageChild(fileSelectionDialog); if ((int) client_data == xrolo_OPEN) open_rolodex_file(filename); else if ((int) client_data == xrolo_SAVE_AS) { /* save_as_rolodex_file() *may* activate a nonmodal dialog box and return with it still pending, so create a copy of the local filename before freeing it. Since callbacks are involved, there is no point in passing it as arguments to procedures and setting (and resetting) callback client-data values: */ if (save_as_filename)/* free(save_as_filename);*/ XtFree(save_as_filename);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -