
#include <X11/IntrinsicP.h>
#include <X11/StringDefs.h>
#include <X11/Xaw/XawInit.h
#include <X11/Xaw/Box.h>
#include <X11/Xaw/Toggle.h>
#include <X11/Xaw/Viewport.h>
#include <X11/Xaw/RoloP.h>

static Boolean GetGeometry();

#define offset(field) XtOffset(RoloWidget, rolo.field)
static XtResource resources[] = 
{
  {XtNuseBottom, XtCBoolean, XtRBoolean, sizeof(Boolean),
     offset(usebottom), XtRImmediate, (caddr_t) False},
  {XtNuseRight, XtCBoolean, XtRBoolean, sizeof(Boolean),
     offset(useright), XtRImmediate, (caddr_t) False},
};

#undef offset
#define offset(field) XtOffset(Rolo, field)

static XtResource subresources[] = 
{
  {XtNlabel, XtCString, XtRString, sizeof(String),
     offset(label), XtRString, (caddr_t) "foo"},
};

#undef offset

static void Initialize();
static void Realize();
static void InsertChild();
static void DeleteChild();
#define superclass	(&formClassRec)


RoloClassRec roloClassRec = {
  { /* core_class fields */
    /* superclass	  */	(WidgetClass) superclass,
    /* class_name	  */	"Rolo",
    /* widget_size	  */	sizeof(RoloRec),
    /* class_initialize	  */	XawInitializeWidgetSet,
    /* class_part_init    */    NULL,
    /* class_inited	  */	FALSE,
    /* initialize	  */	Initialize,
    /* initialize_hook    */    NULL,
    /* realize		  */	Realize,
    /* actions		  */	NULL,
    /* num_actions	  */	0,
    /* resources	  */	resources,
    /* num_resources	  */	XtNumber(resources),
    /* xrm_class	  */	NULLQUARK,
    /* compress_motion	  */	TRUE,
    /* compress_exposure  */	TRUE,
    /* compress_enterleave*/    TRUE,
    /* visible_interest	  */	FALSE,
    /* destroy		  */	NULL,
    /* resize		  */	XtInheritResize,
    /* expose		  */	XtInheritExpose,
    /* set_values	  */	NULL,
    /* set_values_hook    */    NULL,
    /* set_values_almost  */    XtInheritSetValuesAlmost,
    /* get_values_hook    */	NULL,
    /* accept_focus	  */	NULL,
    /* version            */    XtVersion,
    /* callback_private	  */	NULL,
    /* tm_table    	  */	NULL,
    /* query_geometry     */    NULL,
    /* display_accelerator*/	XtInheritDisplayAccelerator,
    /* extension          */	NULL
  },
  { /* composite_class fields */
    /* geometry_manager	  */	XtInheritGeometryManager,
    /* change_managed	  */	XtInheritChangeManaged,
    /* insert_child	  */	InsertChild,
    /* delete_child	  */	DeleteChild,
    /* extension          */	NULL
  },
  { /* constraint_class fields */
    /* subresourses	  */	subresources,
    /* subresource_count  */	XtNumber(subresources),
    /* constraint_size	  */	sizeof(RoloConstraintsRec),
    /* initialize	  */	NULL,
    /* destroy		  */	NULL,
    /* set_values	  */	NULL,
    /* extension          */	NULL
  },
  { /* form_class fields */
    /* layout		  */	NULL,
  },
  { /* rolo_class fields */
    /* empty		  */	0
  }
};


WidgetClass roloWidgetClass = (WidgetClass)&roloClassRec;


