dtcm: Resolve CID 87562
[oweals/cde.git] / cde / programs / dtcm / dtcm / props.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 /* $XConsortium: props.c /main/9 1996/03/25 10:22:39 rswiston $ */
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 <Xm/Xm.h>
33 #include <Xm/Form.h>
34 #include <Xm/LabelG.h>
35 #include <Xm/List.h>
36 #include <Xm/DialogS.h>
37 #include <Xm/PushB.h>
38 #include <Xm/SeparatoG.h>
39 #include <Xm/Text.h>
40 #include <Xm/ToggleBG.h>
41 #include <csa.h>
42 #include "props_pu.h"
43 #include "help.h"
44 #include "calendar.h"
45 #include "deskset.h"
46
47 #define GAP             10
48 #define TOG_GAP         10
49 #define RIGHT_GAP       85  /* Space between text field and right edge */
50 #define MAX_LABEL_SPACE 55
51 #define INDICATOR_SIZE  20
52
53 extern unsigned int p_gap_convert_permissions(Props_pu *);
54 extern void gap_list_select_proc(Widget, XtPointer, XtPointer);
55 extern void p_gap_remove_proc(Widget, XtPointer, XtPointer);
56 extern void p_set_change(Props_pu *);
57 extern Dimension ComputeMaxWidth(Widget, Widget, Widget, Widget);
58
59 static void GAPAddProc(Widget, XtPointer, XtPointer);
60 static void GAPChangeProc(Widget, XtPointer, XtPointer);
61 static Widget CreatePermissions(Props_pu *, Widget, Widget, Dimension,
62                                 Dimension);
63 static int ChangeExistingGAPEntry(Props_pu *);
64
65 extern void
66 v5_gap_pending_change(Widget w, XtPointer data, XtPointer cbs) {
67         Props_pu *p = (Props_pu *) data;
68
69         if (p->v5_gap_pending_message_up == False) {
70                 p->v5_gap_pending_message_up = True;
71                 XtSetSensitive(p->gap2_add_button, True);
72         }
73 }
74
75 extern void
76 v5_gap_clear_pending_change(Props_pu *p) {
77  
78         p->v5_gap_pending_message_up = False;
79         XtSetSensitive(p->gap2_add_button, False);
80 }
81
82
83
84 extern void
85 p_create_v5_group_access_pane(
86         Props_pu *p)
87 {
88         Calendar *c =    calendar;
89         XmString         xstr = NULL;
90         int              i = 0;
91         Widget           gap2_form_mgr;
92         Dimension        max_left_label_width,
93                          max_button_label_width,
94                          tmp;
95         Arg              args[20]; 
96         XtWidgetGeometry geo;
97
98         gap2_form_mgr =
99             XtVaCreateWidget("gap2_form_mgr",
100                 xmFormWidgetClass,
101                 p->base_form_mgr,
102                 XmNtopAttachment,               XmATTACH_WIDGET,
103                 XmNtopWidget,                   p->separator1,
104                 XmNleftAttachment,              XmATTACH_FORM,
105                 XmNrightAttachment,             XmATTACH_FORM,
106                 XmNrightOffset,                 0,
107                 XmNbottomAttachment,            XmATTACH_WIDGET,
108                 XmNbottomOffset,                GAP,
109                 XmNbottomWidget,                p->separator2,
110                 NULL);
111
112         p->pane_list[GROUP_ACCESS_PANE] = gap2_form_mgr;
113
114         /* 
115          * Create our three left hand side labels first in order to figure
116          * out the offset required between the middle widgets and the left
117          * side.
118          */
119         xstr = XmStringCreateLocalized(
120                                 catgets(c->DT_catd, 1, 410, "User Name:"));
121         p->gap2_user_label =
122             XtVaCreateWidget("gap2_label_user_name",
123                 xmLabelGadgetClass,
124                 gap2_form_mgr,
125                 XmNlabelType,                   XmSTRING,
126                 XmNlabelString,                 xstr,
127                 NULL);
128
129         XmStringFree(xstr);
130
131         xstr = XmStringCreateLocalized(
132                                 catgets(c->DT_catd, 1, 738, "Access List:"));
133         p->gap2_access_label =
134             XtVaCreateWidget("gap2_label_access",
135                 xmLabelGadgetClass,
136                 gap2_form_mgr,
137                 XmNlabelType,                   XmSTRING,
138                 XmNlabelString,                 xstr,
139                 NULL);
140
141         XmStringFree(xstr);
142
143         xstr = XmStringCreateLocalized(
144                                 catgets(c->DT_catd, 1, 739, "Access Rights:"));
145         p->gap2_permissions_label =
146             XtVaCreateWidget("gap2_label_permissions",
147                 xmLabelGadgetClass,
148                 gap2_form_mgr,
149                 XmNlabelType,                   XmSTRING,
150                 XmNlabelString,                 xstr,
151                 NULL);
152
153         XmStringFree(xstr);
154
155         max_left_label_width = ComputeMaxWidth(p->gap2_user_label,
156                                                p->gap2_access_label,
157                                                p->gap2_permissions_label,
158                                                NULL)
159                                                + 2 * GAP;
160
161         p->gap2_user_text =
162             XtVaCreateWidget("gap2_text_user_name",
163                 xmTextWidgetClass,
164                 gap2_form_mgr,
165                 XmNmaxLength,                   80,
166                 XmNbottomAttachment,            XmATTACH_NONE,
167                 XmNleftAttachment,              XmATTACH_FORM,
168                 XmNleftOffset,                  max_left_label_width,
169                 XmNtopAttachment,               XmATTACH_FORM,
170                 XmNtopOffset,                   GAP,
171                 NULL);
172         p->gap_user_text = p->gap2_user_text;
173
174         XtAddCallback(p->gap_user_text, XmNvalueChangedCallback, 
175                                         v5_gap_pending_change, (XtPointer)p);
176
177         p->gap2_perm_form = CreatePermissions(p, gap2_form_mgr,
178                                               p->gap2_user_text,
179                                               max_left_label_width, RIGHT_GAP);
180
181         p->gap2_button_form =
182             XtVaCreateWidget("gap2_button_form_mgr",
183                 xmFormWidgetClass,
184                 gap2_form_mgr,
185                 XmNtopAttachment,               XmATTACH_WIDGET,
186                 XmNtopWidget,                   p->gap2_perm_form,
187                 XmNtopOffset,                   GAP,
188                 XmNrightAttachment,             XmATTACH_FORM,
189                 XmNrightOffset,                 GAP,
190                 NULL);
191
192         xstr = XmStringCreateLocalized(catgets(c->DT_catd, 1, 740, "Add"));
193         p->gap2_add_button =
194             XtVaCreateWidget("gap2_button_add",
195                 xmPushButtonWidgetClass,
196                 p->gap2_button_form,
197                 XmNleftAttachment,              XmATTACH_FORM,
198                 XmNleftOffset,                  0,
199                 XmNtopAttachment,               XmATTACH_FORM,
200                 XmNtopOffset,                   5,
201                 XmNalignment,                   XmALIGNMENT_CENTER,
202                 XmNlabelType,                   XmSTRING,
203                 XmNlabelString,                 xstr,
204                 NULL);
205
206         XmStringFree(xstr);
207         XtAddCallback(p->gap2_add_button, XmNactivateCallback, GAPAddProc, p);
208
209         xstr = XmStringCreateLocalized(catgets(c->DT_catd, 1, 419, "Delete"));
210         p->gap2_delete_button =
211             XtVaCreateWidget("gap2_button_delete",
212                 xmPushButtonWidgetClass,
213                 p->gap2_button_form,
214                 XmNleftAttachment,              XmATTACH_FORM,
215                 XmNleftOffset,                  0,
216                 XmNtopAttachment,               XmATTACH_WIDGET,
217                 XmNtopWidget,                   p->gap2_add_button,
218                 XmNtopOffset,                   GAP,
219                 XmNalignment,                   XmALIGNMENT_CENTER,
220                 XmNlabelType,                   XmSTRING,
221                 XmNlabelString,                 xstr,
222                 NULL);
223         p->gap_remove_button = p->gap2_delete_button; 
224
225         XmStringFree(xstr);
226         XtAddCallback(p->gap2_delete_button, XmNactivateCallback,
227                       p_gap_remove_proc, p);
228
229         xstr = XmStringCreateLocalized(catgets(c->DT_catd, 1, 343, "Change"));
230         p->gap2_change_button =
231             XtVaCreateWidget("gap2_button_change",
232                 xmPushButtonWidgetClass,
233                 p->gap2_button_form,
234                 XmNleftAttachment,              XmATTACH_FORM,
235                 XmNleftOffset,                  0,
236                 XmNtopAttachment,               XmATTACH_WIDGET,
237                 XmNtopWidget,                   p->gap2_delete_button,
238                 XmNtopOffset,                   GAP,
239                 XmNalignment,                   XmALIGNMENT_CENTER,
240                 XmNlabelType,                   XmSTRING,
241                 XmNlabelString,                 xstr,
242                 NULL);
243
244         XmStringFree(xstr);
245         XtAddCallback(p->gap2_change_button, XmNactivateCallback, GAPChangeProc,
246                       p);
247
248         max_button_label_width = ComputeMaxWidth(p->gap2_add_button,
249                                                  p->gap2_delete_button,
250                                                  p->gap2_change_button,
251                                                  NULL);
252
253         XtVaSetValues(p->gap2_add_button,
254                 XmNrightAttachment,             XmATTACH_OPPOSITE_FORM,
255                 XmNrightOffset,                 -max_button_label_width,
256                 NULL);
257         XtVaSetValues(p->gap2_delete_button,
258                 XmNrightAttachment,             XmATTACH_OPPOSITE_FORM,
259                 XmNrightOffset,                 -max_button_label_width,
260                 NULL);
261         XtVaSetValues(p->gap2_change_button,
262                 XmNrightAttachment,             XmATTACH_OPPOSITE_FORM,
263                 XmNrightOffset,                 -max_button_label_width,
264                 NULL);
265
266         p->gap_list = NULL;
267         XtSetArg(args[i], XmNscrollBarDisplayPolicy,    XmAUTOMATIC);       ++i;
268         XtSetArg(args[i], XmNlistSizePolicy,            XmVARIABLE);        ++i;
269         XtSetArg(args[i], XmNvisibleItemCount,          10);                ++i;
270         XtSetArg(args[i], XmNrightAttachment,           XmATTACH_WIDGET);   ++i;
271         XtSetArg(args[i], XmNrightWidget,               p->gap2_button_form); ++i;
272         XtSetArg(args[i], XmNrightOffset,               GAP * 2);         ++i;
273         XtSetArg(args[i], XmNleftAttachment,            XmATTACH_FORM);     ++i;
274         XtSetArg(args[i], XmNleftOffset,                max_left_label_width);
275                                                                             ++i;
276         XtSetArg(args[i], XmNtopAttachment,             XmATTACH_WIDGET);   ++i;
277         XtSetArg(args[i], XmNtopOffset,                 GAP);               ++i;
278         XtSetArg(args[i], XmNtopWidget,                 p->gap2_perm_form); ++i;
279         XtSetArg(args[i], XmNbottomAttachment,          XmATTACH_WIDGET);   ++i;
280         XtSetArg(args[i], XmNbottomOffset,              0);                 ++i;
281         XtSetArg(args[i], XmNbottomWidget,              p->separator2);     ++i;
282         XtSetArg(args[i], XmNdoubleClickInterval,       5);                 ++i;
283
284         p->gap2_access_list =
285             XmCreateScrolledList(gap2_form_mgr, "gap2_access_list", args, i);
286         p->gap_access_list = p->gap2_access_list;
287
288         XtAddCallback(p->gap2_access_list, XmNbrowseSelectionCallback,
289                                            gap_list_select_proc, p);
290
291         XtManageChild(p->gap2_access_list);
292
293         XtQueryGeometry( p->gap2_button_form, NULL, &geo );
294
295         XtVaSetValues( p->gap2_user_text,
296                         XmNrightAttachment, XmATTACH_FORM,
297                         XmNrightOffset, geo.width + GAP + GAP,
298                         NULL );
299         XtVaSetValues( p->gap2_perm_form,
300                         XmNrightAttachment, XmATTACH_FORM,
301                         XmNrightOffset, geo.width + GAP + GAP,
302                         NULL );
303
304
305         ManageChildren(p->gap2_button_form);
306
307         XtVaSetValues(p->gap2_user_label,
308                 XmNtopAttachment,               XmATTACH_FORM,
309                 XmNtopOffset,                   GAP,
310                 XmNrightAttachment,             XmATTACH_WIDGET,
311                 XmNrightWidget,                 p->gap2_user_text,
312                 XmNrightOffset,                 5,
313                 NULL);
314
315         XtVaSetValues(p->gap2_permissions_label,
316                 XmNtopAttachment,               XmATTACH_WIDGET,
317                 XmNtopWidget,                   p->gap2_user_text,
318                 XmNtopOffset,                   GAP,
319                 XmNrightAttachment,             XmATTACH_WIDGET,
320                 XmNrightWidget,                 p->gap2_perm_form,
321                 XmNrightOffset,                 5,
322                 NULL);
323
324         XtVaSetValues(p->gap2_access_label,
325                 XmNtopAttachment,               XmATTACH_WIDGET,
326                 XmNtopWidget,                   p->gap2_perm_form,
327                 XmNtopOffset,                   GAP,
328                 XmNrightAttachment,             XmATTACH_WIDGET,
329                 XmNrightWidget,                 p->gap2_access_list,
330                 XmNrightOffset,                 5,
331                 NULL);
332
333         ManageChildren(gap2_form_mgr);
334 }
335
336 static Widget
337 CreatePermissions(
338         Props_pu        *p,
339         Widget           parent,
340         Widget           widget_above,
341         Dimension        left_gap,
342         Dimension        right_gap) 
343 {
344         Calendar *c =    calendar;
345         Widget           perm_form;
346         int              n,
347                          max_label_width,
348                          label_offset;
349         Dimension        tog_width,
350                          view_label_width,
351                          insert_label_width,
352                          change_label_width;
353         XmString         xstr = NULL,
354                          xstr_empty = NULL;
355
356         /* Create the box containing the permission settings */
357
358         perm_form =
359             XtVaCreateWidget("gap2_perm_form_mgr",
360                 xmFormWidgetClass,
361                 parent,
362                 XmNleftAttachment,              XmATTACH_FORM,
363                 XmNleftOffset,                  left_gap,
364                 XmNtopAttachment,               XmATTACH_WIDGET,
365                 XmNtopWidget,                   widget_above,
366                 XmNtopOffset,                   GAP,
367                 XmNshadowThickness,             1,
368                 XmNshadowType,                  XmSHADOW_IN,
369                 NULL);
370
371         xstr = XmStringCreateLocalized(catgets(c->DT_catd, 1, 743, "Public:"));
372         p->gap2_public_label =
373             XtVaCreateWidget("gap2_public_label",
374                 xmLabelGadgetClass,
375                 perm_form,
376                 XmNlabelString,                 xstr,
377                 NULL);
378
379         XmStringFree (xstr);
380
381         xstr = XmStringCreateLocalized(
382                                 catgets(c->DT_catd, 1, 744, "Semiprivate:"));
383         p->gap2_semi_label =
384             XtVaCreateWidget("gap2_semi_label",
385                 xmLabelGadgetClass,
386                 perm_form,
387                 XmNlabelString,                 xstr,
388                 XmNleftAttachment,              XmATTACH_FORM,
389                 XmNleftOffset,                  10,
390                 NULL);
391
392         XmStringFree (xstr);
393
394         xstr = XmStringCreateLocalized(catgets(c->DT_catd, 1, 745, "Private:"));
395         p->gap2_private_label =
396             XtVaCreateWidget("gap2_private_label",
397                 xmLabelGadgetClass,
398                 perm_form,
399                 XmNlabelString,                 xstr,
400                 NULL);
401
402         XmStringFree (xstr);
403
404         /* Margin to the left of the View label */
405         max_label_width = ComputeMaxWidth(p->gap2_public_label,
406                                           p->gap2_semi_label,
407                                           p->gap2_private_label,
408                                           NULL) + 2 * GAP;
409
410         /* Create the labels and toggles for the permissions */
411
412         xstr = XmStringCreateLocalized(catgets(c->DT_catd, 1, 40, "View"));
413         p->gap2_view_label =
414             XtVaCreateWidget("gap2_view_label",
415                 xmLabelGadgetClass,
416                 perm_form,
417                 XmNlabelString,                 xstr,
418                 XmNleftAttachment,              XmATTACH_FORM,
419                 XmNleftOffset,                  max_label_width,
420                 XmNtopAttachment,               XmATTACH_FORM,
421                 XmNtopOffset,                   GAP,
422                 NULL);
423
424         XmStringFree (xstr);
425
426         XtVaGetValues(p->gap2_view_label,
427                 XmNwidth,       &view_label_width,
428                 NULL);
429
430         /* 
431          * If label is greater than the allocated space for the
432          * label, then we use a 0 offset.
433          */
434 #ifdef __ppc
435         label_offset = MAX_LABEL_SPACE;
436         label_offset -= view_label_width;
437 #else
438         label_offset = MAX_LABEL_SPACE - view_label_width;
439 #endif /* __ppc */
440         if (label_offset < 0) label_offset = 0;
441
442         xstr = XmStringCreateLocalized(catgets(c->DT_catd, 1, 342, "Insert"));
443
444         p->gap2_insert_label =
445             XtVaCreateWidget("gap2_insert_label",
446                 xmLabelGadgetClass,
447                 perm_form,
448                 XmNlabelString,                 xstr,
449                 XmNleftAttachment,              XmATTACH_WIDGET,
450                 XmNleftWidget,                  p->gap2_view_label,
451                 XmNleftOffset,                  label_offset,
452                 XmNtopAttachment,               XmATTACH_FORM,
453                 XmNtopOffset,                   GAP,
454                 NULL);
455
456         XmStringFree (xstr);
457
458         XtVaGetValues(p->gap2_insert_label,
459                 XmNwidth,       &insert_label_width,
460                 NULL);
461
462         xstr = XmStringCreateLocalized(catgets(c->DT_catd, 1, 343, "Change"));
463
464         /* 
465          * If label is greater than the allocated space for the
466          * label, then we use a 0 offset.
467          */
468 #ifdef __ppc
469         label_offset = MAX_LABEL_SPACE;
470         label_offset -= insert_label_width;
471 #else
472         label_offset = MAX_LABEL_SPACE - insert_label_width;
473 #endif /* __ppc */
474         if (label_offset < 0) label_offset = 0;
475
476         p->gap2_change_label =
477             XtVaCreateWidget("gap2_change_label",
478                 xmLabelGadgetClass,
479                 perm_form,
480                 XmNlabelString,                 xstr,
481                 XmNleftAttachment,              XmATTACH_WIDGET,
482                 XmNleftWidget,                  p->gap2_insert_label,
483                 XmNleftOffset,                  label_offset,
484                 XmNtopAttachment,               XmATTACH_FORM,
485                 XmNtopOffset,                   GAP,
486                 NULL);
487
488         XmStringFree (xstr);
489
490         XtVaGetValues(p->gap2_change_label,
491                 XmNwidth,       &change_label_width,
492                 NULL);
493
494         xstr_empty = XmStringCreateLocalized("");
495         p->gap2_public_tog[GAP_VIEW] =
496             XtVaCreateWidget("gap2_public_view_tog",
497                 xmToggleButtonGadgetClass,
498                 perm_form,
499                 XmNlabelString,                 xstr_empty,
500                 XmNleftAttachment,              XmATTACH_OPPOSITE_WIDGET,
501                 XmNleftWidget,                  p->gap2_view_label,
502                 XmNtopAttachment,               XmATTACH_WIDGET,
503                 XmNtopWidget,                   p->gap2_view_label,
504                 XmNtopOffset,                   TOG_GAP,
505                 XmNindicatorSize,               INDICATOR_SIZE,
506                 NULL);
507
508         XtVaGetValues(p->gap2_public_tog[GAP_VIEW],
509                 XmNwidth,                       &tog_width,
510                 NULL);
511
512         /*
513          * Center the toggle item under the label above it.
514          */
515         XtVaSetValues(p->gap2_public_tog[GAP_VIEW],
516                 XmNleftOffset,                  view_label_width/2 -
517                                                         (int)(tog_width * 3)/8,
518                 NULL);
519
520         p->gap2_public_tog[GAP_INSERT] =
521             XtVaCreateWidget("gap2_public_insert_tog",
522                 xmToggleButtonGadgetClass,
523                 perm_form,
524                 XmNlabelString,                 xstr_empty,
525                 XmNleftAttachment,              XmATTACH_OPPOSITE_WIDGET,
526                 XmNleftWidget,                  p->gap2_insert_label,
527                 XmNleftOffset,                  insert_label_width/2 -
528                                                         (int)(tog_width * 3)/8,
529                 XmNtopAttachment,               XmATTACH_WIDGET,
530                 XmNtopWidget,                   p->gap2_insert_label,
531                 XmNtopOffset,                   TOG_GAP,
532                 XmNindicatorSize,               INDICATOR_SIZE,
533                 NULL);
534
535         p->gap2_public_tog[GAP_CHANGE] =
536             XtVaCreateWidget("gap2_public_change_tog",
537                 xmToggleButtonGadgetClass,
538                 perm_form,
539                 XmNlabelString,                 xstr_empty,
540                 XmNleftAttachment,              XmATTACH_OPPOSITE_WIDGET,
541                 XmNleftWidget,                  p->gap2_change_label,
542                 XmNleftOffset,                  change_label_width/2 - 
543                                                         (int)(tog_width * 3)/8,
544                 XmNtopAttachment,               XmATTACH_WIDGET,
545                 XmNtopWidget,                   p->gap2_change_label,
546                 XmNtopOffset,                   TOG_GAP,
547                 XmNindicatorSize,               INDICATOR_SIZE,
548                 NULL);
549
550         p->gap2_semi_tog[GAP_VIEW] =
551             XtVaCreateWidget("gap2_semi_view_tog",
552                 xmToggleButtonGadgetClass,
553                 perm_form,
554                 XmNlabelString,                 xstr_empty,
555                 XmNleftAttachment,              XmATTACH_OPPOSITE_WIDGET,
556                 XmNleftWidget,                  p->gap2_public_tog[GAP_VIEW],
557                 XmNtopAttachment,               XmATTACH_WIDGET,
558                 XmNtopWidget,                   p->gap2_public_tog[GAP_VIEW],
559                 XmNtopOffset,                   TOG_GAP,
560                 XmNindicatorSize,               INDICATOR_SIZE,
561                 NULL);
562
563         p->gap2_semi_tog[GAP_INSERT] =
564             XtVaCreateWidget("gap2_semi_insert_tog",
565                 xmToggleButtonGadgetClass,
566                 perm_form,
567                 XmNlabelString,                 xstr_empty,
568                 XmNleftAttachment,              XmATTACH_OPPOSITE_WIDGET,
569                 XmNleftWidget,                  p->gap2_public_tog[GAP_INSERT],
570                 XmNtopAttachment,               XmATTACH_WIDGET,
571                 XmNtopWidget,                   p->gap2_public_tog[GAP_INSERT],
572                 XmNtopOffset,                   TOG_GAP,
573                 XmNindicatorSize,               INDICATOR_SIZE,
574                 NULL);
575                 
576         p->gap2_semi_tog[GAP_CHANGE] =
577             XtVaCreateWidget("gap2_semi_change_tog",
578                 xmToggleButtonGadgetClass,
579                 perm_form,
580                 XmNlabelString,                 xstr_empty,
581                 XmNleftAttachment,              XmATTACH_OPPOSITE_WIDGET,
582                 XmNleftWidget,                  p->gap2_public_tog[GAP_CHANGE],
583                 XmNtopAttachment,               XmATTACH_WIDGET,
584                 XmNtopWidget,                   p->gap2_public_tog[GAP_CHANGE],
585                 XmNtopOffset,                   TOG_GAP,
586                 XmNindicatorSize,               INDICATOR_SIZE,
587                 NULL);
588
589         p->gap2_private_tog[GAP_VIEW] =
590             XtVaCreateWidget("gap2_private_view_tog",
591                 xmToggleButtonGadgetClass,
592                 perm_form,
593                 XmNlabelString,                 xstr_empty,
594                 XmNleftAttachment,              XmATTACH_OPPOSITE_WIDGET,
595                 XmNleftWidget,                  p->gap2_semi_tog[GAP_VIEW],
596                 XmNtopAttachment,               XmATTACH_WIDGET,
597                 XmNtopWidget,                   p->gap2_semi_tog[GAP_VIEW],
598                 XmNtopOffset,                   TOG_GAP,
599                 XmNindicatorSize,               INDICATOR_SIZE,
600                 NULL);
601
602         p->gap2_private_tog[GAP_INSERT] =
603             XtVaCreateWidget("gap2_private_insert_tog",
604                 xmToggleButtonGadgetClass,
605                 perm_form,
606                 XmNlabelString,                 xstr_empty,
607                 XmNleftAttachment,              XmATTACH_OPPOSITE_WIDGET,
608                 XmNleftWidget,                  p->gap2_semi_tog[GAP_INSERT],
609                 XmNtopAttachment,               XmATTACH_WIDGET,
610                 XmNtopWidget,                   p->gap2_semi_tog[GAP_INSERT],
611                 XmNtopOffset,                   TOG_GAP,
612                 XmNindicatorSize,               INDICATOR_SIZE,
613                 NULL);
614                 
615         p->gap2_private_tog[GAP_CHANGE] =
616             XtVaCreateWidget("gap2_private_change_tog",
617                 xmToggleButtonGadgetClass,
618                 perm_form,
619                 XmNlabelString,                 xstr_empty,
620                 XmNleftAttachment,              XmATTACH_OPPOSITE_WIDGET,
621                 XmNleftWidget,                  p->gap2_semi_tog[GAP_CHANGE],
622                 XmNtopAttachment,               XmATTACH_WIDGET,
623                 XmNtopWidget,                   p->gap2_semi_tog[GAP_CHANGE],
624                 XmNtopOffset,                   TOG_GAP,
625                 XmNindicatorSize,               INDICATOR_SIZE,
626                 NULL);
627
628         XmStringFree (xstr_empty);
629
630         XtVaSetValues(p->gap2_public_label,
631                 XmNtopAttachment,               XmATTACH_OPPOSITE_WIDGET,
632                 XmNtopWidget,                   p->gap2_public_tog[GAP_VIEW],
633                 XmNrightAttachment,             XmATTACH_WIDGET,
634                 XmNrightWidget,                 p->gap2_public_tog[GAP_VIEW],
635                 XmNrightOffset,                 2 * GAP,
636                 NULL);
637
638         XtVaSetValues(p->gap2_semi_label,
639                 XmNtopAttachment,               XmATTACH_OPPOSITE_WIDGET,
640                 XmNtopWidget,                   p->gap2_semi_tog[GAP_VIEW],
641                 XmNrightAttachment,             XmATTACH_WIDGET,
642                 XmNrightWidget,                 p->gap2_public_tog[GAP_VIEW],
643                 XmNrightOffset,                 2 * GAP,
644                 NULL);
645
646         XtVaSetValues(p->gap2_private_label,
647                 XmNtopAttachment,               XmATTACH_OPPOSITE_WIDGET,
648                 XmNtopWidget,                   p->gap2_private_tog[GAP_VIEW],
649                 XmNrightAttachment,             XmATTACH_WIDGET,
650                 XmNrightWidget,                 p->gap2_public_tog[GAP_VIEW],
651                 XmNrightOffset,                 2 * GAP,
652                 XmNbottomAttachment,            XmATTACH_FORM,
653                 XmNbottomOffset,                GAP,
654                 NULL);
655
656         /* Margin to the right of the Change label */
657         XtVaSetValues(p->gap2_change_label,
658                 XmNmarginRight,                 GAP,
659                 NULL);
660
661         ManageChildren(perm_form);
662         return (perm_form);
663 }
664
665 static void
666 GAPAddProc(
667         Widget                   w,
668         XtPointer                client_data,
669         XtPointer                callback_struct)
670 {
671         Calendar                *c = calendar;
672         Props_pu                *p = (Props_pu *)client_data;
673         CSA_flags                access_rights;
674         CSA_access_rights       *access_entry,
675                                 *access_list_ptr;
676         char                    *user_name;
677         XmString                 xmstr;
678
679         /*
680          * Get the necessary strings from the UI.
681          */
682         if (!(access_rights = p_gap_convert_permissions(p)))
683                  return;
684
685         /* Get the user's name and host */
686         if (!(user_name = (char *)XmTextGetString(p->gap2_user_text)) ||
687             !*user_name) {
688                 char *title = XtNewString(catgets(c->DT_catd, 1, 750, 
689                               "Calendar : Error - Access List and Permissions"));
690                 char *text = XtNewString(catgets(c->DT_catd, 1, 749,
691                       "Name and Access Rights must be set to add an item to the Access List."));
692                 char *ident1 = XtNewString(catgets(c->DT_catd, 1, 95,
693                                                    "Continue"));
694
695                 XtFree(user_name);
696                 dialog_popup(p->frame,
697                         DIALOG_TITLE, title,
698                         DIALOG_TEXT, text,
699                         BUTTON_IDENT, 1, ident1,
700                         BUTTON_HELP, ACCESS_RIGHTS_ERROR_HELP,
701                         DIALOG_IMAGE, p->xm_error_pixmap,
702                         NULL);
703                 XtFree(ident1);
704                 XtFree(text);
705                 XtFree(title);
706                 return;
707         }
708
709         xmstr = XmStringCreateLocalized(user_name);
710
711         /* See if the item is already in the list */
712         if (p->gap_list) {
713                 int     list_pos = XmListItemPos(p->gap_access_list, xmstr);
714
715                 if (list_pos) {
716                         XmListSelectPos(p->gap_access_list, list_pos, False);
717                         XmListSetBottomPos(p->gap_access_list, list_pos);
718                         XtSetSensitive(p->gap2_change_button, True);
719                         XtSetSensitive(p->gap2_delete_button, True);
720
721                         /* Does the user want us to change an existing item? */
722                         if (!ChangeExistingGAPEntry(p)) {
723                                 /* No */
724                                 XtFree(user_name);
725                                 XmStringFree(xmstr);
726                                 return;
727                         }
728
729                         /* Find the entry and change the rights. */
730                         access_list_ptr = p->gap_list;
731                         do {
732                                 if (!strcmp(access_list_ptr->user->user_name,
733                                                                    user_name)) {
734                                         access_list_ptr->rights = access_rights;
735                                         p->changed_flag = True;
736                                         p_set_change(p);
737                                         XtFree(user_name);
738                                         XmStringFree(xmstr);
739                                         return;
740                                 }
741                         } while (access_list_ptr = access_list_ptr->next);
742                 }
743         }
744
745         /* Create a new access entry and add it to the end of the list */
746         access_entry = 
747                 (CSA_access_rights *)ckalloc(sizeof(CSA_access_rights));
748         access_entry->user = 
749                 (CSA_calendar_user *)ckalloc(sizeof(CSA_calendar_user));
750         access_entry->user->user_name = cm_strdup(user_name);
751         access_entry->rights = access_rights;
752         access_entry->next = NULL;
753
754         if (!p->gap_list) { 
755                 p->gap_list = access_entry;
756         } else {
757                 access_list_ptr = p->gap_list;
758                 while (access_list_ptr->next)
759                         access_list_ptr = access_list_ptr->next;
760                 access_list_ptr->next = access_entry;
761         }
762
763         XmListAddItem(p->gap_access_list, xmstr, 0);
764         p->changed_flag = True;
765         p_set_change(p);
766         XtFree(user_name);
767         XmStringFree(xmstr);
768 }
769
770 static int
771 ChangeExistingGAPEntry(
772         Props_pu        *p)
773 {
774         Calendar        *c = calendar;
775         int              answer;
776
777         char *title = XtNewString(catgets(c->DT_catd, 1, 1078, 
778                         "Calendar : Access List and Permissions - Add"));
779         char *text = XtNewString(catgets(c->DT_catd, 1, 751,
780                 "This entry already exists in the Access List.  Do you wish to change it?"));
781         char *ident1 = XtNewString(catgets(c->DT_catd, 1, 343,
782                         "Change"));
783         char *ident2 = XtNewString(catgets(c->DT_catd, 1, 923,
784                         "Cancel"));
785
786         answer = dialog_popup(p->frame,
787                 DIALOG_TITLE, title,
788                 DIALOG_TEXT, text,
789                 BUTTON_IDENT, 2, ident2,
790                 BUTTON_IDENT, 1, ident1,
791                 NULL);
792         XtFree(ident2);
793         XtFree(ident1);
794         XtFree(text);
795         XtFree(title);
796
797         if (answer == 1)
798                 return False;
799         return True;
800 }
801
802 static void
803 GAPChangeProc(
804         Widget                   w,
805         XtPointer                client_data,
806         XtPointer                callback_struct)
807 {
808         Calendar                *c = calendar;
809         Props_pu                *p = (Props_pu *)client_data;
810         CSA_access_list          step = p->gap_list, 
811                                  last = NULL;
812         int                     *item_list = NULL,
813                                  item_cnt = 0;
814         CSA_flags                access_rights;
815         CSA_access_rights       *access_entry;
816         char                    *user_name;
817         XmString                 xmstr;
818
819
820         /* An item to change must be selected in the access list */
821         if (!XmListGetSelectedPos(p->gap2_access_list, &item_list, &item_cnt)) {
822                 char *title = XtNewString(catgets(c->DT_catd, 1, 750,
823                               "Calendar : Error - Access List and Permissions"));
824                 char *text = XtNewString(catgets(c->DT_catd, 1, 408,
825                               "Please select a name first.                   "));
826                 char *ident1 = XtNewString(catgets(c->DT_catd, 1, 95, "Continue"));
827                 dialog_popup(p->frame,
828                         DIALOG_TITLE, title,
829                         DIALOG_TEXT, text,
830                         BUTTON_IDENT, 1, ident1,
831                         DIALOG_IMAGE, p->xm_error_pixmap,
832                         NULL);
833                 XtFree(ident1);
834                 XtFree(text);
835                 XtFree(title);
836                 return;
837         }
838
839         /*
840          * Get the necessary strings from the UI.
841          */
842         if (!(access_rights = p_gap_convert_permissions(p)))
843                  return;
844
845         /* Get the user's name and host */
846         if (!(user_name = (char *)XmTextGetString(p->gap2_user_text)) ||
847             !*user_name) {
848                 char *title = XtNewString(catgets(c->DT_catd, 1, 750, 
849                               "Calendar : Error - Access List and Permissions"));
850                 char *text = XtNewString(catgets(c->DT_catd, 1, 756,
851                       "Name and Access rights must be set to change an item in the Access List"));
852                 char *ident1 = XtNewString(catgets(c->DT_catd, 1, 95, "Continue"));
853
854                 XtFree(user_name);
855                 dialog_popup(p->frame,
856                         DIALOG_TITLE, title,
857                         DIALOG_TEXT, text,
858                         BUTTON_IDENT, 1, ident1,
859                         DIALOG_IMAGE, p->xm_error_pixmap,
860                         NULL);
861                 XtFree(ident1);
862                 XtFree(text);
863                 XtFree(title);
864                 return;
865         }
866
867         xmstr = XmStringCreateLocalized(user_name);
868
869         /* Create a new access entry and add it to the end of the list */
870         access_entry = 
871                 (CSA_access_rights *)ckalloc(sizeof(CSA_access_rights));
872         access_entry->user = 
873                 (CSA_calendar_user *)ckalloc(sizeof(CSA_calendar_user));
874         access_entry->user->user_name = cm_strdup(user_name);
875         access_entry->rights = access_rights;
876         access_entry->next = NULL;
877
878         /*
879          * Find and change the Access_Entry/name from the list.
880          */
881         item_cnt = 1;
882         while(item_cnt < *item_list) {
883                 last = step;
884                 step = step->next;
885                 ++item_cnt;
886         }
887
888         if (last)
889                 last->next = access_entry;
890         else     
891                 p->gap_list = access_entry;
892  
893         access_entry->next = step->next;
894
895         free(step->user);
896         free(step);
897  
898         XmListReplaceItemsPos(p->gap2_access_list, &xmstr, 1, *item_list);
899
900         p->changed_flag = True;
901         p_set_change(p);
902
903         XmStringFree(xmstr);
904         XtFree((XtPointer)item_list);
905 }