1 /*
2  * year menu widgets.
3  *
4  *	destroy_year_menu()		Destroy the year window an its
5  *					contents
6  *	create_year_menu()		Create a year calendar for curr_year
7  *					and put a year view into it
8  */
9 
10 #include <stdio.h>
11 #include <stdlib.h>
12 #include <time.h>
13 #include <Xm/Xm.h>
14 #include <Xm/DialogS.h>
15 #include <Xm/Form.h>
16 #include <Xm/Frame.h>
17 #include <Xm/RowColumn.h>
18 #include <Xm/LabelP.h>
19 #include <Xm/ArrowBP.h>
20 #include <Xm/ArrowBG.h>
21 #include <Xm/PushBP.h>
22 #include <Xm/PushBG.h>
23 #include <Xm/Text.h>
24 #include <Xm/ScrolledW.h>
25 #include <Xm/DrawingA.h>
26 #include <Xm/Protocols.h>
27 #include "cal.h"
28 
29 static void done_callback	(Widget, int, XmToggleButtonCallbackStruct *);
30 static void year_cal_callback	(Widget, int, XmDrawingAreaCallbackStruct *);
31 
32 extern Display		*display;	/* everybody uses the same server */
33 extern GC		gc;		/* everybody uses this context */
34 extern Widget		toplevel;	/* top-level shell */
35 extern struct mainmenu	mainmenu;	/* all important window widgets */
36 extern Widget		mainwindow;	/* popup menus hang off main window */
37 extern struct config	config;		/* global configuration data */
38 extern struct plist	*mainlist;	/* list of all schedule entries */
39 extern XFontStruct	*font[NFONTS];	/* fonts: FONT_* */
40 extern Pixel		color[NCOLS];	/* colors: COL_* */
41 
42 static Widget		shell;		/* view window, or 0 if deinstalled */
43 static Widget		parent_form;	/* if in mainwindow, parent form */
44 
45 
46 /*
47  * destroy the year menu. Remove it from the screen, and destroy its widgets.
48  * It's too much trouble to keep them for next time.
49  */
50 
destroy_year_menu(void)51 void destroy_year_menu(void)
52 {
53 	if (shell) {
54 		if (!parent_form)
55 			XtPopdown(shell);
56 		XTDESTROYWIDGET(shell);
57 		shell = 0;
58 		mainmenu.yearcal = 0;
59 	}
60 }
61 
62 
63 /*
64  * create the year menu.
65  * There should be buttons for Quit, next/prev year, next/prev 6 months.
66  */
67 
create_year_menu(Widget parent)68 void create_year_menu(
69 	Widget		parent)
70 {
71 	Arg		args[15];
72 	int		n;
73 	Atom		closewindow;
74 	Widget		form, scroll;
75 	Dimension	xs, ys;
76 
77 	xs = 2*config.year_margin+ 4*config.yearbox_xs*7+ 3*config.year_gap +4;
78 	ys = 2*config.year_margin+ 1*config.year_title +
79 				   3*config.yearbox_ys*8+ 3*config.year_gap +4;
80 
81 	form = create_view_form(&shell, parent_form = parent, 'y',
82 						xs, ys, _("Year View"));
83 	if (!form) {
84 		draw_year_calendar(NULL);
85 		return;
86 	}
87 	XtAddCallback(form, XmNhelpCallback, (XtCallbackProc)
88 			help_callback, (XtPointer)"year");
89 
90 	n = 0;
91 	XtSetArg(args[n], XmNtopAttachment,	XmATTACH_FORM);		n++;
92 	XtSetArg(args[n], XmNbottomAttachment,	XmATTACH_FORM);		n++;
93 	XtSetArg(args[n], XmNleftAttachment,	XmATTACH_FORM);		n++;
94 	XtSetArg(args[n], XmNrightAttachment,	XmATTACH_FORM);		n++;
95 	XtSetArg(args[n], XmNtopOffset,		8);			n++;
96 	XtSetArg(args[n], XmNbottomOffset,	8);			n++;
97 	XtSetArg(args[n], XmNleftOffset,	8);			n++;
98 	XtSetArg(args[n], XmNrightOffset,	8);			n++;
99 	XtSetArg(args[n], XmNwidth,		xs);			n++;
100 	XtSetArg(args[n], XmNheight,		ys);			n++;
101 	XtSetArg(args[n], XmNscrollingPolicy,	XmAUTOMATIC);		n++;
102 	scroll = XtCreateWidget("scroll", xmScrolledWindowWidgetClass,
103 			form, args, n);
104 
105 	n = 0;
106 	XtSetArg(args[n], XmNwidth,		xs-4);			n++;
107 	XtSetArg(args[n], XmNheight,		ys-4);			n++;
108 	mainmenu.yearcal = XtCreateWidget("yearcal", xmDrawingAreaWidgetClass,
109 					scroll, args, n);
110 	XtAddCallback(mainmenu.yearcal, XmNinputCallback, (XtCallbackProc)
111 					year_cal_callback, (XtPointer)NULL);
112 	XtAddCallback(mainmenu.yearcal, XmNexposeCallback, (XtCallbackProc)
113 					year_cal_callback, (XtPointer)NULL);
114 	XtManageChild(mainmenu.yearcal);
115 	XtManageChild(scroll);
116 	XtManageChild(form);
117 
118 	if (!parent) {
119 		XtPopup(shell, XtGrabNone);
120 		closewindow = XmInternAtom(display, "WM_DELETE_WINDOW", False);
121 		XmAddWMProtocolCallback(shell, closewindow, (XtCallbackProc)
122 					done_callback, (XtPointer)shell);
123 	}
124 }
125 
126 
127 /*-------------------------------------------------- callbacks --------------*/
128 /*
129  * All of these routines are direct X callbacks.
130  */
131 
132 /*ARGSUSED*/
done_callback(UNUSED Widget widget,UNUSED int item,UNUSED XmToggleButtonCallbackStruct * data)133 static void done_callback(
134 	UNUSED Widget			widget,
135 	UNUSED int			item,
136 	UNUSED XmToggleButtonCallbackStruct*data)
137 {
138 	if (parent_form)
139 		create_view('m');
140 	else
141 		destroy_year_menu();
142 }
143 
144 
145 /*ARGSUSED*/
year_cal_callback(UNUSED Widget w,UNUSED int data,XmDrawingAreaCallbackStruct * info)146 static void year_cal_callback(
147 	UNUSED Widget			w,
148 	UNUSED int			data,
149 	XmDrawingAreaCallbackStruct	*info)
150 {
151 	int				view;
152 
153 	if (info->reason == XmCR_INPUT && info->event->xany.type==ButtonPress){
154 		if ((view = clicked_year_calendar(info->event->xbutton.x,
155 						  info->event->xbutton.y))) {
156 			if (parent_form)
157 				create_view(view == 'Q' ? 'm' : view);
158 			if (view == 'Q')
159 				destroy_year_menu();
160 		}
161 	} else if (info->reason == XmCR_EXPOSE) {
162 		XEvent dummy;
163 		Region region = XCreateRegion();
164 		XtAddExposureToRegion(info->event, region);
165 		while (XCheckWindowEvent(display, info->window, ExposureMask,
166 								&dummy))
167 			XtAddExposureToRegion(&dummy, region);
168 		draw_year_calendar(region);
169 	}
170 }
171