/* 
   elmo - ELectronic Mail Operator

   Copyright (C) 2003, 2004 rzyjontko

   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; version 2.

   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.  

   ----------------------------------------------------------------------

*/
/****************************************************************************
 *    IMPLEMENTATION HEADERS
 ****************************************************************************/

#ifdef HAVE_CONFIG_H
# include <config.h>
#endif

#include <ctype.h>

#include "topbar.h"
#include "ecurses.h"
#include "interface.h"
#include "ask.h"
#include "color.h"
#include "keymap.h"
#include "cmd.h"
#include "help.h"
#include "sender.h"
#include "gettext.h"
#include "mailreader.h"
#include "box_selection.h"
#include "fetch.h"
#include "smtp.h"
#include "abook.h"
#include "attach.h"

/****************************************************************************
 *    IMPLEMENTATION PRIVATE DEFINITIONS / ENUMERATIONS / SIMPLE TYPEDEFS
 ****************************************************************************/
/****************************************************************************
 *    IMPLEMENTATION PRIVATE CLASS PROTOTYPES / EXTERNAL CLASS REFERENCES
 ****************************************************************************/
/****************************************************************************
 *    IMPLEMENTATION PRIVATE STRUCTURES / UTILITY CLASSES
 ****************************************************************************/
/****************************************************************************
 *    IMPLEMENTATION REQUIRED EXTERNAL REFERENCES (AVOID)
 ****************************************************************************/
/****************************************************************************
 *    IMPLEMENTATION PRIVATE DATA
 ****************************************************************************/

/* Toppbar window. */
static WINDOW *window;

/* Color used to display toppbar window. */
static chtype text_color;

/****************************************************************************
 *    INTERFACE DATA
 ****************************************************************************/
/****************************************************************************
 *    IMPLEMENTATION PRIVATE FUNCTION PROTOTYPES
 ****************************************************************************/
/****************************************************************************
 *    IMPLEMENTATION PRIVATE FUNCTIONS
 ****************************************************************************/


static int
print_key (int maxlen, void (*fun)(void), const char *desc)
{
        int         ret;
        struct key *key;

        key = keymap_lookup_fun (keymaps + cmd_state_get (0), fun);
        if (key == NULL)
                return 0;

        if (key->key != '\r' && key->key != ' '
            && (! isprint (key->key) || isspace (key->key)))
                return 0;
        
        window_addch (window, ' ');
        window_addch (window, ' ');
        switch (key->key){

                case '\r':
                        window_addstr (window, "<enter>");
                        ret = 10;
                        break;

                case ' ':
                        window_addstr (window, "<space>");
                        ret = 10;
                        break;

                default:
                        window_addch (window, key->key);
                        ret = 4;
                        break;
        }
        window_addch (window, ':');

        ret += window_addnstr (window, desc, maxlen);

        return ret;
}


static void
draw_bar (void)
{
        int width, nothing;

        getmaxyx (window, nothing, width);
        
        wmove (window, 0, 0);
        
        width -= window_addnstr (window, "[" PACKAGE_STRING "]", width);

        width -= print_key (width, cmd_quit, _("Quit"));
        width -= print_key (width, help_open, _("Help"));
        switch (cmd_state_get (0)){

                case CMD_INVALID:
                        break;
                        
                case CMD_LIST:
                        width -= print_key (width, sender_open_new, _("Mail"));
                        width -= print_key (width, sender_open_reply, _("Reply"));
                        width -= print_key (width, sender_open_reply_all, _("Reply all"));
                        width -= print_key (width, sender_open_fwd, _("Forward"));
                        width -= print_key (width, mailreader_show, _("Read"));
                        width -= print_key (width, fetch_open, _("Fetch"));
                        width -= print_key (width, smtp_flush_outbox, _("Send"));
                        break;

                case CMD_READ_MAIL:
                        width -= print_key (width, mailreader_close, _("Close"));
                        width -= print_key (width, sender_open_reply, _("Reply"));
                        width -= print_key (width, sender_open_reply_all, _("Reply all"));
                        width -= print_key (width, sender_open_fwd, _("Forward"));
                        width -= print_key (width, attach_show, _("Attachments"));
                        width -= print_key (width, abook_add_show, _("Addresses"));
                        width -= print_key (width, mailreader_header_switch, _("Header"));
                        break;

                case CMD_SELECT_BOX:
                        width -= print_key (width, box_selection_hit, _("Open"));
                        break;

                case CMD_FETCH:
                        width -= print_key (width, fetch_close, _("Close"));
                        width -= print_key (width, fetch_get_mail, _("Fetch"));
                        width -= print_key (width, fetch_del_mail, _("Delete"));
                        break;

                case CMD_SENDER:
                        width -= print_key (width, sender_close, _("Cancel"));
                        width -= print_key (width, sender_go, _("Send"));
                        width -= print_key (width, sender_add_attachment, _("Attach"));
                        break;

                case CMD_ATTACH:
                        width -= print_key (width, attach_hide, _("Close"));
                        width -= print_key (width, attach_hit, _("Show"));
                        width -= print_key (width, attach_save, _("Save"));
                        width -= print_key (width, attach_save_all, _("Save all"));
                        break;

                case CMD_ABOOK:
                        width -= print_key (width, abook_hide, _("Close"));
                        width -= print_key (width, abook_compose, _("Mail"));
                        width -= print_key (width, abook_insert, _("New"));
                        width -= print_key (width, abook_hit, _("Select"));
                        break;

                case CMD_ABOOK_ADD:
                        width -= print_key (width, abook_add_hide, _("Close"));
                        width -= print_key (width, abook_add_hit, _("Add"));
                        break;

                case CMD_ASK:
                        break;

                case CMD_HELP:
                        width -= print_key (width, help_close, _("Close"));
                        break;

                case CMD_READ:
                        break;

                case CMD_DEBUG:
                        break;

                case CMD_SEARCH:
                        break;
        }
        
        while (width-- >= 0)
                window_addch (window, ' ');

        touchwin (window);
        wnoutrefresh (window);
}


/* This file is generated by interface.pl script from interface.desc,
   and inc.in. */
static WINDOW *interface_init (void);
#include "topbar.inc"

/****************************************************************************
 *    INTERFACE FUNCTIONS
 ****************************************************************************/

void
topbar_init (void)
{
        window = interface_init ();
        draw_bar ();
}



void
topbar_free_resources (void)
{
        delwin (window);
}


void
topbar_refresh (void)
{
        draw_bar ();
}

/****************************************************************************
 *    INTERFACE CLASS BODIES
 ****************************************************************************/
/****************************************************************************
 *
 *    END MODULE toppbar.c
 *
 ****************************************************************************/


syntax highlighted by Code2HTML, v. 0.9.1