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 librararies 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: props_pu.c /main/22 1999/05/26 09:45:49 mgreess $ */
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.
31 #include <EUSCompat.h>
35 #include <sys/param.h>
38 #include <Xm/LabelG.h>
40 #include <Xm/DialogS.h>
41 #include <Xm/PushBG.h>
42 #include <Xm/RowColumn.h>
44 #include <Xm/SeparatoG.h>
47 #include <Xm/ToggleB.h>
48 #include <Xm/ToggleBG.h>
49 #include <Xm/ComboBox.h>
50 #include <Xm/SSpinB.h>
51 #include <Dt/HourGlass.h>
52 #include <Dt/PrintOptionsP.h>
57 #include "group_editor.h"
61 #include "dayglance.h"
68 static void p_gap_clear_toggles(Props_pu *p);
69 static void p_gap_center_cat_menu(Widget, Widget);
70 static void p_create_v4_group_access_pane(Props_pu *);
71 static Boolean valid_margin_str(Props_pu *, char *);
72 static void print_option_error(Props_pu *, int, int, char *);
74 static void activate_ui(Props_pu *p, PaneType item_no);
75 static void show_ui(Props_pu *p, PaneType item_no);
77 extern void p_create_v5_group_access_pane(Props_pu *);
78 extern void v5_gap_clear_pending_change(Props_pu *p);
79 extern Dimension ComputeMaxWidth(Widget, Widget, Widget, Widget);
81 extern void _i18n_HighestWidget( int num, Widget *ret, Dimension *dim, ... );
82 extern void _i18n_HighestWidgetAdjust( int num, Widget *ret, Dimension *dim, ... );
83 extern void _i18n_WidestWidget( int num, Widget *ret, Dimension *dim, ... );
87 /*******************************************************************************
91 *******************************************************************************/
93 #define PERMISSION_LEN 6
95 static XmString Pane_XmStrs[DATE_FORMAT_PANE + 1];
97 /*******************************************************************************
99 ** Functions static to props_pu.c
101 *******************************************************************************/
106 v4_gap_pending_change(Widget w, XtPointer data, XtPointer cbs) {
107 Props_pu *p = (Props_pu *) data;
109 if (p->v4_gap_pending_message_up == False) {
110 p->v4_gap_pending_message_up = True;
111 XtSetSensitive(p->gap_add_button, True);
116 v4_gap_clear_pending_change(Props_pu *p) {
118 if (p->v4_gap_pending_message_up == True) {
119 p->v4_gap_pending_message_up = False;
120 XtSetSensitive(p->gap_add_button, False);
125 p_set_change(Props_pu *p) {
130 p->changed_flag = True;
133 XtSetSensitive(p->ok_button, True);
135 XtSetSensitive(p->apply_button, True);
136 if (p->defaults_button)
137 XtSetSensitive(p->defaults_button, True);
138 if (p->base_form_mgr)
139 XtVaSetValues(p->base_form_mgr, XmNdefaultButton, p->apply_button, NULL);
143 p_clear_change(Props_pu *p) {
145 p->changed_flag = False;
147 XtSetSensitive(p->ok_button, False);
148 XtSetSensitive(p->apply_button, False);
149 XtSetSensitive(p->defaults_button, False);
150 if (p->cal->my_cal_version >= DATAVER4) {
152 if (*(str = (char *)XmTextGetString(p->gap_user_text))=='\0') {
153 v5_gap_clear_pending_change(p);
156 if (p->v5_gap_pending_message_up == False) {
157 p->v5_gap_pending_message_up = True;
158 XtSetSensitive(p->gap2_add_button, True);
161 XtSetSensitive(p->gap2_change_button, False);
163 v4_gap_clear_pending_change(p);
165 XtSetSensitive(p->gap_remove_button, False);
166 XtVaSetValues(p->base_form_mgr, XmNdefaultButton, p->close_button, NULL);
169 p_mark_change(Widget w, XtPointer data, XtPointer cbs) {
171 Props_pu *p = (Props_pu *)data;
177 set_menu_marker(Widget menu, Props_pu *p) {
183 XtVaGetValues(menu, XmNsubMenuId, &submenu, NULL);
184 XtVaGetValues(submenu,
185 XmNchildren, &children,
186 XmNnumChildren, &num_c,
190 XtAddCallback(children[--num_c], XmNactivateCallback, p_mark_change, p);
196 p_create_editor_pane(
201 char buf[MAXNAMELEN];
202 Props *p = (Props *)c->properties;
205 Props_pu *pu = (Props_pu *)c->properties_pu;
207 Dimension max_left_label_width;
209 Dimension widest, highest;
210 Dimension _toLabel, _toText, _toMenu, _toRC;
216 ep_form_mgr = XtVaCreateWidget("ep_form_mgr",
217 xmFormWidgetClass, pu->base_form_mgr,
218 XmNautoUnmanage, False,
219 XmNtopAttachment, XmATTACH_WIDGET,
220 XmNtopWidget, pu->separator1,
221 XmNleftAttachment, XmATTACH_FORM,
222 XmNrightAttachment, XmATTACH_FORM,
225 pu->pane_list[EDITOR_PANE] = ep_form_mgr;
228 ** Default start time and duration for appointments - use DSSW widget
229 ** for start time stuff.
231 xmstr = XmStringCreateLocalized(catgets(c->DT_catd, 1, 644,
232 "Appointment Times:"));
233 pu->ep_appt_label = XtVaCreateWidget("apptTimes",
234 xmLabelGadgetClass, ep_form_mgr,
235 XmNlabelString, xmstr,
236 XmNtopAttachment, XmATTACH_FORM,
238 XmNleftAttachment, XmATTACH_FORM,
243 build_dssw(&pu->ep_dssw, c, ep_form_mgr, False, False);
247 XtUnmanageChild(pu->ep_dssw.what_scrollwindow);
249 widgets[0] = pu->ep_dssw.start_label;
250 widgets[1] = pu->ep_dssw.start_text;
251 widgets[2] = pu->ep_dssw.start_menu;
252 widgets[3] = pu->ep_dssw.start_ampm_rc_mgr;
254 xmstr = XmStringCreateLocalized(catgets(c->DT_catd, 1, 645,
256 pu->ep_dur_label = widgets[4] = XtVaCreateWidget("duration",
257 xmLabelGadgetClass, pu->ep_dssw.dssw_form_mgr,
258 XmNlabelString, xmstr,
263 XtSetArg(args[ac], XmNcomboBoxType, XmDROP_DOWN_COMBO_BOX); ++ac;
264 XtSetArg(args[ac], XmNvisibleItemCount, 5); ++ac;
265 XtSetArg(args[ac], XmNpositionMode, XmONE_BASED); ++ac;
266 pu->ep_dur_cb = widgets[5] = XmCreateComboBox(pu->ep_dssw.dssw_form_mgr,
267 "ep_dur_cb", args, ac);
268 XtManageChild(pu->ep_dur_cb);
269 XtVaSetValues(pu->ep_dur_cb, XmNwidth, 75, NULL);
271 for(ac = 15; ac <= 90; ac += 15) {
273 sprintf(buf, "%d", ac);
274 xmstr = XmStringCreateLocalized(buf);
275 XmComboBoxAddItem((Widget)pu->ep_dur_cb,
281 XtVaGetValues(pu->ep_dur_cb, XmNtextField, &text_field, 0);
282 XtAddCallback(text_field, XmNvalueChangedCallback, p_mark_change, pu);
283 XtAddCallback(pu->ep_dur_cb, XmNselectionCallback, p_mark_change, pu);
285 xmstr = XmStringCreateLocalized(catgets(c->DT_catd, 1, 646, "Minutes"));
286 pu->ep_dur_message = widgets[6] = XtVaCreateWidget("message",
287 xmLabelGadgetClass, pu->ep_dssw.dssw_form_mgr,
288 XmNlabelString, xmstr,
295 _i18n_WidestWidget( 2, &curr, &max_left_label_width, pu->ep_dur_label,
296 pu->ep_dssw.start_label );
297 _toText = max_left_label_width + 2 * GAP;
298 _i18n_WidestWidget( 1, &curr, &widest, pu->ep_dur_label );
299 _toLabel = _toText - GAP - widest;
300 _i18n_WidestWidget( 1, &curr, &widest, pu->ep_dur_cb );
301 _toMenu = _toText + widest + GAP;
304 * pu->ep_dur_label, pu->ep_dur_cb, pu->ep_dur_message
306 _i18n_HighestWidgetAdjust( 3, &curr, &highest, pu->ep_dur_label,
307 pu->ep_dur_cb, pu->ep_dur_message );
310 XmNtopAttachment, XmATTACH_FORM,
313 XtVaSetValues( pu->ep_dur_label,
314 XmNleftAttachment, XmATTACH_FORM,
315 XmNleftOffset, _toLabel,
317 XtVaSetValues( pu->ep_dur_cb,
318 XmNleftAttachment, XmATTACH_FORM,
319 XmNleftOffset, _toText,
321 XtVaSetValues( pu->ep_dur_message,
322 XmNleftAttachment, XmATTACH_FORM,
323 XmNleftOffset, _toMenu,
328 * pu->ep_dssw.start_label, pu->ep_dssw.start_text,
329 * pu->ep_dssw.start_menu, pu->ep_dssw.start_ampm_rc_mgr
331 _i18n_WidestWidget( 1, &curr, &widest, pu->ep_dssw.start_label );
332 _toLabel = _toText - GAP - widest;
333 _i18n_WidestWidget( 1, &curr, &widest, pu->ep_dssw.start_text );
334 _toMenu = _toText + widest + GAP;
335 _i18n_WidestWidget( 1, &curr, &widest, pu->ep_dssw.start_menu );
336 _toRC = _toMenu + widest + GAP;
337 _i18n_HighestWidgetAdjust( 4, &curr, &highest, pu->ep_dssw.start_label,
338 pu->ep_dssw.start_text,
339 pu->ep_dssw.start_menu,
340 pu->ep_dssw.start_ampm_rc_mgr );
342 XmNtopAttachment, XmATTACH_WIDGET,
346 XtVaSetValues( pu->ep_dssw.start_label,
347 XmNleftAttachment, XmATTACH_FORM,
348 XmNleftOffset, _toLabel,
350 XtVaSetValues( pu->ep_dssw.start_text,
351 XmNleftAttachment, XmATTACH_FORM,
352 XmNleftOffset, _toText,
354 XtVaSetValues( pu->ep_dssw.start_menu,
355 XmNleftAttachment, XmATTACH_FORM,
356 XmNleftOffset, _toMenu,
358 XtVaSetValues( pu->ep_dssw.start_ampm_rc_mgr,
359 XmNleftAttachment, XmATTACH_FORM,
360 XmNleftOffset, _toRC,
363 XtVaSetValues(pu->ep_dssw.dssw_form_mgr,
364 XmNtopAttachment, XmATTACH_WIDGET,
365 XmNtopWidget, pu->ep_appt_label,
367 XmNrightAttachment, XmATTACH_FORM,
368 XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
369 XmNleftWidget, pu->ep_appt_label,
373 XtManageChildren(widgets, 7);
376 * Reminders widget (self contained)
378 build_reminders(&pu->ep_reminders, c, ep_form_mgr);
379 XtVaSetValues(pu->ep_reminders.bfpm_form_mgr,
380 XmNtopAttachment, XmATTACH_WIDGET,
381 XmNtopWidget, pu->ep_dssw.dssw_form_mgr,
383 XmNleftAttachment, XmATTACH_FORM,
387 ** Build the stuff for privacy ...
389 xmstr = XmStringCreateLocalized(
390 catgets(c->DT_catd, 1, 390, "Privacy:"));
391 pu->privacy_label = XtVaCreateWidget("privacy",
392 xmLabelGadgetClass, pu->ep_reminders.bfpm_form_mgr,
393 XmNlabelString, xmstr,
397 pu->privacy_menu = create_privacy_menu(pu->ep_reminders.bfpm_form_mgr);
398 XtVaSetValues(pu->privacy_menu,
401 ManageChildren(pu->ep_reminders.bfpm_form_mgr);
406 _i18n_WidestWidget( 1, &prev, &widest, pu->privacy_label );
407 _i18n_HighestWidget( 2, &prev, &highest, pu->ep_reminders.mailto_label,
408 pu->ep_reminders.mailto_text );
409 _i18n_HighestWidgetAdjust( 2, &curr, &highest,
410 pu->privacy_label, pu->privacy_menu );
412 XmNtopAttachment, XmATTACH_WIDGET,
415 XmNbottomAttachment, XmATTACH_FORM,
418 XtVaSetValues( pu->privacy_label,
419 XmNleftAttachment, XmATTACH_FORM,
420 XmNleftOffset, 15, /* See reminders.c l. 783 */
422 XtVaSetValues( pu->privacy_menu,
423 XmNleftAttachment, XmATTACH_FORM,
424 XmNleftOffset, 15 + widest + 5,
427 XtAddCallback(pu->privacy_menu, XmNselectionCallback, p_mark_change, pu);
429 XtAddCallback(pu->ep_dssw.start_text, XmNvalueChangedCallback, p_mark_change, pu);
430 XtAddCallback(pu->ep_dssw.start_am, XmNvalueChangedCallback, p_mark_change, pu);
431 XtAddCallback(pu->ep_dssw.start_pm, XmNvalueChangedCallback, p_mark_change, pu);
432 XtAddCallback(pu->ep_reminders.beep_text, XmNvalueChangedCallback, p_mark_change, pu);
433 XtAddCallback(pu->ep_reminders.beep_toggle, XmNvalueChangedCallback, p_mark_change, pu);
435 set_menu_marker(pu->ep_reminders.beep_menu, pu);
436 XtAddCallback(pu->ep_reminders.flash_text,
437 XmNvalueChangedCallback, p_mark_change, pu);
438 XtAddCallback(pu->ep_reminders.flash_toggle,
439 XmNvalueChangedCallback, p_mark_change, pu);
440 set_menu_marker(pu->ep_reminders.flash_menu, pu);
441 XtAddCallback(pu->ep_reminders.mail_text,
442 XmNvalueChangedCallback, p_mark_change, pu);
443 XtAddCallback(pu->ep_reminders.mail_toggle,
444 XmNvalueChangedCallback, p_mark_change, pu);
445 set_menu_marker(pu->ep_reminders.mail_menu, pu);
446 XtAddCallback(pu->ep_reminders.mailto_text,
447 XmNvalueChangedCallback, p_mark_change, pu);
448 XtAddCallback(pu->ep_reminders.popup_text,
449 XmNvalueChangedCallback, p_mark_change, pu);
450 XtAddCallback(pu->ep_reminders.popup_toggle,
451 XmNvalueChangedCallback, p_mark_change, pu);
452 set_menu_marker(pu->ep_reminders.popup_menu, pu);
454 ManageChildren(ep_form_mgr);
458 format_hour(char buffer[], int hour, DisplayType dt, Calendar *c)
462 if ((hour == 24) || (hour == 0))
463 cm_strcpy(buffer, catgets(c->DT_catd, 1, 758,"midnight"));
465 sprintf(buffer, "%2d:00 %s", hour-12,
466 catgets(c->DT_catd, 1, 3, "pm"));
468 sprintf(buffer, "%2d:00 %s", hour,
469 catgets(c->DT_catd, 1, 4, "am"));
472 sprintf(buffer, " %02d00", hour);
476 set_scale_value(Widget w, int val, Props_pu *p)
479 char label_buffer[50];
481 Calendar *c = p->cal;
482 Props *props = (Props *) c->properties;
484 format_hour(label_buffer, val, (DisplayType) get_int_prop(props, CP_DEFAULTDISP), c);
486 xmstr = XmStringCreateLocalized(label_buffer);
489 XmNlabelString, xmstr,
497 print_it(Widget w, XtPointer data, XtPointer cbs) {
499 Props_pu *p = (Props_pu *)data;
500 XmScaleCallbackStruct *scbs = (XmScaleCallbackStruct *)cbs;
504 ** Functions related to the display pane
507 p_dp_scale_mod_proc(Widget w, XtPointer data, XtPointer cbs) {
509 Props_pu *p = (Props_pu *)data;
510 XmScaleCallbackStruct *scbs = (XmScaleCallbackStruct *)cbs;
515 if (w == p->dp_beg_scale) {
516 XmScaleGetValue(p->dp_end_scale, &val);
517 if (val < scbs->value)
519 XmScaleSetValue(p->dp_end_scale, scbs->value + 1);
520 set_scale_value(p->dp_end_value, scbs->value + 1, p);
522 set_scale_value(p->dp_beg_value, scbs->value, p);
526 XmScaleGetValue(p->dp_beg_scale, &val);
527 if (val > scbs->value)
529 XmScaleSetValue(p->dp_beg_scale, scbs->value - 1);
530 set_scale_value(p->dp_beg_value, scbs->value - 1, p);
532 set_scale_value(p->dp_end_value, scbs->value, p);
540 p_create_display_pane(Props_pu *p) {
541 Calendar *c = calendar;
545 Dimension widest, highest;
547 Dimension _to1st, _to2nd, _to3rd;
552 dp_form_mgr = XtVaCreateWidget("dp_form_mgr",
553 xmFormWidgetClass, p->base_form_mgr,
554 XmNautoUnmanage, False,
555 XmNtopAttachment, XmATTACH_WIDGET,
556 XmNtopWidget, p->separator1,
557 XmNleftAttachment, XmATTACH_FORM,
558 XmNrightAttachment, XmATTACH_FORM,
559 XmNbottomAttachment, XmATTACH_WIDGET,
561 XmNbottomWidget, p->separator2,
563 p->pane_list[DISPLAY_PANE] = dp_form_mgr;
566 ** User Calendar Location label and text field
568 xmstr = XmStringCreateLocalized(
569 catgets(c->DT_catd, 1, 391, "User Calendar Location:"));
570 p->dp_loc_label = XtVaCreateWidget("location",
571 xmLabelGadgetClass, dp_form_mgr,
572 XmNlabelString, xmstr,
576 p->dp_loc_text = XtVaCreateWidget("dp_loc_text",
577 xmTextWidgetClass, dp_form_mgr,
580 XtAddCallback(p->dp_loc_text,
581 XmNvalueChangedCallback, p_mark_change, p);
584 ** Day Boundaries label and beginning/ending sliders
587 /* There is some additional, very odd layout stuff that
588 happens elsewhere. This is because sliders do not align
589 well with text widgets at all. We want to align the
590 centers of the text and slider widgets. This is done by
591 finding the relative heights of the widgets, and using half
592 the differenmce as a bottom offset. Why don't you see that
593 below? Well, it's because the stupid toolkit reports the
594 height of a slider as 0 unless that slider is mapped. Thus,
595 this bit of alignment cannot happen until the panel with these
596 items is mapped. Pretty stupid. Thus the positioning happens
597 just after the panel is mapped. */
598 xmstr = XmStringCreateLocalized(
599 catgets(c->DT_catd, 1, 392, "Day Boundaries:"));
600 p->dp_day_label = XtVaCreateWidget("dayBoundaries",
601 xmLabelGadgetClass, dp_form_mgr,
602 XmNlabelString, xmstr,
606 xmstr = XmStringCreateLocalized(catgets(c->DT_catd, 1, 393, "Begin:"));
607 p->dp_beg_label = XtVaCreateWidget("begin",
608 xmLabelGadgetClass, dp_form_mgr,
609 XmNlabelString, xmstr,
613 p->dp_beg_scale = XtVaCreateWidget("dp_beg_scale",
614 xmScaleWidgetClass, dp_form_mgr,
615 XmNorientation, XmHORIZONTAL,
621 XtAddCallback(p->dp_beg_scale, XmNvalueChangedCallback,
622 p_dp_scale_mod_proc, p);
623 XtAddCallback(p->dp_beg_scale, XmNdragCallback,
624 p_dp_scale_mod_proc, p);
626 xmstr = XmStringCreateLocalized(catgets(c->DT_catd, 1, 759, "value"));
627 p->dp_beg_value = XtVaCreateWidget("begin",
628 xmLabelGadgetClass, dp_form_mgr,
629 XmNlabelString, xmstr,
633 xmstr = XmStringCreateLocalized(catgets(c->DT_catd, 1, 394, "End:"));
634 p->dp_end_label = XtVaCreateWidget("end",
635 xmLabelGadgetClass, dp_form_mgr,
636 XmNlabelString, xmstr,
640 p->dp_end_scale = XtVaCreateWidget("dp_end_scale",
641 xmScaleWidgetClass, dp_form_mgr,
642 XmNorientation, XmHORIZONTAL,
648 XtAddCallback(p->dp_end_scale, XmNvalueChangedCallback,
649 p_dp_scale_mod_proc, p);
650 XtAddCallback(p->dp_end_scale, XmNdragCallback,
651 p_dp_scale_mod_proc, p);
653 xmstr = XmStringCreateLocalized(catgets(c->DT_catd, 1, 760, "value"));
654 p->dp_end_value = XtVaCreateWidget("begin",
655 xmLabelGadgetClass, dp_form_mgr,
656 XmNlabelString, xmstr,
661 ** 12/24 Hour Display label and toggle buttons
663 xmstr = XmStringCreateLocalized(
664 catgets(c->DT_catd, 1, 395, "Hour Display:"));
665 p->dp_hour_label = XtVaCreateWidget("hourDisplay",
666 xmLabelGadgetClass, dp_form_mgr,
667 XmNlabelString, xmstr,
671 p->dp_hour_rc_mgr = XtVaCreateWidget("dp_hour_rc_mgr",
672 xmRowColumnWidgetClass, dp_form_mgr,
673 XmNpacking, XmPACK_COLUMN,
674 XmNorientation, XmHORIZONTAL,
675 XmNradioBehavior, True,
676 XmNisHomogeneous, True,
677 XmNentryClass, xmToggleButtonGadgetClass,
680 xmstr = XmStringCreateLocalized(catgets(c->DT_catd, 1, 396, "12 Hour"));
681 p->dp_hour12_toggle = widgets[0] = XtVaCreateWidget("twelveHour",
682 xmToggleButtonGadgetClass, p->dp_hour_rc_mgr,
683 XmNlabelString, xmstr,
687 XtAddCallback(p->dp_hour12_toggle,
688 XmNvalueChangedCallback, p_mark_change, p);
690 xmstr = XmStringCreateLocalized(catgets(c->DT_catd, 1, 397, "24 Hour"));
691 p->dp_hour24_toggle = widgets[1] = XtVaCreateWidget("twentyFourHour",
692 xmToggleButtonGadgetClass, p->dp_hour_rc_mgr,
693 XmNlabelString, xmstr,
697 XtAddCallback(p->dp_hour24_toggle,
698 XmNvalueChangedCallback, p_mark_change, p);
700 XtManageChildren(widgets, 2);
703 ** Default view label and toggle buttons
705 xmstr = XmStringCreateLocalized(
706 catgets(c->DT_catd, 1, 398, "Default View:"));
707 p->dp_view_label = XtVaCreateWidget("defaultView:",
708 xmLabelGadgetClass, dp_form_mgr,
709 XmNlabelString, xmstr,
713 p->dp_view_rc_mgr = XtVaCreateWidget("dp_view_rc_mgr",
714 xmRowColumnWidgetClass, dp_form_mgr,
715 XmNpacking, XmPACK_COLUMN,
716 XmNorientation, XmHORIZONTAL,
717 XmNradioBehavior, True,
718 XmNisHomogeneous, True,
719 XmNentryClass, xmToggleButtonGadgetClass,
723 xmstr = XmStringCreateLocalized(catgets(c->DT_catd, 1, 402, "Day"));
724 p->dp_view_day_toggle = XtVaCreateWidget("day",
725 xmToggleButtonGadgetClass, p->dp_view_rc_mgr,
726 XmNlabelString, xmstr,
730 XtAddCallback(p->dp_view_day_toggle,
731 XmNvalueChangedCallback, p_mark_change, p);
733 xmstr = XmStringCreateLocalized(catgets(c->DT_catd, 1, 401, "Week"));
734 p->dp_view_week_toggle = XtVaCreateWidget("week",
735 xmToggleButtonGadgetClass, p->dp_view_rc_mgr,
736 XmNlabelString, xmstr,
740 XtAddCallback(p->dp_view_week_toggle,
741 XmNvalueChangedCallback, p_mark_change, p);
743 xmstr = XmStringCreateLocalized(catgets(c->DT_catd, 1, 400, "Month"));
744 p->dp_view_month_toggle = XtVaCreateWidget("month",
745 xmToggleButtonGadgetClass, p->dp_view_rc_mgr,
746 XmNlabelString, xmstr,
750 XtAddCallback(p->dp_view_month_toggle,
751 XmNvalueChangedCallback, p_mark_change, p);
753 xmstr = XmStringCreateLocalized(catgets(c->DT_catd, 1, 399, "Year"));
754 p->dp_view_year_toggle = XtVaCreateWidget("year",
755 xmToggleButtonGadgetClass, p->dp_view_rc_mgr,
756 XmNlabelString, xmstr,
760 XtAddCallback(p->dp_view_year_toggle,
761 XmNvalueChangedCallback, p_mark_change, p);
763 ManageChildren(p->dp_view_rc_mgr);
766 ** Initial Calendar View label and text field
768 xmstr = XmStringCreateLocalized(
769 catgets(c->DT_catd, 1, 403, "Initial Calendar View:"));
770 p->dp_init_view_label = XtVaCreateWidget("initialView",
771 xmLabelGadgetClass, dp_form_mgr,
772 XmNlabelString, xmstr,
776 p->dp_init_view_text = XtVaCreateWidget("dp_init_view_text",
777 xmTextWidgetClass, dp_form_mgr,
780 XtAddCallback(p->dp_init_view_text,
781 XmNvalueChangedCallback, p_mark_change, p);
786 _i18n_WidestWidget( 7, &curr, &widest, p->dp_loc_label,
787 p->dp_day_label, p->dp_beg_label,
788 p->dp_end_label, p->dp_hour_label,
789 p->dp_view_label, p->dp_init_view_label );
790 _to2nd = 5 + widest + 10;
793 * p->dp_loc_label, p->dp_loc_text
795 _i18n_WidestWidget( 1, &curr, &widest, p->dp_loc_label );
796 _to1st = _to2nd - 10 - widest;
797 _i18n_HighestWidgetAdjust( 2, &curr, &highest, p->dp_loc_label,
800 XmNtopAttachment, XmATTACH_FORM,
803 XtVaSetValues( p->dp_loc_label,
804 XmNleftAttachment, XmATTACH_FORM,
805 XmNleftOffset, _to1st,
807 XtVaSetValues( p->dp_loc_text,
808 XmNleftAttachment, XmATTACH_FORM,
809 XmNleftOffset, _to2nd,
816 _i18n_WidestWidget( 1, &curr, &widest, p->dp_day_label );
817 _to1st = _to2nd - 10 - widest;
818 XtVaSetValues( p->dp_day_label,
819 XmNtopAttachment, XmATTACH_WIDGET,
823 XtVaSetValues( p->dp_day_label,
824 XmNleftAttachment, XmATTACH_FORM,
825 XmNleftOffset, _to1st,
827 prev = p->dp_day_label;
830 * p->dp_beg_label, p->dp_beg_scale, p->dp_beg_value
832 _i18n_WidestWidget( 1, &curr, &widest, p->dp_beg_label );
833 _to1st = _to2nd - 10 - widest;
834 _i18n_WidestWidget( 1, &curr, &widest, p->dp_beg_scale );
835 _to3rd = _to2nd + widest + 5;
836 _i18n_HighestWidgetAdjust( 3, &curr, &highest, p->dp_beg_label,
837 p->dp_beg_scale, p->dp_beg_value );
839 XmNtopAttachment, XmATTACH_WIDGET,
843 XtVaSetValues( p->dp_beg_label,
844 XmNleftAttachment, XmATTACH_FORM,
845 XmNleftOffset, _to1st,
847 XtVaSetValues( p->dp_beg_scale,
848 XmNleftAttachment, XmATTACH_FORM,
849 XmNleftOffset, _to2nd,
851 XtVaSetValues( p->dp_beg_value,
852 XmNleftAttachment, XmATTACH_FORM,
853 XmNleftOffset, _to3rd,
858 * p->dp_end_label, p->dp_end_scale, p->dp_end_value
860 _i18n_WidestWidget( 1, &curr, &widest, p->dp_end_label );
861 _to1st = _to2nd - 10 - widest;
862 _i18n_WidestWidget( 1, &curr, &widest, p->dp_end_scale );
863 _to3rd = _to2nd + widest + 5;
864 _i18n_HighestWidgetAdjust( 3, &curr, &highest, p->dp_end_label,
865 p->dp_end_scale, p->dp_end_value );
867 XmNtopAttachment, XmATTACH_WIDGET,
871 XtVaSetValues( p->dp_end_label,
872 XmNleftAttachment, XmATTACH_FORM,
873 XmNleftOffset, _to1st,
875 XtVaSetValues( p->dp_end_scale,
876 XmNleftAttachment, XmATTACH_FORM,
877 XmNleftOffset, _to2nd,
879 XtVaSetValues( p->dp_end_value,
880 XmNleftAttachment, XmATTACH_FORM,
881 XmNleftOffset, _to3rd,
886 * p->dp_hour_label, p->dp_hour_rc_mgr
888 _i18n_WidestWidget( 1, &curr, &widest, p->dp_hour_label );
889 _to1st = _to2nd - 10 - widest;
890 _i18n_HighestWidgetAdjust( 2, &curr, &highest, p->dp_hour_label,
893 XmNtopAttachment, XmATTACH_WIDGET,
897 XtVaSetValues( p->dp_hour_label,
898 XmNleftAttachment, XmATTACH_FORM,
899 XmNleftOffset, _to1st,
901 XtVaSetValues( p->dp_hour_rc_mgr,
902 XmNleftAttachment, XmATTACH_FORM,
903 XmNleftOffset, _to2nd,
908 * p->dp_view_label, p->dp_view_rc_mgr
910 _i18n_WidestWidget( 1, &curr, &widest, p->dp_view_label );
911 _to1st = _to2nd - 10 - widest;
912 _i18n_HighestWidgetAdjust( 2, &curr, &highest, p->dp_view_label,
915 XmNtopAttachment, XmATTACH_WIDGET,
919 XtVaSetValues( p->dp_view_label,
920 XmNleftAttachment, XmATTACH_FORM,
921 XmNleftOffset, _to1st,
923 XtVaSetValues( p->dp_view_rc_mgr,
924 XmNleftAttachment, XmATTACH_FORM,
925 XmNleftOffset, _to2nd,
930 * p->dp_init_view_label, p->dp_init_view_text
932 _i18n_WidestWidget( 1, &curr, &widest, p->dp_init_view_label );
933 _to1st = _to2nd - 10 - widest;
934 _i18n_HighestWidgetAdjust( 2, &curr, &highest, p->dp_init_view_label,
935 p->dp_init_view_text );
937 XmNtopAttachment, XmATTACH_WIDGET,
941 XtVaSetValues( p->dp_init_view_label,
942 XmNleftAttachment, XmATTACH_FORM,
943 XmNleftOffset, _to1st,
945 XtVaSetValues( p->dp_init_view_text,
946 XmNleftAttachment, XmATTACH_FORM,
947 XmNleftOffset, _to2nd,
952 ManageChildren(dp_form_mgr);
956 p_gap_convert_permissions(
959 Calendar *c = calendar;
960 unsigned int perm_val = 0;
963 * V5DEP: If this is a V5 server w/V1 backing store probably should use
966 if (p->cal->my_cal_version >= DATAVER4) {
967 if (XmToggleButtonGadgetGetState(p->gap2_public_tog[GAP_VIEW]))
968 perm_val |= CSA_VIEW_PUBLIC_ENTRIES;
969 if (XmToggleButtonGadgetGetState(
970 p->gap2_public_tog[GAP_INSERT]))
971 perm_val |= CSA_INSERT_PUBLIC_ENTRIES;
972 if (XmToggleButtonGadgetGetState(
973 p->gap2_public_tog[GAP_CHANGE]))
974 perm_val |= CSA_CHANGE_PUBLIC_ENTRIES;
975 if (XmToggleButtonGadgetGetState(
976 p->gap2_semi_tog[GAP_VIEW]))
977 perm_val |= CSA_VIEW_CONFIDENTIAL_ENTRIES;
978 if (XmToggleButtonGadgetGetState(
979 p->gap2_semi_tog[GAP_INSERT]))
980 perm_val |= CSA_INSERT_CONFIDENTIAL_ENTRIES;
981 if (XmToggleButtonGadgetGetState(
982 p->gap2_semi_tog[GAP_CHANGE]))
983 perm_val |= CSA_CHANGE_CONFIDENTIAL_ENTRIES;
984 if (XmToggleButtonGadgetGetState(
985 p->gap2_private_tog[GAP_VIEW]))
986 perm_val |= CSA_VIEW_PRIVATE_ENTRIES;
987 if (XmToggleButtonGadgetGetState(
988 p->gap2_private_tog[GAP_INSERT]))
989 perm_val |= CSA_INSERT_PRIVATE_ENTRIES;
990 if (XmToggleButtonGadgetGetState(
991 p->gap2_private_tog[GAP_CHANGE]))
992 perm_val |= CSA_CHANGE_PRIVATE_ENTRIES;
994 perm_val |= CSA_ORGANIZER_RIGHTS;
996 if (XmToggleButtonGadgetGetState(p->gap_browse_toggle))
997 perm_val |= CSA_X_DT_BROWSE_ACCESS;
998 if (XmToggleButtonGadgetGetState(p->gap_insert_toggle))
999 perm_val |= CSA_X_DT_INSERT_ACCESS;
1000 if (XmToggleButtonGadgetGetState(p->gap_delete_toggle))
1001 perm_val |= CSA_X_DT_DELETE_ACCESS;
1004 if (perm_val == 0) {
1005 char *title = XtNewString(catgets(c->DT_catd, 1, 750,
1006 "Calendar : Error - Access List and Permissions"));
1007 char *text = XtNewString(catgets(c->DT_catd, 1, 405,
1008 "Please select at least one permission. "));
1009 char *ident1 = XtNewString(catgets(c->DT_catd, 1, 95,
1011 dialog_popup(p->frame,
1012 DIALOG_TITLE, title,
1014 BUTTON_IDENT, 1, ident1,
1015 BUTTON_HELP, ACCESS_RIGHTS_ERROR_HELP,
1016 DIALOG_IMAGE, p->xm_error_pixmap,
1027 p_gap_create_perm_str(CSA_flags perm_val) {
1029 char c_value[PERMISSION_LEN + 1];
1031 if (perm_val & CSA_X_DT_BROWSE_ACCESS) {
1035 if (perm_val & CSA_X_DT_INSERT_ACCESS) {
1039 if (perm_val & CSA_X_DT_DELETE_ACCESS) {
1044 return cm_strdup(c_value);
1048 p_gap_create_entry_string(Props_pu *p, char *who, char *p_str, XmString *val) {
1051 buf = (char *)ckalloc(NAME_LEN + PERMISSION_LEN + 1);
1052 sprintf(buf, "%-*s%s", NAME_LEN, who, p_str);
1053 *val = XmStringCreateLocalized(buf);
1058 p_gap_add_proc(Widget w, XtPointer client_data, XtPointer callback_struct) {
1059 int *item_list = NULL, item_cnt = 0;
1062 Props_pu *p = (Props_pu *)client_data;
1064 CSA_access_list step = p->gap_list, last = NULL, new_e;
1067 ** First, get the necessary strings from the UI
1069 if (!(pt = p_gap_convert_permissions(p)))
1071 p_str = p_gap_create_perm_str(pt);
1072 who = (char *)XmTextGetString(p->gap_user_text);
1073 p_gap_create_entry_string(p, who, p_str, &xmstr);
1077 ** Either add or change the item on the UI and to the Access_Entry
1080 new_e = (CSA_access_list)ckalloc(sizeof(CSA_access_rights));
1081 new_e->user = (CSA_calendar_user *)ckalloc(sizeof(CSA_calendar_user));
1082 new_e->user->user_name = cm_strdup(who);
1087 if (XmListGetSelectedPos(p->gap_access_list, &item_list, &item_cnt)) {
1089 ** We're changing the value, find the item in the linked list
1092 while(item_cnt < *item_list) {
1100 p->gap_list = new_e;
1102 new_e->next = step->next;
1106 XmListReplaceItemsPos(p->gap_access_list, &xmstr, 1, *item_list);
1107 XtFree((XtPointer)item_list);
1110 ** Add the Access_Entry item to the end of the list
1113 p->gap_list = new_e;
1119 XmListAddItem(p->gap_access_list, xmstr, 0);
1121 XmStringFree(xmstr);
1126 p_gap_remove_proc(Widget w, XtPointer client_data, XtPointer callback_struct) {
1127 Calendar *c = calendar;
1128 int *item_list = NULL, item_cnt = 0;
1129 Props_pu *p = (Props_pu *)client_data;
1130 CSA_access_list step = p->gap_list, last = NULL;
1132 if (XmListGetSelectedPos(p->gap_access_list, &item_list, &item_cnt)) {
1134 ** Find and delete the Access_Entry from the list
1137 while(item_cnt < *item_list) {
1143 last->next = step->next;
1145 p->gap_list = step->next;
1150 XmListDeleteItemsPos(p->gap_access_list, 1, *item_list);
1151 XmTextSetString(p->gap_user_text, "\0");
1152 p_gap_clear_toggles(p);
1154 if (p->cal->my_cal_version >= DATAVER4) {
1155 v5_gap_clear_pending_change(p);
1156 XtSetSensitive(p->gap2_change_button, False);
1157 XtSetSensitive(p->gap_remove_button, False);
1159 v4_gap_clear_pending_change(p);
1160 XtFree((XtPointer)item_list);
1163 char *title = XtNewString(catgets(c->DT_catd, 1, 750, "Calendar : Error - Access List and Permissions"));
1164 char *text = XtNewString(catgets(c->DT_catd, 1, 408, "Please select a name first. "));
1165 char *ident1 = XtNewString(catgets(c->DT_catd, 1, 95, "Continue"));
1166 dialog_popup(p->frame,
1167 DIALOG_TITLE, title,
1169 BUTTON_IDENT, 1, ident1,
1170 DIALOG_IMAGE, p->xm_error_pixmap,
1179 gap_list_select_proc(Widget w, XtPointer client_data, XtPointer data) {
1180 int *item_list = NULL, item_cnt = 0;
1181 Props_pu *p = (Props_pu *)client_data;
1182 CSA_access_list step = p->gap_list;
1184 if (!XmListGetSelectedPos(p->gap_access_list, &item_list, &item_cnt))
1187 if (item_cnt <= 0) {
1188 if (p->cal->my_cal_version >= DATAVER4)
1189 XtSetSensitive(p->gap2_change_button, False);
1190 XtSetSensitive(p->gap_remove_button, False);
1192 if (p->cal->my_cal_version >= DATAVER4)
1193 XtSetSensitive(p->gap2_change_button, True);
1194 XtSetSensitive(p->gap_remove_button, True);
1198 while(step && item_cnt < *item_list) {
1202 XmTextSetString(p->gap_user_text, step->user->user_name);
1205 * V5DEP: If this is a V5 server w/V1 backing store probably
1206 * should use old access flags.
1208 if (p->cal->my_cal_version >= DATAVER4) {
1209 XmToggleButtonGadgetSetState(p->gap2_public_tog[GAP_VIEW],
1210 (step->rights & CSA_VIEW_PUBLIC_ENTRIES) ? True : False,
1212 XmToggleButtonGadgetSetState(p->gap2_public_tog[GAP_INSERT],
1213 (step->rights & CSA_INSERT_PUBLIC_ENTRIES) ?
1214 True : False, True);
1215 XmToggleButtonGadgetSetState(p->gap2_public_tog[GAP_CHANGE],
1216 (step->rights & CSA_CHANGE_PUBLIC_ENTRIES) ?
1217 True : False, True);
1218 XmToggleButtonGadgetSetState(p->gap2_semi_tog[GAP_VIEW],
1219 (step->rights & CSA_VIEW_CONFIDENTIAL_ENTRIES) ?
1220 True : False, True);
1221 XmToggleButtonGadgetSetState(p->gap2_semi_tog[GAP_INSERT],
1222 (step->rights & CSA_INSERT_CONFIDENTIAL_ENTRIES) ?
1223 True : False, True);
1224 XmToggleButtonGadgetSetState(p->gap2_semi_tog[GAP_CHANGE],
1225 (step->rights & CSA_CHANGE_CONFIDENTIAL_ENTRIES) ?
1226 True : False, True);
1227 XmToggleButtonGadgetSetState(p->gap2_private_tog[GAP_VIEW],
1228 (step->rights & CSA_VIEW_PRIVATE_ENTRIES) ?
1229 True : False, True);
1230 XmToggleButtonGadgetSetState(p->gap2_private_tog[GAP_INSERT],
1231 (step->rights & CSA_INSERT_PRIVATE_ENTRIES) ?
1232 True : False, True);
1233 XmToggleButtonGadgetSetState(p->gap2_private_tog[GAP_CHANGE],
1234 (step->rights & CSA_CHANGE_PRIVATE_ENTRIES) ?
1235 True : False, True);
1237 XmToggleButtonGadgetSetState(p->gap_browse_toggle,
1238 (step->rights & CSA_X_DT_BROWSE_ACCESS) ? True : False,
1240 XmToggleButtonGadgetSetState(p->gap_insert_toggle,
1241 (step->rights & CSA_X_DT_INSERT_ACCESS) ? True : False,
1243 XmToggleButtonGadgetSetState(p->gap_delete_toggle,
1244 (step->rights & CSA_X_DT_DELETE_ACCESS) ? True : False,
1248 XtFree((XtPointer)item_list);
1254 p_create_v4_group_access_pane(Props_pu *p) {
1255 Calendar *c = calendar;
1257 Widget gap_form_mgr;
1259 Dimension widest, highest, dmy;
1266 gap_form_mgr = XtVaCreateWidget("gap_form_mgr",
1267 xmFormWidgetClass, p->base_form_mgr,
1268 XmNautoUnmanage, False,
1269 XmNtopAttachment, XmATTACH_WIDGET,
1270 XmNtopWidget, p->separator1,
1271 XmNleftAttachment, XmATTACH_FORM,
1272 XmNrightAttachment, XmATTACH_FORM,
1273 XmNbottomAttachment, XmATTACH_WIDGET,
1274 XmNbottomOffset, 10,
1275 XmNbottomWidget, p->separator2,
1277 p->pane_list[GROUP_ACCESS_PANE] = gap_form_mgr;
1280 ** User Name label, text field, and add button
1282 xmstr = XmStringCreateLocalized(
1283 catgets(c->DT_catd, 1, 410, "User Name:"));
1284 p->gap_user_label = XtVaCreateWidget("userName",
1285 xmLabelGadgetClass, gap_form_mgr,
1286 XmNlabelString, xmstr,
1288 XmStringFree(xmstr);
1290 p->gap_user_text = XtVaCreateWidget("gap_user_text",
1291 xmTextWidgetClass, gap_form_mgr,
1294 XtAddCallback(p->gap_user_text,
1295 XmNvalueChangedCallback, v4_gap_pending_change,
1298 xmstr = XmStringCreateLocalized(
1299 catgets(c->DT_catd, 1, 411, "Add Name"));
1300 p->gap_add_button = XtVaCreateWidget("addName",
1301 xmPushButtonGadgetClass, gap_form_mgr,
1302 XmNlabelString, xmstr,
1303 XmNnavigationType, XmTAB_GROUP,
1304 XmNsensitive, False,
1306 XmStringFree(xmstr);
1307 XtAddCallback(p->gap_add_button,
1308 XmNactivateCallback, p_gap_add_proc, p);
1311 ** Access list stuff and remove button
1314 char *user = XtNewString(catgets(c->DT_catd, 1, 983, "User Name"));
1315 char *perm = XtNewString(catgets(c->DT_catd, 1, 413, "Permissions"));
1316 buf = (char *)ckalloc(cm_strlen(user) + cm_strlen(perm) + 10);
1317 sprintf(buf, "%-*s%s", NAME_LEN, user, perm);
1318 xmstr = XmStringCreateLocalized(buf);
1323 p->gap_access_header = XtVaCreateManagedWidget("gap_access_header",
1324 xmLabelGadgetClass, gap_form_mgr,
1325 XmNlabelString, xmstr,
1327 XmStringFree(xmstr);
1331 p->gap_access_list = (Widget)XmCreateScrolledList(gap_form_mgr,
1332 "gap_access_list", NULL, 0);
1333 p->gap_access_list_sw = XtParent(p->gap_access_list);
1334 XtVaSetValues(p->gap_access_list_sw,
1336 XtVaSetValues(p->gap_access_list,
1337 XmNvisibleItemCount, 10,
1338 XmNdoubleClickInterval, 5,
1340 XtAddCallback(p->gap_access_list,
1341 XmNbrowseSelectionCallback, gap_list_select_proc, p);
1342 XtManageChild(p->gap_access_list);
1344 xmstr = XmStringCreateLocalized(
1345 catgets(c->DT_catd, 1, 414, "Remove Name"));
1346 p->gap_remove_button = XtVaCreateWidget("removeName",
1347 xmPushButtonGadgetClass, gap_form_mgr,
1348 XmNlabelString, xmstr,
1349 XmNnavigationType, XmTAB_GROUP,
1350 XmNsensitive, False,
1352 XmStringFree(xmstr);
1353 XtAddCallback(p->gap_remove_button,
1354 XmNactivateCallback, p_gap_remove_proc, p);
1356 xmstr = XmStringCreateLocalized(
1357 catgets(c->DT_catd, 1, 415, "B = Browse I = Insert D = Delete"));
1358 p->gap_access_msg = XtVaCreateWidget("browseInsertDelete",
1359 xmLabelGadgetClass, gap_form_mgr,
1360 XmNlabelString, xmstr,
1362 XmStringFree(xmstr);
1365 ** Finally, permissions label and choice toggle list
1367 xmstr = XmStringCreateLocalized(
1368 catgets(c->DT_catd, 1, 416, "Permissions:"));
1369 p->gap_perm_label = XtVaCreateWidget("permissions",
1370 xmLabelGadgetClass, gap_form_mgr,
1371 XmNlabelString, xmstr,
1373 XmStringFree(xmstr);
1375 p->gap_perm_rc_mgr = XtVaCreateWidget("gap_perm_rc_mgr",
1376 xmRowColumnWidgetClass, gap_form_mgr,
1377 XmNpacking, XmPACK_COLUMN,
1378 XmNorientation, XmHORIZONTAL,
1379 XmNradioBehavior, False,
1380 XmNisHomogeneous, True,
1381 XmNindicatorType, XmN_OF_MANY,
1382 XmNentryClass, xmToggleButtonGadgetClass,
1385 xmstr = XmStringCreateLocalized(catgets(c->DT_catd, 1, 417, "Browse"));
1386 p->gap_browse_toggle = XtVaCreateWidget("browse",
1387 xmToggleButtonGadgetClass, p->gap_perm_rc_mgr,
1388 XmNlabelString, xmstr,
1390 XmStringFree(xmstr);
1392 xmstr = XmStringCreateLocalized(catgets(c->DT_catd, 1, 342, "Insert"));
1393 p->gap_insert_toggle = XtVaCreateWidget("insert",
1394 xmToggleButtonGadgetClass, p->gap_perm_rc_mgr,
1395 XmNlabelString, xmstr,
1397 XmStringFree(xmstr);
1399 xmstr = XmStringCreateLocalized(catgets(c->DT_catd, 1, 419, "Delete"));
1400 p->gap_delete_toggle = XtVaCreateWidget("delete",
1401 xmToggleButtonGadgetClass, p->gap_perm_rc_mgr,
1402 XmNlabelString, xmstr,
1404 XmStringFree(xmstr);
1411 * p->gap_user_label, p->gap_user_text, p->gap_add_button
1413 _i18n_HighestWidgetAdjust( 3, &curr, &highest, p->gap_user_label,
1414 p->gap_user_text, p->gap_add_button );
1415 XtVaSetValues( curr,
1416 XmNtopAttachment, XmATTACH_FORM,
1420 XtVaSetValues( p->gap_user_label,
1421 XmNleftAttachment, XmATTACH_FORM,
1424 _i18n_WidestWidget( 1, &curr, &widest, p->gap_user_label );
1425 XtVaSetValues( p->gap_user_text,
1426 XmNleftAttachment, XmATTACH_FORM,
1427 XmNleftOffset, 5 + widest + 10,
1429 _i18n_WidestWidget( 1, &curr, &dmy, p->gap_user_text );
1430 _toEdge = 5 + widest + 10 + dmy;
1431 XtVaSetValues( p->gap_add_button,
1432 XmNleftAttachment, XmATTACH_FORM,
1433 XmNleftOffset, _toEdge + 10,
1437 * p->gap_access_header
1439 XtVaSetValues( p->gap_access_header,
1440 XmNleftAttachment, XmATTACH_FORM,
1442 XmNtopAttachment, XmATTACH_WIDGET,
1446 prev = p->gap_access_header;
1449 * p->gap_access_list_sw, p->gap_remove_button
1451 _i18n_HighestWidget( 2, &curr, &highest, p->gap_access_list_sw,
1452 p->gap_remove_button );
1453 XtVaSetValues( p->gap_access_list_sw,
1454 XmNleftAttachment, XmATTACH_FORM,
1456 XmNrightAttachment, XmATTACH_OPPOSITE_FORM,
1457 XmNrightOffset, -1 * _toEdge,
1458 XmNtopAttachment, XmATTACH_WIDGET,
1462 XtVaSetValues( p->gap_remove_button,
1463 XmNleftAttachment, XmATTACH_FORM,
1464 XmNleftOffset, _toEdge + 10,
1465 XmNtopAttachment, XmATTACH_WIDGET,
1474 XtVaSetValues( p->gap_access_msg,
1475 XmNleftAttachment, XmATTACH_FORM,
1477 XmNtopAttachment, XmATTACH_WIDGET,
1481 prev = p->gap_access_msg;
1484 * p->gap_perm_label, p->gap_perm_rc_mgr
1486 _i18n_HighestWidgetAdjust( 2, &curr, &highest, p->gap_perm_label,
1487 p->gap_perm_rc_mgr );
1488 XtVaSetValues( curr,
1489 XmNtopAttachment, XmATTACH_WIDGET,
1494 XtVaSetValues( p->gap_perm_label,
1495 XmNleftAttachment, XmATTACH_FORM,
1498 _i18n_WidestWidget( 1, &curr, &widest, p->gap_perm_label );
1499 XtVaSetValues( p->gap_perm_rc_mgr,
1500 XmNleftAttachment, XmATTACH_FORM,
1501 XmNleftOffset, 5 + widest + 5,
1504 ManageChildren(p->gap_perm_rc_mgr);
1505 ManageChildren(gap_form_mgr);
1509 ** Functions related to the printer ops pane
1512 static char *hdrDefaults[] =
1520 static char *hdrStrings[POP_HDR_NUM_CHOICES];
1523 p_create_printer_ops_pane(
1526 Calendar *c = calendar;
1527 Widget pop_form_mgr;
1535 pop_form_mgr = XtVaCreateWidget("pop_form_mgr",
1536 xmFormWidgetClass, p->base_form_mgr,
1537 XmNautoUnmanage, False,
1538 XmNtopAttachment, XmATTACH_WIDGET,
1539 XmNtopWidget, p->separator1,
1541 XmNleftAttachment, XmATTACH_FORM,
1543 XmNrightAttachment, XmATTACH_FORM,
1544 XmNrightOffset, GAP,
1545 XmNbottomAttachment, XmATTACH_WIDGET,
1546 XmNbottomWidget, p->separator2,
1547 XmNbottomOffset, GAP,
1549 p->pane_list[PRINTER_OPS_PANE] = pop_form_mgr;
1551 p->pop_margin_frame = _DtPrintCreateMarginFrame(pop_form_mgr);
1552 XtVaSetValues(p->pop_margin_frame,
1553 XmNtopAttachment, XmATTACH_FORM,
1555 XmNleftAttachment, XmATTACH_FORM,
1557 XmNrightAttachment, XmATTACH_FORM,
1561 _DtPrintMarginFrameEnumToWidget(p->pop_margin_frame,
1562 DTPRINT_OPTION_MARGIN_LEFT);
1563 XtAddCallback(p->pop_left_text, XmNvalueChangedCallback,
1564 p_mark_change, (XtPointer)p);
1566 _DtPrintMarginFrameEnumToWidget(p->pop_margin_frame,
1567 DTPRINT_OPTION_MARGIN_TOP);
1568 XtAddCallback(p->pop_top_text, XmNvalueChangedCallback,
1569 p_mark_change, (XtPointer)p);
1571 _DtPrintMarginFrameEnumToWidget(p->pop_margin_frame,
1572 DTPRINT_OPTION_MARGIN_RIGHT);
1573 XtAddCallback(p->pop_right_text, XmNvalueChangedCallback,
1574 p_mark_change, (XtPointer)p);
1575 p->pop_bottom_text =
1576 _DtPrintMarginFrameEnumToWidget(p->pop_margin_frame,
1577 DTPRINT_OPTION_MARGIN_BOTTOM);
1578 XtAddCallback(p->pop_bottom_text, XmNvalueChangedCallback,
1579 p_mark_change, (XtPointer)p);
1581 for (i = 0; i < POP_HDR_NUM_CHOICES; i++)
1582 hdrStrings[i] = XtNewString(catgets(c->DT_catd, 1, 1106 + i,
1585 p->pop_header_frame =
1586 _DtPrintCreateHdrFtrFrame(pop_form_mgr, POP_HDR_NUM_CHOICES,
1587 hdrStrings, (void **)NULL);
1588 XtVaSetValues(p->pop_header_frame,
1589 XmNtopAttachment, XmATTACH_WIDGET,
1590 XmNtopWidget, p->pop_margin_frame,
1592 XmNleftAttachment, XmATTACH_FORM,
1594 XmNrightAttachment, XmATTACH_FORM,
1597 _DtPrintHdrFtrFrameMenuWidgets(p->pop_header_frame,
1601 XtAddCallback(optionPane, XmNentryCallback,
1602 p_mark_change, (XtPointer)p);
1605 _DtPrintHdrFtrFrameEnumToWidget(p->pop_header_frame,
1606 DTPRINT_OPTION_HEADER_LEFT);
1609 _DtPrintHdrFtrFrameEnumToWidget(p->pop_header_frame,
1610 DTPRINT_OPTION_HEADER_RIGHT);
1613 _DtPrintHdrFtrFrameEnumToWidget(p->pop_header_frame,
1614 DTPRINT_OPTION_FOOTER_LEFT);
1617 _DtPrintHdrFtrFrameEnumToWidget(p->pop_header_frame,
1618 DTPRINT_OPTION_FOOTER_RIGHT);
1620 xmstr = XmStringCreateLocalized(
1621 catgets(c->DT_catd, 1, 434, "Include:"));
1622 p->pop_privacy_label = XtVaCreateWidget("include",
1623 xmLabelGadgetClass, pop_form_mgr,
1624 XmNlabelString, xmstr,
1625 XmNtopAttachment, XmATTACH_WIDGET,
1627 XmNtopWidget, p->pop_header_frame,
1628 XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
1630 XmNleftWidget, p->pop_margin_frame,
1632 XmStringFree(xmstr);
1635 ** Include label and toggle choice
1637 p->pop_privacy_rc_mgr = XtVaCreateWidget("pop_privacy_rc_mgr",
1638 xmRowColumnWidgetClass, pop_form_mgr,
1639 XmNpacking, XmPACK_COLUMN,
1640 XmNorientation, XmVERTICAL,
1641 XmNradioBehavior, False,
1642 XmNisHomogeneous, True,
1643 XmNindicatorType, XmN_OF_MANY,
1644 XmNentryClass, xmToggleButtonGadgetClass,
1647 XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
1649 XmNtopWidget, p->pop_privacy_label,
1650 XmNleftAttachment, XmATTACH_WIDGET,
1652 XmNleftWidget, p->pop_privacy_label,
1655 xmstr = XmStringCreateLocalized(catgets(c->DT_catd, 1, 435,
1656 "Show Time and Text Appts"));
1657 p->pop_privacy_public_toggle = XtVaCreateWidget(
1659 xmToggleButtonGadgetClass, p->pop_privacy_rc_mgr,
1660 XmNlabelString, xmstr,
1662 XmStringFree(xmstr);
1664 XtAddCallback(p->pop_privacy_public_toggle,
1665 XmNvalueChangedCallback, p_mark_change, p);
1667 xmstr = XmStringCreateLocalized( catgets(c->DT_catd, 1, 436,
1668 "Show Time Only Appts"));
1669 p->pop_privacy_semi_toggle = XtVaCreateWidget(
1671 xmToggleButtonGadgetClass, p->pop_privacy_rc_mgr,
1672 XmNlabelString, xmstr,
1674 XmStringFree(xmstr);
1676 XtAddCallback(p->pop_privacy_semi_toggle,
1677 XmNvalueChangedCallback, p_mark_change, p);
1679 xmstr = XmStringCreateLocalized(catgets(c->DT_catd, 1, 437,
1680 "Show Nothing Appts"));
1681 p->pop_privacy_private_toggle = XtVaCreateWidget(
1683 xmToggleButtonGadgetClass, p->pop_privacy_rc_mgr,
1684 XmNlabelString, xmstr,
1686 XmStringFree(xmstr);
1688 XtAddCallback(p->pop_privacy_private_toggle,
1689 XmNvalueChangedCallback, p_mark_change, p);
1691 ManageChildren(p->pop_privacy_rc_mgr);
1692 ManageChildren (pop_form_mgr);
1696 ** Functions related to the date format pane
1699 p_create_date_format_pane(
1702 Calendar *c = calendar;
1703 Widget dfp_form_mgr;
1705 Dimension max_left_label_width;
1710 dfp_form_mgr = XtVaCreateWidget("dfp_form_mgr",
1711 xmFormWidgetClass, p->base_form_mgr,
1712 XmNautoUnmanage, False,
1713 XmNtopAttachment, XmATTACH_WIDGET,
1714 XmNtopWidget, p->separator1,
1715 XmNleftAttachment, XmATTACH_FORM,
1716 XmNrightAttachment, XmATTACH_FORM,
1717 XmNbottomAttachment, XmATTACH_WIDGET,
1718 XmNbottomOffset, 10,
1719 XmNbottomWidget, p->separator2,
1721 p->pane_list[DATE_FORMAT_PANE] = dfp_form_mgr;
1724 ** Date ordering label and choice toggle widget
1726 xmstr = XmStringCreateLocalized(
1727 catgets(c->DT_catd, 1, 438, "Date Ordering:"));
1728 p->dfp_order_label = XtVaCreateWidget("dateOrdering",
1729 xmLabelGadgetClass, dfp_form_mgr,
1730 XmNlabelString, xmstr,
1732 XmStringFree(xmstr);
1734 xmstr = XmStringCreateLocalized(
1735 catgets(c->DT_catd, 1, 442, "Date Separator:"));
1736 p->dfp_sep_label = XtVaCreateWidget("dateSeparator",
1737 xmLabelGadgetClass, dfp_form_mgr,
1738 XmNlabelString, xmstr,
1740 XmStringFree(xmstr);
1742 max_left_label_width = ComputeMaxWidth(p->dfp_order_label,
1744 NULL, NULL) + 2 * GAP;
1746 p->dfp_order_rc_mgr = XtVaCreateWidget("dfp_order_rc_mgr",
1747 xmRowColumnWidgetClass, dfp_form_mgr,
1748 XmNpacking, XmPACK_COLUMN,
1749 XmNorientation, XmVERTICAL,
1750 XmNradioBehavior, True,
1751 XmNisHomogeneous, True,
1752 XmNentryClass, xmToggleButtonGadgetClass,
1753 XmNleftAttachment, XmATTACH_FORM,
1754 XmNleftOffset, max_left_label_width,
1755 XmNtopAttachment, XmATTACH_FORM,
1759 xmstr = XmStringCreateLocalized(
1760 catgets(c->DT_catd, 1, 439, "MM | DD | YY"));
1761 p->dfp_order_mmddyy_toggle = XtVaCreateWidget("mmddyy",
1762 xmToggleButtonGadgetClass, p->dfp_order_rc_mgr,
1763 XmNlabelString, xmstr,
1765 XmStringFree(xmstr);
1767 XtAddCallback(p->dfp_order_mmddyy_toggle,
1768 XmNvalueChangedCallback, p_mark_change, p);
1770 xmstr = XmStringCreateLocalized(
1771 catgets(c->DT_catd, 1, 440, "DD | MM | YY"));
1772 p->dfp_order_ddmmyy_toggle = XtVaCreateWidget("ddmmyy",
1773 xmToggleButtonGadgetClass, p->dfp_order_rc_mgr,
1774 XmNlabelString, xmstr,
1776 XmStringFree(xmstr);
1778 XtAddCallback(p->dfp_order_ddmmyy_toggle,
1779 XmNvalueChangedCallback, p_mark_change, p);
1781 xmstr = XmStringCreateLocalized(
1782 catgets(c->DT_catd, 1, 441, "YY | MM | DD"));
1783 p->dfp_order_yymmdd_toggle = XtVaCreateWidget("yymmdd",
1784 xmToggleButtonGadgetClass, p->dfp_order_rc_mgr,
1785 XmNlabelString, xmstr,
1787 XmStringFree(xmstr);
1789 XtAddCallback(p->dfp_order_yymmdd_toggle,
1790 XmNvalueChangedCallback, p_mark_change, p);
1792 ManageChildren(p->dfp_order_rc_mgr);
1795 ** Date separator label and choice toggle widget
1797 p->dfp_sep_rc_mgr = XtVaCreateWidget("dfp_sep_rc_mgr",
1798 xmRowColumnWidgetClass, dfp_form_mgr,
1799 XmNpacking, XmPACK_COLUMN,
1800 XmNorientation, XmVERTICAL,
1801 XmNradioBehavior, True,
1802 XmNisHomogeneous, True,
1803 XmNentryClass, xmToggleButtonGadgetClass,
1804 XmNleftAttachment, XmATTACH_FORM,
1805 XmNleftOffset, max_left_label_width,
1806 XmNtopAttachment, XmATTACH_WIDGET,
1807 XmNtopWidget, p->dfp_order_rc_mgr,
1811 xmstr = XmStringCreateLocalized(catgets(c->DT_catd, 1, 443, "Blank"));
1812 p->dfp_sep_blank_toggle = XtVaCreateWidget("blank",
1813 xmToggleButtonGadgetClass, p->dfp_sep_rc_mgr,
1814 XmNlabelString, xmstr,
1816 XmStringFree(xmstr);
1818 XtAddCallback(p->dfp_sep_blank_toggle,
1819 XmNvalueChangedCallback, p_mark_change, p);
1821 xmstr = XmStringCreateLocalized("/");
1822 p->dfp_sep_slash_toggle = XtVaCreateWidget("oblique",
1823 xmToggleButtonGadgetClass, p->dfp_sep_rc_mgr,
1824 XmNlabelString, xmstr,
1826 XmStringFree(xmstr);
1828 XtAddCallback(p->dfp_sep_slash_toggle,
1829 XmNvalueChangedCallback, p_mark_change, p);
1831 xmstr = XmStringCreateLocalized(".");
1832 p->dfp_sep_period_toggle = XtVaCreateWidget("period",
1833 xmToggleButtonGadgetClass, p->dfp_sep_rc_mgr,
1834 XmNlabelString, xmstr,
1836 XmStringFree(xmstr);
1838 XtAddCallback(p->dfp_sep_period_toggle,
1839 XmNvalueChangedCallback, p_mark_change, p);
1841 xmstr = XmStringCreateLocalized("-");
1842 p->dfp_sep_dash_toggle = XtVaCreateWidget("hyphen",
1843 xmToggleButtonGadgetClass, p->dfp_sep_rc_mgr,
1844 XmNlabelString, xmstr,
1846 XmStringFree(xmstr);
1848 XtAddCallback(p->dfp_sep_dash_toggle,
1849 XmNvalueChangedCallback, p_mark_change, p);
1851 XtVaSetValues(p->dfp_order_label,
1852 XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
1853 XmNtopWidget, p->dfp_order_rc_mgr,
1855 XmNrightAttachment, XmATTACH_WIDGET,
1856 XmNrightWidget, p->dfp_order_rc_mgr,
1857 XmNrightOffset, GAP,
1860 XtVaSetValues(p->dfp_sep_label,
1861 XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
1862 XmNtopWidget, p->dfp_sep_rc_mgr,
1864 XmNrightAttachment, XmATTACH_WIDGET,
1865 XmNrightWidget, p->dfp_sep_rc_mgr,
1866 XmNrightOffset, GAP,
1869 ManageChildren(p->dfp_sep_rc_mgr);
1870 ManageChildren(dfp_form_mgr);
1874 ** Callback from the category option menu
1877 p_category_notify(Widget w, XtPointer client_data, XtPointer call_data)
1879 Widget base_form_mgr = XtParent(XtParent(XtParent(w)));
1880 PaneType item_no = (PaneType)client_data;
1881 Props_pu *p = (Props_pu *)NULL;
1884 ** Note this cheesy hack. The convenience functions allow you NO
1885 ** method which which to attach user data to the buttons on menus ...
1886 ** so the user data on the base form was set to contain a pointer to
1887 ** the Props_pu structure and we go up through the heirarchical levels
1888 ** using the widget parameter to retrieve this pointer.
1890 ** This sucks, but Motif sucks worse and I could find no other method.
1892 XtVaGetValues(base_form_mgr, XmNuserData, &p,
1895 show_ui(p, item_no);
1899 activate_ui(Props_pu *p, PaneType item_no)
1903 Widget optMenu = (Widget)NULL;
1904 WidgetList children;
1908 XtSetArg(args[nargs], XmNsubMenuId, &optMenu); nargs++;
1909 XtGetValues(p->category_menu, args, nargs);
1911 if (optMenu != (Widget)NULL)
1914 XtSetArg(args[nargs], XmNchildren, &children); nargs++;
1915 XtSetArg(args[nargs], XmNnumChildren, &nChildren); nargs++;
1916 XtGetValues(optMenu, args, nargs);
1918 if (item_no < nChildren)
1921 XtSetArg(args[nargs], XmNmenuHistory, children[item_no]); nargs++;
1922 XtSetValues(p->category_menu, args, nargs);
1924 show_ui(p, item_no);
1930 show_ui(Props_pu *p, PaneType item_no)
1933 Dimension label_height, slider_height;
1935 /* determine if there are uncommited changes in the property
1936 sheet that need to be flushed. */
1939 if (p_flush_changes(c) == False)
1941 Widget optMenu = (Widget)NULL;
1942 WidgetList children;
1945 XtVaGetValues(p->category_menu, XmNsubMenuId, &optMenu, NULL);
1946 XtVaGetValues(optMenu, XmNchildren, &children,
1947 XmNnumChildren, &nChildren, NULL);
1948 if (p->last_props_pane < nChildren)
1949 XtVaSetValues(p->category_menu, XmNmenuHistory,
1950 children[p->last_props_pane], NULL);
1955 ** Performance optimization - don't create each panel until it's
1956 ** asked for (except for the editor pane which is the first one ...).
1958 ** Motif, however, is not liking this optimization (bug in toolkit? I
1959 ** would guess yes ...). It's not resizing the pop-up correctly and
1960 ** it's leaving a number of fields blank ... it doesn't do this if the
1961 ** panes are all created before the window is poped up ... so all the
1962 ** panes are created before and this "if" statement will never evaluate
1963 ** to true. When (or if) this is fixed in the toolkit, remove the
1964 ** create statements from the p_make_props_pu function.
1966 if (!p->pane_list[item_no]) {
1969 p_create_display_pane(p);
1971 case GROUP_ACCESS_PANE:
1972 if (p->cal->my_cal_version < DATAVER4)
1973 p_create_v4_group_access_pane(p);
1975 p_create_v5_group_access_pane(p);
1977 case PRINTER_OPS_PANE:
1978 p_create_printer_ops_pane(p);
1980 case DATE_FORMAT_PANE:
1981 p_create_date_format_pane(p);
1988 if (!p->pane_list[item_no])
1991 XtUnmanageChild(p->pane_list[p->last_props_pane]);
1992 XtVaSetValues(p->separator2,
1993 XmNtopWidget, p->pane_list[item_no],
1995 XtManageChild(p->pane_list[item_no]);
1996 p->last_props_pane = item_no;
1999 /* code for display settings */
2001 XtVaGetValues(p->dp_beg_label, XmNheight, &label_height, NULL);
2002 XtVaGetValues(p->dp_beg_scale, XmNheight, &slider_height, NULL);
2003 XtVaSetValues(p->dp_beg_scale, XmNbottomOffset, ((int) label_height - (int) slider_height)/2, NULL);
2004 XtVaSetValues(p->dp_end_scale, XmNbottomOffset, ((int) label_height - (int) slider_height)/2, NULL);
2007 /* Center Category menu */
2008 p_gap_center_cat_menu(p->pane_list[p->last_props_pane],
2013 set_editor_defaults_later(XtPointer client_data, XtIntervalId *interval_id) {
2014 Calendar *c = (Calendar *)client_data;
2015 Props_pu *pu = (Props_pu *)c->properties_pu;
2017 _DtTurnOnHourGlass(c->frame);
2018 _DtTurnOnHourGlass(pu->frame);
2020 if (((Editor *) c->editor)->base_form_mgr) {
2021 Editor *e = (Editor *) c->editor;
2023 set_editor_defaults(e, 0, 0, False);
2026 if (((GEditor *) c->geditor)->base_form_mgr) {
2027 GEditor *ge = (GEditor *) c->geditor;
2029 set_geditor_defaults(ge, 0, 0);
2032 if (((ToDo *) c->todo)->base_form_mgr) {
2033 ToDo *t = (ToDo *)c->todo;
2035 set_todo_defaults(t);
2038 _DtTurnOffHourGlass(c->frame);
2039 _DtTurnOffHourGlass(pu->frame);
2043 p_save_changes(Calendar *c) {
2045 Props *p = (Props *)c->properties;
2046 Props_pu *pu = (Props_pu *)c->properties_pu;
2049 Tick current_mb_date = 0;
2053 Browser *b = (Browser*)c->browser;
2057 ot = get_int_prop(p, CP_DATEORDERING);
2058 st = get_int_prop(p, CP_DATESEPARATOR);
2060 date = get_date_from_widget(c->view->date, b->datetext, ot, st);
2063 current_mb_date = cm_getdate(date, NULL);
2066 if (get_props_from_ui(pu, p, &redisplay_mask) == True) {
2070 if (!save_props(p)) {
2071 char *title = XtNewString(catgets(c->DT_catd, 1, 454, "Calendar : Error - Options"));
2072 char *text = XtNewString(catgets(c->DT_catd, 1, 445, "An error occurred writing to ~/.desksetdefaults.\nMake sure you have permission to write to this file."));
2073 char *ident1 = XtNewString(catgets(c->DT_catd, 1, 95, "Continue"));
2074 dialog_popup(pu->frame,
2075 DIALOG_TITLE, title,
2077 BUTTON_IDENT, 1, ident1,
2078 BUTTON_HELP, DESKSET_DEFAULTS_ERROR_HELP,
2079 DIALOG_IMAGE, pu->xm_error_pixmap,
2087 _DtTurnOnHourGlass(c->frame);
2088 _DtTurnOnHourGlass(pu->frame);
2090 if (redisplay_mask & PROPS_REDO_DISPLAY) {
2091 Dimension width, height;
2093 /* If this bit is set then it means that things controlling
2094 the day boundaries, or some detail of date representation
2095 has changed. All the things that paint get changed here.
2096 This is the main canvas, the multi-browse window, and
2097 the todo and appointment list dialogs. */
2099 XtVaGetValues(c->canvas,
2103 cache_dims(c, width, height);
2105 if (c->view->glance != yearGlance)
2106 paint_canvas(c, NULL, RENDER_CLEAR_FIRST);
2109 mb_refigure_chart(c);
2111 /* reformat the display values in the property sheet.
2112 The property sheet must exist is we have to refigure
2113 out the hour mode, so we don't need to check whether
2114 it exists or not. */
2116 XmScaleGetValue(pu->dp_end_scale, &val);
2117 set_scale_value(pu->dp_end_value, val, pu);
2118 XmScaleGetValue(pu->dp_beg_scale, &val);
2119 set_scale_value(pu->dp_beg_value, val, pu);
2121 if (c->editor && ((Editor *) c->editor)->view_list)
2122 build_editor_view((Editor *) c->editor, ((Editor *) (c->editor))->view_list_glance, True);
2124 if (c->todo && ((ToDo *) c->todo)->view_frame)
2125 build_todo_view((ToDo *) c->todo, ((ToDo *) (c->todo))->view_list_glance, True);
2128 /* redo date entry in the multi-browser */
2130 if (b && current_mb_date) {
2131 ot = get_int_prop(p, CP_DATEORDERING);
2132 st = get_int_prop(p, CP_DATESEPARATOR);
2133 format_tick(b->date, ot, st, buf);
2134 XmTextSetString(b->datetext, buf);
2138 if (redisplay_mask & PROPS_REDO_EDITORS) {
2140 if (((Editor *) c->editor)->base_form_mgr) {
2142 Editor *e = (Editor *) c->editor;
2143 DSSW *dssw = &((Editor *) c->editor)->dssw;
2145 set_dssw_menus(dssw, p);
2147 add_all_appt((Editor *) c->editor);
2152 if (((GEditor *) c->geditor)->base_form_mgr) {
2153 GEditor *ge = (GEditor *) c->geditor;
2154 DSSW *dssw = &((GEditor *) c->geditor)->dssw;
2156 set_dssw_menus(dssw, p);
2163 if (((ToDo *) c->todo)->base_form_mgr) {
2164 ToDo *t = (ToDo *)c->todo;
2165 DSSW *dssw = &((ToDo *) c->todo)->dssw;
2167 set_dssw_menus(dssw, p);
2169 add_all_todo((ToDo *) c->todo);
2172 set_dssw_menus(&pu->ep_dssw, p);
2174 XtVaSetValues(c->browse_button, XmNsubMenuId, NULL, NULL);
2175 update_browse_menu_names(c);
2176 XtVaSetValues(c->browse_button, XmNsubMenuId, c->browse_menu, NULL);
2178 browser_reset_list(c);
2180 /* This is really hateful. The deal is that something
2181 about the code that redefines the start and stop time
2182 menus has a timing hole in it. If I reset the values
2183 for these two menus before the application returns to
2184 the toolkit, the values will get clobbered later.
2185 There seems to be no way to force the toolkit to
2186 complete the restrucutring of the menus immediately,
2187 so I have to add a timer proc to reset the defaults on
2188 the dialog a little bit after returning to the notifier
2189 loop. Urk. This really needs to be fixed some day. */
2191 XtAppAddTimeOut(c->xcontext->app, 50, set_editor_defaults_later, c);
2196 _DtTurnOffHourGlass(pu->frame);
2197 _DtTurnOffHourGlass(c->frame);
2200 if (redisplay_mask & PROPS_REDO_PRINT_DIALOG) {}
2206 ** Button callback procs
2209 p_apply_proc(Widget w, XtPointer client_data, XtPointer data) {
2210 Calendar *c = (Calendar *)client_data;
2218 XtPointer client_data,
2221 Calendar *c = (Calendar *)client_data;
2222 Props_pu *pu = (Props_pu *)c->properties_pu;
2225 if (p_save_changes(c) == True)
2226 XtUnmanageChild(pu->base_form_mgr);
2230 p_defaults_proc(Widget w, XtPointer client_data, XtPointer data) {
2231 p_defaults_proc_helper(client_data);
2235 extern void p_defaults_proc_helper(XtPointer client_data){
2237 Calendar *c = (Calendar *)client_data;
2238 Props *p = (Props *)c->properties;
2239 Props_pu *pu = (Props_pu *)c->properties_pu;
2241 if (!read_props(p)) {
2242 char *title = XtNewString(catgets(c->DT_catd, 1, 454, "Calendar : Error - Options"));
2243 char *text = XtNewString(catgets(c->DT_catd, 1, 448, "An error occurred reading from ~/.desksetdefaults.\nMake sure you have permission to read this file."));
2244 char *ident1 = XtNewString(catgets(c->DT_catd, 1, 95, "Continue"));
2245 dialog_popup(pu->frame,
2246 DIALOG_TITLE, title,
2248 BUTTON_IDENT, 1, ident1,
2249 BUTTON_HELP, DESKSET_DEFAULTS_ERROR_HELP,
2250 DIALOG_IMAGE, pu->xm_error_pixmap,
2256 if ((start = get_int_prop(p, CP_DAYBEGIN)) < 0)
2258 else if (start > 22)
2260 if ((stop = get_int_prop(p, CP_DAYEND)) <= start)
2264 set_int_prop(p, CP_DAYBEGIN, start);
2265 set_int_prop(p, CP_DAYEND, stop);
2267 set_props_on_ui(pu, p);
2272 p_close_proc(Widget w, XtPointer client_data, XtPointer data) {
2273 Props_pu *p = (Props_pu *)client_data;
2275 XtUnmanageChild(p->base_form_mgr);
2279 p_flush_changes(Calendar *c) {
2280 Props *p = (Props *)c->properties;
2281 Props_pu *pu = (Props_pu *)c->properties_pu;
2286 if (pu->changed_flag == True) {
2287 char *title = XtNewString(catgets(c->DT_catd, 1, 450, "Calendar : Options - Help"));
2288 char *text = XtNewString(catgets(c->DT_catd, 1, 451, "You have made unsaved changes.\nYou may save your changes, discard your changes, \nor return to your previous place in the dialog."));
2289 char *ident1 = XtNewString(catgets(c->DT_catd, 1, 452, "Save"));
2290 char *ident2 = XtNewString(catgets(c->DT_catd, 1, 700, "Discard"));
2291 char *ident3 = XtNewString(catgets(c->DT_catd, 1, 923, "Cancel"));
2292 answer = dialog_popup(pu->frame,
2293 DIALOG_TITLE, title,
2295 BUTTON_IDENT, 1, ident1,
2296 BUTTON_IDENT, 2, ident2,
2297 BUTTON_IDENT, 3, ident3,
2298 DIALOG_IMAGE, pu->xm_warning_pixmap,
2307 return(p_save_changes(c));
2309 else if (answer == 2) {
2310 set_props_on_ui(pu, p);
2313 else if (answer == 3) {
2322 p_quit_handler(Widget w, XtPointer cdata, XtPointer data) {
2323 Calendar *c = (Calendar *)cdata;
2324 Props_pu *pu = (Props_pu *)c->properties_pu;
2326 if (p_flush_changes(c) == True)
2327 XtUnmanageChild(pu->base_form_mgr);
2331 p_make_props_pu(Calendar *c) {
2334 catgets(c->DT_catd, 1, 458, "Calendar : Options");
2336 Props_pu *p = (Props_pu *)c->properties_pu;
2342 ** An array of panes will be used to "flip" through the different
2343 ** property choice sheets
2346 p->pane_list = (Widget *)ckalloc(sizeof(Widget)*(DATE_FORMAT_PANE + 1));
2347 memset(p->pane_list, 0, sizeof(Widget)*(DATE_FORMAT_PANE + 1));
2350 ** Create the base frame and form manager
2352 buf = (char *)ckalloc(cm_strlen(popuplabel)
2353 + cm_strlen(c->calname) + 4);
2354 sprintf(buf, "%s - %s", popuplabel, c->calname);
2356 p->frame = XtVaCreatePopupShell("frame",
2357 xmDialogShellWidgetClass, c->frame,
2358 XmNdeleteResponse, XmDO_NOTHING,
2360 XmNallowShellResize, True,
2363 setup_quit_handler(p->frame, p_quit_handler, (caddr_t)c);
2365 p->base_form_mgr = XtVaCreateWidget("base_form_mgr",
2366 xmFormWidgetClass, p->frame,
2367 XmNautoUnmanage, False,
2368 XmNhorizontalSpacing, 1,
2369 XmNverticalSpacing, 1,
2371 XmNresizable, False,
2372 XmNfractionBase, 29,
2373 XmNtopAttachment, XmATTACH_FORM,
2375 XmNbottomAttachment, XmATTACH_FORM,
2377 XmNrightAttachment, XmATTACH_FORM,
2379 XmNleftAttachment, XmATTACH_FORM,
2384 ** Now the "top" portion - the category menu and the first separator
2387 Pane_XmStrs[EDITOR_PANE] =
2388 XmStringCreateLocalized(catgets(c->DT_catd, 1, 762,
2389 "Editor Defaults"));
2390 Pane_XmStrs[DISPLAY_PANE] =
2391 XmStringCreateLocalized(catgets(c->DT_catd, 1, 763,
2392 "Display Settings"));
2393 Pane_XmStrs[GROUP_ACCESS_PANE] =
2394 XmStringCreateLocalized(catgets(c->DT_catd, 1, 764,
2395 "Access List and Permissions"));
2396 Pane_XmStrs[PRINTER_OPS_PANE] =
2397 XmStringCreateLocalized(catgets(c->DT_catd, 1, 765,
2398 "Printer Settings"));
2399 Pane_XmStrs[DATE_FORMAT_PANE] =
2400 XmStringCreateLocalized(catgets(c->DT_catd, 1, 766,
2403 label = XmStringCreateLocalized(
2404 catgets(c->DT_catd, 1, 459, "Category:"));
2406 p->category_menu = widgets[0] =
2407 XmVaCreateSimpleOptionMenu(p->base_form_mgr,
2408 "category_menu", label, NULL, 0, p_category_notify,
2409 XmVaPUSHBUTTON, Pane_XmStrs[EDITOR_PANE], NULL, NULL, NULL,
2410 XmVaPUSHBUTTON, Pane_XmStrs[DISPLAY_PANE], NULL, NULL, NULL,
2411 XmVaPUSHBUTTON, Pane_XmStrs[GROUP_ACCESS_PANE], NULL, NULL,NULL,
2412 XmVaPUSHBUTTON, Pane_XmStrs[PRINTER_OPS_PANE], NULL, NULL, NULL,
2413 XmVaPUSHBUTTON, Pane_XmStrs[DATE_FORMAT_PANE], NULL, NULL, NULL,
2414 XmNtopAttachment, XmATTACH_FORM,
2415 XmNleftAttachment, XmATTACH_FORM,
2416 XmNrightAttachment, XmATTACH_NONE,
2417 XmNnavigationType, XmTAB_GROUP,
2419 XmStringFree(label);
2421 p->separator1 = widgets[1] = XtVaCreateWidget("separator1",
2422 xmSeparatorGadgetClass, p->base_form_mgr,
2423 XmNleftAttachment, XmATTACH_FORM,
2424 XmNrightAttachment, XmATTACH_FORM,
2425 XmNtopAttachment, XmATTACH_WIDGET,
2426 XmNtopWidget, p->category_menu,
2430 ** Now create the "bottom" part - the separator and choice buttons
2432 p_create_editor_pane(c);
2434 p->separator2 = widgets[2] = XtVaCreateWidget("separator2",
2435 xmSeparatorGadgetClass, p->base_form_mgr,
2436 XmNleftAttachment, XmATTACH_FORM,
2437 XmNrightAttachment, XmATTACH_FORM,
2441 * To get the pane to resize instead of the buttons at the bottom
2442 * of the option sheet we attach the bottom of the pane to the
2443 * separator instead of the other way around.
2445 XtVaSetValues(p->pane_list[EDITOR_PANE],
2446 XmNbottomAttachment, XmATTACH_WIDGET,
2447 XmNbottomOffset, 10,
2448 XmNbottomWidget, p->separator2,
2451 xmstr = XmStringCreateLocalized(catgets(c->DT_catd, 1, 655, "OK"));
2452 p->ok_button = widgets[3] = XtVaCreateWidget("ok",
2453 xmPushButtonGadgetClass, p->base_form_mgr,
2454 XmNlabelString, xmstr,
2455 XmNrecomputeSize, False,
2456 XmNbottomAttachment, XmATTACH_FORM,
2458 XmNleftAttachment, XmATTACH_POSITION,
2460 XmNrightAttachment, XmATTACH_POSITION,
2461 XmNrightPosition, 7,
2464 XmStringFree(xmstr);
2465 XtAddCallback(p->ok_button, XmNactivateCallback, p_ok_proc, c);
2467 XtVaSetValues(p->separator2,
2468 XmNbottomAttachment, XmATTACH_WIDGET,
2469 XmNbottomOffset, 10,
2470 XmNbottomWidget, p->ok_button,
2473 xmstr = XmStringCreateLocalized(catgets(c->DT_catd, 1, 460, "Apply"));
2474 p->apply_button = widgets[4] = XtVaCreateWidget("apply",
2475 xmPushButtonGadgetClass, p->base_form_mgr,
2476 XmNlabelString, xmstr,
2477 XmNrecomputeSize, False,
2478 XmNbottomAttachment, XmATTACH_FORM,
2480 XmNtopWidget, p->separator2,
2481 XmNleftAttachment, XmATTACH_POSITION,
2483 XmNrightAttachment, XmATTACH_POSITION,
2484 XmNrightPosition, 12,
2487 XmStringFree(xmstr);
2488 XtAddCallback(p->apply_button, XmNactivateCallback, p_apply_proc, c);
2490 xmstr = XmStringCreateLocalized(catgets(c->DT_catd, 1, 691, "Reset"));
2491 p->defaults_button = widgets[5] = XtVaCreateWidget("reset",
2492 xmPushButtonGadgetClass, p->base_form_mgr,
2493 XmNlabelString, xmstr,
2494 XmNrecomputeSize, False,
2495 XmNbottomAttachment, XmATTACH_FORM,
2497 XmNleftAttachment, XmATTACH_POSITION,
2498 XmNleftPosition, 12,
2499 XmNrightAttachment, XmATTACH_POSITION,
2500 XmNrightPosition, 17,
2503 XmStringFree(xmstr);
2504 XtAddCallback(p->defaults_button,
2505 XmNactivateCallback, p_defaults_proc, c);
2507 xmstr = XmStringCreateLocalized(catgets(c->DT_catd, 1, 923, "Cancel"));
2508 p->close_button = widgets[6] = XtVaCreateWidget("close",
2509 xmPushButtonGadgetClass, p->base_form_mgr,
2510 XmNlabelString, xmstr,
2511 XmNbottomAttachment, XmATTACH_FORM,
2513 XmNtopWidget, p->separator2,
2514 XmNleftAttachment, XmATTACH_POSITION,
2515 XmNleftPosition, 17,
2516 XmNrightAttachment, XmATTACH_POSITION,
2517 XmNrightPosition, 22,
2520 XmStringFree(xmstr);
2521 XtAddCallback(p->close_button, XmNactivateCallback, p_close_proc, p);
2523 xmstr = XmStringCreateLocalized(catgets(c->DT_catd, 1, 77, "Help"));
2524 p->help_button = widgets[7] = XtVaCreateWidget("help",
2525 xmPushButtonGadgetClass, p->base_form_mgr,
2526 XmNlabelString, xmstr,
2527 XmNbottomAttachment, XmATTACH_FORM,
2529 XmNtopWidget, p->separator2,
2530 XmNleftAttachment, XmATTACH_POSITION,
2531 XmNleftPosition, 22,
2532 XmNrightAttachment, XmATTACH_POSITION,
2533 XmNrightPosition, 27,
2535 XmStringFree(xmstr);
2536 XtAddCallback(p->help_button, XmNactivateCallback,
2537 (XtCallbackProc)help_cb, OPTIONS_HELP_BUTTON);
2538 XtAddCallback(p->base_form_mgr, XmNhelpCallback,
2539 (XtCallbackProc)help_cb, (XtPointer) OPTIONS_HELP_BUTTON);
2543 ** Last, create the remaining panes
2545 p_create_display_pane(p);
2546 if (p->cal->my_cal_version < DATAVER4)
2547 p_create_v4_group_access_pane(p);
2549 p_create_v5_group_access_pane(p);
2551 p_create_printer_ops_pane(p);
2552 p_create_date_format_pane(p);
2555 ** Manage the uppermost children (first pane is Editor Defaults)
2557 p->last_props_pane = EDITOR_PANE;
2558 widgets[8] = p->pane_list[p->last_props_pane];
2560 /* set default button */
2561 XtVaSetValues(p->base_form_mgr, XmNcancelButton,
2562 p->close_button, NULL);
2565 XtManageChildren(widgets, 9);
2569 string_is_number(char *str) {
2572 if (blank_buf(str)) {
2576 while (str && *str) {
2577 if (!isdigit(*str) && *str != ' ' && *str != '\t')
2587 string_is_time(char *str) {
2589 Boolean found_colon = False;
2590 int found_first_number = 0;
2591 int found_second_number = 0;
2593 if (blank_buf(str)) {
2597 /* a time is a pretty structured beast */
2600 if ((*str == ' ') || (*str == '\t')) {
2602 else if (*str == ':') {
2603 if (found_colon == True)
2605 else if (found_first_number == False)
2610 else if (isdigit(*str)) {
2611 if (found_colon == True)
2612 found_second_number++;
2614 found_first_number++;
2622 if ((found_colon == True) &&
2623 ((((found_first_number > 2) || (found_first_number < 1)) || (found_second_number != 2))))
2625 else if ((found_colon == False) && ((found_first_number > 4) || found_first_number < 3))
2632 /*******************************************************************************
2634 ** Functions external to props_pu.c
2636 *******************************************************************************/
2638 get_editor_vals_from_ui(Props_pu *pu, Props *p) {
2642 DisplayType dt = get_int_prop(p, CP_DEFAULTDISP);
2644 char *msg, *dur_txt;
2645 Reminder_val_op status;
2646 Calendar *c = pu->cal;
2648 XtVaGetValues(pu->ep_dur_cb, XmNtextField, &text, NULL);
2649 dur_txt = XmTextGetString(text);
2651 if (string_is_number(dur_txt) == False) {
2652 char *title = XtNewString(catgets(c->DT_catd, 1, 1079, "Calendar : Error - Editor Settings"));
2653 char *text = XtNewString(catgets(c->DT_catd, 1, 819, "The Duration value must be an integer with no sign.\nYour properties settings have not been saved."));
2654 char *ident1 = XtNewString(catgets(c->DT_catd, 1, 95, "Continue"));
2657 dialog_popup(pu->frame,
2658 DIALOG_TITLE, title,
2660 BUTTON_IDENT, 1, ident1,
2661 BUTTON_HELP, DURATION_ERROR_HELP,
2662 DIALOG_IMAGE, pu->xm_error_pixmap,
2670 if (atoi(dur_txt) >= (60 *24)) {
2671 char *title = XtNewString(catgets(c->DT_catd, 1, 1079, "Calendar : Error - Editor Settings"));
2672 char *text = XtNewString(catgets(c->DT_catd, 1, 916, "The Duration value must be less than 24 hours.\nYour properties settings have not been saved."));
2673 char *ident1 = XtNewString(catgets(c->DT_catd, 1, 95, "Continue"));
2676 dialog_popup(pu->frame,
2677 DIALOG_TITLE, title,
2679 BUTTON_IDENT, 1, ident1,
2680 BUTTON_HELP, DURATION_ERROR_HELP,
2681 DIALOG_IMAGE, pu->xm_error_pixmap,
2689 get_dssw_times(&pu->ep_dssw);
2691 if (string_is_time(pu->ep_dssw.start_val.val) == False) {
2692 char *title = XtNewString(catgets(c->DT_catd, 1, 1079, "Calendar : Error - Editor Settings"));
2693 char *text = XtNewString(catgets(c->DT_catd, 1, 820, "The start value must be a valid time.\nYour properties settings have not been saved."));
2694 char *ident1 = XtNewString(catgets(c->DT_catd, 1, 95, "Continue"));
2695 dialog_popup(pu->frame,
2696 DIALOG_TITLE, title,
2698 BUTTON_IDENT, 1, ident1,
2699 BUTTON_HELP, START_ERROR_HELP,
2700 DIALOG_IMAGE, pu->xm_error_pixmap,
2709 strncpy(buf, pu->ep_dssw.start_val.val, 2);
2711 hr = atoi(buf) % 24;
2714 if (!XmToggleButtonGetState(pu->ep_dssw.start_am)) {
2717 } else if (hr == 12)
2719 strncpy(buf, &pu->ep_dssw.start_val.val[3], 2);
2722 strncpy(buf, &pu->ep_dssw.start_val.val[2], 2);
2725 min = atoi(buf) % 60;
2726 set_int_prop(p, CP_APPTBEGIN, (hr * minsec) + min);
2728 XtVaGetValues(pu->ep_dur_cb, XmNtextField, &text, NULL);
2730 min = atoi(XmTextGetString(text));
2731 set_int_prop(p, CP_APPTDURATION, min);
2734 if ((status = get_reminders_vals(&pu->ep_reminders, False)) != REMINDERS_OK) {
2735 char *title = XtNewString(catgets(c->DT_catd, 1, 1079, "Calendar : Error - Editor Settings"));
2737 char *ident1 = XtNewString(catgets(c->DT_catd, 1, 95, "Continue"));
2740 case ADVANCE_BLANK : text = XtNewString(catgets(c->DT_catd, 1, 908, "You may not set a blank reminder value.\nYour properties settings have not been saved."));
2743 case ADVANCE_CONTAINS_BLANK : text = XtNewString(catgets(c->DT_catd, 1, 909, "You may not set a reminder value with an embedded blank.\nYour properties settings have not been saved."));
2746 case ADVANCE_NONNUMERIC : text = XtNewString(catgets(c->DT_catd, 1, 910, "Reminder values must be a number with an optional sign.\nYour properties settings have not been saved."));
2750 dialog_popup(pu->frame,
2751 DIALOG_TITLE, title,
2753 BUTTON_IDENT, 1, ident1,
2754 DIALOG_IMAGE, pu->xm_error_pixmap,
2755 BUTTON_HELP, ADVANCE_ERROR_HELP,
2763 val = &pu->ep_reminders.beep_val;
2764 set_char_prop(p, CP_BEEPON, boolean_str(val->selected));
2765 set_int_prop(p, CP_BEEPADV, val->scope_val);
2766 set_char_prop(p, CP_BEEPUNIT, (char *)time_scope_str(val->scope));
2768 val = &pu->ep_reminders.flash_val;
2769 set_char_prop(p, CP_FLASHON, boolean_str(val->selected));
2770 set_int_prop(p, CP_FLASHADV, val->scope_val);
2771 set_char_prop(p, CP_FLASHUNIT, (char *)time_scope_str(val->scope));
2773 val = &pu->ep_reminders.popup_val;
2774 set_char_prop(p, CP_OPENON, boolean_str(val->selected));
2775 set_int_prop(p, CP_OPENADV, val->scope_val);
2776 set_char_prop(p, CP_OPENUNIT, (char *)time_scope_str(val->scope));
2778 val = &pu->ep_reminders.mail_val;
2779 set_char_prop(p, CP_MAILON, boolean_str(val->selected));
2780 set_int_prop(p, CP_MAILADV, val->scope_val);
2781 set_char_prop(p, CP_MAILUNIT, (char *)time_scope_str(val->scope));
2782 set_char_prop(p, CP_MAILTO, pu->ep_reminders.mailto_val);
2784 XtVaGetValues(pu->privacy_menu, XmNselectedPosition, &i, NULL);
2786 set_char_prop(p, CP_PRIVACY, privacy_str(i));
2792 get_display_vals_from_ui(Props_pu *pu, Props *p) {
2795 Calendar *c = pu->cal;
2797 set_char_prop(p, CP_CALLOC, str = XmTextGetString(pu->dp_loc_text));
2798 if (blank_buf(str) || embedded_blank(str)) {
2799 char *title = XtNewString(catgets(c->DT_catd, 1, 1083, "Calendar : Error - Display Settings"));
2800 char *text = XtNewString(catgets(c->DT_catd, 1, 772, "You may not save a blank User Calendar Location\nor one that contains blanks.\nYour properties settings have not been saved."));
2801 char *ident1 = XtNewString(catgets(c->DT_catd, 1, 95, "Continue"));
2802 dialog_popup(pu->frame,
2803 DIALOG_TITLE, title,
2805 BUTTON_IDENT, 1, ident1,
2806 BUTTON_HELP, CAL_LOCATION_ERROR_HELP,
2807 DIALOG_IMAGE, pu->xm_error_pixmap,
2818 XtVaGetValues(pu->dp_beg_scale, XmNvalue, &val,
2820 set_int_prop(p, CP_DAYBEGIN, val);
2821 XtVaGetValues(pu->dp_end_scale, XmNvalue, &val,
2823 set_int_prop(p, CP_DAYEND, val);
2825 set_int_prop(p, CP_DEFAULTDISP, XmToggleButtonGadgetGetState(
2826 pu->dp_hour24_toggle) ? HOUR24 : HOUR12);
2828 if (XmToggleButtonGadgetGetState(pu->dp_view_day_toggle))
2829 val = (int)DAY_VIEW;
2830 else if (XmToggleButtonGadgetGetState(pu->dp_view_month_toggle))
2831 val = (int)MONTH_VIEW;
2832 else if (XmToggleButtonGadgetGetState(pu->dp_view_week_toggle))
2833 val = (int)WEEK_VIEW;
2834 else if (XmToggleButtonGadgetGetState(pu->dp_view_year_toggle))
2835 val = (int)YEAR_VIEW;
2836 set_int_prop(p, CP_DEFAULTVIEW, val);
2838 set_char_prop(p, CP_DEFAULTCAL,
2839 str = XmTextGetString(pu->dp_init_view_text));
2841 if (blank_buf(str) || embedded_blank(str)) {
2842 char *title = XtNewString(catgets(c->DT_catd, 1, 1083, "Calendar : Error - Display Settings"));
2843 char *text = XtNewString(catgets(c->DT_catd, 1, 773, "You may not save a blank Initial Calendar View\nor one that contains blanks.\nYour properties settings have not been saved."));
2844 char *ident1 = XtNewString(catgets(c->DT_catd, 1, 95, "Continue"));
2845 dialog_popup(pu->frame,
2846 DIALOG_TITLE, title,
2848 BUTTON_IDENT, 1, ident1,
2849 DIALOG_IMAGE, pu->xm_error_pixmap,
2864 get_gap_vals_from_ui(Props_pu *pu, Props *p) {
2865 CSA_return_code stat;
2868 cal = allocate_cal_struct(appt_write,
2869 pu->cal->my_cal_version,
2870 CSA_CAL_ATTR_ACCESS_LIST_I,
2872 cal->access_list->value->item.access_list_value = pu->gap_list;
2873 pu->gap_list = NULL;
2875 stat = csa_update_calendar_attributes(pu->cal->my_cal_handle, cal->count, cal->attrs, NULL);
2876 backend_err_msg(pu->frame, pu->cal->calname, stat, pu->xm_error_pixmap);
2877 free_cal_struct(&cal);
2878 set_gap_vals_on_ui(pu, p);
2883 print_option_error(Props_pu *pu, int setNum, int msgNum, char *str)
2885 Calendar *c = pu->cal;
2886 char *text = XtNewString(catgets(c->DT_catd, setNum, msgNum, str));
2887 static char *title = (char *)NULL;
2888 static char *ident1 = (char *)NULL;
2890 if (title == (char *)NULL)
2891 title = XtNewString(catgets(c->DT_catd, 1, 1085,
2892 "Calendar : Error - Printer Settings"));
2893 if (ident1 == (char *)NULL)
2894 ident1 = XtNewString(catgets(c->DT_catd, 1, 95, "Continue"));
2896 dialog_popup(pu->frame,
2897 DIALOG_TITLE, title,
2899 BUTTON_IDENT, 1, ident1,
2900 BUTTON_HELP, PRINT_HELP_BUTTON,
2901 DIALOG_IMAGE, pu->xm_error_pixmap,
2907 get_printer_vals_from_ui(Props_pu *pu, Props *p) {
2911 if ((str = _DtPrintGetMarginSpec(pu->pop_right_text)) != (char *)NULL)
2913 if (valid_margin_str(pu, str))
2915 set_char_prop(p, CP_PRINTRMARGIN, str);
2920 print_option_error(pu, 1, 821,
2921 "You have specified an illegal right margin value.\nYour properties settings have not been saved.");
2927 if ((str = _DtPrintGetMarginSpec(pu->pop_bottom_text)) != (char *)NULL)
2929 if (valid_margin_str(pu, str))
2931 set_char_prop(p, CP_PRINTBMARGIN, str);
2936 print_option_error(pu, 1, 822,
2937 "You have specified an illegal bottom margin value.\nYour properties settings have not been saved.");
2943 if ((str = _DtPrintGetMarginSpec(pu->pop_left_text)) != (char *)NULL)
2945 if (valid_margin_str(pu, str))
2947 set_char_prop(p, CP_PRINTLMARGIN, str);
2952 print_option_error(pu, 1, 911,
2953 "You have specified an illegal left margin value.\nYour properties settings have not been saved.");
2959 if ((str = _DtPrintGetMarginSpec(pu->pop_top_text)) != (char *)NULL)
2961 if (valid_margin_str(pu, str))
2963 set_char_prop(p, CP_PRINTTMARGIN, str);
2968 print_option_error(pu, 1, 912,
2969 "You have specified an illegal top margin value.\nYour properties settings have not been saved.");
2975 set_int_prop(p, CP_PRINTLHEADER,
2976 _DtPrintGetHdrFtrIndex(pu->pop_tl_option));
2977 set_int_prop(p, CP_PRINTRHEADER,
2978 _DtPrintGetHdrFtrIndex(pu->pop_tr_option));
2979 set_int_prop(p, CP_PRINTLFOOTER,
2980 _DtPrintGetHdrFtrIndex(pu->pop_bl_option));
2981 set_int_prop(p, CP_PRINTRFOOTER,
2982 _DtPrintGetHdrFtrIndex(pu->pop_br_option));
2985 ** For backward compatability with the XView toggles (which used or'd
2986 ** values) - we must continue ...
2988 if (XmToggleButtonGadgetGetState(pu->pop_privacy_public_toggle))
2989 plevel |= PRINT_PUBLIC;
2990 if (XmToggleButtonGadgetGetState(pu->pop_privacy_semi_toggle))
2991 plevel |= PRINT_SEMIPRIVATE;
2992 if (XmToggleButtonGadgetGetState(pu->pop_privacy_private_toggle))
2993 plevel |= PRINT_PRIVATE;
2994 set_int_prop(p, CP_PRINTPRIVACY, plevel);
3000 get_date_vals_from_ui(Props_pu *pu, Props *p) {
3001 if (XmToggleButtonGadgetGetState(pu->dfp_order_mmddyy_toggle))
3002 set_int_prop(p, CP_DATEORDERING, (int)ORDER_MDY);
3003 else if (XmToggleButtonGadgetGetState(pu->dfp_order_ddmmyy_toggle))
3004 set_int_prop(p, CP_DATEORDERING, (int)ORDER_DMY);
3005 else if (XmToggleButtonGadgetGetState(pu->dfp_order_yymmdd_toggle))
3006 set_int_prop(p, CP_DATEORDERING, (int)ORDER_YMD);
3008 if (XmToggleButtonGadgetGetState(pu->dfp_sep_blank_toggle))
3009 set_int_prop(p, CP_DATESEPARATOR, (int)SEPARATOR_BLANK);
3010 else if (XmToggleButtonGadgetGetState(pu->dfp_sep_slash_toggle))
3011 set_int_prop(p, CP_DATESEPARATOR, (int)SEPARATOR_SLASH);
3012 else if (XmToggleButtonGadgetGetState(pu->dfp_sep_period_toggle))
3013 set_int_prop(p, CP_DATESEPARATOR, (int)SEPARATOR_DOT);
3014 else if (XmToggleButtonGadgetGetState(pu->dfp_sep_dash_toggle))
3015 set_int_prop(p, CP_DATESEPARATOR, (int)SEPARATOR_DASH);
3021 get_props_from_ui(Props_pu *pu, Props *p, int *redisplay_mask) {
3023 *redisplay_mask = 0;
3025 /* we only ever have to get the values for one of the categories,
3026 as changing the nanes causes the values for the existing
3027 category to be flushed. */
3029 switch(pu->last_props_pane) {
3031 if (get_display_vals_from_ui(pu, p) == True)
3034 *redisplay_mask |= (PROPS_REDO_EDITORS | PROPS_REDO_DISPLAY);
3036 case GROUP_ACCESS_PANE:
3037 if (get_gap_vals_from_ui(pu, p) == True)
3040 case PRINTER_OPS_PANE:
3041 if (get_printer_vals_from_ui(pu, p) == True)
3044 *redisplay_mask |= PROPS_REDO_PRINT_DIALOG;
3046 case DATE_FORMAT_PANE:
3047 if (get_date_vals_from_ui(pu, p) == True)
3050 *redisplay_mask |= (PROPS_REDO_EDITORS | PROPS_REDO_DISPLAY);
3053 if (get_editor_vals_from_ui(pu, p) == True)
3056 *redisplay_mask |= PROPS_REDO_EDITORS;
3064 set_editor_vals_on_ui(Props_pu *pu, Props *p) {
3066 char buf[MAXNAMELEN];
3070 set_dssw_defaults(&pu->ep_dssw, now(), True);
3071 XtVaGetValues(pu->ep_dur_cb, XmNtextField, &text, NULL);
3073 sprintf(buf, "%d", get_int_prop(p, CP_APPTDURATION));
3074 XmTextSetString(text, buf);
3077 val = &pu->ep_reminders.beep_val;
3078 val->selected = convert_boolean_str(get_char_prop(p, CP_BEEPON));
3079 val->scope = convert_time_scope_str(get_char_prop(p, CP_BEEPUNIT));
3080 val->scope_val = get_int_prop(p, CP_BEEPADV);
3082 val = &pu->ep_reminders.flash_val;
3083 val->selected = convert_boolean_str(get_char_prop(p, CP_FLASHON));
3084 val->scope = convert_time_scope_str(get_char_prop(p, CP_FLASHUNIT));
3085 val->scope_val = get_int_prop(p, CP_FLASHADV);
3087 val = &pu->ep_reminders.popup_val;
3088 val->selected = convert_boolean_str(get_char_prop(p, CP_OPENON));
3089 val->scope = convert_time_scope_str(get_char_prop(p, CP_OPENUNIT));
3090 val->scope_val = get_int_prop(p, CP_OPENADV);
3092 val = &pu->ep_reminders.mail_val;
3093 val->selected = convert_boolean_str(get_char_prop(p, CP_MAILON));
3094 val->scope = convert_time_scope_str(get_char_prop(p, CP_MAILUNIT));
3095 val->scope_val = get_int_prop(p, CP_MAILADV);
3096 strcpy(pu->ep_reminders.mailto_val, get_char_prop(p, CP_MAILTO));
3098 set_reminders_vals(&pu->ep_reminders, False);
3100 i = convert_privacy_str_to_op(get_char_prop(p, CP_PRIVACY));
3101 XtVaSetValues(pu->privacy_menu, XmNselectedPosition, i + 1, NULL);
3105 set_display_vals_on_ui(Props_pu *pu, Props *p) {
3106 XmTextSetString(pu->dp_loc_text, get_char_prop(p, CP_CALLOC));
3108 XtVaSetValues(pu->dp_beg_scale, XmNvalue, get_int_prop(p, CP_DAYBEGIN),
3110 set_scale_value(pu->dp_beg_value, get_int_prop(p, CP_DAYBEGIN), pu);
3112 XtVaSetValues(pu->dp_end_scale, XmNvalue, get_int_prop(p, CP_DAYEND),
3114 set_scale_value(pu->dp_end_value, get_int_prop(p, CP_DAYEND), pu);
3116 XmToggleButtonGadgetSetState((get_int_prop(p, CP_DEFAULTDISP) == HOUR12)
3117 ? pu->dp_hour12_toggle : pu->dp_hour24_toggle, True, True);
3119 switch(get_int_prop(p, CP_DEFAULTVIEW)) {
3121 XmToggleButtonGadgetSetState(pu->dp_view_day_toggle,
3125 XmToggleButtonGadgetSetState(pu->dp_view_week_toggle,
3129 XmToggleButtonGadgetSetState(pu->dp_view_year_toggle,
3134 XmToggleButtonGadgetSetState(pu->dp_view_month_toggle,
3139 XmTextSetString(pu->dp_init_view_text, get_char_prop(p, CP_DEFAULTCAL));
3143 set_gap_vals_on_ui(Props_pu *pu, Props *p) {
3146 CSA_return_code stat;
3148 CSA_access_list step = NULL, holder = NULL, last;
3150 cal = allocate_cal_struct(appt_read,
3151 pu->cal->my_cal_version,
3152 CSA_CAL_ATTR_ACCESS_LIST_I,
3154 stat = query_cal_struct(pu->cal->my_cal_handle, cal);
3155 backend_err_msg(pu->frame, pu->cal->calname, stat, pu->xm_error_pixmap);
3156 if (stat != CSA_SUCCESS) {
3157 free_cal_struct(&cal);
3160 pu->gap_list = cal->access_list->value->item.access_list_value;
3161 cal->access_list->value->item.access_list_value = NULL;
3163 XmListDeleteAllItems(pu->gap_access_list);
3164 step = pu->gap_list;
3166 if (pu->cal->my_cal_version < DATAVER4) {
3167 p_str = p_gap_create_perm_str(step->rights);
3168 p_gap_create_entry_string(pu, step->user->user_name,
3172 xmstr = XmStringCreateLocalized(step->user->user_name);
3174 XmListAddItem(pu->gap_access_list, xmstr, 0);
3175 XmStringFree(xmstr);
3178 free_cal_struct(&cal);
3182 valid_margin_str(Props_pu *pu, char *str)
3186 XmConvertStringToUnits(XtScreen(pu->pop_margin_frame),
3187 str, XmHORIZONTAL, XmINCHES, &badStr);
3189 return (Boolean)!badStr;
3193 set_printer_vals_on_ui(Props_pu *pu, Props *p) {
3196 _DtPrintSetMarginSpec(pu->pop_left_text,
3197 get_char_prop(p, CP_PRINTLMARGIN));
3199 _DtPrintSetMarginSpec(pu->pop_top_text,
3200 get_char_prop(p, CP_PRINTTMARGIN));
3202 _DtPrintSetMarginSpec(pu->pop_right_text,
3203 get_char_prop(p, CP_PRINTRMARGIN));
3205 _DtPrintSetMarginSpec(pu->pop_bottom_text,
3206 get_char_prop(p, CP_PRINTBMARGIN));
3208 _DtPrintSetHdrFtrByIndex(pu->pop_tl_option,
3209 get_int_prop(p, CP_PRINTLHEADER));
3211 _DtPrintSetHdrFtrByIndex(pu->pop_tr_option,
3212 get_int_prop(p, CP_PRINTRHEADER));
3214 _DtPrintSetHdrFtrByIndex(pu->pop_bl_option,
3215 get_int_prop(p, CP_PRINTLFOOTER));
3217 _DtPrintSetHdrFtrByIndex(pu->pop_br_option,
3218 get_int_prop(p, CP_PRINTRFOOTER));
3221 ** For backward compatability with the XView toggles (which used or'd
3222 ** values) - we must continue ...
3224 plevel = get_int_prop(p, CP_PRINTPRIVACY);
3225 if (plevel & PRINT_PUBLIC)
3226 XmToggleButtonGadgetSetState(pu->pop_privacy_public_toggle,
3228 if (plevel & PRINT_SEMIPRIVATE)
3229 XmToggleButtonGadgetSetState(pu->pop_privacy_semi_toggle,
3231 if (plevel & PRINT_PRIVATE)
3232 XmToggleButtonGadgetSetState(pu->pop_privacy_private_toggle,
3237 set_date_vals_on_ui(Props_pu *pu, Props *p) {
3238 SeparatorType st = get_int_prop(p, CP_DATESEPARATOR);
3239 OrderingType ot = get_int_prop(p, CP_DATEORDERING);
3243 XmToggleButtonGadgetSetState(pu->dfp_order_mmddyy_toggle,
3247 XmToggleButtonGadgetSetState(pu->dfp_order_ddmmyy_toggle,
3252 XmToggleButtonGadgetSetState(pu->dfp_order_yymmdd_toggle,
3258 case SEPARATOR_BLANK:
3259 XmToggleButtonGadgetSetState(pu->dfp_sep_blank_toggle,
3262 case SEPARATOR_SLASH:
3263 XmToggleButtonGadgetSetState(pu->dfp_sep_slash_toggle,
3267 XmToggleButtonGadgetSetState(pu->dfp_sep_period_toggle,
3270 case SEPARATOR_DASH:
3271 XmToggleButtonGadgetSetState(pu->dfp_sep_dash_toggle,
3278 set_props_on_ui(Props_pu *pu, Props *p) {
3279 set_editor_vals_on_ui(pu, p);
3280 set_display_vals_on_ui(pu, p);
3281 set_gap_vals_on_ui(pu, p);
3282 set_printer_vals_on_ui(pu, p);
3283 set_date_vals_on_ui(pu, p);
3290 show_props_pu(Calendar *c) {
3291 Props *p = (Props *)c->properties;
3292 Props_pu *pu = (Props_pu *)c->properties_pu;
3304 if (!props_pu_showing(pu))
3306 set_props_on_ui(pu, p);
3307 XtManageChild(pu->base_form_mgr);
3309 /* Center Category menu */
3310 p_gap_center_cat_menu(pu->pane_list[pu->last_props_pane],
3314 /* reset default values. takes care of 7:00/9:00 start problem */
3315 p_defaults_proc_helper(c);
3317 XtPopup(pu->frame, XtGrabNone);
3321 show_print_props_pu(Calendar *c)
3323 Props *p = (Props *)c->properties;
3324 Props_pu *pu = (Props_pu *)c->properties_pu;
3331 activate_ui(pu, PRINTER_OPS_PANE);
3333 if (!props_pu_showing(pu))
3335 set_props_on_ui(pu, p);
3336 XtManageChild(pu->base_form_mgr);
3338 /* Center Category menu */
3339 p_gap_center_cat_menu(pu->pane_list[pu->last_props_pane],
3345 props_pu_clean_up(Props_pu *p) {
3348 p->pane_list = NULL;
3352 props_pu_showing(Props_pu *p) {
3353 if (p && p->base_form_mgr)
3354 return XtIsManaged(p->base_form_mgr);
3359 p_gap_clear_toggles(Props_pu *p)
3363 * V5DEP: If this is a V5 server w/V1 backing store probably
3364 * should use old access flags.
3366 if (p->cal->my_cal_version >= DATAVER4) {
3367 XmToggleButtonGadgetSetState(p->gap2_public_tog[GAP_VIEW],
3369 XmToggleButtonGadgetSetState(p->gap2_public_tog[GAP_INSERT],
3371 XmToggleButtonGadgetSetState(p->gap2_public_tog[GAP_CHANGE],
3373 XmToggleButtonGadgetSetState(p->gap2_semi_tog[GAP_VIEW],
3375 XmToggleButtonGadgetSetState(p->gap2_semi_tog[GAP_INSERT],
3377 XmToggleButtonGadgetSetState(p->gap2_semi_tog[GAP_CHANGE],
3379 XmToggleButtonGadgetSetState(p->gap2_private_tog[GAP_VIEW],
3381 XmToggleButtonGadgetSetState(p->gap2_private_tog[GAP_INSERT],
3383 XmToggleButtonGadgetSetState(p->gap2_private_tog[GAP_CHANGE],
3386 XmToggleButtonGadgetSetState(p->gap_browse_toggle,
3388 XmToggleButtonGadgetSetState(p->gap_insert_toggle,
3390 XmToggleButtonGadgetSetState(p->gap_delete_toggle,
3396 p_gap_center_cat_menu(
3400 Dimension frame_width, menu_width;
3402 XtVaGetValues(frame, XmNwidth, &frame_width, NULL);
3403 XtVaGetValues(menu, XmNwidth, &menu_width, NULL);
3405 XtVaSetValues(menu, XmNleftOffset, frame_width/2 - menu_width/2,