/***************************************************************************
 *             __________               __   ___.
 *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
 *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
 *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
 *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
 *                     \/            \/     \/    \/            \/
 *
 * Copyright (C) 2009 Johannes Schwarz
 * based on Will Robertson code in superdom
 *
 * 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 software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
 * KIND, either express or implied.
 *
 ****************************************************************************/
#include "plugin.h"
#include "display_text.h"

#define MARGIN 5

static bool wait_key_press(void)
{
    int button;
    do {
        button = rb->button_get(true);
        if ( rb->default_event_handler( button ) == SYS_USB_CONNECTED )
            return true;
    } while(IS_SYSEVENT(button) || ( button == BUTTON_NONE )
            || ( button & (BUTTON_REL|BUTTON_REPEAT) ) );
    return false;
}

bool display_text(unsigned short words, char** text, struct style_text* style,
                  struct viewport* vp_text, bool wait_key)
{
    bool ret = false;
    int prev_drawmode;
#ifdef HAVE_LCD_COLOR
    int standard_fgcolor;
#endif
    int space_w, width, height;
    unsigned short x , y;
    unsigned short vp_width = LCD_WIDTH;
    unsigned short vp_height = LCD_HEIGHT;
    unsigned short i = 0, style_index = 0;
    if (vp_text != NULL) {
        vp_width = vp_text->width;
        vp_height = vp_text->height;
    }
    struct viewport *last_vp = rb->screens[SCREEN_MAIN]->set_viewport(vp_text);
    prev_drawmode = rb->lcd_get_drawmode();
    rb->lcd_set_drawmode(DRMODE_SOLID);
#ifdef HAVE_LCD_COLOR
    standard_fgcolor = rb->lcd_get_foreground();
#endif
    rb->screens[SCREEN_MAIN]->clear_viewport();
    x = MARGIN;
    y = MARGIN;
    rb->button_clear_queue();
    rb->lcd_getstringsize(" ", &space_w, &height);
    for (i = 0; i < words; i++) {
        rb->lcd_getstringsize(text[i], &width, NULL);
        /* skip to next line if the word is an empty string */
        if (rb->strcmp(text[i], "")==0) {
            x = MARGIN;
            y = y + height;
            continue;
        /* .. or if the current one can't fit the word */
        } else if (x + width > vp_width - MARGIN) {
            x = MARGIN;
            y = y + height;
        }
        /* display the remaining text by button click or exit */
        if (y + height > vp_height - MARGIN) {
            y = MARGIN;
            rb->screens[SCREEN_MAIN]->update_viewport();
            if (wait_key_press())
            {
                ret = true;
                goto cleanup;
            }
            rb->screens[SCREEN_MAIN]->clear_viewport();
        }
        /* no text formatting available */
        if (style==NULL || style[style_index].index != i) {
            rb->lcd_putsxy(x, y, text[i]);
        } else {
            /* set align */
            if (style[style_index].flags&TEXT_CENTER) {
                x = (vp_width-width)/2;
            }
            /* set font color */
#ifdef HAVE_LCD_COLOR
            switch (style[style_index].flags&TEXT_COLOR_MASK) {
                case C_RED:
                    rb->lcd_set_foreground(LCD_RGBPACK(255,0,0));
                    break;
                case C_YELLOW:
                    rb->lcd_set_foreground(LCD_RGBPACK(255,255,0));
                    break;
                case C_GREEN:
                    rb->lcd_set_foreground(LCD_RGBPACK(0,192,0));
                    break;
                case C_BLUE:
                    rb->lcd_set_foreground(LCD_RGBPACK(0,0,255));
                    break;
                case C_ORANGE:
                    rb->lcd_set_foreground(LCD_RGBPACK(255,192,0));
                    break;
                case STANDARD:
                default:
                    rb->lcd_set_foreground(standard_fgcolor);
                    break;
            }
#endif
            rb->lcd_putsxy(x, y, text[i]);
            /* underline the word */
            if (style[style_index].flags&TEXT_UNDERLINE) {
                rb->lcd_hline(x, x+width, y+height-1);
            }
#ifdef HAVE_LCD_COLOR
            rb->lcd_set_foreground(standard_fgcolor);
#endif
            style_index++;
        }
        x += width + space_w;
    }
    rb->screens[SCREEN_MAIN]->update_viewport();
    rb->lcd_set_drawmode(prev_drawmode);
    if (wait_key)
    {
        if (wait_key_press())
            ret = true;
    }

cleanup:
    rb->screens[SCREEN_MAIN]->set_viewport(last_vp);
    return ret;
}
