/**********************************************************************
This file is part of Crack dot Com's free source code release of
Golgotha.
for
information about compiling & licensing issues visit this URL
If that doesn't help, contact Jonathan Clark at
golgotha_source@usa.net (Subject should have "GOLG" in it)
***********************************************************************/
#include "menu/menuitem.hh"
#include "window/win_evt.hh"
#include "window/style.hh"
i4_menu_item_class::i4_menu_item_class(const i4_const_str *idle_context_help,
i4_graphical_style_class *hint,
w16 w, w16 h,
i4_event_reaction_class *press,
i4_event_reaction_class *depress,
i4_event_reaction_class *activate,
i4_event_reaction_class *deactivate
) :
i4_parent_window_class(w,h),
hint(hint)
{
if (idle_context_help)
context_help=new i4_str(*idle_context_help);
else
context_help=0;
send.press=press;
send.depress=depress;
send.activate=activate;
send.deactivate=deactivate;
menu_parent=0;
active=i4_F;
pressed=i4_F;
disabled=i4_F;
}
void i4_menu_item_class::send_event(i4_event_reaction_class *ev, reaction_type type)
{
if (menu_parent)
menu_parent->note_reaction_sent(this, ev, type);
if (ev && ev->event && ev->handler_reference.get())
i4_kernel.send_event(ev->handler_reference.get(), ev->event);
}
void i4_menu_item_class::receive_event(i4_event *ev)
{
i4_parent_window_class::receive_event(ev);
if (!disabled)
{
if (ev->type()==i4_event::MOUSE_BUTTON_UP || ev->type()==i4_event::MOUSE_BUTTON_DOWN)
if (context_help_window.get())
i4_kernel.delete_handler(context_help_window.get());
if (ev->type()==i4_event::WINDOW_MESSAGE)
{
CAST_PTR(w,i4_window_message_class,ev);
switch (w->sub_type)
{
case i4_window_message_class::GOT_KEYBOARD_FOCUS :
case i4_window_message_class::GOT_MOUSE_FOCUS :
{
do_activate();
send_event(send.activate, ACTIVATED);
} break;
case i4_window_message_class::LOST_KEYBOARD_FOCUS :
case i4_window_message_class::LOST_MOUSE_FOCUS :
{
if (context_help_window.get())
{
i4_window_class *w=context_help_window.get();
context_help_window=0;
i4_kernel.delete_handler(w);
}
do_deactivate();
send_event(send.deactivate, DEACTIVATED);
} break;
}
}
else if (ev->type()==i4_event::IDLE_MESSAGE)
do_idle();
}
}
void i4_menu_item_class::do_idle()
{
if (!context_help_window.get() && context_help)
context_help_window=hint->create_quick_context_help(x(), y()+height()+5, *context_help);
}
void i4_menu_item_class::do_activate()
{
if (!active)
{
active=i4_T;
request_redraw();
}
}
void i4_menu_item_class::do_deactivate()
{
if (active)
{
active=i4_F;
request_redraw();
}
}
void i4_menu_item_class::do_disable()
{
if (!disabled)
{
disabled=i4_T;
request_redraw();
}
}
void i4_menu_item_class::do_undisable()
{
if (disabled)
{
disabled=i4_F;
request_redraw();
}
}
void i4_menu_item_class::do_press()
{
if (!pressed)
{
pressed=i4_T;
request_redraw();
}
}
void i4_menu_item_class::do_depress()
{
if (pressed)
{
pressed=i4_F;
request_redraw();
}
}
i4_menu_item_class::~i4_menu_item_class()
{
if (context_help_window.get())
i4_kernel.delete_handler(context_help_window.get());
if (context_help)
delete context_help;
if (send.press)
delete send.press;
if (send.depress)
delete send.depress;
if (send.activate)
delete send.activate;
if (send.deactivate)
delete send.deactivate;
}