/**********************************************************************
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)
***********************************************************************/
#ifdef _MANGLE_INC
#include "gui/BROWS~B4.HH"
#else
#include "gui/browse_tree.hh"
#endif
#include "window/style.hh"
#include "window/colorwin.hh"
#include "window/win_evt.hh"
void i4_vertical_compact_window_class::compact()
{
sw32 my=0,largest_width=0;
i4_parent_window_class::win_iter w;
for (w=children.begin();
w!=children.end(); ++w)
if (w->width()>largest_width)
largest_width=w->width();
for (w=children.begin();
w!=children.end(); ++w)
{
if (center)
w->private_move(x() + largest_width/2-(sw32)w->width()/2 - w->x(), y() + my - w->y());
else
w->private_move(0, y() + my - w->y());
my+=w->height();
}
if (width()!=largest_width || my!=height())
resize(largest_width, my);
}
void i4_horizontal_compact_window_class::compact()
{
sw32 mx=0,largest_height=0;
i4_parent_window_class::win_iter w;
for (w=children.begin();
w!=children.end(); ++w)
if (w->height()>largest_height)
largest_height=w->height();
for (w=children.begin();
w!=children.end(); ++w)
{
if (center)
w->private_move(x() + mx - w->x(), y() + largest_height/2-(sw32)w->height()/2 - w->y());
else
w->private_move(x() + mx - w->x(), 0);
mx+=w->width();
}
if (mx!=width() || largest_height!=height())
resize(mx, largest_height);
}
void i4_vertical_compact_window_class::receive_event(i4_event *ev)
{
if (ev->type()==i4_event::WINDOW_MESSAGE)
{
CAST_PTR(mess,i4_window_message_class,ev);
if (mess->sub_type==i4_window_message_class::NOTIFY_RESIZE)
{
CAST_PTR(res,i4_window_notify_resize_class,ev);
sw32 ow=res->from()->width(), oh=res->from()->height();
res->from()->private_resize(res->new_width, res->new_height);
compact();
res->from()->private_resize(ow, oh);
note_undrawn(0,0, width()-1, height()-1);
} else i4_parent_window_class::receive_event(ev);
} else i4_parent_window_class::receive_event(ev);
}
void i4_vertical_compact_window_class::parent_draw(i4_draw_context_class &context)
{
i4_rect_list_class child_clip(&context.clip,0,0);
child_clip.intersect_list(&undrawn_area);
child_clip.swap(&context.clip);
local_image->clear(color,context);
child_clip.swap(&context.clip);
}
void i4_horizontal_compact_window_class::receive_event(i4_event *ev)
{
if (ev->type()==i4_event::WINDOW_MESSAGE)
{
CAST_PTR(mess,i4_window_message_class,ev);
if (mess->sub_type==i4_window_message_class::NOTIFY_RESIZE)
{
CAST_PTR(res,i4_window_notify_resize_class,ev);
sw32 ow=res->from()->width(), oh=res->from()->height();
res->from()->private_resize(res->new_width, res->new_height);
compact();
res->from()->private_resize(ow, oh);
note_undrawn(0,0, width()-1, height()-1);
} else i4_parent_window_class::receive_event(ev);
} else i4_parent_window_class::receive_event(ev);
}
void i4_horizontal_compact_window_class::parent_draw(i4_draw_context_class &context)
{
i4_rect_list_class child_clip(&context.clip,0,0);
child_clip.intersect_list(&undrawn_area);
child_clip.swap(&context.clip);
local_image->clear(color,context);
child_clip.swap(&context.clip);
}
class i4_browse_toggle_class : public i4_window_class
{
public:
char *name() { return "browse_toggle"; }
enum { EXPANDED, COMPACTED, NO_CHILDREN } state;
i4_browse_window_class *browse_parent;
i4_graphical_style_class *style;
i4_browse_toggle_class(i4_graphical_style_class *style,
i4_browse_window_class *browse_parent,
i4_bool show_plus_minus,
i4_bool expanded,
i4_bool has_a_child)
: i4_window_class(style->icon_hint->plus_icon->width()+4,
style->icon_hint->plus_icon->height()),
browse_parent(browse_parent),
style(style)
{
if (show_plus_minus)
{
if (expanded)
state=EXPANDED;
else
state=COMPACTED;
}
else
state=NO_CHILDREN;
}
virtual void draw(i4_draw_context_class &context)
{
local_image->clear(style->color_hint->window.passive.medium, context);
if (state!=NO_CHILDREN)
{
if (state==EXPANDED)
style->icon_hint->plus_icon->put_image_trans(local_image, 0,0, 0, context);
else
style->icon_hint->minus_icon->put_image_trans(local_image, 0,0, 0, context);
}
}
virtual void receive_event(i4_event *ev)
{
if (ev->type()==i4_event::MOUSE_BUTTON_DOWN && state!=NO_CHILDREN)
{
if (state==EXPANDED)
{
state=COMPACTED;
browse_parent->compress();
}
else
{
state=EXPANDED;
browse_parent->expand();
}
request_redraw();
}
}
} ;
void i4_browse_window_class::add_arranged_child(i4_window_class *child)
{
title_area->add_child(0,0,child);
((i4_horizontal_compact_window_class *)title_area)->compact();
private_resize(0,0);
arrange_right_down();
if (child_object)
child_object->move(x_start(), 0);
resize_to_fit_children();
}
void i4_browse_window_class::compress()
{
if (child_object && expanded)
{
expanded=i4_F;
i4_parent_window_class::remove_child(child_object);
resize_to_fit_children();
}
}
void i4_browse_window_class::expand()
{
if (child_object && !expanded)
{
expanded=i4_T;
i4_parent_window_class::add_child(0,0,child_object);
private_resize(0,0);
arrange_right_down();
if (child_object)
child_object->move(x_start(), 0);
resize_to_fit_children();
}
}
void i4_browse_window_class::replace_object(i4_window_class *object)
{
if (child_object)
{
if (expanded)
remove_child(child_object);
delete child_object;
child_object=0;
/*
if (((i4_browse_toggle_class *)toggle_button)->state == i4_browse_toggle_class::EXPANDED)
((i4_browse_toggle_class *)toggle_button)->state=i4_browse_toggle_class::COMPACTED;
else if (((i4_browse_toggle_class *)toggle_button)->state == i4_browse_toggle_class::COMPACTED)
((i4_browse_toggle_class *)toggle_button)->state=i4_browse_toggle_class::EXPANDED;
*/
toggle_button->request_redraw();
private_resize(0,0);
resize_to_fit_children();
}
if (object)
{
child_object=object;
if (expanded)
i4_parent_window_class::add_child(0,0,object);
private_resize(0,0);
arrange_right_down();
object->move(x_start(), 0);
resize_to_fit_children();
}
}
class i4_browse_title_container_class : public i4_parent_window_class
{
public:
i4_browse_title_container_class() : i4_parent_window_class(0,0) {}
char *name() { return "browse title container"; }
};
i4_browse_window_class::i4_browse_window_class(i4_graphical_style_class *style,
i4_window_class *title_object,
i4_window_class *child_obj,
i4_bool show_plus_minus,
i4_bool expanded)
: style(style),
expanded(expanded),
i4_parent_window_class(0,0)
{
toggle_button=0;
child_object=0;
title_area=new i4_horizontal_compact_window_class(style->color_hint->window.passive.medium,
i4_T);
((i4_horizontal_compact_window_class *)title_area)->compact();
i4_parent_window_class::add_child(0,0,title_area);
toggle_button=new i4_browse_toggle_class(style, this,
show_plus_minus,
expanded,
(i4_bool)(child_obj!=0));
title_area->add_child(0,0,toggle_button);
if (title_object)
add_arranged_child(title_object);
if (child_obj)
replace_object(child_obj);
}
sw32 i4_browse_window_class::x_start()
{
return style->icon_hint->plus_icon->width() + 10;
}
void i4_browse_window_class::receive_event(i4_event *ev)
{
if (ev->type()==i4_event::WINDOW_MESSAGE)
{
CAST_PTR(mess,i4_window_message_class,ev);
if (mess->sub_type==i4_window_message_class::NOTIFY_RESIZE)
{
CAST_PTR(resize,i4_window_notify_resize_class,ev);
note_undrawn(0,0, width()-1, height()-1);
w16 ow=resize->from()->width(),
oh=resize->from()->height();
resize->from()->private_resize(resize->new_width,resize->new_height);
private_resize(0,0);
arrange_right_down();
if (child_object)
child_object->move(x_start(), 0);
resize_to_fit_children();
note_undrawn(0,0, width()-1, height()-1);
resize->from()->private_resize(ow, oh);
}
else
i4_parent_window_class::receive_event(ev);
}
else i4_parent_window_class::receive_event(ev);
}
void i4_browse_window_class::parent_draw(i4_draw_context_class &context)
{
i4_rect_list_class child_clip(&context.clip,0,0);
child_clip.intersect_list(&undrawn_area);
child_clip.swap(&context.clip);
local_image->clear(style->color_hint->window.passive.medium,context);
child_clip.swap(&context.clip);
}