diff options
Diffstat (limited to 'src/wins.c')
-rwxr-xr-x | src/wins.c | 260 |
1 files changed, 260 insertions, 0 deletions
diff --git a/src/wins.c b/src/wins.c new file mode 100755 index 0000000..1687f5e --- /dev/null +++ b/src/wins.c @@ -0,0 +1,260 @@ +/* $Id: wins.c,v 1.1 2007/07/21 19:37:44 culot Exp $ */ + +/* + * Calcurse - text-based organizer + * Copyright (c) 2007 Frederic Culot + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Send your feedback or comments to : calcurse@culot.org + * Calcurse home page : http://culot.org/calcurse + * + */ + +#include <ncurses.h> +#include <stdlib.h> + +#include "i18n.h" +#include "vars.h" +#include "calendar.h" +#include "notify.h" +#include "utils.h" +#include "todo.h" +#include "wins.h" + +/* Create all the windows. */ +void +wins_init(window_t *wincal, window_t *winapp, window_t *wintod, + window_t *winbar) +{ + char label[BUFSIZ]; + + /* + * Create the three main windows plus the status bar and the pad used to + * display appointments and event. + */ + cwin = newwin(CALHEIGHT, CALWIDTH, wincal->y, wincal->x); + snprintf(label, BUFSIZ, _("Calendar")); + wins_show(cwin, label); + awin = newwin(winapp->h, winapp->w, winapp->y, winapp->x); + snprintf(label, BUFSIZ, _("Appointments")); + wins_show(awin, label); + apad->width = winapp->w - 3; + apad->ptrwin = newpad(apad->length, apad->width); + twin = newwin(wintod->h, wintod->w, wintod->y, wintod->x); + snprintf(label, BUFSIZ, _("ToDo")); + wins_show(twin, label); + swin = newwin(winbar->h, winbar->w, winbar->y, winbar->x); + + /* Enable function keys (i.e. arrow keys) in those windows */ + keypad(swin, TRUE); + keypad(twin, TRUE); + keypad(awin, TRUE); + keypad(cwin, TRUE); +} + +/* + * Delete the existing windows and recreate them with their new + * size and placement. + */ +void +wins_reinit(conf_t *conf, int which_pan, window_t *winbar, window_t *winapp, + window_t *wintod, window_t *wincal, window_t *winnot) +{ + clear(); + delwin(swin); + delwin(cwin); + delwin(awin); + delwin(apad->ptrwin); + delwin(twin); + wins_get_config(conf, winbar, winnot, winapp, wintod, wincal); + wins_init(wincal, winapp, wintod, winbar); + if (notify_bar()) + notify_reinit_bar(winnot->h, winnot->w, winnot->y, winnot->x); +} + +/* Show the window with a border and a label. */ +void +wins_show(WINDOW * win, char *label) +{ + int startx, starty, height, width; + + getbegyx(win, starty, startx); + getmaxyx(win, height, width); + + box(win, 0, 0); + mvwaddch(win, 2, 0, ACS_LTEE); + mvwhline(win, 2, 1, ACS_HLINE, width - 2); + mvwaddch(win, 2, width - 1, ACS_RTEE); + + print_in_middle(win, 1, 0, width, label); +} + +/* + * Get the screen size and recalculate the windows configurations. + */ +void +wins_get_config(conf_t *conf, window_t *status, window_t *notify, + window_t *apts, window_t *todo, window_t *calr) +{ + /* Get the screen configuration */ + getmaxyx(stdscr, row, col); + + /* fixed values for status, notification bars and calendar */ + status->h = STATUSHEIGHT; + status->w = col; + status->y = row - status->h; + status->x = 0; + + if (notify_bar()) { + notify->h = 1; + notify->w = col; + notify->y = status->y - 1; + notify->x = 0; + } else { + notify->h = 0; + notify->w = 0; + notify->y = 0; + notify->x = 0; + } + + if (conf->layout <= 4) { /* APPOINTMENT is the biggest panel */ + apts->w = col - CALWIDTH; + apts->h = row - (status->h + notify->h); + todo->w = CALWIDTH; + todo->h = row - (CALHEIGHT + status->h + notify->h); + } else { /* TODO is the biggest panel */ + todo->w = col - CALWIDTH; + todo->h = row - (status->h + notify->h); + apts->w = CALWIDTH; + apts->h = row - (CALHEIGHT + status->h + notify->h); + } + + /* defining the layout */ + switch (conf->layout) { + case 1: + apts->y = 0; + apts->x = 0; + calr->y = 0; + todo->x = apts->w; + todo->y = CALHEIGHT; + calr->x = apts->w; + break; + case 2: + apts->y = 0; + apts->x = 0; + todo->y = 0; + todo->x = apts->w; + calr->x = apts->w; + calr->y = todo->h; + break; + case 3: + apts->y = 0; + todo->x = 0; + calr->x = 0; + calr->y = 0; + apts->x = CALWIDTH; + todo->y = CALHEIGHT; + break; + case 4: + apts->y = 0; + todo->x = 0; + todo->y = 0; + calr->x = 0; + apts->x = CALWIDTH; + calr->y = todo->h; + break; + case 5: + todo->y = 0; + todo->x = 0; + calr->y = 0; + apts->y = CALHEIGHT; + apts->x = todo->w; + calr->x = todo->w; + break; + case 6: + todo->y = 0; + todo->x = 0; + apts->y = 0; + apts->x = todo->w; + calr->x = todo->w; + calr->y = apts->h; + break; + case 7: + todo->y = 0; + apts->x = 0; + calr->x = 0; + calr->y = 0; + todo->x = CALWIDTH; + apts->y = CALHEIGHT; + break; + case 8: + todo->y = 0; + apts->x = 0; + calr->x = 0; + apts->y = 0; + todo->x = CALWIDTH; + calr->y = apts->h; + break; + } +} + +/* + * Update all of the three windows and put a border around the + * selected window. + */ +void +wins_update(int surrounded_window, conf_t *conf, window_t *winbar, + window_t *winapp, window_t *wintod, int hilt_app, int hilt_tod, + int which_pan, int nb_tod, int first_todo_onscreen, char *saved_t_mesg) +{ + switch (surrounded_window) { + + case CALENDAR: + border_color(cwin); + border_nocolor(awin); + border_nocolor(twin); + break; + + case APPOINTMENT: + border_color(awin); + border_nocolor(cwin); + border_nocolor(twin); + break; + + case TODO: + border_color(twin); + border_nocolor(awin); + border_nocolor(cwin); + break; + + default: + fputs(_("FATAL ERROR in wins_update: no window selected\n"), + stderr); + exit(EXIT_FAILURE); + /* NOTREACHED */ + } + + apoint_update_panel(winapp, hilt_app, which_pan); + todo_update_panel(wintod, hilt_tod, nb_tod, which_pan, + first_todo_onscreen, &saved_t_mesg); + calendar_update_panel(cwin); + status_bar(surrounded_window); + if (notify_bar()) + notify_update_bar(); + wmove(swin, 0, 0); + doupdate(); +} |