Lines Matching +full:mm +full:- +full:0

1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
4 * Copyright (c) 2022-2024 Alfonso Sabato Siciliano
37 #define MIN_YEAR_CAL 0
42 #define MIN_YEAR_DATE 0
46 #define ISLEAP(year) ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
87 static int month_days(int yy, int mm)
91 if (mm == 2)
93 else if (mm == 4 || mm == 6 || mm == 9 || mm == 11)
101 static int week_day(int yy, int mm, int dd)
105 dd += mm < 3 ? yy-- : yy - 2;
106 wd = 23*mm/9 + dd + 4 + yy/4 - yy/100 + yy/400;
114 int *mm, int *dd)
119 *mm = MIN(*month, 12);
120 if (*mm == 0)
121 *mm = 1;
122 *dd = (*day == 0) ? 1 : *day;
123 if (*dd > month_days(*yy, *mm))
124 *dd = month_days(*yy, *mm);
127 static void datectl(enum operation op, int *yy, int *mm, int *dd)
131 ndays = month_days(*yy, *mm);
136 *dd -= 7;
138 if (*mm == 1) {
139 *yy -= 1;
140 *mm = 12;
142 *mm -= 1;
143 ndays = month_days(*yy, *mm);
144 *dd = ndays - abs(7 - *dd);
151 if (*mm == 12) {
153 *mm = 1;
155 *mm += 1;
156 *dd = *dd + 7 - ndays;
161 *dd -= 1;
163 if (*mm == 1) {
164 *yy -= 1;
165 *mm = 12;
167 *mm -= 1;
168 *dd = month_days(*yy, *mm);
175 if (*mm == 12) {
177 *mm = 1;
179 *mm += 1;
184 if (*mm == 1) {
185 *mm = 12;
186 *yy -= 1;
188 *mm -= 1;
189 ndays = month_days(*yy, *mm);
194 if (*mm == 12) {
195 *mm = 1;
198 *mm += 1;
199 ndays = month_days(*yy, *mm);
204 *yy -= 1;
205 ndays = month_days(*yy, *mm);
211 ndays = month_days(*yy, *mm);
219 *mm = 1;
224 *mm = 12;
240 mvwhline(win, 0, w/2 - l/2, UARROW(conf), l);
241 mvwhline(win, h-1, w/2 - l/2, DARROW(conf), l);
248 mvwprintw(win, 1, 1, fmt, m[value - 1]);
258 print_calendar(struct bsddialog_conf *conf, WINDOW *win, int yy, int mm, int dd,
268 mvwhline(win, 0, 15, UARROW(conf), 4);
269 mvwhline(win, h-1, 15, DARROW(conf), 4);
270 mvwvline(win, 3, 0, LARROW(conf), 3);
271 mvwvline(win, 3, w-1, RARROW(conf), 3);
276 ndays = month_days(yy, mm);
278 wd = week_day(yy, mm, 1);
290 wd = 0;
304 if (d->built) {
308 if (dialog_size_position(d, MINHCAL, MINWCAL, NULL) != 0)
310 if (draw_dialog(d) != 0)
312 if (d->built)
316 ycal = d->y + d->h - 15;
317 xcal = d->x + d->w/2 - 17;
318 mvwaddstr(d->widget, d->h - 16, d->w/2 - 17, "Month");
319 update_box(d->conf, mm_win, ycal, xcal, 3, 17, RAISED);
320 mvwaddstr(d->widget, d->h - 16, d->w/2, "Year");
321 update_box(d->conf, yy_win, ycal, xcal + 17, 3, 17, RAISED);
322 update_box(d->conf, dd_win, ycal + 3, xcal, 9, 34, RAISED);
323 wnoutrefresh(d->widget);
325 return (0);
333 int retval, sel, yy, mm, dd;
343 init_date(year, month, day, &yy, &mm, &dd);
345 if (prepare_dialog(conf, text, rows, cols, &d) != 0)
352 RETURN_ERROR("Cannot build WINDOW for mm");
357 if (calendar_redraw(&d, yy_win, mm_win, dd_win) != 0)
360 sel = -1;
363 drawsquare(conf, mm_win, RAISED, "%15s", mm, sel == 0);
365 print_calendar(conf, dd_win, yy, mm, dd, sel == 2);
373 if (focusbuttons || conf->button.always_active) {
379 if (conf->key.enable_esc) {
389 sel = 0;
390 d.bs.curr = conf->button.always_active ?
391 0 : -1;
397 sel = -1;
398 d.bs.curr = 0;
409 sel = 0;
410 d.bs.curr = conf->button.always_active ?
411 0 : -1;
414 datectl(RIGHT_DAY, &yy, &mm, &dd);
423 d.bs.curr--;
424 if (d.bs.curr < 0) {
427 d.bs.curr = conf->button.always_active ?
428 0 : -1;
431 datectl(LEFT_DAY, &yy, &mm, &dd);
433 sel = 0;
434 } else { /* sel = 0, Month */
436 sel = -1;
437 d.bs.curr = 0;
445 d.bs.curr = conf->button.always_active ? 0 : -1;
447 } else if (sel == 0) {
448 datectl(UP_MONTH, &yy, &mm, &dd);
450 datectl(UP_YEAR, &yy, &mm, &dd);
452 datectl(UP_DAY, &yy, &mm, &dd);
458 } else if (sel == 0) {
459 datectl(DOWN_MONTH, &yy, &mm, &dd);
461 datectl(DOWN_YEAR, &yy, &mm, &dd);
463 datectl(DOWN_DAY, &yy, &mm, &dd);
466 case '-':
469 } else if (sel == 0) {
470 datectl(UP_MONTH, &yy, &mm, &dd);
472 datectl(UP_YEAR, &yy, &mm, &dd);
474 datectl(LEFT_DAY, &yy, &mm, &dd);
480 } else if (sel == 0) {
481 datectl(DOWN_MONTH, &yy, &mm, &dd);
483 datectl(DOWN_YEAR, &yy, &mm, &dd);
485 datectl(RIGHT_DAY, &yy, &mm, &dd);
489 datectl(UP_MONTH, &yy, &mm, &dd);
492 datectl(DOWN_MONTH, &yy, &mm, &dd);
495 datectl(UP_YEAR, &yy, &mm, &dd);
498 datectl(DOWN_YEAR, &yy, &mm, &dd);
501 if (conf->key.f1_file == NULL &&
502 conf->key.f1_message == NULL)
504 if (f1help_dialog(conf) != 0)
506 if (calendar_redraw(&d, yy_win, mm_win, dd_win) != 0)
511 if (calendar_redraw(&d, yy_win, mm_win, dd_win) != 0)
525 *month = mm;
540 if (d->built) {
544 if (dialog_size_position(d, 3 /*windows*/, MINWDATE, NULL) != 0)
546 if (draw_dialog(d) != 0)
548 if (d->built)
552 y = d->y + d->h - 6;
553 x = (d->x + d->w / 2) - 11;
554 update_box(d->conf, di[0].win, y, x, 3, di[0].width, LOWERED);
555 mvwaddch(d->widget, d->h - 5, x - d->x + di[0].width, '/');
556 x += di[0].width + 1;
557 update_box(d->conf, di[1].win, y, x , 3, di[1].width, LOWERED);
558 mvwaddch(d->widget, d->h - 5, x - d->x + di[1].width, '/');
560 update_box(d->conf, di[2].win, y, x, 3, di[2].width, LOWERED);
561 wnoutrefresh(d->widget);
563 return (0);
567 build_dateitem(const char *format, int *yy, int *mm, int *dd,
574 {UP_MONTH, DOWN_MONTH, NULL, 11, "%9s", mm},
578 for (i = 0; i < 3; i++) {
586 if (format == NULL || wcscmp(wformat, L"d/m/y") == 0) {
587 dt[0] = init[2];
589 dt[2] = init[0];
590 } else if (wcscmp(wformat, L"m/d/y") == 0) {
591 dt[0] = init[1];
593 dt[2] = init[0];
594 } else if (wcscmp(wformat, L"y/m/d") == 0) {
595 dt[0] = init[0];
602 return (0);
610 int retval, i, sel, yy, mm, dd;
620 init_date(year, month, day, &yy, &mm, &dd);
622 if (prepare_dialog(conf, text, rows, cols, &d) != 0)
625 if (build_dateitem(conf->date.format, &yy, &mm, &dd, di) != 0)
627 if (datebox_redraw(&d, di) != 0)
630 sel = -1;
633 for (i = 0; i < 3; i++)
643 if (focusbuttons || conf->button.always_active) {
649 if (conf->key.enable_esc) {
662 sel = 0;
663 d.bs.curr = conf->button.always_active ?
664 0 : -1;
670 d.bs.curr = 0;
678 d.bs.curr--;
679 focusbuttons = d.bs.curr < 0 ? false : true;
682 d.bs.curr = conf->button.always_active ?
683 0 : -1;
686 sel--;
687 focusbuttons = sel < 0 ? true : false;
689 d.bs.curr = (int)d.bs.nbuttons - 1;
693 case '-':
695 datectl(di[sel].up, &yy, &mm, &dd);
699 sel = 0;
701 d.bs.curr = conf->button.always_active ? 0 : -1;
704 datectl(di[sel].up, &yy, &mm, &dd);
711 datectl(di[sel].down, &yy, &mm, &dd);
714 if (conf->key.f1_file == NULL &&
715 conf->key.f1_message == NULL)
717 if (f1help_dialog(conf) != 0)
719 if (datebox_redraw(&d, di) != 0)
724 if (datebox_redraw(&d, di) != 0)
738 *month = mm;
741 for (i = 0; i < 3 ; i++)