Add GNU LGPL headers to all .c .C and .h files
[oweals/cde.git] / cde / programs / dtcm / dtcm / goto.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 /*******************************************************************************
24 **
25 **  goto.c
26 **
27 **  $XConsortium: goto.c /main/4 1995/12/04 14:18:24 rswiston $
28 **
29 **  RESTRICTED CONFIDENTIAL INFORMATION:
30 **
31 **  The information in this document is subject to special
32 **  restrictions in a confidential disclosure agreement between
33 **  HP, IBM, Sun, USL, SCO and Univel.  Do not distribute this
34 **  document outside HP, IBM, Sun, USL, SCO, or Univel without
35 **  Sun's specific written approval.  This document and all copies
36 **  and derivative works thereof must be returned or destroyed at
37 **  Sun's request.
38 **
39 **  Copyright 1993 Sun Microsystems, Inc.  All rights reserved.
40 **
41 *******************************************************************************/
42
43 /*                                                                      *
44  * (c) Copyright 1993, 1994 Hewlett-Packard Company                     *
45  * (c) Copyright 1993, 1994 International Business Machines Corp.       *
46  * (c) Copyright 1993, 1994 Sun Microsystems, Inc.                      *
47  * (c) Copyright 1993, 1994 Novell, Inc.                                *
48  */
49
50 #ifndef lint
51 static  char sccsid[] = "@(#)goto.c 1.40 95/03/28 Copyr 1993 Sun Microsystems, Inc.";
52 #endif
53
54 #include <EUSCompat.h>
55 #include <stdio.h>
56 #include <Xm/Xm.h>
57 #include <Xm/Form.h>
58 #include <Xm/Label.h>
59 #include <Xm/LabelG.h>
60 #include <Xm/List.h>
61 #include <Xm/DialogS.h>
62 #include <Xm/PushB.h>
63 #include <Xm/RowColumn.h>
64 #include <Xm/Scale.h>
65 #include <Xm/SeparatoG.h>
66 #include <Xm/Text.h>
67 #include <Xm/ToggleBG.h>
68 #include <Xm/MwmUtil.h>
69 #include "calendar.h"
70 #include "util.h"
71 #include "timeops.h"
72 #include "find.h"
73 #include "datefield.h"
74 #include "getdate.h"
75 #include "dayglance.h"
76 #include "select.h"
77 #include "props.h"
78 #include "editor.h"
79 #include "goto.h"
80 #include "help.h"
81
82 extern caddr_t
83 make_goto(Calendar *c)
84 {
85         Goto            *g;
86         XmString        xmstr;
87         Widget          separator, button_form;
88         void            goto_date(), g_cancel_cb();
89         char            *title;
90
91         if (c->goTo == NULL) {
92                 c->goTo = (caddr_t)ckalloc(sizeof(Goto));
93                 g = (Goto*)c->goTo;
94         }
95         else
96                 g = (Goto*)c->goTo;
97
98         title = XtNewString(catgets(c->DT_catd, 1, 715, "Calendar : Go to Date"));
99         g->frame = XtVaCreatePopupShell("frame",
100                 xmDialogShellWidgetClass, c->frame,
101                 XmNtitle, title,
102                 XmNallowShellResize, True,
103                 XmNmappedWhenManaged, False,
104                 NULL);
105         XtFree(title);
106
107         g->form = XtVaCreateWidget("form",
108                 xmFormWidgetClass,      g->frame,
109                 XmNautoUnmanage,        False,
110                 XmNfractionBase,        3,
111                 XmNhorizontalSpacing,   4,
112                 XmNverticalSpacing,     4,
113                 XmNmarginWidth,         0,
114                 XmNmarginHeight,        0,
115                 NULL);
116
117         xmstr = XmStringCreateLocalized(catgets(c->DT_catd, 1, 293, "Date:"));
118         g->datelabel = XtVaCreateWidget("Date:", 
119                 xmLabelWidgetClass,     g->form,
120                 XmNleftAttachment,      XmATTACH_FORM,
121                 XmNleftOffset,          5,
122                 XmNtopAttachment,       XmATTACH_FORM,
123                 XmNtopOffset,           11,
124                 XmNlabelString,         xmstr,
125                 NULL);
126         XmStringFree(xmstr);
127
128         g->datetext = XtVaCreateWidget("text", 
129                 xmTextWidgetClass,      g->form,
130                 XmNtopAttachment,       XmATTACH_FORM,
131                 XmNtopWidget,           g->datelabel,
132                 XmNtopOffset,           7,
133                 XmNleftAttachment,      XmATTACH_WIDGET,
134                 XmNleftWidget,          g->datelabel,
135                 XmNrightAttachment,     XmATTACH_POSITION,
136                 XmNrightPosition,       3,
137                 XmNrightOffset,         10,
138                 XmNcolumns,             32,
139                 NULL);
140         XtAddCallback(g->datetext, XmNactivateCallback, goto_date, NULL);
141
142
143         separator = XtVaCreateWidget("separator",
144                 xmSeparatorGadgetClass,
145                 g->form,
146                 XmNleftAttachment,      XmATTACH_FORM,
147                 XmNrightAttachment,     XmATTACH_FORM,
148                 XmNtopAttachment,       XmATTACH_WIDGET,
149                 XmNtopWidget,           g->datetext,
150                 XmNtopOffset,           5,
151                 NULL);
152
153         button_form = XtVaCreateWidget("form",
154                 xmFormWidgetClass,      g->form,
155                 XmNautoUnmanage,        False,
156                 XmNleftAttachment,      XmATTACH_FORM,
157                 XmNleftOffset,          5,
158                 XmNrightAttachment,     XmATTACH_FORM,
159                 XmNrightOffset,         5,
160                 XmNtopAttachment,       XmATTACH_WIDGET,
161                 XmNtopWidget,           separator,
162                 XmNhorizontalSpacing,   4,
163                 XmNfractionBase,        3,
164                 NULL);
165
166         xmstr = XmStringCreateLocalized(catgets(c->DT_catd, 1, 294, "Go To"));
167         g->datebutton = XtVaCreateWidget("goTo", 
168                 xmPushButtonWidgetClass, button_form,
169                 XmNtopAttachment,       XmATTACH_WIDGET,
170                 XmNtopWidget,           separator,
171                 XmNlabelString,         xmstr,
172                 XmNnavigationType,      XmTAB_GROUP,
173                 XmNleftAttachment,      XmATTACH_POSITION,
174                 XmNleftPosition,        0,
175                 XmNrightAttachment,     XmATTACH_POSITION,
176                 XmNrightPosition,       1,
177                 NULL);
178         XtAddCallback(g->datebutton, XmNactivateCallback, goto_date, NULL);
179         XmStringFree(xmstr);
180
181         xmstr = XmStringCreateLocalized(catgets(c->DT_catd, 1, 680, "Close"));
182         g->cancelbutton = XtVaCreateWidget("cancel", 
183                 xmPushButtonWidgetClass, button_form,
184                 XmNtopAttachment,       XmATTACH_WIDGET,
185                 XmNtopWidget,           separator,
186                 XmNleftAttachment,      XmATTACH_POSITION,
187                 XmNleftPosition,        1,
188                 XmNrightAttachment,     XmATTACH_POSITION,
189                 XmNrightPosition,       2,
190                 XmNlabelString,         xmstr,
191                 NULL);
192         XtAddCallback(g->cancelbutton, XmNactivateCallback, g_cancel_cb, NULL);
193         XmStringFree(xmstr);
194
195
196         xmstr = XmStringCreateLocalized(catgets(c->DT_catd, 1, 77, "Help"));
197         g->helpbutton = XtVaCreateWidget("help", 
198                 xmPushButtonWidgetClass, button_form,
199                 XmNtopAttachment,       XmATTACH_WIDGET,
200                 XmNtopWidget,           separator,
201                 XmNleftAttachment,      XmATTACH_POSITION,
202                 XmNleftPosition,        2,
203                 XmNrightAttachment,     XmATTACH_POSITION,
204                 XmNrightPosition,       3,
205                 XmNlabelString,         xmstr,
206                 NULL);
207         XtAddCallback(g->helpbutton, XmNactivateCallback, 
208                                 (XtCallbackProc)help_cb, GOTO_HELP_BUTTON);
209         XtAddCallback(g->form, XmNhelpCallback,
210                 (XtCallbackProc)help_cb, (XtPointer) GOTO_HELP_BUTTON);
211         XmStringFree(xmstr);
212
213         g->goto_message = XtVaCreateWidget("message",
214                 xmLabelGadgetClass, g->form,
215                 XmNalignment, XmALIGNMENT_BEGINNING,
216                 XmNtopAttachment, XmATTACH_WIDGET,
217                 XmNtopWidget, g->cancelbutton,
218                 XmNleftAttachment, XmATTACH_FORM,
219                 XmNrightAttachment, XmATTACH_FORM,
220                 XmNbottomAttachment, XmATTACH_FORM,
221                 NULL);
222
223         /* set default button */
224         XtVaSetValues(g->form, XmNdefaultButton, g->datebutton, NULL);
225         XtVaSetValues(g->form, XmNcancelButton, g->cancelbutton, NULL);
226         XtVaSetValues(button_form, XmNdefaultButton, g->datebutton, NULL);
227         XtVaSetValues(button_form, XmNcancelButton, g->cancelbutton, NULL);
228         XmProcessTraversal(g->datetext, XmTRAVERSE_CURRENT);
229         XtVaSetValues(g->form, XmNinitialFocus, g->datetext, NULL);
230
231         ManageChildren(button_form);
232         ManageChildren(g->form);
233         XtManageChild(g->form);
234         XtVaSetValues(g->frame, XmNmappedWhenManaged, True, NULL);
235         XtRealizeWidget(g->frame);
236
237         XtPopup(g->frame, XtGrabNone);
238
239         return(caddr_t)g;
240 }
241
242 void
243 goto_date(Widget widget, XtPointer client_data, XmPushButtonCallbackStruct *cbs)
244 {
245         Calendar *c = calendar;
246         Props *p;
247         Goto *g;
248         Tick gotodate, start, stop;
249         char *date = NULL, today[DATESIZ];
250         char message[40];
251         Dimension w, h;
252         OrderingType ot;
253         SeparatorType st;
254  
255         p = (Props*)c->properties;
256         ot = get_int_prop(p, CP_DATEORDERING);
257         st = get_int_prop(p, CP_DATESEPARATOR);
258         g = (Goto*)c->goTo;
259  
260         date = XmTextGetString(g->datetext);
261         if ((*date == NULL) || (date == NULL)) {
262                 sprintf(message, catgets(c->DT_catd, 1, 297, "Please type in a date"));
263                 set_message(g->goto_message, message);
264                 return;
265         }
266         format_tick(c->view->date, ot, st, today);
267         set_message(g->goto_message, "");
268         date = get_date_from_widget(c->view->date, g->datetext, ot, st);
269         if ( date == NULL ) {
270                 return;
271         } else {
272                 gotodate = cm_getdate(date, NULL);
273         }
274         if (!strcmp(today, date)) {
275                 sprintf(message, catgets(c->DT_catd, 1, 298, "You are already viewing %s"), date);
276                 set_message(g->goto_message, message);
277                 return;
278         }
279  
280
281         if (gotodate == DATE_BBOT) {
282                 sprintf(message, catgets(c->DT_catd, 1, 814, "You must enter a date after 1969 and before 2038"));
283                 set_message(g->goto_message, message);
284                 return;
285         }
286         else if (gotodate == DATE_AEOT) {
287                 sprintf(message, catgets(c->DT_catd, 1, 814, "You must enter a date after 1969 and before 2038"));
288                 set_message(g->goto_message, message);
289                 return;
290         }
291         else if (gotodate <= 0) {
292                 sprintf(message, catgets(c->DT_catd, 1, 299, "Invalid Date"));
293                 set_message(g->goto_message, message);
294                 return;
295         }
296
297         invalidate_cache(c);
298          
299         get_range(c->view->glance, c->view->date, &start, &stop);
300         if (in_range(start, stop, gotodate)) {
301                 /* date is in view; deselect and repaint new selection */
302                 calendar_deselect(c);
303                 c->view->olddate = c->view->date;
304                 c->view->date = gotodate;
305                 paint_selection(c);
306         }
307         else {
308                 /* repaint the entire canvas */
309                 c->view->olddate = c->view->date;
310                 c->view->date = gotodate;
311                 c->view->nwks = numwks(c->view->date);
312                 XtVaGetValues(c->canvas, XmNwidth, &w, XmNheight, &h, NULL);
313                 gr_clear_area(c->xcontext, 0, 0, w, h);
314                 if (c->view->glance == dayGlance) {
315                         init_mo(c);
316                         init_dayview(c);
317                 }
318                 paint_canvas(c, NULL, RENDER_UNMAP);
319         }        
320 }
321
322 void
323 g_cancel_cb(
324         Widget  widget,
325         XtPointer client_data,
326         XmPushButtonCallbackStruct *cbs)
327 {
328         Calendar *c = calendar;
329         Goto      *g;
330
331         g = (Goto *)c->goTo;
332
333         XmTextSetString(g->datetext, "");
334
335         XtPopdown(g->frame);
336
337         return;
338 }