2 * CDE - Common Desktop Environment
4 * Copyright (c) 1993-2012, The Open Group. All rights reserved.
6 * These libraries and programs are free software; you can
7 * redistribute them and/or modify them under the terms of the GNU
8 * Lesser General Public License as published by the Free Software
9 * Foundation; either version 2 of the License, or (at your option)
12 * These libraries and programs are distributed in the hope that
13 * they will be useful, but WITHOUT ANY WARRANTY; without even the
14 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15 * PURPOSE. See the GNU Lesser General Public License for more
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with these libraries and programs; if not, write
20 * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
21 * Floor, Boston, MA 02110-1301 USA
23 /* $TOG: dtpad.c /main/14 1999/09/15 15:15:02 mgreess $ */
24 /**********************************<+>*************************************
25 ***************************************************************************
29 ** Project: DT dtpad, a memo maker type editor based on the Dt Editor
35 ** This file contains routines that create the dtpad menu bar widget
36 ** and the Dt Editor widget.
38 *******************************************************************
39 ** (c) Copyright Hewlett-Packard Company, 1990, 1991, 1992, 1993.
41 ** reserved. Copying or other reproduction of this program
42 ** except for archival purposes is prohibited without prior
43 ** written consent of Hewlett-Packard Company.
44 ********************************************************************
46 ********************************************************************
47 ** (c) Copyright 1993, 1994 Hewlett-Packard Company
48 ** (c) Copyright 1993, 1994 International Business Machines Corp.
49 ** (c) Copyright 1993, 1994 Sun Microsystems, Inc.
50 ** (c) Copyright 1993, 1994 Novell, Inc.
51 ********************************************************************
54 **************************************************************************
55 **********************************<+>*************************************/
58 #include "X11/Xutil.h"
59 #include <X11/StringDefs.h>
61 #ifndef NO_MESSAGE_CATALOG
64 # include <nl_types.h>
67 extern Editor *pPadList; /* declared in main.c */
68 extern int numActivePads; /* declared in main.c */
69 extern Widget topLevelWithWmCommand; /* declared in main.c */
72 /************************************************************************
73 * CreateDefaultImage - create a default image for the warning symbol.
75 ************************************************************************/
83 XImage *image; /* image for warning pixmap */
85 image = (XImage *) XtMalloc (sizeof (XImage));
87 image->height = height;
91 image->format = XYBitmap;
92 image->byte_order = LSBFirst;
93 image->bitmap_unit = 8;
94 image->bitmap_bit_order = LSBFirst;
95 image->bitmap_pad = 8;
96 image->bytes_per_line = (width+7)/8;
97 XmInstallImage (image, name);
102 * The following functions are multibyte-aware string handling routines,
103 * including MbStrchr, MbStrrchr, and MbBasename. These routines are
104 * used as substitutes for the single-byte-only strchr and strrchr routines.
107 * [SuG 5/12/95] Added MbStrchri which does exactly MbStrchr, but also returns
111 /************************************************************************
113 ************************************************************************/
119 size_t mbCurMax = MB_CUR_MAX;
120 wchar_t targetChar, curChar;
122 int i, numBytes, byteLen;
124 if(mbCurMax <= 1) return strchr(str, ch);
127 mbtowc(&targetChar, &tmpChar, mbCurMax);
128 for(i = 0, numBytes = 0, byteLen = strlen(str); i < byteLen; i += numBytes)
130 numBytes = mbtowc(&curChar, &str[i], mbCurMax);
131 if(curChar == targetChar) return &str[i];
136 /************************************************************************
138 ************************************************************************/
144 size_t mbCurMax = MB_CUR_MAX;
145 wchar_t targetChar, curChar;
147 int i, j, numBytes, byteLen;
149 /*if(mbCurMax <= 1) return strchr(str, ch);*/
152 mbtowc(&targetChar, &tmpChar, mbCurMax);
153 for(i = 0, j = 0, numBytes = 0, byteLen = strlen(str); i < byteLen;
156 numBytes = mbtowc(&curChar, &str[i], mbCurMax);
157 if(curChar == targetChar) {
166 /************************************************************************
168 ************************************************************************/
174 size_t mbCurMax = MB_CUR_MAX;
175 wchar_t targetChar, curChar;
176 char tmpChar, *lastChar;
177 int i, numBytes, byteLen;
179 if(mbCurMax <= 1) return strrchr(str, ch);
182 mbtowc(&targetChar, &tmpChar, mbCurMax);
183 for(i = 0, numBytes = 0, lastChar = (char *)NULL, byteLen = strlen(str);
184 i < byteLen; i += numBytes)
186 numBytes = mbtowc(&curChar, &str[i], mbCurMax);
187 if(curChar == targetChar) lastChar = &str[i];
194 /************************************************************************
196 ************************************************************************/
203 lastSlash = MbStrrchr(str, '/');
205 if(lastSlash != (char *)NULL)
206 return lastSlash + 1;
212 /************************************************************************
213 * ChangeMainWindowTitle - If necessary, put file name in window title
214 ************************************************************************/
216 ChangeMainWindowTitle(
222 Boolean freeName = False;
223 XTextProperty textProp;
225 /* Should happen only when creating a new view */
226 if (!XtIsRealized(pPad->app_shell))
229 if (pPad->ttEditReq.contract &&
230 (pPad->ttEditReq.docName && *pPad->ttEditReq.docName)) {
231 name = pPad->ttEditReq.docName;
232 } else if (pPad->fileStuff.fileName && *pPad->fileStuff.fileName) {
233 name = MbBasename(pPad->fileStuff.fileName);
235 name = strdup(UNNAMED_TITLE);
238 title = (char *)XtMalloc(strlen(DialogTitle(pPad)) + strlen(name) + 1);
239 sprintf(title, "%s%s", DialogTitle(pPad), name);
241 XmbTextListToTextProperty(pPad->display, &name, 1, XStdICCTextStyle,
243 XSetWMIconName(pPad->display, XtWindow(pPad->app_shell), &textProp);
244 XFree(textProp.value);
246 XtSetArg(al[0], XmNtitle, title);
247 XtSetArg(al[1], XmNtitleEncoding, None);
248 XtSetValues(pPad->app_shell, al, 2);
256 /************************************************************************
257 * SetSaveAsLabelAndDialog - set the File menu [Save As] button label and
258 * mnemonic, and the SaveAs dialog title based on whether or not the
259 * file name can change.
260 ************************************************************************/
262 SetSaveAsLabelAndDialog(
271 if (pPad->fileStuff.fileWidgets.saveAsBtn) {
272 if (pPad->xrdb.nameChange) {
273 mnemonic = strdup(((char *)GETMESSAGE(11, 25, "A")));
274 tmpStr = XmStringCreateLocalized(((char *)GETMESSAGE(11, 26, "Save As...")));
276 mnemonic = strdup(((char *)GETMESSAGE(11, 109, "F")));
277 tmpStr = XmStringCreateLocalized(((char *)GETMESSAGE(11, 110, "Copy To File...")));
280 XtSetArg(al[ac], XmNlabelString, tmpStr); ac++;
281 XtSetArg(al[ac], XmNmnemonic, mnemonic[0]); ac++;
282 XtSetValues(pPad->fileStuff.fileWidgets.saveAsBtn, al, ac);
284 XmStringFree(tmpStr);
287 if (pPad->fileStuff.fileWidgets.saveAs.saveAs_form) {
288 strcpy(buf, DialogTitle(pPad));
289 if (pPad->xrdb.nameChange) {
290 strcat(buf, (char *)GETMESSAGE(5, 7, "Save As"));
292 strcat(buf, (char *)GETMESSAGE(5, 43, "Copy To File"));
294 tmpStr = XmStringCreateLocalized(buf);
295 XtSetArg(al[0], XmNdialogTitle, tmpStr);
296 XtSetValues(pPad->fileStuff.fileWidgets.saveAs.saveAs_form, al, 1);
297 XmStringFree(tmpStr);
304 /************************************************************************
305 * CreateHelpMenu - Create the Help pulldown menu
318 ************************************************************************/
323 Widget help_pane, cascade, WidgList[12];
329 /* -----> create "Help" PulldownMenu */
331 help_pane = XmCreatePulldownMenu (pPad->menu_bar, "helpMenu", al, ac);
332 XtAddCallback(help_pane, XmNhelpCallback,
333 (XtCallbackProc)HelpHelpCB, pPad);
334 mnemonic = strdup(((char *)GETMESSAGE(11, 81, "H")));
335 tmpStr = XmStringCreateLocalized(((char *)GETMESSAGE(11, 82, "Help")));
337 XtSetArg (al[ac], XmNsubMenuId, help_pane); ac++;
338 XtSetArg(al[ac], XmNlabelString, tmpStr); ac++;
339 XtSetArg(al[ac], XmNmnemonic, mnemonic[0]); ac++;
340 cascade = XmCreateCascadeButtonGadget(pPad->menu_bar, "Help", al, ac);
341 XtAddCallback(cascade, XmNhelpCallback,(XtCallbackProc)HelpHelpCB, pPad);
342 XtManageChild(cascade);
344 XmStringFree(tmpStr);
347 XtSetArg(al[ac], XmNmenuHelpWidget, cascade); ac++;
348 XtSetValues (pPad->menu_bar, al, ac);
350 /* -----> create "Overview" push button */
351 mnemonic = strdup(((char *)GETMESSAGE(11, 83, "v")));
352 tmpStr = XmStringCreateLocalized(((char *)GETMESSAGE(11, 84, "Overview")));
354 XtSetArg(al[ac], XmNlabelString, tmpStr); ac++;
355 XtSetArg(al[ac], XmNmnemonic, mnemonic[0]); ac++;
356 WidgList[count++]= XmCreatePushButtonGadget(help_pane, "overview", al, ac );
357 XtAddCallback (WidgList[count-1], XmNactivateCallback,
358 (XtCallbackProc)HelpOverviewCB, (XtPointer) pPad);
360 XmStringFree(tmpStr);
362 /* -----> craete Separator */
364 WidgList[count++] = XmCreateSeparatorGadget (help_pane, "sep1", al, ac);
366 /* -----> create "Tasks" push button */
367 mnemonic = strdup(((char *)GETMESSAGE(11, 85, "T")));
368 tmpStr = XmStringCreateLocalized(((char *)GETMESSAGE(11, 86, "Tasks")));
370 XtSetArg(al[ac], XmNlabelString, tmpStr); ac++;
371 XtSetArg(al[ac], XmNmnemonic, mnemonic[0]); ac++;
372 WidgList[count++]= XmCreatePushButtonGadget(help_pane, "tasks", al, ac );
373 XtAddCallback (WidgList[count-1], XmNactivateCallback,
374 (XtCallbackProc)HelpTasksCB, (XtPointer) pPad);
376 XmStringFree(tmpStr);
378 /* -----> create "Table of Contents" push button */
379 mnemonic = strdup(((char *)GETMESSAGE(11, 87, "C")));
380 tmpStr = XmStringCreateLocalized(((char *)GETMESSAGE(11, 88, "Table of Contents")));
382 XtSetArg(al[ac], XmNlabelString, tmpStr); ac++;
383 XtSetArg(al[ac], XmNmnemonic, mnemonic[0]); ac++;
384 WidgList[count++]= XmCreatePushButtonGadget(help_pane, "TOC", al, ac );
385 XtAddCallback (WidgList[count-1], XmNactivateCallback,
386 (XtCallbackProc)HelpTOCCB, (XtPointer) pPad);
388 XmStringFree(tmpStr);
390 /* -----> create "Reference" push button */
391 mnemonic = strdup(((char *)GETMESSAGE(11, 89, "R")));
392 tmpStr = XmStringCreateLocalized(((char *)GETMESSAGE(11, 90, "Reference")));
394 XtSetArg(al[ac], XmNlabelString, tmpStr); ac++;
395 XtSetArg(al[ac], XmNmnemonic, mnemonic[0]); ac++;
396 WidgList[count++]= XmCreatePushButtonGadget(help_pane, "reference", al, ac );
397 XtAddCallback (WidgList[count-1], XmNactivateCallback,
398 (XtCallbackProc)HelpReferenceCB, (XtPointer) pPad);
400 XmStringFree(tmpStr);
402 /* -----> create "On Item" push button */
403 mnemonic = strdup(((char *)GETMESSAGE(11, 91, "O")));
404 tmpStr = XmStringCreateLocalized(((char *)GETMESSAGE(11, 92, "On Item")));
406 XtSetArg(al[ac], XmNlabelString, tmpStr); ac++;
407 XtSetArg(al[ac], XmNmnemonic, mnemonic[0]); ac++;
408 WidgList[count++]= XmCreatePushButtonGadget(help_pane, "onItem", al, ac );
409 XtAddCallback (WidgList[count-1], XmNactivateCallback,
410 (XtCallbackProc)HelpOnItemCB, (XtPointer) pPad);
412 XmStringFree(tmpStr);
414 /* -----> create Separator*/
416 WidgList[count++] = XmCreateSeparatorGadget (help_pane, "sep2", al, ac);
418 /* -----> create "Using Help" push button */
419 mnemonic = strdup(((char *)GETMESSAGE(11, 93, "U")));
420 tmpStr = XmStringCreateLocalized(((char *)GETMESSAGE(11, 94, "Using Help")));
422 XtSetArg(al[ac], XmNlabelString, tmpStr); ac++;
423 XtSetArg(al[ac], XmNmnemonic, mnemonic[0]); ac++;
424 WidgList[count++]= XmCreatePushButtonGadget(help_pane, "usingHelp", al, ac );
425 XtAddCallback (WidgList[count-1], XmNactivateCallback,
426 (XtCallbackProc)HelpUsingHelpCB, (XtPointer) pPad);
428 XmStringFree(tmpStr);
430 /* -----> create Separator */
432 WidgList[count++] = XmCreateSeparatorGadget (help_pane, "sep3", al, ac);
434 /* -----> create "About Text Editor" push button */
435 mnemonic = strdup(((char *)GETMESSAGE(11, 95, "A")));
436 tmpStr = XmStringCreateLocalized(((char *)GETMESSAGE(11, 96, "About Text Editor")));
438 XtSetArg(al[ac], XmNlabelString, tmpStr); ac++;
439 XtSetArg(al[ac], XmNmnemonic, mnemonic[0]); ac++;
440 WidgList[count++]= XmCreatePushButtonGadget(help_pane, "about", al, ac );
441 XtAddCallback (WidgList[count-1], XmNactivateCallback,
442 (XtCallbackProc)HelpAboutCB, (XtPointer) pPad);
444 XmStringFree(tmpStr);
446 XtManageChildren(WidgList, count);
450 /************************************************************************
451 * CreateFileMenu - Create the "File" pulldown menu
457 * Save or [Save (needed)]
463 ************************************************************************/
468 Widget file_pane, cascade, WidgList[12];
473 FileWidgets *pWidg = &pPad->fileStuff.fileWidgets;
475 /* -----> create "File" PulldownMenu */
477 file_pane = XmCreatePulldownMenu (pPad->menu_bar, "fileMenu", al, ac);
478 XtAddCallback(file_pane, XmNhelpCallback,
479 (XtCallbackProc)HelpFileCB, pPad);
480 mnemonic = strdup(((char *)GETMESSAGE(11, 15, "F")));
481 tmpStr = XmStringCreateLocalized(((char *)GETMESSAGE(11, 16, "File")));
483 XtSetArg (al[ac], XmNsubMenuId, file_pane); ac++;
484 XtSetArg(al[ac], XmNlabelString, tmpStr); ac++;
485 XtSetArg(al[ac], XmNmnemonic, mnemonic[0]); ac++;
486 cascade = XmCreateCascadeButtonGadget (pPad->menu_bar, "File", al, ac);
487 XtAddCallback (cascade, XmNcascadingCallback,
488 (XtCallbackProc)FileCascadingCB, (XtPointer) pPad);
489 XtAddCallback(cascade, XmNhelpCallback, (XtCallbackProc)HelpFileCB, pPad);
490 XtManageChild (cascade);
492 XmStringFree(tmpStr);
494 /* -----> create "New" push button */
495 mnemonic = strdup(((char *)GETMESSAGE(11, 17, "N")));
496 tmpStr = XmStringCreateLocalized(((char *)GETMESSAGE(11, 18, "New")));
498 XtSetArg(al[ac], XmNlabelString, tmpStr); ac++;
499 XtSetArg(al[ac], XmNmnemonic, mnemonic[0]); ac++;
500 WidgList[count++] = XmCreatePushButtonGadget (file_pane, "new", al, ac);
501 pWidg->newBtn = WidgList[count-1];
502 XtAddCallback (WidgList[count-1], XmNactivateCallback,
503 (XtCallbackProc)FileNewCB, (XtPointer) pPad);
505 XmStringFree(tmpStr);
507 /* -----> create "Open..." push button */
508 mnemonic = strdup(((char *)GETMESSAGE(11, 19, "O")));
509 tmpStr=XmStringCreateLocalized(((char *)GETMESSAGE(11, 20, "Open...")));
511 XtSetArg(al[ac], XmNlabelString, tmpStr); ac++;
512 XtSetArg(al[ac], XmNmnemonic, mnemonic[0]); ac++;
513 WidgList[count++] = XmCreatePushButtonGadget (file_pane, "open", al, ac);
514 pWidg->openBtn = WidgList[count - 1];
515 XtAddCallback (WidgList[count-1], XmNactivateCallback,
516 (XtCallbackProc) FileOpenCB, (XtPointer) pPad);
518 XmStringFree(tmpStr);
520 /* -----> create "Include..." push button */
521 mnemonic = strdup(((char *)GETMESSAGE(11, 21, "I")));
522 tmpStr = XmStringCreateLocalized(((char *)GETMESSAGE(11, 22, "Include...")));
524 XtSetArg(al[ac], XmNlabelString, tmpStr); ac++;
525 XtSetArg(al[ac], XmNmnemonic, mnemonic[0]); ac++;
526 WidgList[count++] = XmCreatePushButtonGadget (file_pane, "include", al, ac);
527 pWidg->includeBtn = WidgList[count - 1];
528 XtAddCallback (WidgList[count-1], XmNactivateCallback,
529 (XtCallbackProc) FileIncludeCB, (XtPointer) pPad);
531 XmStringFree(tmpStr);
533 /* -----> create save/print separator */
535 WidgList[count++] = XmCreateSeparatorGadget (file_pane, "SvSp", al, ac);
537 /* -----> create "Save" push button */
538 mnemonic = strdup(((char *)GETMESSAGE(11, 23, "S")));
539 /* Note: The "Save" label is set in FileCascadingCB() when the File menu
540 * is displayed based on whether or not there are unsaved changes */
541 pPad->fileStuff.saveBtnLabel =
542 XmStringCreateLocalized(((char *)GETMESSAGE(11, 24, "Save")));
543 pPad->fileStuff.saveNeededBtnLabel =
544 XmStringCreateLocalized(((char *)GETMESSAGE(11, 73, "Save (needed)")));
546 XtSetArg(al[ac], XmNmnemonic, mnemonic[0]); ac++;
547 WidgList[count++] = XmCreatePushButtonGadget (file_pane, "save", al, ac);
548 pWidg->saveBtn = WidgList[count - 1];
549 XtAddCallback (WidgList[count-1], XmNactivateCallback,
550 (XtCallbackProc) FileSaveCB, (XtPointer) pPad);
553 /* -----> create "Save As..." push button
554 * (its label/mnemonic are set later in SetSaveAsLabelAndDialog()
555 * based on xrdb.nameChange) */
557 WidgList[count++] = XmCreatePushButtonGadget (file_pane, "saveAs", al, ac);
558 pWidg->saveAsBtn = WidgList[count - 1];
559 XtAddCallback (WidgList[count-1], XmNactivateCallback,
560 (XtCallbackProc) FileSaveAsCB, (XtPointer) pPad);
562 /* -----> create "Print..." push button */
563 mnemonic = strdup(((char *)GETMESSAGE(11, 27, "P")));
564 tmpStr = XmStringCreateLocalized(((char *)GETMESSAGE(11, 28, "Print...")));
566 XtSetArg(al[ac], XmNlabelString, tmpStr); ac++;
567 XtSetArg(al[ac], XmNmnemonic, mnemonic[0]); ac++;
568 WidgList[count++] = XmCreatePushButtonGadget (file_pane, "print", al, ac);
569 pWidg->printBtn = WidgList[count - 1];
570 XtAddCallback (WidgList[count-1], XmNactivateCallback,
571 (XtCallbackProc) FileXpPrintCB, (XtPointer) pPad);
573 XmStringFree(tmpStr);
575 /* -----> create close/exit separator */
577 WidgList[count++] = XmCreateSeparatorGadget (file_pane, "ExSp", al, ac);
579 /* -----> create "Close" (Exit) push button */
580 mnemonic = strdup(((char *)GETMESSAGE(11, 29, "C")));
581 tmpStr = XmStringCreateLocalized(((char *)GETMESSAGE(11, 30, "Close")));
583 XtSetArg(al[ac], XmNlabelString, tmpStr); ac++;
584 XtSetArg(al[ac], XmNmnemonic, mnemonic[0]); ac++;
585 WidgList[count++] = XmCreatePushButtonGadget (file_pane, "close", al, ac);
586 pPad->ExitWid = WidgList[count-1];
587 pWidg->exitBtn = WidgList[count - 1];
588 XtAddCallback (WidgList[count-1], XmNactivateCallback,
589 (XtCallbackProc) FileExitCB, (XtPointer) pPad);
591 XmStringFree(tmpStr);
593 /* -----> manage the all "File" menu buttons */
594 XtManageChildren(WidgList, count);
598 /************************************************************************
599 * CreateEditMenu - Create the "Edit" pulldown menu
613 ************************************************************************/
618 Widget edit_pane, cascade, WidgList[12];
623 EditWidgets *pWidg = &pPad->editStuff.widgets;
625 /* -----> create "Edit" PulldownMenu */
627 edit_pane = XmCreatePulldownMenu (pPad->menu_bar, "editMenu", al, ac);
628 XtAddCallback(edit_pane, XmNhelpCallback,
629 (XtCallbackProc)HelpEditCB, pPad);
630 mnemonic = strdup(((char *)GETMESSAGE(11, 31, "E")));
631 tmpStr = XmStringCreateLocalized(((char *)GETMESSAGE(11, 32, "Edit")));
633 XtSetArg(al[ac], XmNsubMenuId, edit_pane); ac++;
634 XtSetArg(al[ac], XmNlabelString, tmpStr); ac++;
635 XtSetArg(al[ac], XmNmnemonic, mnemonic[0]); ac++;
636 cascade= XmCreateCascadeButtonGadget(pPad->menu_bar, "Edit", al, ac);
637 XtAddCallback(cascade, XmNhelpCallback,(XtCallbackProc)HelpEditCB, pPad);
638 XtManageChild(cascade);
640 XmStringFree(tmpStr);
642 /* -----> create "Undo" push button */
643 mnemonic = strdup(((char *)GETMESSAGE(11, 33, "U")));
644 tmpStr = XmStringCreateLocalized(((char *)GETMESSAGE(11, 34, "Undo")));
646 XtSetArg(al[ac], XmNlabelString, tmpStr); ac++;
647 XtSetArg(al[ac], XmNmnemonic, mnemonic[0]); ac++;
648 WidgList[count++] = XmCreatePushButtonGadget(edit_pane, "undo", al, ac);
649 pWidg->undoBtn = WidgList[count - 1];
650 XtAddCallback(WidgList[count-1], XmNactivateCallback,
651 (XtCallbackProc) EditUndoCB, (XtPointer) pPad);
653 XmStringFree(tmpStr);
655 /* -----> create undo separator */
657 WidgList[count++] = XmCreateSeparatorGadget(edit_pane, "CtSp", al, ac);
659 /* -----> create "Cut" push button */
660 mnemonic = strdup(((char *)GETMESSAGE(11, 35, "t")));
661 tmpStr = XmStringCreateLocalized(((char *)GETMESSAGE(11, 36, "Cut")));
663 XtSetArg(al[ac], XmNlabelString, tmpStr); ac++;
664 XtSetArg(al[ac], XmNmnemonic, mnemonic[0]); ac++;
665 WidgList[count++] = XmCreatePushButtonGadget(edit_pane, "cut", al, ac);
666 pWidg->cutBtn = WidgList[count - 1];
667 XtAddCallback(WidgList[count-1], XmNactivateCallback,
668 (XtCallbackProc) EditCutCB, (XtPointer) pPad);
670 XmStringFree(tmpStr);
672 /* -----> create "Copy" push button */
673 mnemonic = strdup(((char *)GETMESSAGE(11, 37, "C")));
674 tmpStr = XmStringCreateLocalized(((char *)GETMESSAGE(11, 38, "Copy")));
676 XtSetArg(al[ac], XmNlabelString, tmpStr); ac++;
677 XtSetArg(al[ac], XmNmnemonic, mnemonic[0]); ac++;
678 WidgList[count++] = XmCreatePushButtonGadget(edit_pane, "copy", al, ac);
679 pWidg->copyBtn = WidgList[count - 1];
680 XtAddCallback(WidgList[count-1], XmNactivateCallback,
681 (XtCallbackProc) EditCopyCB, (XtPointer) pPad);
683 XmStringFree(tmpStr);
685 /* -----> create "Paste" push button */
686 mnemonic = strdup(((char *)GETMESSAGE(11, 39, "P")));
687 tmpStr = XmStringCreateLocalized(((char *)GETMESSAGE(11, 40, "Paste")));
689 XtSetArg(al[ac], XmNlabelString, tmpStr); ac++;
690 XtSetArg(al[ac], XmNmnemonic, mnemonic[0]); ac++;
691 WidgList[count++] = XmCreatePushButtonGadget(edit_pane, "paste", al, ac);
692 pWidg->pasteBtn = WidgList[count - 1];
693 XtAddCallback(WidgList[count-1], XmNactivateCallback,
694 (XtCallbackProc) EditPasteCB, (XtPointer) pPad);
696 XmStringFree(tmpStr);
698 /* -----> create "Clear" push button */
699 mnemonic = strdup(((char *)GETMESSAGE(11, 41, "e")));
700 tmpStr = XmStringCreateLocalized(((char *)GETMESSAGE(11, 42, "Clear")));
702 XtSetArg(al[ac], XmNlabelString, tmpStr); ac++;
703 XtSetArg(al[ac], XmNmnemonic, mnemonic[0]); ac++;
704 WidgList[count++] = XmCreatePushButtonGadget(edit_pane, "clear", al, ac);
705 pWidg->clearBtn = WidgList[count - 1];
706 XtAddCallback(WidgList[count-1], XmNactivateCallback,
707 (XtCallbackProc) EditClearCB, (XtPointer) pPad);
709 XmStringFree(tmpStr);
711 /* -----> create "Delete" push button */
712 mnemonic = strdup(((char *)GETMESSAGE(11, 43, "D")));
713 tmpStr = XmStringCreateLocalized(((char *)GETMESSAGE(11, 44,"Delete")));
715 XtSetArg(al[ac], XmNlabelString, tmpStr); ac++;
716 XtSetArg(al[ac], XmNmnemonic, mnemonic[0]); ac++;
717 WidgList[count++] = XmCreatePushButtonGadget (edit_pane, "delete", al, ac);
718 pWidg->deleteBtn = WidgList[count - 1];
719 XtAddCallback(WidgList[count-1], XmNactivateCallback,
720 (XtCallbackProc) EditDeleteCB, (XtPointer) pPad);
722 XmStringFree(tmpStr);
724 /* -----> XXX - create "Select All" push button */
725 mnemonic = strdup(((char *)GETMESSAGE(11, 101, "S")));
726 tmpStr = XmStringCreateLocalized(((char *)GETMESSAGE(11, 102, "Select All")));
728 XtSetArg(al[ac], XmNlabelString, tmpStr); ac++;
729 XtSetArg(al[ac], XmNmnemonic, mnemonic[0]); ac++;
730 WidgList[count++] = XmCreatePushButtonGadget(edit_pane, "selectAll", al, ac);
731 pWidg->selectAllBtn = WidgList[count - 1];
732 XtAddCallback(WidgList[count-1], XmNactivateCallback,
733 (XtCallbackProc) SelectAllCB, (XtPointer) pPad);
735 XmStringFree(tmpStr);
737 /* -----> create find/change separator */
739 WidgList[count++] = XmCreateSeparatorGadget (edit_pane, "FSSp", al, ac);
741 /* -----> create "Find/Change" push button */
742 mnemonic = strdup(((char *)GETMESSAGE(11, 103, "F")));
743 tmpStr =XmStringCreateLocalized(((char *)GETMESSAGE(11, 104,"Find/Change...")));
745 XtSetArg(al[ac], XmNlabelString, tmpStr); ac++;
746 XtSetArg(al[ac], XmNmnemonic, mnemonic[0]); ac++;
748 XmCreatePushButtonGadget(edit_pane, "findChange", al, ac);
749 pWidg->findChangeBtn = WidgList[count - 1];
750 XtAddCallback(WidgList[count-1], XmNactivateCallback,
751 (XtCallbackProc) FindChangeCB, (XtPointer) pPad);
753 XmStringFree(tmpStr);
755 /* -----> create "Check Spelling" push button */
756 mnemonic = strdup(((char *)GETMESSAGE(11, 105, "k")));
757 tmpStr = XmStringCreateLocalized(((char *)GETMESSAGE(11, 106, "Check Spelling...")));
759 XtSetArg(al[ac], XmNlabelString, tmpStr); ac++;
760 XtSetArg(al[ac], XmNmnemonic, mnemonic[0]); ac++;
761 WidgList[count++] = XmCreatePushButtonGadget(edit_pane, "checkSpelling",
763 pWidg->checkSpellingBtn = WidgList[count - 1];
764 XtAddCallback(WidgList[count-1], XmNactivateCallback,
765 (XtCallbackProc) CheckSpellingCB, (XtPointer) pPad);
767 XmStringFree(tmpStr);
769 /* -----> manage all the "Edit" menu buttons */
770 XtManageChildren(WidgList, count);
774 /************************************************************************
775 * CreateFormatMenu - Create the "Format" pulldown menu
781 ************************************************************************/
786 Widget format_pane, cascade, WidgList[12];
792 /* -----> create "Format" PulldownMenu */
794 format_pane = XmCreatePulldownMenu (pPad->menu_bar, "formatMenu", al, ac);
795 XtAddCallback(format_pane, XmNhelpCallback,
796 (XtCallbackProc)HelpFormatCB, pPad);
797 mnemonic = strdup(((char *)GETMESSAGE(11, 51, "r")));
798 tmpStr = XmStringCreateLocalized(((char *)GETMESSAGE(11, 52, "Format")));
800 XtSetArg (al[ac], XmNsubMenuId, format_pane); ac++;
801 XtSetArg(al[ac], XmNlabelString, tmpStr); ac++;
802 XtSetArg(al[ac], XmNmnemonic, mnemonic[0]); ac++;
803 cascade= XmCreateCascadeButtonGadget (pPad->menu_bar, "format", al, ac);
804 XtAddCallback(cascade, XmNhelpCallback,(XtCallbackProc)HelpFormatCB, pPad);
805 pPad->formatStuff.widgets.formatBtn = cascade;
806 XtManageChild (cascade);
808 XmStringFree(tmpStr);
810 /* -----> create "Settings..." button */
811 mnemonic = strdup(((char *)GETMESSAGE(11, 53, "S")));
812 tmpStr = XmStringCreateLocalized(((char *)GETMESSAGE(11, 54, "Settings...")));
814 XtSetArg(al[ac], XmNlabelString, tmpStr); ac++;
815 XtSetArg(al[ac], XmNmnemonic, mnemonic[0]); ac++;
817 XmCreatePushButtonGadget (format_pane, "settings", al, ac);
818 XtAddCallback (WidgList[count-1], XmNactivateCallback,
819 (XtCallbackProc) FormatCB, (XtPointer) pPad);
821 XmStringFree(tmpStr);
823 /* -----> create "Paragraph" button */
824 mnemonic = strdup(((char *)GETMESSAGE(11, 55, "P")));
825 tmpStr = XmStringCreateLocalized(((char *)GETMESSAGE(11, 56, "Paragraph")));
827 XtSetArg(al[ac], XmNlabelString, tmpStr); ac++;
828 XtSetArg(al[ac], XmNmnemonic, mnemonic[0]); ac++;
830 XmCreatePushButtonGadget (format_pane, "paragraph", al, ac);
831 XtAddCallback (WidgList[count-1], XmNactivateCallback,
832 (XtCallbackProc) FormatParaCB, (XtPointer) pPad);
834 XmStringFree(tmpStr);
836 /* -----> create "All" button */
837 mnemonic = strdup(((char *)GETMESSAGE(11, 57, "l")));
838 tmpStr = XmStringCreateLocalized(((char *)GETMESSAGE(11, 58, "All")));
840 XtSetArg(al[ac], XmNlabelString, tmpStr); ac++;
841 XtSetArg(al[ac], XmNmnemonic, mnemonic[0]); ac++;
842 WidgList[count++] = XmCreatePushButtonGadget (format_pane, "all", al, ac);
843 XtAddCallback (WidgList[count-1], XmNactivateCallback,
844 (XtCallbackProc) FormatAllCB, (XtPointer) pPad);
846 XmStringFree(tmpStr);
848 /* -----> manage the all "Format" menu buttons */
849 XtManageChildren(WidgList, count);
853 /************************************************************************
854 * CreateOptionsMenu - Create the "Options" pulldown menu
860 ************************************************************************/
865 Widget options_pane, cascade, WidgList[12];
870 OptionsMenuWidgets *pWidg = &pPad->optionsStuff.widgets;
872 /* -----> create "Options" PulldownMenu */
874 options_pane = XmCreatePulldownMenu (pPad->menu_bar, "optionsMenu", al, ac);
875 XtAddCallback(options_pane, XmNhelpCallback,
876 (XtCallbackProc)HelpOptionsCB, pPad);
877 mnemonic = strdup(((char *)GETMESSAGE(11, 59, "O")));
878 tmpStr = XmStringCreateLocalized(((char *)GETMESSAGE(11, 60, "Options")));
880 XtSetArg(al[ac], XmNsubMenuId, options_pane); ac++;
881 XtSetArg(al[ac], XmNlabelString, tmpStr); ac++;
882 XtSetArg(al[ac], XmNmnemonic, mnemonic[0]); ac++;
883 cascade= XmCreateCascadeButtonGadget (pPad->menu_bar, "options", al, ac);
884 XtAddCallback(cascade, XmNhelpCallback,(XtCallbackProc)HelpOptionsCB, pPad);
885 pPad->optionsStuff.widgets.optionsBtn = cascade;
886 XtManageChild (cascade);
888 XmStringFree(tmpStr);
890 /* -----> create "Overstrike" toggle button */
891 mnemonic = strdup(((char *)GETMESSAGE(11, 61, "O")));
892 tmpStr = XmStringCreateLocalized(((char *)GETMESSAGE(11, 62, "Overstrike")));
894 XtSetArg(al[ac], XmNlabelString, tmpStr); ac++;
895 XtSetArg(al[ac], XmNmnemonic, mnemonic[0]); ac++;
896 XtSetArg(al[ac], XmNvisibleWhenOff, True); ac++;
897 XtSetArg(al[ac], XmNset, pPad->xrdb.overstrike); ac++;
898 WidgList[count++] = XmCreateToggleButton (options_pane, "overstrike", al, ac);
899 pWidg->overstrikeBtn = WidgList[count - 1];
900 XtAddCallback (WidgList[count-1], XmNvalueChangedCallback,
901 (XtCallbackProc) OverstrikeCB, (XtPointer) pPad);
903 XmStringFree(tmpStr);
905 /* -----> create "Wrap To Fit" toggle button */
906 mnemonic = strdup(((char *)GETMESSAGE(11, 111, "W")));
907 tmpStr = XmStringCreateLocalized(((char *)GETMESSAGE(11, 112, "Wrap To Fit")));
909 XtSetArg(al[ac], XmNlabelString, tmpStr); ac++;
910 XtSetArg(al[ac], XmNmnemonic, mnemonic[0]); ac++;
911 XtSetArg(al[ac], XmNvisibleWhenOff, True); ac++;
912 XtSetArg(al[ac], XmNset, pPad->xrdb.wordWrap); ac++;
913 WidgList[count++] = XmCreateToggleButton (options_pane, "wordWrap", al, ac);
914 pWidg->wordWrapBtn = WidgList[count - 1];
915 XtAddCallback (WidgList[count-1], XmNvalueChangedCallback,
916 (XtCallbackProc) WordWrapCB, (XtPointer) pPad);
918 XmStringFree(tmpStr);
920 /* -----> create "Status Line" toggle button */
921 mnemonic = strdup(((char *)GETMESSAGE(11, 65, "S")));
922 tmpStr = XmStringCreateLocalized(((char *)GETMESSAGE(11, 66, "Status Line")));
924 XtSetArg(al[ac], XmNlabelString, tmpStr); ac++;
925 XtSetArg(al[ac], XmNmnemonic, mnemonic[0]); ac++;
926 XtSetArg(al[ac], XmNvisibleWhenOff, True); ac++;
927 XtSetArg(al[ac], XmNset, pPad->xrdb.statusLine); ac++;
928 WidgList[count++] = XmCreateToggleButton (options_pane, "statusLine", al, ac);
929 pWidg->statusLineBtn = WidgList[count - 1];
930 XtAddCallback (WidgList[count-1], XmNvalueChangedCallback,
931 (XtCallbackProc) StatusLineCB, (XtPointer) pPad);
933 XmStringFree(tmpStr);
935 XtManageChildren(WidgList, count);
940 /************************************************************************
941 * CreateMenuBar - Create MenuBar in MainWindow
943 ************************************************************************/
945 CreateMenuBar( Editor *pPad )
947 pPad->menu_bar = XmCreateMenuBar (pPad->mainWindow, "bar", NULL, 0);
948 XtAddCallback(pPad->menu_bar, XmNhelpCallback,
949 (XtCallbackProc)HelpMenubarCB, pPad);
951 CreateFileMenu(pPad);
952 CreateEditMenu(pPad);
953 CreateFormatMenu(pPad);
954 CreateOptionsMenu(pPad);
955 CreateHelpMenu(pPad);
959 /************************************************************************
960 * CreateEditorWidget - creates the Dt Editor widget
961 ************************************************************************/
966 Widget parent = pPad->mainWindow;
967 Arg al[10]; /* arg list */
968 int ac; /* arg count */
969 Pixel background, foreground, top_shadow, bottom_shadow, selectColor;
971 XmString dialogTitleStr = XmStringCreateLocalized(DialogTitle(pPad));
973 /* create the DtEditor widget */
975 XtSetArg(al[ac], DtNrows, DEFAULT_ROWS); ac++;
976 XtSetArg(al[ac], DtNcolumns, DEFAULT_COLS); ac++;
977 XtSetArg(al[ac], DtNdialogTitle, dialogTitleStr); ac++;
978 pPad->editor = DtCreateEditor(parent, "editor", al, ac);
979 XmStringFree(dialogTitleStr);
981 /* add the DtEditor callbacks */
982 XtAddCallback(pPad->editor, XmNhelpCallback,
983 (XtCallbackProc) HelpEditorWidgetCB,
985 XtAddCallback(pPad->editor, DtNtextSelectCallback,
986 (XtCallbackProc) TextSelectedCB,
988 XtAddCallback(pPad->editor, DtNtextDeselectCallback,
989 (XtCallbackProc) TextDeselectedCB,
992 /* get id of status line text field widget */
993 pPad->statusLineMsg = DtEditorGetMessageTextFieldID(pPad->editor);
998 /************************************************************************
999 * FindOrCreatePad - finds an unused entry in the list of Editors or,
1000 * if none can be found, creates a new entry with some defaults
1001 * obtain from the last entry that was created.
1003 * Returns True if an existing, unused entry is "reused" or False
1004 * if a new entry is created. Also updates the current entry
1005 * (whose address is passed as a parameter) to point to the
1006 * found/created entry.
1008 * Note: The first entry in the list of Editors is created by
1009 * CreatedFirstPad(). This routine is used to create
1010 * all subsequent entries.
1012 ************************************************************************/
1017 Boolean foundPad = False;
1022 /* -----> Reuse unused entries (corresponding to closed editor windows)
1023 * before creating new ones. */
1024 for (pPad = pPadList; pPad != (Editor *)NULL; pPad = pPad->pNextPad){
1025 if (pPad->inUse == False) {
1033 /* -----> Create a new entry if an unused one can not be found. */
1034 if (foundPad == False) {
1036 char **argv_l, **c_argv_l;
1039 unsigned short group_id,
1042 /* -----> Save some defaults from the last entry that was created. */
1043 Boolean exitOnLastClose = pPadList->xrdb.exitOnLastClose;
1044 pProgName = pPadList->progname;
1045 group_id = pPadList->group_id;
1046 user_id = pPadList->user_id;
1047 display = pPadList->display;
1049 /* -----> Create a new entry and point pPad and the global, pPadList
1054 /* -----> Set some defaults from the last entry that was created. */
1055 pPad->display = display;
1056 pPad->progname = pProgName;
1057 pPad->group_id = group_id;
1058 pPad->user_id = user_id;
1059 pPad->xrdb.exitOnLastClose = exitOnLastClose;
1061 /* -----> Create the application shell for the new Editor entry. */
1063 XtSetArg(al[ac], XmNargv, &argv_l); ac++;
1064 XtSetArg(al[ac], XmNargc, &argc_l); ac++;
1065 XtGetValues(topLevelWithWmCommand, al, ac);
1067 c_argv_l = (char **) XtMalloc(argc_l * sizeof(char*));
1068 for (i=0; i<argc_l; i++)
1069 c_argv_l[i] = strdup(argv_l[i]);
1072 XtSetArg(al[ac], XmNargv, argv_l); ac++;
1073 XtSetArg(al[ac], XmNargc, argc_l); ac++;
1074 pPad->app_shell = XtAppCreateShell(pPad->progname, DTPAD_CLASS_NAME,
1075 applicationShellWidgetClass,
1076 pPad->display, al, ac);
1077 pPad->app_context = XtWidgetToApplicationContext(pPad->app_shell);
1079 /* -----> Set all resources to initial server values */
1080 RestoreInitialServerResources(pPad);
1084 /* -----> update the pointer to the current entry and return whether or
1085 * not an existing entry was reused */
1091 /************************************************************************
1092 * SetWorkSpaceHints -
1094 ************************************************************************/
1101 Atom * workspace_atoms = NULL;
1102 int num_workspaces=0;
1108 ptr = MbStrchr (workspaces, ' ');
1110 if (ptr != NULL) *ptr = 0;
1112 workspace_atoms = (Atom *) XtRealloc ((char *)workspace_atoms,
1113 sizeof (Atom) * (num_workspaces + 1));
1114 workspace_atoms[num_workspaces] =
1115 XmInternAtom (XtDisplay(shell), workspaces, True);
1122 workspaces = ptr + 1;
1124 } while (ptr != NULL);
1126 DtWsmSetWorkspacesOccupied(XtDisplay(shell), XtWindow (shell),
1127 workspace_atoms, num_workspaces);
1129 XtFree ((char *) workspace_atoms);
1130 workspace_atoms = NULL;
1136 Screen *currentScreen;
1138 char *workspace_name;
1140 screen = XDefaultScreen(XtDisplay(shell));
1141 currentScreen = XScreenOfDisplay(XtDisplay(shell), screen);
1142 rootWindow = RootWindowOfScreen(currentScreen);
1144 if(DtWsmGetCurrentWorkspace(XtDisplay(shell), rootWindow,
1145 &pCurrent) == Success)
1147 DtWsmSetWorkspacesOccupied(XtDisplay(shell), XtWindow (shell),
1154 /************************************************************************
1155 * ClearStatusMessage - clears the message (XmTextField) portion of the
1156 * DtEditor widget's status line.
1157 ************************************************************************/
1163 XmTextFieldSetString(pPad->statusLineMsg, "");
1167 /************************************************************************
1168 * SetStatusMessage - sets the message (XmTextField) portion of the
1169 * DtEditor widget's status line to the specified string.
1170 ************************************************************************/
1177 XmTextFieldSetString(pPad->statusLineMsg, str);
1183 * CreatePopupMenu - Create popup menu in editor window
1187 CreatePopupMenu( Editor *pPad )
1191 Widget popupCascade, popupBtns[10];
1192 Widget fileMenu, editMenu, optionMenu, helpMenu;
1197 pPad->popup = XmCreatePopupMenu(pPad->editor, "popupMenu", NULL, 0);
1198 XtAddEventHandler(parent, ButtonPressMask, False, PopupHandler,
1199 (XtPointer)popupMenu);
1201 /* Create text editor title */
1203 (Widget)XmCreateLabelGadget(pPad->popup, "popupTitle", NULL, 0);
1206 /* Create title separators */
1207 popupBtns[i++] = XmCreateSeparatorGadget(pPad->popup, "sep2", NULL, 0);
1209 fileMenu = XmCreatePulldownMenu (pPad->popup, "fileMenu", NULL, 0);
1211 tmpStr = XmStringCreateLocalized(((char *)GETMESSAGE(11, 16, "File")));
1212 mnemonic = strdup(((char *)GETMESSAGE(11, 15, "F")));
1215 XtSetArg(al[ac], XmNlabelString, tmpStr); ac++;
1216 XtSetArg(al[ac], XmNsubMenuId, fileMenu); ac++;
1217 XtSetArg(al[ac], XmNmnemonic, mnemonic); ac++;
1218 popupBtns[i++] = XmCreateCascadeButtonGadget(pPad->popup, "File", al, ac);
1220 XmStringFree(tmpStr);
1222 mnemonic = strdup(((char *)GETMESSAGE(11, 17, "N")));
1223 tmpStr = XmStringCreateLocalized(((char *)GETMESSAGE(11, 18, "New")));
1225 XtSetArg(al[ac], XmNlabelString, tmpStr); ac++;
1226 XtSetArg(al[ac], XmNmnemonic, mnemonic); ac++;
1227 popupBtns[i] = XmCreatePushButtonGadget(pPad->popup, "New", al, ac);
1228 XtAddCallback(button, XmNactivateCallback, callback, callData);
1229 XtAddCallback (popupBtns[i], XmNactivateCallback,
1230 (XtCallbackProc)FileNewCB, (XtPointer) pPad);
1232 XmStringFree(tmpStr);
1235 CreateButton(fileMenu, "Open...", 'O', DisplayFsbCb, (XtPointer)LOAD_DATA);
1236 CreateButton(fileMenu, "Include...", 'I', DisplayFsbCb,
1237 (XtPointer)INSERT_DATA);
1238 CreateButton(fileMenu, "Save As...", 'A', DisplayFsbCb, (XtPointer)SAVE_DATA
1240 CreateButton(fileMenu, "New", 'N', ResetEditorCb, NULL);
1242 editMenu = XmCreatePulldownMenu (popupMenu, "editMenu", NULL, 0);
1243 CreateCascade(popupMenu, "Edit", 'E', editMenu);
1244 CreateButton(editMenu, "Undo", 'U', UndoCb, (XtPointer)LOAD_DATA);
1245 ad.cutPopupButton = CreateButton(editMenu, "Cut", 't', CutCb, NULL);
1246 ad.copyPopupButton = CreateButton(editMenu, "Copy", 'C', CopyCb, NULL);
1247 CreateButton(editMenu, "Paste", 'P', PasteCb, NULL);
1249 CreateButton(popupMenu, "Find/Change...", 'F', FindCb, (XtPointer)ad.editor)
1255 static void PopupHandler(Widget w, XtPointer cd, XEvent *event, Boolean *ctd)
1257 if (((XButtonEvent *)event)->button != Button3) return;
1259 XmMenuPosition((Widget)cd, (XButtonEvent *)event);
1260 XtManageChild ((Widget)cd);