📄 smartindent.c
字号:
XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, lmForm, XmNbottomAttachment, XmATTACH_WIDGET, XmNbottomWidget, okBtn, NULL); /* XmNmarginWidth, 0, XmNmarginHeight, 0, XmNseparatorOn, False, XmNspacing, 3, XmNsashIndent, -2, */ initForm = XtVaCreateManagedWidget("initForm", xmFormWidgetClass, pane, NULL); initLbl = XtVaCreateManagedWidget("initLbl", xmLabelGadgetClass, initForm, XmNlabelString, s1=XmStringCreateSimple( "Language Specific Initialization Macro Commands and Definitions"), XmNmnemonic, 'I', NULL); XmStringFree(s1); n = 0; XtSetArg(args[n], XmNeditMode, XmMULTI_LINE_EDIT); n++; XtSetArg(args[n], XmNrows, 5); n++; XtSetArg(args[n], XmNcolumns, 80); n++; XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET); n++; XtSetArg(args[n], XmNtopWidget, initLbl); n++; XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); n++; XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); n++; XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); n++; SmartIndentDialog.initMacro = XmCreateScrolledText(initForm, "initMacro", args, n); AddMouseWheelSupport(SmartIndentDialog.initMacro); XtManageChild(SmartIndentDialog.initMacro); RemapDeleteKey(SmartIndentDialog.initMacro); XtVaSetValues(initLbl, XmNuserData, SmartIndentDialog.initMacro, NULL); newlineForm = XtVaCreateManagedWidget("newlineForm", xmFormWidgetClass, pane, NULL); newlineLbl = XtVaCreateManagedWidget("newlineLbl", xmLabelGadgetClass, newlineForm, XmNlabelString, s1=XmStringCreateSimple("Newline Macro"), XmNmnemonic, 'N', NULL); XmStringFree(s1); XtVaCreateManagedWidget("newlineArgsLbl", xmLabelGadgetClass, newlineForm, XmNalignment, XmALIGNMENT_END, XmNlabelString, s1=XmStringCreateSimple( "($1 is insert position, return indent request or -1)"), XmNrightAttachment, XmATTACH_FORM, NULL); XmStringFree(s1); n = 0; XtSetArg(args[n], XmNeditMode, XmMULTI_LINE_EDIT); n++; XtSetArg(args[n], XmNrows, 5); n++; XtSetArg(args[n], XmNcolumns, 80); n++; XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET); n++; XtSetArg(args[n], XmNtopWidget, newlineLbl); n++; XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); n++; XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); n++; XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); n++; SmartIndentDialog.newlineMacro = XmCreateScrolledText(newlineForm, "newlineMacro", args, n); AddMouseWheelSupport(SmartIndentDialog.newlineMacro); XtManageChild(SmartIndentDialog.newlineMacro); RemapDeleteKey(SmartIndentDialog.newlineMacro); XtVaSetValues(newlineLbl, XmNuserData, SmartIndentDialog.newlineMacro,NULL); modifyForm = XtVaCreateManagedWidget("modifyForm", xmFormWidgetClass, pane, NULL); modifyLbl = XtVaCreateManagedWidget("modifyLbl", xmLabelGadgetClass, modifyForm, XmNlabelString,s1=XmStringCreateSimple("Type-in Macro"), XmNmnemonic, 'M', NULL); XmStringFree(s1); XtVaCreateManagedWidget("modifyArgsLbl", xmLabelGadgetClass, modifyForm, XmNalignment, XmALIGNMENT_END, XmNlabelString, s1=XmStringCreateSimple( "($1 is position, $2 is character just inserted)"), XmNrightAttachment, XmATTACH_FORM, NULL); XmStringFree(s1); n = 0; XtSetArg(args[n], XmNeditMode, XmMULTI_LINE_EDIT); n++; XtSetArg(args[n], XmNrows, 5); n++; XtSetArg(args[n], XmNcolumns, 80); n++; XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET); n++; XtSetArg(args[n], XmNtopWidget, modifyLbl); n++; XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); n++; XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); n++; XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); n++; SmartIndentDialog.modMacro = XmCreateScrolledText(modifyForm, "modifyMacro", args, n); AddMouseWheelSupport(SmartIndentDialog.modMacro); XtManageChild(SmartIndentDialog.modMacro); RemapDeleteKey(SmartIndentDialog.modMacro); XtVaSetValues(modifyLbl, XmNuserData, SmartIndentDialog.modMacro, NULL); /* Set initial default button */ XtVaSetValues(form, XmNdefaultButton, okBtn, NULL); XtVaSetValues(form, XmNcancelButton, dismissBtn, NULL); /* Handle mnemonic selection of buttons and focus to dialog */ AddDialogMnemonicHandler(form, FALSE); /* Fill in the dialog information for the selected language mode */ setSmartIndentDialogData(findIndentSpec(lmName)); SetLangModeMenu(SmartIndentDialog.lmOptMenu,SmartIndentDialog.langModeName); /* Realize all of the widgets in the new dialog */ RealizeWithoutForcingPosition(SmartIndentDialog.shell);}static void destroyCB(Widget w, XtPointer clientData, XtPointer callData){ XtFree(SmartIndentDialog.langModeName); SmartIndentDialog.shell = NULL;}static void langModeCB(Widget w, XtPointer clientData, XtPointer callData){ char *modeName; int i, resp; static smartIndentRec emptyIndentSpec = {NULL, NULL, NULL, NULL}; smartIndentRec *oldMacros, *newMacros; /* Get the newly selected mode name. If it's the same, do nothing */ XtVaGetValues(w, XmNuserData, &modeName, NULL); if (!strcmp(modeName, SmartIndentDialog.langModeName)) return; /* Find the original macros */ for (i=0; i<NSmartIndentSpecs; i++) if (!strcmp(SmartIndentDialog.langModeName,SmartIndentSpecs[i]->lmName)) break; oldMacros = i == NSmartIndentSpecs ? &emptyIndentSpec : SmartIndentSpecs[i]; /* Check if the macros have changed, if so allow user to apply, discard, or cancel */ newMacros = getSmartIndentDialogData(); if (indentSpecsDiffer(oldMacros, newMacros)) { resp = DialogF(DF_QUES, SmartIndentDialog.shell, 3, "Smart Indent", "Smart indent macros for language mode\n" "%s were changed. Apply changes?", "Apply", "Discard", "Cancel", SmartIndentDialog.langModeName); if (resp == 3) { SetLangModeMenu(SmartIndentDialog.lmOptMenu, SmartIndentDialog.langModeName); return; } else if (resp == 1) { if (checkSmartIndentDialogData()) { if (oldMacros == &emptyIndentSpec) { SmartIndentSpecs[NSmartIndentSpecs++] = copyIndentSpec(newMacros); } else { freeIndentSpec(oldMacros); SmartIndentSpecs[i] = copyIndentSpec(newMacros); } } else { SetLangModeMenu(SmartIndentDialog.lmOptMenu, SmartIndentDialog.langModeName); return; } } } freeIndentSpec(newMacros); /* Fill the dialog with the new language mode information */ SmartIndentDialog.langModeName = XtNewString(modeName); setSmartIndentDialogData(findIndentSpec(modeName));}static void lmDialogCB(Widget w, XtPointer clientData, XtPointer callData){ EditLanguageModes();}static void commonDialogCB(Widget w, XtPointer clientData, XtPointer callData){ EditCommonSmartIndentMacro();}static void okCB(Widget w, XtPointer clientData, XtPointer callData){ /* change the macro */ if (!updateSmartIndentData()) return; /* pop down and destroy the dialog */ XtDestroyWidget(SmartIndentDialog.shell);}static void applyCB(Widget w, XtPointer clientData, XtPointer callData){ /* change the patterns */ updateSmartIndentData();} static void checkCB(Widget w, XtPointer clientData, XtPointer callData){ if (checkSmartIndentDialogData()) DialogF(DF_INF, SmartIndentDialog.shell, 1, "Macro compiled", "Macros compiled without error", "Dismiss");} static void restoreCB(Widget w, XtPointer clientData, XtPointer callData){ int i; smartIndentRec *defaultIS; /* Find the default indent spec */ for (i=0; i<N_DEFAULT_INDENT_SPECS; i++) { if (!strcmp(SmartIndentDialog.langModeName, DefaultIndentSpecs[i].lmName)) { break; } } if (i == N_DEFAULT_INDENT_SPECS) { DialogF(DF_WARN, SmartIndentDialog.shell, 1, "Smart Indent", "There are no default indent macros\nfor language mode %s", "Dismiss", SmartIndentDialog.langModeName); return; } defaultIS = &DefaultIndentSpecs[i]; if (DialogF(DF_WARN, SmartIndentDialog.shell, 2, "Discard Changes", "Are you sure you want to discard\n" "all changes to smart indent macros\n" "for language mode %s?", "Discard", "Cancel", SmartIndentDialog.langModeName) == 2) { return; } /* if a stored version of the indent macros exist, replace them, if not, add a new one */ for (i=0; i<NSmartIndentSpecs; i++) if (!strcmp(SmartIndentDialog.langModeName,SmartIndentSpecs[i]->lmName)) break; if (i < NSmartIndentSpecs) { freeIndentSpec(SmartIndentSpecs[i]); SmartIndentSpecs[i] = copyIndentSpec(defaultIS); } else SmartIndentSpecs[NSmartIndentSpecs++] = copyIndentSpec(defaultIS); /* Update the dialog */ setSmartIndentDialogData(defaultIS);} static void deleteCB(Widget w, XtPointer clientData, XtPointer callData){ int i; if (DialogF(DF_WARN, SmartIndentDialog.shell, 2, "Delete Macros", "Are you sure you want to delete smart indent\n" "macros for language mode %s?", "Yes, Delete", "Cancel", SmartIndentDialog.langModeName) == 2) { return; } /* if a stored version of the pattern set exists, delete it from the list */ for (i=0; i<NSmartIndentSpecs; i++) if (!strcmp(SmartIndentDialog.langModeName,SmartIndentSpecs[i]->lmName)) break; if (i < NSmartIndentSpecs) { freeIndentSpec(SmartIndentSpecs[i]); memmove(&SmartIndentSpecs[i], &SmartIndentSpecs[i+1], (NSmartIndentSpecs-1 - i) * sizeof(smartIndentRec *)); NSmartIndentSpecs--; } /* Clear out the dialog */ setSmartIndentDialogData(NULL);}static void dismissCB(Widget w, XtPointer clientData, XtPointer callData){ /* pop down and destroy the dialog */ XtDestroyWidget(SmartIndentDialog.shell);}static void helpCB(Widget w, XtPointer clientData, XtPointer callData){ Help(HELP_SMART_INDENT);}static int checkSmartIndentDialogData(void){ char *widgetText, *errMsg, *stoppedAt; Program *prog; /* Check the initialization macro */ if (!TextWidgetIsBlank(SmartIndentDialog.initMacro)) { widgetText =ensureNewline(XmTextGetString(SmartIndentDialog.initMacro)); if (!CheckMacroString(SmartIndentDialog.shell, widgetText, "initialization macro", &stoppedAt)) { XmTextSetInsertionPosition(SmartIndentDialog.initMacro, stoppedAt - widgetText); XmProcessTraversal(SmartIndentDialog.initMacro, XmTRAVERSE_CURRENT); XtFree(widgetText); return False; } XtFree(widgetText); } /* Test compile the newline macro */ if (TextWidgetIsBlank(SmartIndentDialog.newlineMacro)) { DialogF(DF_WARN, SmartIndentDialog.shell, 1, "Smart Indent", "Newline macro required", "Dismiss"); return False; } widgetText = ensureNewline(XmTextGetString(SmartIndentDialog.newlineMacro)); prog = ParseMacro(widgetText, &errMsg, &stoppedAt); if (prog == NULL) { ParseError(SmartIndentDialog.shell, widgetText, stoppedAt, "newline macro", errMsg); XmTextSetInsertionPosition(SmartIndentDialog.newlineMacro, stoppedAt - widgetText); XmProcessTraversal(SmartIndentDialog.newlineMacro, XmTRAVERSE_CURRENT); XtFree(widgetText); return False; } XtFree(widgetText); FreeProgram(prog); /* Test compile the modify macro */ if (!TextWidgetIsBlank(SmartIndentDialog.modMacro)) { widgetText = ensureNewline(XmTextGetString(SmartIndentDialog.modMacro)); prog = ParseMacro(widgetText, &errMsg, &stoppedAt); if (prog == NULL) { ParseError(SmartIndentDialog.shell, widgetText, stoppedAt, "modify macro", errMsg); XmTextSetInsertionPosition(SmartIndentDialog.modMacro, stoppedAt - widgetText); XmProcessTraversal(SmartIndentDialog.modMacro, XmTRAVERSE_CURRENT); XtFree(widgetText); return False; } XtFree(widgetText); FreeProgram(prog); } return True;}static smartIndentRec *getSmartIndentDialogData(void){ smartIndentRec *is; is = (smartIndentRec *)XtMalloc(sizeof(smartIndentRec)); is->lmName = XtNewString(SmartIndentDialog.langModeName); is->initMacro = TextWidgetIsBlank(SmartIndentDialog.initMacro) ? NULL : ensureNewline(XmTextGetString(SmartIndentDialog.initMacro)); is->newlineMacro = TextWidgetIsBlank(SmartIndentDialog.newlineMacro) ? NULL: ensureNewline(XmTextGetString(SmartIndentDialog.newlineMacro)); is->modMacro = TextWidgetIsBlank(SmartIndentDialog.modMacro) ? NULL : ensureNewline(XmTextGetString(SmartIndentDialog.modMacro)); return is;}static void setSmartIndentDialogData(smartIndentRec *is){ if (is == NULL) { XmTextSetString(SmartIndentDialog.initMacro, ""); XmTextSetString(SmartIndentDialog.newlineMacro, ""); XmTextSetString(SmartIndentDialog.modMacro, ""); } else { if (is->initMacro == NULL) XmTextSetString(SmartIndentDialog.initMacro, ""); else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -