dtcm/reminders.c: NULL is not 0
[oweals/cde.git] / cde / programs / dtcm / dtcm / about.c
1 /*
2  * CDE - Common Desktop Environment
3  *
4  * Copyright (c) 1993-2012, The Open Group. All rights reserved.
5  *
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)
10  * any later version.
11  *
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
16  * details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with these librararies and programs; if not, write
20  * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
21  * Floor, Boston, MA 02110-1301 USA
22  */
23 /* $TOG: about.c /main/7 1999/02/03 15:35:27 mgreess $ */
24 /*
25  *  (c) Copyright 1993, 1994 Hewlett-Packard Company
26  *  (c) Copyright 1993, 1994 International Business Machines Corp.
27  *  (c) Copyright 1993, 1994 Novell, Inc.
28  *  (c) Copyright 1993, 1994 Sun Microsystems, Inc.
29  */
30
31 #include <stdlib.h>
32 #include <stdio.h>
33 #include <time.h>
34 #include <Xm/Frame.h>
35 #include <Xm/Xm.h>
36 #include <Xm/Form.h>
37 #include <Xm/LabelG.h>
38 #include <Xm/Label.h>
39 #include <Xm/DialogS.h>
40 #include <Xm/PushBG.h>
41 #include <Xm/PushB.h>
42 #include <Xm/SeparatoG.h>
43 #include <Dt/Dt.h>
44 #include <EUSCompat.h>
45 #include "calendar.h"
46 #include "props_pu.h"
47 #include "revision.h"
48
49 #include "icon_pixmap_xbm"
50
51 #ifdef CREDITS
52 char *main_credits[] = {
53         "Mary Hamilton",
54         "Chris Kasso",
55         "Martin Knutson",
56         "Terre Layton",
57         "Yvonne Tso",
58         "J.F. Unson",
59         "Janice Winsor",
60         NULL
61 };
62
63 char *also_credits[] = {
64         "Brent Ayers",
65         "David Curley",
66         "Betty Deluco",
67         "Lin-Chuan Lee",
68         NULL
69 };
70 #endif /* CREDITS */
71
72 #define GAP             10
73 #define TOG_GAP         10
74 #define MAX_LABEL_SPACE 55
75 #define XmUNSPECIFIED_ICON_SIZE 0
76 #define DTCM_ABOUT      "DtCMa"
77
78 extern Dimension ComputeMaxWidth(Widget, Widget, Widget, Widget);
79
80 static void close_about(Widget, XtPointer, XtPointer);
81 static void destroy_about(Widget, XtPointer, XtPointer);
82 static void do_credits(Widget, XtPointer, XtPointer);
83
84 extern String XmGetIconFileName( 
85                         Screen *screen,
86                         String imageInstanceName,
87                         String imageClassName,
88                         String hostPrefix,
89                         unsigned int size) ;
90
91 /*
92  * Create is popup the Calendar About dialog.
93  */
94 void
95 show_about(
96         Widget          w,
97         XtPointer       clientData,
98         XtPointer       cbs)
99 {
100         Calendar        *c = calendar;
101         XmString         xstr = NULL;
102         Dimension        max_width, form_width;
103         Pixmap           image = 0;
104         char             buf[64],
105                         *image_filename;
106         XmbTextItem      text[1];
107         Pixel            fg, bg;
108         Widget           icon_label, main_form, sub_form, name_label, 
109                          version_label, version_date, copyright_label,
110                          hp_label, ibm_label, novell_label, sun_label,
111                          separator, close_button, more_button, dialog,
112                          data_version_label, server_version_label; 
113         Display         *dpy = XtDisplay(c->frame);
114         Screen          *screen = XtScreen(c->frame);
115         struct tm        tm;
116         char            *title;
117 #if DTCM_INTERNAL_REV > 0
118         char             buf2[64];
119 #endif
120
121         if (c->about_dialog) {
122                 XtPopup(c->about_dialog, XtGrabNone);
123                 XMapRaised(dpy, XtWindow(c->about_dialog));
124                 return;
125         }
126
127         title = XtNewString(catgets(c->DT_catd, 1, 922, "About Calendar"));
128         dialog = XtVaCreatePopupShell("about_dialog",
129                 xmDialogShellWidgetClass,
130                 c->frame,
131                 XmNtitle,                       title,
132                 XmNdeleteResponse,              XmDESTROY,
133                 XmNallowShellResize,            True,
134                 NULL);
135         XtFree(title);
136
137         main_form =
138             XtVaCreateWidget("about_form_mgr",
139                 xmFormWidgetClass,
140                 dialog,
141                 XmNautoUnmanage,                False,
142                 XmNtopAttachment,               XmATTACH_FORM,
143                 XmNtopOffset,                   GAP,
144                 XmNleftAttachment,              XmATTACH_FORM,
145                 XmNrightAttachment,             XmATTACH_FORM,
146                 XmNbottomAttachment,            XmATTACH_FORM,
147                 XmNfractionBase,                4,
148                 XmNnoResize,                    True,
149                 NULL);
150
151         XtVaGetValues(main_form,
152                 XmNbackground,          &bg,
153                 XmNforeground,          &fg,
154                 NULL);
155
156         if ((image_filename = XmGetIconFileName(screen, NULL, 
157                                                 DTCM_ABOUT, NULL, 
158                                                 XmUNSPECIFIED_ICON_SIZE))) {
159                 image = XmGetPixmap(screen, image_filename, fg, bg); 
160                 free(image_filename);
161         }
162
163
164         icon_label =
165             XtVaCreateWidget("icon_label",
166                 xmLabelWidgetClass,
167                 main_form,
168                 XmNtopAttachment,               XmATTACH_FORM,
169                 XmNtopOffset,                   GAP,
170                 XmNleftAttachment,              XmATTACH_FORM,
171                 XmNleftOffset,                  GAP,
172                 NULL);
173
174         if (!image || image == XmUNSPECIFIED_PIXMAP) {
175                 xstr = XmStringCreateLocalized(
176                         catgets(c->DT_catd, 1, 917, "Missing\nGraphics"));
177                 XtVaSetValues(icon_label,
178                         XmNlabelType,                   XmSTRING,
179                         XmNlabelString,                 xstr,
180                         XmNborderWidth,                 1,
181                         NULL);
182                 XmStringFree(xstr);
183         } else {
184                 XtVaSetValues(icon_label,
185                         XmNlabelType,                   XmPIXMAP,
186                         XmNlabelPixmap,                 image,
187                         NULL);
188         }
189
190         sub_form =
191             XtVaCreateWidget("sub_form",
192                 xmFormWidgetClass,
193                 main_form,
194                 XmNtopAttachment,               XmATTACH_FORM,
195                 XmNtopOffset,                   GAP,
196                 XmNleftAttachment,              XmATTACH_WIDGET,
197                 XmNleftWidget,                  icon_label,
198                 XmNleftAttachment,              XmATTACH_WIDGET,
199                 XmNshadowThickness,             0,
200                 XmNshadowType,                  XmSHADOW_IN,
201                 NULL);
202
203         xstr = XmStringCreateLocalized(catgets(c->DT_catd, 1, 340, "Calendar"));
204         name_label =
205             XtVaCreateWidget("about_name_label",
206                 xmLabelWidgetClass,
207                 sub_form,
208                 XmNlabelType,                   XmSTRING,
209                 XmNlabelString,                 xstr,
210                 XmNalignment,                   XmALIGNMENT_BEGINNING,
211                 XmNtopAttachment,               XmATTACH_FORM,
212                 XmNtopOffset,                   GAP,
213                 XmNleftAttachment,              XmATTACH_FORM,
214                 XmNleftOffset,                  0,
215                 XmNrightAttachment,             XmATTACH_FORM,
216                 XmNrightOffset,                 GAP,
217                 NULL);
218
219         XmStringFree(xstr);
220
221         sprintf(buf, "%s %d.%d.%d", 
222                                 catgets(c->DT_catd, 1, 671, "Version"), 
223                                 DtVERSION, DtREVISION, DtUPDATE_LEVEL); 
224 #if DTCM_INTERNAL_REV > 0
225         strcpy(buf2, buf);
226         sprintf(buf, "%s (%s %d)", 
227                                 buf2,
228                                 catgets(c->DT_catd, 1, 672, "Revision"), 
229                                 DTCM_INTERNAL_REV);
230 #endif
231
232         xstr = XmStringCreateLocalized(buf);
233         version_label =
234             XtVaCreateWidget("version_label",
235                 xmLabelWidgetClass,
236                 sub_form,
237                 XmNlabelType,                   XmSTRING,
238                 XmNlabelString,                 xstr,
239                 XmNalignment,                   XmALIGNMENT_BEGINNING,
240                 XmNtopAttachment,               XmATTACH_WIDGET,
241                 XmNtopOffset,                   GAP,
242                 XmNtopWidget,                   name_label,
243                 XmNleftAttachment,              XmATTACH_FORM,
244                 XmNleftOffset,                  0,
245                 XmNrightAttachment,             XmATTACH_FORM,
246                 XmNrightOffset,                 GAP,
247                 NULL);
248
249         XmStringFree(xstr);
250
251         sprintf(buf, "%s %d", catgets(c->DT_catd, 1, 967, 
252                                 "Calendar Server Version"), 
253                                 get_server_version(c->my_cal_handle));
254
255         xstr = XmStringCreateLocalized(buf);
256         server_version_label =
257             XtVaCreateWidget("server_version",
258                 xmLabelWidgetClass,
259                 sub_form,
260                 XmNlabelType,                   XmSTRING,
261                 XmNlabelString,                 xstr,
262                 XmNalignment,                   XmALIGNMENT_BEGINNING,
263                 XmNtopAttachment,               XmATTACH_WIDGET,
264                 XmNtopOffset,                   0,
265                 XmNtopWidget,                   version_label,
266                 XmNleftAttachment,              XmATTACH_FORM,
267                 XmNleftOffset,                  0,
268                 XmNrightAttachment,             XmATTACH_FORM,
269                 XmNrightOffset,                 GAP,
270                 NULL);
271
272         XmStringFree(xstr);
273
274         sprintf(buf, "%s %d", catgets(c->DT_catd, 1, 968, 
275                                 "Calendar Data Version"), 
276                                 c->my_cal_version);
277
278         xstr = XmStringCreateLocalized(buf);
279         data_version_label =
280             XtVaCreateWidget("data_version",
281                 xmLabelWidgetClass,
282                 sub_form,
283                 XmNlabelType,                   XmSTRING,
284                 XmNlabelString,                 xstr,
285                 XmNalignment,                   XmALIGNMENT_BEGINNING,
286                 XmNtopAttachment,               XmATTACH_WIDGET,
287                 XmNtopOffset,                   0,
288                 XmNtopWidget,                   server_version_label,
289                 XmNleftAttachment,              XmATTACH_FORM,
290                 XmNleftOffset,                  0,
291                 XmNrightAttachment,             XmATTACH_FORM,
292                 XmNrightOffset,                 GAP,
293                 NULL);
294
295         XmStringFree(xstr);
296
297 #if defined(DTCM_SHOW_ABOUT_COPYRIGHT)
298
299         tm.tm_sec = 0;
300         tm.tm_min = 0;
301         tm.tm_hour = 0;
302         tm.tm_mday = 1;
303         tm.tm_mon = DTCM_VERSION_MONTH - 1;
304         tm.tm_year = DTCM_VERSION_YEAR - 1900;
305         tm.tm_isdst = -1;
306
307 #ifdef _AIX
308         sprintf( buf, "%s %d", months[tm.tm_mon + 1 ], tm.tm_year + 1900 );
309 #else /* _AIX */
310         strftime(buf, 64, "%B %Y", &tm);
311 #endif /* _AIX */
312
313         xstr = XmStringCreateLocalized(buf);
314         version_date =
315             XtVaCreateWidget("version_date",
316                 xmLabelWidgetClass,
317                 sub_form,
318                 XmNlabelType,                   XmSTRING,
319                 XmNlabelString,                 xstr,
320                 XmNalignment,                   XmALIGNMENT_BEGINNING,
321                 XmNtopAttachment,               XmATTACH_WIDGET,
322                 XmNtopOffset,                   0,
323                 XmNtopWidget,                   data_version_label,
324                 XmNleftAttachment,              XmATTACH_FORM,
325                 XmNleftOffset,                  0,
326                 XmNrightAttachment,             XmATTACH_FORM,
327                 XmNrightOffset,                 GAP,
328                 NULL);
329
330         XmStringFree(xstr);
331         xstr = XmStringCreateLocalized(catgets(c->DT_catd, 1, 674,
332                                            "Copyright (c) 1993, 1994, 1995:"));
333         copyright_label =
334             XtVaCreateWidget("copyright_label",
335                 xmLabelWidgetClass,
336                 sub_form,
337                 XmNlabelType,                   XmSTRING,
338                 XmNlabelString,                 xstr,
339                 XmNalignment,                   XmALIGNMENT_BEGINNING,
340                 XmNtopAttachment,               XmATTACH_WIDGET,
341                 XmNtopOffset,                   GAP,
342                 XmNtopWidget,                   version_date,
343                 XmNleftAttachment,              XmATTACH_FORM,
344                 XmNleftOffset,                  0,
345                 XmNrightAttachment,             XmATTACH_FORM,
346                 XmNrightOffset,                 GAP,
347                 NULL);
348
349         XmStringFree(xstr);
350         xstr = XmStringCreateLocalized(catgets(c->DT_catd, 1, 675, 
351                                                 "Hewlett-Packard Company"));
352         hp_label =
353             XtVaCreateWidget("hp_label",
354                 xmLabelWidgetClass,
355                 sub_form,
356                 XmNlabelType,                   XmSTRING,
357                 XmNlabelString,                 xstr,
358                 XmNalignment,                   XmALIGNMENT_BEGINNING,
359                 XmNtopAttachment,               XmATTACH_WIDGET,
360                 XmNtopOffset,                   GAP,
361                 XmNtopWidget,                   copyright_label,
362                 XmNleftAttachment,              XmATTACH_FORM,
363                 XmNleftOffset,                  GAP * 2,
364                 XmNrightAttachment,             XmATTACH_FORM,
365                 XmNrightOffset,                 GAP,
366                 NULL);
367
368         XmStringFree(xstr);
369         xstr = XmStringCreateLocalized(catgets(c->DT_catd, 1, 676, 
370                                 "International Business Machines Corp."));
371         ibm_label =
372             XtVaCreateWidget("ibm_label",
373                 xmLabelWidgetClass,
374                 sub_form,
375                 XmNlabelType,                   XmSTRING,
376                 XmNlabelString,                 xstr,
377                 XmNalignment,                   XmALIGNMENT_BEGINNING,
378                 XmNtopAttachment,               XmATTACH_WIDGET,
379                 XmNtopOffset,                   0,
380                 XmNtopWidget,                   hp_label,
381                 XmNleftAttachment,              XmATTACH_FORM,
382                 XmNleftOffset,                  GAP * 2,
383                 XmNrightAttachment,             XmATTACH_FORM,
384                 XmNrightOffset,                 GAP,
385                 NULL);
386
387         XmStringFree(xstr);
388         xstr = XmStringCreateLocalized(catgets(c->DT_catd, 1, 677, 
389                                                 "Novell, Inc."));
390         novell_label =
391             XtVaCreateWidget("novell_label",
392                 xmLabelWidgetClass,
393                 sub_form,
394                 XmNlabelType,                   XmSTRING,
395                 XmNlabelString,                 xstr,
396                 XmNalignment,                   XmALIGNMENT_BEGINNING,
397                 XmNtopAttachment,               XmATTACH_WIDGET,
398                 XmNtopOffset,                   0,
399                 XmNtopWidget,                   ibm_label,
400                 XmNleftAttachment,              XmATTACH_FORM,
401                 XmNleftOffset,                  GAP * 2,
402                 XmNrightAttachment,             XmATTACH_FORM,
403                 XmNrightOffset,                 GAP,
404                 NULL);
405
406         XmStringFree(xstr);
407         xstr = XmStringCreateLocalized(catgets(c->DT_catd, 1, 678, 
408                                                 "Sun Microsystems, Inc."));
409         sun_label =
410             XtVaCreateWidget("sun_label",
411                 xmLabelWidgetClass,
412                 sub_form,
413                 XmNlabelType,                   XmSTRING,
414                 XmNlabelString,                 xstr,
415                 XmNalignment,                   XmALIGNMENT_BEGINNING,
416                 XmNtopAttachment,               XmATTACH_WIDGET,
417                 XmNtopOffset,                   0,
418                 XmNtopWidget,                   novell_label,
419                 XmNleftAttachment,              XmATTACH_FORM,
420                 XmNleftOffset,                  GAP * 2,
421                 XmNrightAttachment,             XmATTACH_FORM,
422                 XmNrightOffset,                 GAP,
423                 NULL);
424
425         XmStringFree(xstr);
426 #endif
427
428 #ifdef CREDITS
429         xstr = XmStringCreateLocalized(catgets(c->DT_catd, 1, 679, "More..."));
430         more_button = XtVaCreateWidget("more_button",
431                 xmPushButtonGadgetClass, 
432                 main_form,
433                 XmNlabelString,                 xstr,
434                 XmNmarginWidth,                 5,
435                 XmNtopAttachment,               XmATTACH_NONE,
436                 XmNleftAttachment,              XmATTACH_WIDGET,
437                 XmNleftOffset,                  GAP,
438                 XmNleftWidget,                  sub_form,
439                 XmNrightAttachment,             XmATTACH_FORM,
440                 XmNrightOffset,                 GAP,
441                 NULL);
442
443         XmStringFree(xstr);
444         XtAddCallback(more_button, XmNactivateCallback, do_credits, 
445                         (XtPointer)image);
446 #endif /* CREDITS */
447
448         separator = XtVaCreateWidget("separator",
449                 xmSeparatorGadgetClass,
450                 main_form,
451                 XmNtopAttachment,               XmATTACH_WIDGET,
452                 XmNtopOffset,                   GAP * 2,
453                 XmNtopWidget,                   sub_form,
454                 XmNleftAttachment,              XmATTACH_FORM,
455                 XmNleftOffset,                  0,
456                 XmNrightAttachment,             XmATTACH_FORM,
457                 XmNrightOffset,                 0,
458                 NULL);
459
460         xstr = XmStringCreateLocalized(catgets(c->DT_catd, 1, 680, "Close"));
461         close_button = XtVaCreateWidget("close_button",
462                 xmPushButtonGadgetClass, main_form,
463                 XmNlabelString,                 xstr,
464                 XmNmarginWidth,                 5,
465                 XmNbottomAttachment,            XmATTACH_FORM,
466                 XmNbottomOffset,                GAP,
467                 XmNtopAttachment,               XmATTACH_WIDGET,
468                 XmNtopWidget,                   separator,
469                 XmNtopOffset,                   GAP,
470                 NULL);
471
472 #ifdef CREDITS
473         max_width = ComputeMaxWidth(more_button, close_button, NULL, NULL);
474 #else
475         max_width = ComputeMaxWidth(close_button, close_button, NULL, NULL);
476 #endif /* CREDITS */
477
478         XmStringFree(xstr);
479         XtAddCallback(close_button, XmNactivateCallback, close_about, NULL);
480         XtAddCallback(close_button, XmNdestroyCallback, destroy_about, NULL);
481
482 #ifdef CREDITS
483         XtVaSetValues(more_button,
484                 XmNwidth,                       max_width,
485                 XmNbottomAttachment,            XmATTACH_WIDGET,
486                 XmNbottomWidget,                separator,
487                 XmNbottomOffset,                GAP,
488                 NULL);
489 #endif /* CREDITS */
490
491         ManageChildren(sub_form);
492         ManageChildren(main_form);
493         XtManageChild(main_form);
494
495         XtVaGetValues(main_form,
496                 XmNwidth,                       &form_width,
497                 NULL);
498
499         XtVaSetValues(close_button,
500                 XmNleftAttachment,              XmATTACH_FORM,
501                 XmNleftOffset,                  form_width/2 - max_width/2,
502                 XmNwidth,                       max_width,
503                 NULL);
504
505         XtVaSetValues(main_form, 
506                 XmNdefaultButton,               close_button,
507                 XmNcancelButton,                close_button,
508                 NULL);
509
510         XtPopup(dialog, XtGrabNone);
511
512         c->about_dialog = dialog;
513 }
514
515 static void
516 close_about(
517         Widget                   w,
518         XtPointer                client_data,
519         XtPointer                callback_struct)
520 {
521         XtPopdown(calendar->about_dialog);
522         XtDestroyWidget(calendar->about_dialog);
523         calendar->about_dialog = NULL;
524 }
525
526 static void
527 destroy_about(
528         Widget                   w,
529         XtPointer                client_data,
530         XtPointer                callback_struct)
531 {
532         calendar->about_dialog = NULL;
533 }
534
535 static void
536 destroy_credits(
537         Widget                   w,
538         XtPointer                client_data,
539         XtPointer                callback_struct)
540 {
541         calendar->credits_dialog = NULL;
542 }
543
544 static void
545 close_credits(
546         Widget                   w,
547         XtPointer                client_data,
548         XtPointer                callback_struct)
549 {
550         XtPopdown(calendar->credits_dialog);
551         XtDestroyWidget(calendar->credits_dialog);
552         calendar->credits_dialog = NULL;
553 }
554
555 #ifdef CREDITS
556
557 /*
558  * Create and popup the Credits dialog.
559  */
560 static void
561 do_credits(
562         Widget          w,
563         XtPointer       client_data,
564         XtPointer       callback_struct)
565 {
566         Calendar        *c = calendar;
567         Pixmap          image = (Pixmap)client_data;
568         Widget          dialog, main_form, sub_form, separator, close_button,
569                         icon_label, title_label, label, parent, above_widget;
570         XmString        xstr = NULL;
571         int             i;
572         Dimension       button_width, dialog_width;
573         char            *title;
574
575         if (c->credits_dialog) {
576                 XtPopup(c->credits_dialog, XtGrabNone);
577                 return;
578         }
579
580         title = XtNewString(catgets(c->DT_catd, 1, 681, "Calendar Contributors"));
581         dialog = XtVaCreatePopupShell("contrib_dialog",
582                 xmDialogShellWidgetClass,
583                 c->frame,
584                 XmNtitle,                       title,
585                 XmNdeleteResponse,              XmDESTROY,
586                 XmNallowShellResize,            True,
587                 NULL);
588         XtFree(title);
589
590         main_form =
591             XtVaCreateWidget("credit_main_form",
592                 xmFormWidgetClass,
593                 dialog,
594                 XmNtopAttachment,               XmATTACH_FORM,
595                 XmNtopOffset,                   GAP,
596                 XmNleftAttachment,              XmATTACH_FORM,
597                 XmNrightAttachment,             XmATTACH_FORM,
598                 XmNbottomAttachment,            XmATTACH_FORM,
599                 XmNnoResize,                    True,
600                 NULL);
601
602         icon_label =
603             XtVaCreateWidget("icon_label",
604                 xmLabelWidgetClass,
605                 main_form,
606                 XmNtopAttachment,               XmATTACH_FORM,
607                 XmNtopOffset,                   GAP,
608                 XmNleftAttachment,              XmATTACH_FORM,
609                 XmNleftOffset,                  GAP,
610                 NULL);
611
612         if (!image || image == XmUNSPECIFIED_PIXMAP) {
613                 xstr = XmStringCreateLocalized(
614                         catgets(c->DT_catd, 1, 918, "Missing\nGraphics"));
615                 XtVaSetValues(icon_label,
616                         XmNlabelType,                   XmSTRING,
617                         XmNlabelString,                 xstr,
618                         XmNborderWidth,                 1,
619                         NULL);
620                 XmStringFree(xstr);
621         } else {
622                 XtVaSetValues(icon_label,
623                         XmNlabelType,                   XmPIXMAP,
624                         XmNlabelPixmap,                 image,
625                         NULL);
626         }
627
628         sub_form =
629             XtVaCreateWidget("credit_sub_form",
630                 xmFormWidgetClass,
631                 main_form,
632                 XmNtopAttachment,               XmATTACH_FORM,
633                 XmNtopOffset,                   GAP,
634                 XmNleftAttachment,              XmATTACH_WIDGET,
635                 XmNleftWidget,                  icon_label,
636                 XmNrightAttachment,             XmATTACH_FORM,
637                 NULL);
638
639         xstr = XmStringCreateLocalized(catgets(c->DT_catd, 1, 682, 
640                                 "This application was brought to you by:"));
641         title_label =
642             XtVaCreateWidget("title_label",
643                 xmLabelWidgetClass,
644                 sub_form,
645                 XmNlabelType,                   XmSTRING,
646                 XmNlabelString,                 xstr,
647                 XmNalignment,                   XmALIGNMENT_BEGINNING,
648                 XmNtopAttachment,               XmATTACH_FORM,
649                 XmNtopOffset,                   GAP,
650                 XmNleftAttachment,              XmATTACH_FORM,
651                 XmNleftOffset,                  0,
652                 XmNrightAttachment,             XmATTACH_FORM,
653                 XmNrightOffset,                 GAP,
654                 NULL);
655
656         XmStringFree(xstr);
657
658         above_widget = title_label;
659
660         for (i = 0; main_credits[i]; i++) {
661                 xstr = XmStringCreateLocalized(main_credits[i]);
662                 label =
663                     XtVaCreateWidget("main_credit_label",
664                         xmLabelWidgetClass,
665                         sub_form,
666                         XmNlabelType,                   XmSTRING,
667                         XmNlabelString,                 xstr,
668                         XmNalignment,                   XmALIGNMENT_BEGINNING,
669                         XmNtopAttachment,               XmATTACH_WIDGET,
670                         XmNtopWidget,                   above_widget,
671                         XmNtopOffset,                   0,
672                         XmNleftAttachment,              XmATTACH_FORM,
673                         XmNleftOffset,                  90,
674                         XmNrightAttachment,             XmATTACH_FORM,
675                         XmNrightOffset,                 GAP,
676                         NULL);
677
678                 above_widget = label;
679                 XmStringFree(xstr);
680         }
681
682         xstr = XmStringCreateLocalized(catgets(c->DT_catd, 1, 1002, 
683                                 "Also contributing:"));
684         title_label =
685             XtVaCreateWidget("title_label",
686                 xmLabelWidgetClass,
687                 sub_form,
688                 XmNlabelType,                   XmSTRING,
689                 XmNlabelString,                 xstr,
690                 XmNalignment,                   XmALIGNMENT_BEGINNING,
691                 XmNtopAttachment,               XmATTACH_WIDGET,
692                 XmNtopWidget,                   above_widget,
693                 XmNtopOffset,                   10,
694                 XmNleftAttachment,              XmATTACH_FORM,
695                 XmNleftOffset,                  0,
696                 XmNrightAttachment,             XmATTACH_FORM,
697                 XmNrightOffset,                 GAP,
698                 NULL);
699
700         XmStringFree(xstr);
701
702         above_widget = title_label;
703
704         for (i = 0; also_credits[i]; i++) {
705                 xstr = XmStringCreateLocalized(also_credits[i]);
706                 label =
707                     XtVaCreateWidget("credit_label",
708                         xmLabelWidgetClass,
709                         sub_form,
710                         XmNlabelType,                   XmSTRING,
711                         XmNlabelString,                 xstr,
712                         XmNalignment,                   XmALIGNMENT_BEGINNING,
713                         XmNtopAttachment,               XmATTACH_WIDGET,
714                         XmNtopWidget,                   above_widget,
715                         XmNtopOffset,                   0,
716                         XmNleftAttachment,              XmATTACH_FORM,
717                         XmNleftOffset,                  90,
718                         XmNrightAttachment,             XmATTACH_FORM,
719                         XmNrightOffset,                 GAP,
720                         NULL);
721
722                 above_widget = label;
723                 XmStringFree(xstr);
724         }
725
726         separator = XtVaCreateWidget("separator",
727                 xmSeparatorGadgetClass,
728                 main_form,
729                 XmNtopAttachment,               XmATTACH_WIDGET,
730                 XmNtopOffset,                   GAP * 2,
731                 XmNtopWidget,                   sub_form,
732                 XmNleftAttachment,              XmATTACH_FORM,
733                 XmNleftOffset,                  0,
734                 XmNrightAttachment,             XmATTACH_FORM,
735                 XmNrightOffset,                 0,
736                 NULL);
737
738         xstr = XmStringCreateLocalized(catgets(c->DT_catd, 1, 680, "Close"));
739         close_button = XtVaCreateWidget("close_button",
740                 xmPushButtonGadgetClass, main_form,
741                 XmNlabelString,                 xstr,
742                 XmNmarginWidth,                 5,
743                 XmNbottomAttachment,            XmATTACH_FORM,
744                 XmNbottomOffset,                GAP,
745                 XmNtopAttachment,               XmATTACH_WIDGET,
746                 XmNtopWidget,                   separator,
747                 XmNtopOffset,                   GAP,
748                 NULL);
749
750         XmStringFree(xstr);
751         XtAddCallback(close_button, XmNactivateCallback, close_credits, NULL);
752         XtAddCallback(close_button, XmNdestroyCallback, destroy_credits, NULL);
753
754         ManageChildren(sub_form);
755         ManageChildren(main_form);
756         XtManageChild(main_form);
757
758         XtVaGetValues(dialog,
759                 XmNwidth,       &dialog_width,
760                 NULL);
761         XtVaGetValues(close_button,
762                 XmNwidth,       &button_width,
763                 NULL);
764
765         XtVaSetValues(close_button,
766                 XmNleftAttachment,              XmATTACH_FORM,
767                 XmNleftOffset,                  dialog_width/2 - button_width/2,
768                 NULL);
769
770         XtVaSetValues(main_form, XmNdefaultButton, close_button, NULL);
771         XtVaSetValues(main_form, XmNcancelButton, close_button, NULL);
772
773         XtPopup(dialog, XtGrabNone);
774
775         c->credits_dialog = dialog;
776 }
777
778 #endif /* CREDITS */