00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include <stdio.h>
00024 #include <errno.h>
00025 #include <stdlib.h>
00026 #include <unistd.h>
00027
00028 #include "setup.h"
00029 #include "clips.h"
00030 #include "commline.h"
00031
00032 #include "xsetup.h"
00033 #include "xclips.h"
00034 #include "xedit.h"
00035 #include "xmain.h"
00036 #include "xmenu.h"
00037 #include "xmenu_file.h"
00038 #include "xclipstext.h"
00039
00040 static void EditorFontSelect(Widget,XtPointer,XtPointer);
00041 static void ExitEditor(Widget,XtPointer,XtPointer);
00042 static void EditorSaveFirst(Widget,XtPointer,XtPointer);
00043 static void EditorSave(Widget,XtPointer,XtPointer);
00044
00045
00046 XawTextPosition CurrentPosition,EndPosition;
00047 Widget CurrentSource;
00048 char *BatchString = NULL;
00049
00050 char *xclips_translation3 =
00051 "\
00052 Ctrl<Key>B: balance() \n\
00053 Ctrl<Key>C: complete-construct-editor()\n\
00054 ";
00055
00056 String bindings[] =
00057 {
00058 "Ctrl-a Begining Of Line",
00059 "Ctrl-b Search for matching parenthesis",
00060 "Crtl-d Delete Next Character",
00061 "Crtl-e End Of Line",
00062 "Crtl-f Forward Character",
00063 "Crtl-g Multiply Reset",
00064 "Crtl-h Delete Previous Character",
00065 "Crtl-j Newline And Indent",
00066 "Crtl-k Kill To End Of Line",
00067 "Crtl-l Redraw Display",
00068 "Crtl-m Newline",
00069 "Crtl-n Next Line",
00070 "Crtl-o Newline And Backup",
00071 "Crtl-p Previous Line",
00072 "Crtl-r Search/Replace Backward",
00073 "Crtl-s Search/Replace Forward",
00074 "Crtl-t Transpose Characters",
00075 "Crtl-u Multiply by 4",
00076 "Crtl-v Next Page",
00077 "Crtl-w Kill Selection",
00078 "Crtl-y Unkill",
00079 "Crtl-z Scroll One Line Up",
00080 "Meta-b Backward Word",
00081 "Meta-D Kill Word",
00082 "Meta-d Delete Next Word",
00083 "Meta-f Forward Word",
00084 "Meta-H Backward Kill Word",
00085 "Meta-h Delete Previous Word",
00086 "Meta-i Insert File",
00087 "Meta-k Kill To End Of Paragraph",
00088 "Meta-q Form Paragraph",
00089 "Meta-v Previous Page",
00090 "Meta-y Insert Current Selection",
00091 "Meta-z Scroll One Line Down",
00092 "Meta-< Begining Of File",
00093 "Meta-> End Of File",
00094 "Meta-] Forward Paragraph",
00095 "Meta-[ Backward Paragraph",
00096 "Meta-Delete Delete Previous Word",
00097 "Meta-Shift Delete Kill Previous Word",
00098 "Meta-Backspace Delete Previous Word",
00099 "Meta-Shift Backspace Kill Previous Word",
00100 NULL,
00101 };
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111 void EditNewFile(
00112 Widget w,
00113 XtPointer client_data,
00114 XtPointer call_data)
00115 {
00116 void *theEnv = GetCurrentEnvironment();
00117 String filename = XawDialogGetValueString(XtParent(w));
00118 char fullpath[255];
00119 Widget edit = NULL, edit_form = NULL, outer_form = NULL, asciiForm = NULL,
00120 edit_text= NULL, button= NULL, menu= NULL, item;
00121 Dimension width, height;
00122 FILE *fp = NULL;
00123 char buf[512];
00124
00125 strcpy(fullpath, path);
00126 strcat(fullpath, filename);
00127
00128
00129
00130
00131
00132 if((fp = fopen(fullpath, "r+")) == NULL)
00133 {
00134
00135 switch (errno)
00136 {
00137 case ENOENT:
00138
00139 if((fp = fopen(fullpath, "w")) == NULL)
00140 {
00141 sprintf(buf,"Can't open file %s for edit\n", fullpath);
00142 EnvPrintRouter(theEnv,"wclips", buf);
00143 quit_get_event = TRUE;
00144 PrintPrompt(theEnv);
00145 return;
00146 }
00147
00148 break;
00149
00150 default:
00151 sprintf(buf, "Permission denied, can't open file %s \n", fullpath);
00152 EnvPrintRouter(theEnv,"wclips", buf);
00153 quit_get_event = TRUE;
00154 PrintPrompt(theEnv);
00155 CancelPopupSelect(outer_form, (XtPointer)XtParent(w), (XtPointer)NULL);
00156 return;
00157 }
00158 }
00159
00160
00161
00162
00163
00164 fclose(fp);
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179 XtSetArg(TheArgs[0], XtNwidth, &width);
00180 XtSetArg(TheArgs[1], XtNheight, &height);
00181 XtGetValues(dialog, TheArgs, 2);
00182 edit = XtCreatePopupShell(filename,
00183 topLevelShellWidgetClass,
00184 toplevel,
00185 NULL, 0);
00186
00187 XtSetArg(TheArgs[0], XtNheight, height);
00188 XtSetArg(TheArgs[1], XtNwidth, width);
00189 outer_form = XtCreateManagedWidget("outer_form",
00190 panedWidgetClass,
00191 edit,
00192 TheArgs, 2);
00193
00194 edit_form = XtCreateManagedWidget("buttonForm",
00195 formWidgetClass,
00196 outer_form,
00197 NULL, 0);
00198
00199 asciiForm = XtCreateManagedWidget("asciiform",
00200 formWidgetClass,
00201 outer_form,
00202 NULL, 0);
00203
00204 XtSetArg(TheArgs[0], XtNheight, height-35);
00205 XtSetArg(TheArgs[1], XtNwidth, width);
00206 XtSetArg(TheArgs[2], XtNresize, "false");
00207 XtSetArg(TheArgs[3], XtNtype, XawAsciiFile);
00208 XtSetArg(TheArgs[4], XtNeditType, XawtextEdit);
00209 XtSetArg(TheArgs[5], XtNscrollVertical, XawtextScrollWhenNeeded);
00210 XtSetArg(TheArgs[6], XtNscrollHorizontal, XawtextScrollWhenNeeded);
00211 XtSetArg(TheArgs[7], XtNstring, fullpath);
00212 edit_text = XtCreateManagedWidget("dialog_text",
00213 asciiTextWidgetClass,
00214 asciiForm,
00215 TheArgs, 8);
00216
00217 XtOverrideTranslations(edit_text,XtParseTranslationTable(xclips_translation3));
00218
00219
00220
00221
00222
00223 button = XtCreateManagedWidget("File",
00224 menuButtonWidgetClass,
00225 edit_form,
00226 NULL, 0);
00227
00228 menu = XtCreatePopupShell("menu",
00229 simpleMenuWidgetClass,
00230 button,
00231 NULL, 0);
00232
00233 item = XtCreateManagedWidget("Save",
00234 smeBSBObjectClass,
00235 menu,
00236 NULL, 0);
00237 XtAddCallback(item, XtNcallback, EditorSaveCallback, (XtPointer)(edit_text));
00238 item = XtCreateManagedWidget("Save As",
00239 smeBSBObjectClass,
00240 menu,
00241 NULL, 0);
00242 XtAddCallback(item, XtNcallback, EditorSaveAsCallback,
00243 (XtPointer)(edit_text));
00244 item = XtCreateManagedWidget("Revert",
00245 smeBSBObjectClass,
00246 menu,
00247 NULL, 0);
00248 XtAddCallback(item, XtNcallback, EditorRevertCallback,
00249 (XtPointer)(edit_text));
00250
00251 (void)XtCreateManagedWidget("line",smeLineObjectClass,menu,NULL,0);
00252
00253 item = XtCreateManagedWidget("Load Selection",
00254 smeBSBObjectClass,
00255 menu,
00256 NULL, 0);
00257 XtAddCallback(item, XtNcallback, EditorCompileSelectionCallback,
00258 (XtPointer)edit_text);
00259
00260 item = XtCreateManagedWidget("Batch Selection",
00261 smeBSBObjectClass,
00262 menu,
00263 NULL, 0);
00264 XtAddCallback(item,XtNcallback,EditorBatchSelectionCb,(XtPointer)edit_text);
00265
00266 item = XtCreateManagedWidget("Load Buffer",
00267 smeBSBObjectClass,
00268 menu,
00269 NULL, 0);
00270 XtAddCallback(item, XtNcallback, EditorCompileFileCallback,
00271 (XtPointer)edit_text);
00272
00273
00274 (void)XtCreateManagedWidget("line",smeLineObjectClass,menu,NULL,0);
00275
00276 item = XtCreateManagedWidget("Exit",
00277 smeBSBObjectClass,
00278 menu,
00279 NULL, 0);
00280 XtAddCallback(item, XtNcallback, EditorExitCallback, (XtPointer)edit_text);
00281
00282
00283
00284
00285
00286 XtSetArg(TheArgs[0], XtNfromHoriz, button);
00287 button = XtCreateManagedWidget("Edit",
00288 menuButtonWidgetClass,
00289 edit_form,
00290 TheArgs, 1);
00291
00292 menu = XtCreatePopupShell("menu",
00293 simpleMenuWidgetClass,
00294 button,
00295 NULL, 0);
00296
00297 item = XtCreateManagedWidget("Complete... ^C",
00298 smeBSBObjectClass,
00299 menu,
00300 NULL, 0);
00301 XtAddCallback(item, XtNcallback, CompletionEditCallback, (XtPointer)edit_text);
00302 (void)XtCreateManagedWidget("line",
00303 smeLineObjectClass,
00304 menu,
00305 NULL, 0);
00306 item = XtCreateManagedWidget("Cut",
00307 smeBSBObjectClass,
00308 menu,
00309 NULL, 0);
00310 XtAddCallback(item, XtNcallback, EditorCutCallback, (XtPointer)edit_text);
00311 item = XtCreateManagedWidget("Paste",
00312 smeBSBObjectClass,
00313 menu,
00314 NULL, 0);
00315 XtAddCallback(item, XtNcallback, EditorPasteCallback, (XtPointer)edit_text);
00316 item = XtCreateManagedWidget("Search/Replace...",
00317 smeBSBObjectClass,
00318 menu,
00319 NULL, 0);
00320 XtAddCallback(item, XtNcallback, EditorSearchReplaceCallback,
00321 (XtPointer)edit_text);
00322 item = XtCreateManagedWidget("Balance ^B",
00323 smeBSBObjectClass,
00324 menu,
00325 NULL, 0);
00326 XtAddCallback(item,XtNcallback,FindMatchingParenthesisCallback,(XtPointer)edit_text);
00327 (void)XtCreateManagedWidget("line",
00328 smeLineObjectClass,
00329 menu,
00330 NULL, 0);
00331 item = XtCreateManagedWidget("Beginning of File",
00332 smeBSBObjectClass,
00333 menu,
00334 NULL, 0);
00335 XtAddCallback(item, XtNcallback, EditorBeginingOfFileCallback,
00336 (XtPointer)edit_text);
00337 item = XtCreateManagedWidget("End of File",
00338 smeBSBObjectClass,
00339 menu,
00340 NULL, 0);
00341 XtAddCallback(item, XtNcallback, EditorEndOfFileCallback,
00342 (XtPointer)edit_text);
00343
00344
00345
00346
00347
00348 XtSetArg(TheArgs[0], XtNfromHoriz, button);
00349 button = XtCreateManagedWidget("Font",
00350 menuButtonWidgetClass,
00351 edit_form,
00352 TheArgs, 1);
00353
00354 menu = XtCreatePopupShell("menu",
00355 simpleMenuWidgetClass,
00356 button,
00357 NULL, 0);
00358
00359 item = XtCreateManagedWidget("5x8",
00360 smeBSBObjectClass,
00361 menu,
00362 NULL, 0);
00363 XtAddCallback(item, XtNcallback, EditorFontSelect, (XtPointer)edit_text);
00364 item = XtCreateManagedWidget("6x10",
00365 smeBSBObjectClass,
00366 menu,
00367 NULL, 0);
00368 XtAddCallback(item, XtNcallback, EditorFontSelect, (XtPointer)edit_text);
00369 item = XtCreateManagedWidget("6x13bold",
00370 smeBSBObjectClass,
00371 menu,
00372 NULL, 0);
00373 XtAddCallback(item, XtNcallback, EditorFontSelect, (XtPointer)edit_text);
00374 item = XtCreateManagedWidget("7x13bold",
00375 smeBSBObjectClass,
00376 menu,
00377 NULL, 0);
00378 XtAddCallback(item, XtNcallback, EditorFontSelect, (XtPointer)edit_text);
00379 item = XtCreateManagedWidget("8x13bold",
00380 smeBSBObjectClass,
00381 menu,
00382 NULL, 0);
00383 XtAddCallback(item, XtNcallback, EditorFontSelect, (XtPointer)edit_text);
00384 item = XtCreateManagedWidget("9x15bold",
00385 smeBSBObjectClass,
00386 menu,
00387 NULL, 0);
00388 XtAddCallback(item, XtNcallback, EditorFontSelect, (XtPointer)edit_text);
00389 item = XtCreateManagedWidget("10x20",
00390 smeBSBObjectClass,
00391 menu,
00392 NULL, 0);
00393 XtAddCallback(item, XtNcallback, EditorFontSelect, (XtPointer)edit_text);
00394 item = XtCreateManagedWidget("12x24",
00395 smeBSBObjectClass,
00396 menu,
00397 NULL, 0);
00398 XtAddCallback(item, XtNcallback, EditorFontSelect, (XtPointer)edit_text);
00399
00400
00401
00402
00403
00404 XtSetArg(TheArgs[0], XtNfromHoriz, button);
00405 button = XtCreateManagedWidget("Help",
00406 menuButtonWidgetClass,
00407 edit_form,
00408 TheArgs, 1);
00409
00410 menu = XtCreatePopupShell("menu",
00411 simpleMenuWidgetClass,
00412 button,
00413 NULL, 0);
00414
00415 item = XtCreateManagedWidget("Key Bindings",
00416 smeBSBObjectClass,
00417 menu,
00418 NULL, 0);
00419 XtAddCallback(item, XtNcallback, EditorHelpSelect, (XtPointer)edit_text);
00420
00421 XtPopup(edit, XtGrabNone);
00422 }
00423
00424
00425
00426
00427
00428
00429
00430
00431
00432
00433
00434 void EditorSaveCallback(
00435 Widget w,
00436 XtPointer client_data,
00437 XtPointer call_data)
00438 {
00439 Widget popup, confirm;
00440
00441 popup = XtCreatePopupShell("popup",
00442 topLevelShellWidgetClass,
00443 toplevel,
00444 NULL, 0);
00445
00446 XtSetArg(TheArgs[0], XtNlabel, "This will overwrite\nthe old file!");
00447 XtSetArg(TheArgs[1], XtNicon, clips_logo);
00448 confirm = XtCreateManagedWidget("confirm",
00449 dialogWidgetClass,
00450 popup,
00451 TheArgs, 2);
00452 XawDialogAddButton(confirm, "Overwrite", EditorSave, client_data);
00453 XawDialogAddButton(confirm, "Cancel", CancelPopupSelect, (XtPointer)confirm);
00454
00455 XtPopup(popup, XtGrabNonexclusive);
00456 }
00457
00458
00459
00460
00461
00462
00463
00464
00465
00466
00467 void EditorSaveAsCallback(
00468 Widget w,
00469 XtPointer client_data,
00470 XtPointer call_data)
00471 {
00472 Widget popup, file_dialog;
00473
00474 file_item = SAVEAS;
00475
00476 popup = XtCreatePopupShell("popup",
00477 topLevelShellWidgetClass,
00478 toplevel,
00479 NULL, 0);
00480
00481 XtSetArg(TheArgs[0], XtNlabel, "Enter new file name:");
00482 XtSetArg(TheArgs[1], XtNvalue, "");
00483 XtSetArg(TheArgs[2], XtNicon, clips_logo);
00484 file_dialog = XtCreateManagedWidget("file_dialog",
00485 dialogWidgetClass,
00486 popup,
00487 TheArgs, 3);
00488 XawDialogAddButton(file_dialog, "Save", EditorSaveAs, client_data);
00489 XawDialogAddButton(file_dialog, "Cancel", CancelPopupSelect,
00490 (XtPointer)file_dialog);
00491
00492 XtPopup(popup, XtGrabNonexclusive);
00493 }
00494
00495
00496
00497
00498
00499
00500
00501
00502
00503
00504
00505 void EditorRevertCallback(
00506 Widget w,
00507 XtPointer client_data,
00508 XtPointer call_data)
00509 {
00510 Widget popup, confirm;
00511 String filename;
00512
00513 file_item = REVERT;
00514
00515 popup = XtCreatePopupShell("popup",
00516 topLevelShellWidgetClass,
00517 toplevel,
00518 NULL, 0);
00519
00520 XtSetArg(TheArgs[0], XtNstring, &filename);
00521 XtGetValues((Widget)client_data, TheArgs, 1);
00522 XtSetArg(TheArgs[0], XtNlabel, "You will loose\nall your changes!");
00523 XtSetArg(TheArgs[1], XtNicon, clips_logo);
00524 XtSetArg(TheArgs[2], XtNvalue, filename);
00525 XtSetArg(TheArgs[3], XtNeditType, XawtextRead);
00526 confirm = XtCreateManagedWidget("confirm", dialogWidgetClass, popup, TheArgs, 4);
00527 XawDialogAddButton(confirm, "Revert", EditorRevert, client_data);
00528 XawDialogAddButton(confirm, "Cancel", CancelPopupSelect, (XtPointer)confirm);
00529
00530 XtPopup(popup, XtGrabNonexclusive);
00531 }
00532
00533
00534
00535
00536
00537
00538
00539
00540
00541
00542
00543
00544 int FindSelection(
00545 void *theEnv,
00546 char *log_name)
00547 {
00548 if(strcmp("XeditSelection",log_name)== 0)
00549 return(TRUE);
00550 return(FALSE);
00551 }
00552
00553
00554
00555
00556
00557
00558
00559
00560 int SelectionGetc(
00561 void *theEnv,
00562 char *log_name)
00563 {
00564
00565 XawTextBlock text_return;
00566
00567 if(XawTextSourceRead(CurrentSource,CurrentPosition,&text_return,1) != EndPosition)
00568 {
00569 CurrentPosition++;
00570 return((int)text_return.ptr[0]);
00571 }
00572 else
00573 return(EOF);
00574 }
00575
00576
00577
00578
00579
00580
00581 int SelectionUngetc(
00582 void *theEnv,
00583 int c,
00584 char *log_name)
00585 {
00586 if (c == EOF )
00587 return(1);
00588 if(CurrentPosition > 0)
00589 CurrentPosition--;
00590 return(1);
00591 }
00592
00593
00594
00595
00596
00597
00598
00599
00600
00601
00602
00603 void EditorCompileSelectionCallback(
00604 Widget w,
00605 XtPointer client_data,
00606 XtPointer call_data)
00607 {
00608 void *theEnv = GetCurrentEnvironment();
00609
00610 CurrentSource = XawTextGetSource((Widget)client_data);
00611
00612 XawTextGetSelectionPos((Widget)client_data,&CurrentPosition,&EndPosition);
00613 if(CurrentPosition == EndPosition)
00614 return;
00615
00616 EndPosition++;
00617
00618
00619
00620 EnvAddRouter(theEnv,"xclipsSelection",90,FindSelection,NULL,SelectionGetc,SelectionUngetc,NULL);
00621
00622
00623
00624 LoadXFile("xclipsSelection","XeditSelection");
00625 EnvPrintRouter(theEnv,"wclips","CLIPS> ");
00626 quit_get_event = True;
00627 }
00628
00629
00630
00631
00632
00633
00634 int FileFind(
00635 void *theEnv,
00636 char *log_name)
00637 {
00638 if(strcmp("XeditBuffer",log_name)== 0)
00639 return(TRUE);
00640 return(FALSE);
00641 }
00642
00643
00644
00645
00646
00647
00648
00649 int FileGetc(
00650 void *theEnv,
00651 char *log_name)
00652 {
00653
00654 XawTextBlock text_return;
00655
00656 if(XawTextSourceRead(CurrentSource,CurrentPosition,&text_return,1) != CurrentPosition)
00657 {
00658 CurrentPosition++;
00659 return((int)text_return.ptr[0]);
00660 }
00661 else
00662 return(EOF);
00663 }
00664
00665
00666
00667
00668
00669
00670 int FileUngetc(
00671 void *theEnv,
00672 int c,
00673 char *log_name)
00674 {
00675 if (c == EOF )
00676 return(1);
00677 if(CurrentPosition > 0)
00678 CurrentPosition--;
00679 return(1);
00680 }
00681
00682
00683
00684
00685
00686
00687
00688
00689
00690
00691
00692 void EditorCompileFileCallback(
00693 Widget w,
00694 XtPointer client_data,
00695 XtPointer call_data)
00696 {
00697 void *theEnv = GetCurrentEnvironment();
00698 CurrentPosition = 0;
00699 CurrentSource = XawTextGetSource((Widget)client_data);
00700
00701
00702
00703 EnvAddRouter(theEnv,"xclipsFile",90,FileFind,NULL,FileGetc,FileUngetc,NULL);
00704
00705
00706 LoadXFile("xclipsFile","XeditBuffer");
00707 PrintCLIPS("wclips","CLIPS> ");
00708 quit_get_event = True;
00709 }
00710
00711
00712
00713
00714
00715
00716
00717
00718
00719 int LoadXFile(
00720 char *str1,
00721 char *str2)
00722 {
00723 void *theEnv = GetCurrentEnvironment();
00724
00725 EnvActivateRouter(theEnv,str1);
00726 SetPrintWhileLoading(theEnv,TRUE);
00727 LoadConstructsFromLogicalName(theEnv,str2);
00728 EnvDeactivateRouter(theEnv,str1);
00729 SetPrintWhileLoading(theEnv,FALSE);
00730 EnvDeleteRouter(theEnv,str1);
00731 return 0;
00732 }
00733
00734
00735
00736
00737
00738
00739
00740
00741
00742
00743
00744 void EditorBatchSelectionCb(
00745 Widget w,
00746 XtPointer client_data,
00747 XtPointer call_data)
00748 {
00749 XawTextBlock text_return;
00750
00751 if(BatchString != NULL)
00752 {
00753 free(BatchString);
00754 BatchString = NULL;
00755 }
00756 CurrentSource = XawTextGetSource((Widget)client_data);
00757 XawTextGetSelectionPos((Widget)client_data,&CurrentPosition,&EndPosition);
00758 XawTextSourceRead(CurrentSource,CurrentPosition,&text_return,EndPosition - CurrentPosition );
00759 BatchString = (char*)malloc((EndPosition - CurrentPosition) + 2);
00760 strncpy(BatchString,text_return.ptr,EndPosition - CurrentPosition);
00761 BatchString[EndPosition - CurrentPosition] = '\n';
00762 BatchString[(EndPosition + 1) - CurrentPosition] = 0;
00763 OpenStringBatch(GetCurrentEnvironment(),"editBatch",BatchString,False);
00764 quit_get_event = True;
00765 }
00766
00767
00768
00769
00770
00771
00772
00773
00774
00775 void EditorExitCallback(
00776 Widget w,
00777 XtPointer client_data,
00778 XtPointer call_data)
00779 {
00780 Widget popup, confirm;
00781
00782 popup = XtCreatePopupShell("popup",
00783 topLevelShellWidgetClass,
00784 toplevel,
00785 NULL, 0);
00786
00787 XtSetArg(TheArgs[0], XtNlabel, "Exit this editor!\nAre you sure?");
00788 XtSetArg(TheArgs[1], XtNicon, clips_logo);
00789 confirm = XtCreateManagedWidget("confirm",
00790 dialogWidgetClass,
00791 popup,
00792 TheArgs, 2);
00793 XawDialogAddButton(confirm, "Exit", ExitEditor,
00794 (XtPointer)(XtParent(XtParent((Widget)client_data))));
00795 XawDialogAddButton(confirm, "Cancel", CancelPopupSelect, (XtPointer)confirm);
00796
00797 if (XawAsciiSourceChanged(XawTextGetSource((Widget)client_data)))
00798 XawDialogAddButton(confirm, "Save First", EditorSaveFirst, client_data);
00799
00800 XtPopup(popup, XtGrabNonexclusive);
00801 }
00802
00803
00804
00805
00806
00807
00808
00809
00810
00811 void EditorCutCallback(
00812 Widget w,
00813 XtPointer client_data,
00814 XtPointer call_data)
00815 {
00816 DeleteCurrentSelection((Widget)client_data, &TheEvent);
00817 }
00818
00819
00820
00821
00822
00823
00824
00825
00826
00827 void EditorPasteCallback(
00828 Widget w,
00829 XtPointer client_data,
00830 XtPointer call_data)
00831 {
00832 Stuff((TextWidget) client_data, &TheEvent);
00833 }
00834
00835
00836
00837
00838
00839
00840
00841
00842
00843 void EditorSearchReplaceCallback(
00844 Widget w,
00845 XtPointer client_data,
00846 XtPointer call_data)
00847 {
00848 static String params[] = {"forward"};
00849 Cardinal num_params = 1;
00850
00851 _XawTextSearch((Widget)client_data, &TheEvent, params, &num_params);
00852 }
00853
00854
00855
00856
00857
00858
00859
00860
00861
00862
00863 void FindMatchingParenthesisCallback(
00864 Widget w,
00865 XtPointer client_data,
00866 XtPointer call_data)
00867 {
00868 XawTextBlock text_return;
00869 XawTextPosition length;
00870 Boolean Forward = True;
00871 Widget source = XawTextGetSource((Widget)client_data);
00872 XawTextPosition Pos = XawTextGetInsertionPoint((Widget)client_data);
00873
00874
00875
00876
00877
00878
00879
00880
00881 length = XawTextSourceRead (source,Pos,&text_return,1);
00882 if(text_return.length != 0)
00883 {
00884 if(text_return.ptr[0] == ')')
00885 Forward = False;
00886 else if (text_return.ptr[0] != '(')
00887 {
00888 XBell(XtDisplay(toplevel),100);
00889 return;
00890 }
00891 }
00892 else
00893 {
00894 XBell(XtDisplay(toplevel),100);
00895 return;
00896 }
00897
00898
00899
00900 if(Forward)
00901 {
00902 if( SearchForward(source,&text_return,length))
00903 XawTextSetSelection((Widget)client_data,Pos,text_return.firstPos + text_return.length);
00904 else
00905 {
00906 XBell(XtDisplay(toplevel),100);
00907 WarningWindow( "There is no\n matching parenthesis!");
00908 }
00909 }
00910
00911
00912
00913
00914
00915 else
00916 {
00917 if( SearchBackward(source,&text_return,length))
00918 XawTextSetSelection((Widget)client_data,text_return.firstPos, Pos + 1);
00919 else
00920 {
00921 XBell(XtDisplay(toplevel),100);
00922 WarningWindow("There is no\nmatching parenthesis!");
00923 }
00924 }
00925 }
00926
00927
00928
00929
00930
00931
00932
00933
00934
00935
00936
00937 int SearchForward(
00938 Widget source,
00939 XawTextBlock *text_return,
00940 XawTextPosition length)
00941 {
00942 XawTextPosition newPos = length;
00943 int count = 1;
00944
00945 while((newPos != text_return->firstPos) && (count))
00946 {
00947 newPos = XawTextSourceRead(source,newPos,text_return,1);
00948 if(newPos == text_return->firstPos)
00949 break;
00950 if( text_return->ptr[0] == '(')
00951 count++;
00952 else if( text_return->ptr[0] == ')')
00953 count--;
00954 }
00955 if(count)
00956 return(False);
00957 else
00958 return(True);
00959 }
00960
00961
00962
00963
00964
00965
00966 void WarningWindow(
00967 char *text)
00968 {
00969 Widget WarningShell,WarningDialog;
00970
00971 WarningShell = XtCreatePopupShell("Confirmation",
00972 topLevelShellWidgetClass,
00973 toplevel,
00974 NULL, 0);
00975 XtSetArg(TheArgs[0], XtNlabel, text);
00976 WarningDialog = XtCreateManagedWidget("confirm",
00977 dialogWidgetClass,
00978 WarningShell,
00979 TheArgs, 1);
00980 XawDialogAddButton( WarningDialog,"Okay",CancelPopupSelect,(XtPointer)WarningDialog);
00981 XtPopup(WarningShell, XtGrabNonexclusive);
00982
00983 }
00984
00985
00986
00987
00988
00989
00990
00991
00992
00993 int SearchBackward(
00994 Widget source,
00995 XawTextBlock *text_return,
00996 XawTextPosition length)
00997 {
00998 int count = 1;
00999 XawTextPosition NewPos = length - 2;
01000
01001 while((NewPos >= 0 ) && count)
01002 {
01003 NewPos = XawTextSourceRead(source,NewPos,text_return,1) - 2;
01004 if(text_return->ptr[0] == ')')
01005 count++;
01006 else if (text_return->ptr[0] == '(')
01007 count--;
01008 }
01009 if(count)
01010 return(False);
01011 else
01012 return(True);
01013 }
01014
01015
01016
01017
01018
01019
01020
01021
01022
01023
01024
01025 void EditorBeginingOfFileCallback(
01026 Widget w,
01027 XtPointer client_data,
01028 XtPointer call_data)
01029 {
01030 MoveBeginningOfFile((Widget)client_data, &TheEvent);
01031 }
01032
01033
01034
01035
01036
01037
01038
01039
01040
01041
01042
01043 void EditorEndOfFileCallback(
01044 Widget w,
01045 XtPointer client_data,
01046 XtPointer call_data)
01047 {
01048 MoveEndOfFile((Widget)client_data, &TheEvent);
01049 }
01050
01051
01052
01053
01054
01055
01056
01057
01058
01059 static void EditorFontSelect(
01060 Widget w,
01061 XtPointer client_data,
01062 XtPointer call_data)
01063 {
01064 Widget edit_text = (Widget)client_data;
01065 XFontStruct *font;
01066 Arg args[1];
01067
01068 if ((font = XLoadQueryFont(XtDisplay(edit_text), XtName(w))) != NULL)
01069 {
01070 XtSetArg(args[0], XtNfont, font);
01071 XtSetValues(edit_text, args, 1);
01072 }
01073 }
01074
01075
01076
01077
01078
01079
01080
01081
01082
01083 void EditorHelpSelect(
01084 Widget w,
01085 XtPointer client_data,
01086 XtPointer call_data)
01087 {
01088 Arg args[6];
01089 Widget help, help_form, help_list;
01090
01091 help = XtCreatePopupShell("help",
01092 topLevelShellWidgetClass,
01093 toplevel,
01094 NULL, 0);
01095
01096 XtSetArg(args[0], XtNdefaultDistance, 0);
01097 help_form = XtCreateManagedWidget("help_form",
01098 formWidgetClass,
01099 help,
01100 args, 1);
01101
01102 XtSetArg(args[0], XtNborderWidth, 0);
01103 XtSetArg(args[1], XtNdefaultColumns, 2);
01104 XtSetArg(args[2], XtNforceColumns, True);
01105 XtSetArg(args[3], XtNlist, bindings);
01106 XtSetArg(args[4], XtNallowHoriz, True);
01107 XtSetArg(args[5], XtNallowVert, True);
01108 help_list = XtCreateManagedWidget("menu",
01109 listWidgetClass,
01110 help_form,
01111 args, 6);
01112
01113 XtAddCallback(help_list, XtNcallback, CancelPopupSelect,
01114 (XtPointer)help_form);
01115
01116 XtPopup(help, XtGrabNone);
01117 }
01118
01119
01120
01121
01122
01123
01124
01125
01126
01127
01128 static void EditorSave(
01129 Widget w,
01130 XtPointer client_data,
01131 XtPointer call_data)
01132 {
01133 XawAsciiSave(XawTextGetSource((Widget)client_data));
01134 XtDestroyWidget(XtParent(XtParent(w)));
01135 }
01136
01137
01138
01139
01140
01141
01142
01143
01144
01145
01146 void EditorSaveAs(
01147 Widget w,
01148 XtPointer client_data,
01149 XtPointer call_data)
01150 {
01151 Arg args[1];
01152 String filename = XawDialogGetValueString(XtParent(w));
01153 Widget edit_text = XawTextGetSource((Widget)client_data);
01154
01155 if (XawAsciiSaveAsFile(edit_text, filename))
01156 {
01157 XtSetArg(args[0], XtNstring, filename);
01158 XtSetValues(edit_text, args, 1);
01159 }
01160
01161 XtDestroyWidget(XtParent(XtParent(w)));
01162 }
01163
01164
01165
01166
01167
01168
01169
01170
01171
01172 void EditorRevert(
01173 Widget w,
01174 XtPointer client_data,
01175 XtPointer call_data)
01176 {
01177 Arg args[1];
01178 String filename = XawDialogGetValueString(XtParent(w));
01179
01180 if (access(filename, 00) == 0)
01181 {
01182 XtSetArg(args[0], XtNstring, filename);
01183 XtSetValues((Widget)client_data, args, 1);
01184 }
01185
01186 XtDestroyWidget(XtParent(XtParent(w)));
01187 }
01188
01189
01190
01191
01192
01193
01194
01195
01196
01197 static void ExitEditor(
01198 Widget w,
01199 XtPointer client_data,
01200 XtPointer call_data)
01201 {
01202 if(BatchString != NULL)
01203 {
01204 free(BatchString);
01205 BatchString = NULL;
01206 }
01207 XtDestroyWidget(XtParent(XtParent(w)));
01208 XtDestroyWidget(XtParent((Widget)client_data));
01209 }
01210
01211
01212
01213
01214
01215
01216
01217
01218
01219 static void EditorSaveFirst(
01220 Widget w,
01221 XtPointer client_data,
01222 XtPointer call_data)
01223 {
01224 XawAsciiSave(XawTextGetSource((Widget)client_data));
01225
01226 XtDestroyWidget(XtParent(XtParent(w)));
01227 XtDestroyWidget(XtParent(XtParent(XtParent((Widget)client_data))));
01228 }
01229