/* Copyright (C) Acorn Computers Ltd 1994 */

/* include standard C definitions */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/* include event lib declarations */

#include "event.h"

/* include toolbox lib declarations */

#include "toolbox.h"
#include "window.h"
#include "gadgets.h"
#include "menu.h"

/* include application definitions */

#include "hyper.h"
#include "button.h"
#include "view.h"
#include "utils.h"
#include "comps.h"
#include "events.h"
#include "commands.h"
#include "menus.h"
#include "hcl.h"

/*
 * this will be called when the iconbar menu is about to be shown
 * we need to fade or unfade the 'views' entry and build the submenu
 * accordingly. In this way we don't need to keep updating the menu
 * every time a new file is loaded or a view removed, just when it
 * is actually used.
 */

int build_views(int event_code, ToolboxEvent  *event, IdBlock *id_block,
                   void  *handle)
{
    Viewer *views = *(Viewer **)handle;
    ObjectId menu = id_block->self_id;
    int faded = (views != NULL) ? 0:1;

    IGNORE(event);
    IGNORE(event_code);

    /* fade/unfade the new view/ remove view entries */

    menu_set_fade(0,menu,RemoveView,faded);
    menu_set_fade(0,menu,NewView,faded);

    if (views)
    {
        MenuTemplateEntry Entry = {0};

        /* get the object id of the views submenu */
        menu_get_sub_menu_show(0,menu,NewView,&menu);

        while(views) {
            if (!(views->flags & ViewerFlag_AddedToMenu)) {
               Entry.click_event = ViewEvent;
               Entry.text = views->name;
               Entry.max_text = strlen (Entry.text) +1;
               Entry.component_id = (ComponentId) views;

               menu_add_entry(0,menu ,Menu_AddEntryAtEnd,(char *) &Entry,0);

               views->flags |= ViewerFlag_AddedToMenu;
            }

            views = views->next;
        }

    }
    return 1;
}

int alter_views(int event_code, ToolboxEvent  *event, IdBlock *id_block,
                   void  *handle)
{
    Viewer *views       = *(Viewer **)handle;
    ObjectId menu       = id_block->self_id;
    ComponentId parent  = id_block->parent_component,
                self    = id_block->self_component;
    Viewer *view        = (Viewer *) self;
    unsigned int state;

    IGNORE(event);
    IGNORE(event_code);

    if (parent == RemoveView) {
        menu_remove_entry(0,menu,self);
        do_clear(view,0);
        toolbox_hide_object(0,view->window);
        commands_free(view);
        view_remove_handlers(view);
        free(view);
        if (views == view) {
           *(Viewer **)handle = view ->next;
           views = view->next;
        }
        else {
           while (views) {
              if (views->next == view) {
                 views->next = view->next;
                 break;
              }
              views = views->next;
           }
        }
        if (!views) {
           menu_set_fade(0,id_block->parent_id,RemoveView,1);
           menu_set_fade(0,id_block->parent_id,NewView,1);
        }
        return 1;
    }

    toolbox_get_object_state(0,view->window,&state);

    if(!state) command_parse(view,NULL);

    toolbox_show_object(0,view->window,0,0,menu,0);

    return 1;

}
