/*
 * textsw.font.c --display a text subwindow and allow the user to edit
 * it.  Panel items allow the user to change the font (family, style and
 * size) of the textsw.
 */
#include <xview/xview.h>
#include <xview/panel.h>
#include <xview/textsw.h>
#include <xview/font.h>

Panel_item      family_item, style_item, scale_item, name_item;
Textsw          textsw;

main(argc, argv)
int     argc;
char    *argv[];
{
    Frame       frame;
    Panel       panel;
    Xv_Font     font;
    void        change_font();
    int         change_font_by_name();
    extern void exit();

    xv_init(XV_INIT_ARGC_PTR_ARGV, &argc, argv, NULL);

    frame = (Frame)xv_create(XV_NULL, FRAME,
                             FRAME_LABEL,            argv[0],
                             FRAME_SHOW_FOOTER,      TRUE,
                             NULL);

    panel = (Panel)xv_create(frame, PANEL,
                             PANEL_LAYOUT,           PANEL_VERTICAL,
                             NULL);
    (void) xv_create(panel, PANEL_BUTTON,
                     PANEL_LABEL_STRING,     "Quit",
                     PANEL_NOTIFY_PROC,      exit,
                     NULL);
    family_item = (Panel_item)xv_create(panel, PANEL_CHOICE,
                                        PANEL_LABEL_STRING,     "Family",
                                        PANEL_LAYOUT,           PANEL_HORIZONTAL,
                                        PANEL_DISPLAY_LEVEL,    PANEL_CURRENT,
                                        PANEL_CHOICE_STRINGS,
                                        FONT_FAMILY_DEFAULT, FONT_FAMILY_DEFAULT_FIXEDWIDTH,
                                        FONT_FAMILY_LUCIDA, FONT_FAMILY_LUCIDA_FIXEDWIDTH,
                                        FONT_FAMILY_ROMAN, FONT_FAMILY_SERIF, FONT_FAMILY_COUR,
                                        FONT_FAMILY_CMR, FONT_FAMILY_GALLENT,
                                        NULL,
                                        PANEL_NOTIFY_PROC,      change_font,
                                        NULL);
    style_item = (Panel_item)xv_create(panel, PANEL_CHOICE,
                                       PANEL_LABEL_STRING,     "Style",
                                       PANEL_LAYOUT,           PANEL_HORIZONTAL,
                                       PANEL_DISPLAY_LEVEL,    PANEL_CURRENT,
                                       PANEL_CHOICE_STRINGS,
                                       FONT_STYLE_DEFAULT, FONT_STYLE_NORMAL, FONT_STYLE_BOLD,
                                       FONT_STYLE_ITALIC, FONT_STYLE_BOLD_ITALIC, NULL,
                                       PANEL_NOTIFY_PROC,      change_font,
                                       NULL);
    scale_item = (Panel_item)xv_create(panel, PANEL_CHOICE,
                                       PANEL_LABEL_STRING,     "Scale",
                                       PANEL_LAYOUT,           PANEL_HORIZONTAL,
                                       PANEL_DISPLAY_LEVEL,    PANEL_CURRENT,
                                       PANEL_CHOICE_STRINGS,
                                       "Small", "Medium", "Large", "X-Large", NULL,
                                       PANEL_NOTIFY_PROC,      change_font,
                                       PANEL_VALUE,        1,
                                       PANEL_DEFAULT_VALUE,    1,
                                       NULL);
    name_item = (Panel_item)xv_create(panel, PANEL_TEXT,
                                      PANEL_LABEL_STRING,     "Font Name:",
                                      PANEL_LAYOUT,           PANEL_HORIZONTAL,
                                      PANEL_VALUE_DISPLAY_LENGTH, 20,
                                      PANEL_NOTIFY_PROC,      change_font_by_name,
                                      NULL);
    window_fit(panel);

    textsw = (Textsw)xv_create(frame, TEXTSW,
                               WIN_ROWS,               20,
                               WIN_COLUMNS,            80,
                               NULL);

    window_fit(frame);

    font = (Xv_Font)xv_get(frame, XV_FONT);
    xv_set(textsw, WIN_FONT, font, NULL);
    xv_set(frame, FRAME_LEFT_FOOTER, xv_get(font, FONT_NAME), NULL);

    xv_main_loop(frame);
}

void
change_font(item, value, event)
Panel_item   item;
Event       *event;
{
    static int  family, style, scale;
    char        buf[128];
    Frame       frame;
    char        *family_name;
    char        *style_name;
    int         scale_value;
    Xv_Font     font;

    frame = (Frame)xv_get(xv_get(item, PANEL_PARENT_PANEL), XV_OWNER);
    family_name = (char *) xv_get(family_item, PANEL_CHOICE_STRING,
                                  xv_get(family_item, PANEL_VALUE));
    style_name = (char *) xv_get(style_item, PANEL_CHOICE_STRING,
                                 xv_get(style_item, PANEL_VALUE));
    scale_value = (int) xv_get(scale_item, PANEL_VALUE);

    xv_set(frame, FRAME_BUSY, TRUE, NULL);
    font = (Xv_Font)xv_find(frame, FONT,
                            FONT_FAMILY,    family_name,
                            FONT_STYLE,     style_name,
                            /* scale_value happens to coincide with Window_rescale_state values */
                            FONT_SCALE,     scale_value,
                            NULL);
    xv_set(frame, FRAME_BUSY, FALSE, NULL);

    if(!font)
    {
        if(item == family_item)
        {
            sprintf(buf, "cannot load '%s'", family_name);
            xv_set(family_item, PANEL_VALUE, family, NULL);
        }
        else if(item == style_item)
        {
            sprintf(buf, "cannot load '%s'", style_name);
            xv_set(style_item, PANEL_VALUE, style, NULL);
        }
        else
        {
            sprintf(buf, "Not available in %s scale.",
                    xv_get(scale_item, PANEL_CHOICE_STRING, scale));
            xv_set(scale_item, PANEL_VALUE, scale, NULL);
        }

        xv_set(frame, FRAME_RIGHT_FOOTER, buf, NULL);
        return;
    }

    if(item == family_item)
        family = value;
    else if(item == style_item)
        style = value;
    else
        scale = value;

    xv_set(textsw, WIN_FONT, font, NULL);
    sprintf(buf, "Current font: %s", xv_get(font, FONT_NAME));
    xv_set(frame, FRAME_LEFT_FOOTER, buf, NULL);
}

change_font_by_name(item, event)
Panel_item item;
Event *event;
{
    char buf[128];
    char *name = (char *)xv_get(item, PANEL_VALUE);
    Frame frame = (Frame)xv_get(xv_get(item, PANEL_PARENT_PANEL), XV_OWNER);
    Xv_Font font = (Xv_Font)xv_find(frame, FONT,
                                    FONT_NAME,      name,
                                    NULL);

    if(!font)
    {
        sprintf(buf, "cannot load '%s'", name);
        xv_set(frame, FRAME_RIGHT_FOOTER, buf, NULL);
        return PANEL_NONE;
    }

    xv_set(textsw, WIN_FONT, font, NULL);
    sprintf(buf, "Current font: %s", xv_get(font, FONT_NAME));
    xv_set(frame, FRAME_LEFT_FOOTER, buf, NULL);
    return PANEL_NONE;
}

