/*
 *
 */

#include <stdio.h>
#include <X11/Intrinsic.h>
#include <X11/StringDefs.h>
#include <X11/Shell.h>
#include <X11/Xaw/Label.h>
#include <X11/Xaw/Paned.h>
#include <discuss/discuss.h>
#include "Meeting.h"
#include "stuff.h"

static const char rcsid[] =
    "$Header: /afs/sipb.mit.edu/project/discuss/.cvsroot/discuss/source/xdsc/mtg.c,v 1.4 1992/06/26 02:25:56 raeburn Exp $";

struct mtg_list {
    struct mtg_list *next;
    Widget data;
};

struct mtg_list mtg_list;

#define set_refigure_mode(val) XawPanedSetRefigureMode (big_w, val)

static Boolean destroy_window_wp (XtPointer w) {
    XtDestroyWidget ((Widget) w);
    return True;
}

void schedule_window_destruction_cb (Widget w, XtPointer p, XtPointer call) {
    Widget shell = (Widget) p;
    /* someday we should fix up the button too, recheck the meeting... */
    if (shell == toplevel)
	exit (0);
    XtPopdown (shell);
    XtAppAddWorkProc (XtWidgetToApplicationContext (w),
		      destroy_window_wp, one_win ? w : p);
    cmd_ckm ();
}

select_mtg (Widget w, caddr_t close, caddr_t call) {
    struct mtg_list *new;
    XtCallbackRec callback[2];
    Arg args[10];
    Widget new_widget;
    int n_args;
#define AddArg(x,y) XtSetArg(args[n_args],x,y); n_args++
    char *buf;
    struct button_info *btn = (struct button_info *) close;

    if (one_win) {
	Dimension height, width;
	Position x, y;

	n_args = 0;
	AddArg (XtNheight, &height);
	AddArg (XtNwidth, &width);
	AddArg (XtNx, &x);
	AddArg (XtNy, &y);
	XtGetValues (mtg_list.data, args, n_args);
	set_refigure_mode (False);
	XtUnmanageChild (mtg_list.data);
	XtDestroyWidget (mtg_list.data);
	n_args = 0;
	AddArg (XtNmeetingName, btn->nb.aliases[0]);
	AddArg (XtNmeeting, &btn->nb);
	AddArg (XtNheight, height);
	AddArg (XtNwidth, width);
	AddArg (XtNx, x);
	AddArg (XtNy, y);
	mtg_list.data = XtCreateManagedWidget ("meeting",
					       discussMeetingWidgetClass,
					       big_w,
					       args, n_args);
	set_refigure_mode (True);
	return;
    }
    new = (struct mtg_list *) malloc(sizeof(struct mtg_list));
    new->data = mtg_list.data;
    new->next = mtg_list.next;
    n_args = 0;
    buf = alloca (strlen (btn->nb.aliases[0]) + strlen (whoami) + 5);
    sprintf (buf, "%s (%s)", whoami, btn->nb.aliases[0]);
    AddArg (XtNname, buf);
    AddArg (XtNiconName, buf);
    AddArg (XtNtitle, buf);
    new_widget = XtCreatePopupShell (btn->nb.aliases[0],
				     topLevelShellWidgetClass,
				     toplevel, args, n_args);
    n_args = 0;
    callback[0].callback = schedule_window_destruction_cb;
    callback[0].closure = (caddr_t) new_widget;
    callback[1].callback = 0;
    AddArg (XtNquitCallback, callback);
    AddArg (XtNmeetingName, btn->nb.aliases[0]);
    AddArg (XtNmeeting, &btn->nb);
    mtg_list.data = XtCreateManagedWidget ("foo", discussMeetingWidgetClass,
					   new_widget, args, n_args);
    mtg_list.next = new;
    XtPopup (new_widget, XtGrabNone);
}

void select_null_mtg (void) {
    mtg_list.data = XtCreateManagedWidget ("meeting",
					   discussMeetingWidgetClass,
					   big_w, 0, 0);
}