/* ARGSUSED */
static void 
Initialize(request, new)
     Widget request, new;
{
  RoloWidget w = (RoloWidget) new;
  static Arg args[10];
  Cardinal num_args;
  Dimension view_height;
  Dimension view_width;
  Widget t;

  w->form.default_spacing = 0;  /* Reset the default spacing to 0 pixels. */
  
  /* 
   * Initialize all widget pointers to NULL.
   */
  
  w->rolo.child     = (Widget *) NULL;
  w->rolo.cur_child = (Widget)   NULL;

  t = XtCreateManagedWidget("box", formWidgetClass, new, NULL, 0);
  w->rolo.box = XtCreateManagedWidget("toggleBox", boxWidgetClass, t, NULL, 0);
  
  /* 
   * Create View Widget.
   */
  
  num_args = 0;
  XtSetArg(args[num_args], XtNbackgroundPixmap, None); num_args++;
  XtSetArg(args[num_args], XtNborderWidth, 0);         num_args++;
  XtSetArg(args[num_args], XtNleft, XtChainLeft);      num_args++;
  XtSetArg(args[num_args], XtNright, XtChainRight);    num_args++;
  XtSetArg(args[num_args], XtNtop, XtChainTop);        num_args++;
  XtSetArg(args[num_args], XtNbottom, XtChainBottom);  num_args++;
  XtSetArg(args[num_args], XtNwidth, w->core.width);   num_args++;
  XtSetArg(args[num_args], XtNheight, w->core.height); num_args++;
  XtSetArg(args[num_args], XtNfromHoriz, w->rolo.box); num_args++;
  
  t = XtCreateManagedWidget("view", viewportWidgetClass, new, args, num_args);
  w->rolo.view = XtCreateManagedWidget("viewBox", boxWidgetClass, t, args, 0);

  /*
   * Set the view widget to the correct height.
   */
  
  view_width  = w->core.width;
  view_height = w->core.height;

  if(w->rolo.box && 
     (w->core.height > w->rolo.box->core.height + 
      w->rolo.box->core.border_width))
    view_height -= w->rolo.box->core.height + w->rolo.box->core.border_width;
  
  num_args = 0;
  XtSetArg(args[num_args], XtNwidth, view_width);   num_args++;
  XtSetArg(args[num_args], XtNheight, view_height); num_args++;
  XtSetValues(w->rolo.view, args, num_args);
}



static void 
Realize(widget, value_mask, attributes)
     Widget widget;
     XtValueMask *value_mask;
     XSetWindowAttributes *attributes;
{
  RoloWidget w = (RoloWidget) widget;
  register Widget *child = w->rolo.child;

  *value_mask |= CWBitGravity;
  attributes->bit_gravity = NorthWestGravity;
  (*superclass->core_class.realize) (widget, value_mask, attributes);
  XtRealizeWidget(w->rolo.view);

  while(child && *child)
    {
      XtMoveWidget(*child, (Position) 0, (Position) 0);
      XtRealizeWidget(*child);
      XReparentWindow(XtDisplay(w), XtWindow(*child), XtWindow(w->rolo.view),
		      (Position)0, (Position) 0);
      XtCreateManagedWidget("foo", toggleWidgetClass, w->rolo.box, 0, 0);
      ++child;
    }

  /*XtRealizeWidget(w->rolo.box);*/
  if(w->rolo.cur_child)
    XtMapWidget(w->rolo.cur_child); 
}




static void 
InsertChild(widget)
     register Widget widget;
{
  RoloWidget w = (RoloWidget) widget->core.parent;
  int n = 0;

  if(!w->rolo.view)
    {
      (*superclass->composite_class.insert_child) (w);
      return;
    }

  if(!w->rolo.child)
    w->rolo.child = (Widget *) XtMalloc(sizeof(Widget) * 2);
  else
    {
      while(w->rolo.child[n])
	++n;
      w->rolo.child = (Widget *) XtRealloc(w->rolo.child,
					   sizeof(Widget) * (n + 1));
    }

  w->rolo.child[n]   = widget;
  w->rolo.child[n+1] = (Widget) NULL;


  if(w->rolo.view)
    (*superclass->composite_class.insert_child) (w->rolo.view);
  else 
    (*superclass->composite_class.insert_child) (w);
  
}



static void 
DeleteChild(w)
     Widget w;
{
/*  (*superclass->composite_class.delete_child) (w->rolo.view); */
} 

