/***********************************************************************
 *
 * TITLE:	menu_calls.c
 *
 * AUTHOR:	Cassie Mulnix
 *
 * DESCRIPTION:	This module is part of the OPPS editor, xopps.  It contains
 *		the menu definitions and handlers.
 *
 *                              CHANGE HISTORY
 *
 * $Log: menu_calls.c,v $
 * Revision 1.57  1994/06/16  16:56:35  clm
 * updated to new gr_ routines using GR_ for font names
 *
 * Revision 1.56  1994/05/20  23:31:43  clm
 * updated with HP, SGI changes
 *
 * Revision 1.55  1994/05/04  23:34:36  clm
 * ported to ANSI C
 *
 * Revision 1.54  1993/10/19  14:40:50  clm
 * updated all oellib stuff
 *
 * Revision 1.53  1993/05/18  20:58:30  clm
 * added new message.c function
 * took out assignment of st_flag
 *
 * Revision 1.52  1993/02/22  21:34:32  clm
 * fixed refresh of plines in evt2slp
 *
 * Revision 1.51  1993/02/20  00:09:33  clm
 * fixed evt2slp to copy precedence lines if they exist
 *
 * Revision 1.50  1993/02/08  16:10:15  clm
 * added event to slip to menu
 * added beware to all delete options
 *
 * Revision 1.49  1992/12/11  21:30:16  clm
 * made RSRC_FONT and RSRC_POINT global
 *
 * Revision 1.48  1992/12/10  21:45:40  clm
 * fixed new_index so chart is always object 0
 *
 * Revision 1.47  1992/12/01  16:49:32  clm
 * added vertical positioning to sequence
 *
 * Revision 1.46  1992/11/24  21:15:40  clm
 * added find_pline to delete_pline since pline is on menu if co
 * really belongs to an object
 *
 * Revision 1.45  1992/11/12  18:57:03  clm
 * added display date options to slip and event calls
 *
 * Revision 1.44  1992/11/09  16:30:02  clm
 * added precedence lines
 *
 * Revision 1.43  1992/10/19  14:28:57  clm
 * added all dates to be updated in copy_it
 *
 * Revision 1.42  1992/10/12  20:31:51  clm
 * changed object calls to reflect addition of all_id_disp toggle
 *
 * Revision 1.41  1992/10/02  20:25:14  clm
 * housekeeping
 *
 * Revision 1.40  1992/09/29  23:27:26  clm
 *  added id text and toggle to all dated objects
 *
 * Revision 1.39  1992/09/22  17:46:23  clm
 * added copy function for objects
 *
 * Revision 1.38  1992/09/22  17:18:52  clm
 * added activity object
 *
 * Revision 1.37  1992/09/17  15:12:45  clm
 * added disp option to chart date object
 *
 * Revision 1.36  1992/09/15  15:59:22  clm
 * added text and text positioning to add_slip call
 *
 * Revision 1.35  1992/09/14  19:52:36  clm
 * added hpos and vpos to simple activity
 *
 * Revision 1.34  1992/09/14  18:46:59  clm
 * added draw layer to all objects
 *
 * Revision 1.33  1992/09/08  22:50:11  clm
 * added sequence.c
 *
 * Revision 1.32  1992/09/01  17:45:30  clm
 * added color to add calls for all objects
 *
 * Revision 1.31  1992/08/31  17:19:09  clm
 * took out clock and box objects
 *
 * Revision 1.30  1992/08/25  20:07:56  clm
 * added boolean values for modified
 *
 * Revision 1.29  1992/08/25  16:23:57  clm
 * fixed switch statement in edit_it object types
 *
 * Revision 1.28  1992/08/25  15:51:36  clm
 * added xlnary and ylnary objects to edit options
 * alphabetized menu
 *
 * Revision 1.27  1992/08/20  15:16:27  clm
 * fixed font value in call to add_chdate
 *
 * Revision 1.26  1992/08/14  21:05:12  clm
 * added color to add_sact
 *
 * Revision 1.25  1992/08/13  18:10:20  clm
 * fixed call for add_chdate
 *
 * Revision 1.24  1992/08/10  17:42:23  clm
 * changed default level of status and level objects
 *
 * Revision 1.23  1992/08/03  21:34:32  clm
 * added slip, status, page, chart date, symbols, and levels to menu
 *
 * Revision 1.22  1992/07/15  19:43:00  clm
 * changed current_date to issue_date
 *
 * Revision 1.21  1992/07/08  17:20:30  clm
 * changed issue_date to current_date call
 *
 * Revision 1.20  1992/07/06  17:49:03  clm
 * added line display and number display toggles
 * to horizontal line menu
 *
 * Revision 1.19  1992/06/24  17:14:15  clm
 * added functions for horizontal line callbacks
 *
 * Revision 1.17  1992/05/21  21:33:51  clm
 * incorporated rectangle routines
 *
 * Revision 1.15  1992/05/20  19:50:57  clm
 * cleaned up file and help format
 *
 * Revision 1.14  1992/05/11  22:39:22  kevin
 * renamed project include file to xopps.h
 *
 * Revision 1.2  90/11/28  07:33:58  ana
 * First cut of popup menus using motif.
 * 
 * Revision 1.1  90/11/13  10:08:29  ana
 * Initial revision
 *
 ***********************************************************************
 *
 * WARNINGS:
 *
 * EXTERNAL CALLABLE COMPONENTS (PUBLIC):
 *
 * GLOBALS:
 *
 * WAIVERS:
 *
 * NOTES:
 *
 * MANPAGE:
 *
 ***********************************************************************/
 
#ifndef lint
static char rcsid[] =
    "$Id: menu_calls.c,v 1.57 1994/06/16 16:56:35 clm OEL $";
#endif

#include <Xm/BulletinB.h>
#include <Xm/PushB.h>
#include <Xm/List.h>
#include <Xm/Text.h>
#include <Xm/RowColumn.h>
#include <Xm/Label.h>
#include <Xm/Separator.h>
#include <Xm/CascadeB.h>

#include "xopps.h"

#define BEWARE "The delete function is irreversible. \n Do you wish to continue?"
static void edit_it(Widget, struct cdata *, XtPointer);
static void delete_it(Widget, struct cdata *, XtPointer);
static void delete_pline(Widget, struct cdata *, XtPointer);
static void undo_it(Widget, struct cdata *, XtPointer);
static void edit_hln(Widget, struct cdata *, XtPointer);
static void delete_hln(Widget, struct cdata *, XtPointer);
static void insert_hln(Widget, struct cdata *, XtPointer);
static void copy_it(Widget, struct cdata *, XtPointer);
static void call_image(Widget, struct cdata *, XtPointer);
static void call_text(Widget, struct cdata *, XtPointer);
static void call_sact(Widget, struct cdata *, XtPointer);
static void call_act(Widget, struct cdata *, XtPointer);
static void call_event(Widget, struct cdata *, XtPointer);
static void call_slip(Widget, struct cdata *, XtPointer);
static void call_status(Widget, struct cdata *, XtPointer);
static void call_page(Widget, struct cdata *, XtPointer);
static void call_chdate(Widget, struct cdata *, XtPointer);
static void call_symbol(Widget, struct cdata *, XtPointer);
static void call_level(Widget, struct cdata *, XtPointer);
static void call_sequence(Widget, struct cdata *, XtPointer);
static void tog_line(Widget, struct cdata *, XtPointer);
static void tog_number(Widget, struct cdata *, XtPointer);
static void evt2slp(Widget, struct cdata *, XtPointer);

static Widget submenu;				/* mouse submenu */
static Widget actmenu;				/* activity menu */
/***********************************************************************
 *
 * FUNCTION:
 *	init_menu()
 *
 * INPUTS:
 *	parent	(Widget)
 *
 * OUTPUTS:
 *
 * RETURNS:
 *
 * EXTERNALLY READ:
 *
 * EXTERNALLY MODIFIED:
 *
 * DESCRIPTION:
 *	initializes the drawing area popup menu
 */

void 
init_menu(Widget parent)
{
    Arg args[10];
    XmString xmtemp;
    Cardinal n;

    /*
     * Create the menu with a label and separator bar
     */
    menu = XmCreatePopupMenu( parent, "menu", NULL, 0);

    xmtemp = XmStringCreateSimple("Operations");
    n = 0;
    XtSetArg(args[n], XmNlabelString, xmtemp); n++;
    XtCreateManagedWidget( "operations", xmLabelWidgetClass, menu, args, n);
    XmStringFree(xmtemp);

    XtCreateManagedWidget( "separator", xmSeparatorWidgetClass, menu, NULL, 0);

    /*
     * Create the buttons to go in the menu
     */
    xmtemp = XmStringCreateSimple("Undo");
    n = 0;
    XtSetArg(args[n], XmNlabelString, xmtemp); n++;
    menu_item[(int) UNDO]=XtCreateManagedWidget("undo",xmPushButtonWidgetClass, 
	menu, args, n);
    XtAddCallback(menu_item[(int) UNDO], XmNactivateCallback, 
	(XtCallbackProc)undo_it, &data);
    XmStringFree(xmtemp);

    xmtemp = XmStringCreateSimple("Copy");
    n = 0;
    XtSetArg(args[n], XmNlabelString, xmtemp); n++;
    menu_item[(int)COPY] = XtCreateManagedWidget("copy",
	 xmPushButtonWidgetClass, menu, args, n);
    XtAddCallback(menu_item[(int)COPY], XmNactivateCallback, 
	(XtCallbackProc)copy_it, &data);
    XmStringFree(xmtemp);

    xmtemp = XmStringCreateSimple("Event to Slip");
    n = 0;
    XtSetArg(args[n], XmNlabelString, xmtemp); n++;
    menu_item[(int)EVT2SLP] = XtCreateManagedWidget("ect2slp",
	 xmPushButtonWidgetClass, menu, args, n);
    XtAddCallback(menu_item[(int)EVT2SLP], XmNactivateCallback, 
	(XtCallbackProc)evt2slp, &data);
    XmStringFree(xmtemp);

    xmtemp = XmStringCreateSimple("Edit");
    n = 0;
    XtSetArg(args[n], XmNlabelString, xmtemp); n++;
    menu_item[(int) EDIT] = XtCreateManagedWidget("edit", 
	xmPushButtonWidgetClass, menu, args, n);
    XtAddCallback(menu_item[(int) EDIT], XmNactivateCallback, 
	(XtCallbackProc)edit_it, &data);
    XmStringFree(xmtemp);

    xmtemp =  XmStringCreateSimple("Delete");
    n = 0;
    XtSetArg(args[n], XmNlabelString, xmtemp); n++;
    menu_item[(int) DELETE] = XtCreateManagedWidget("delete", 
	xmPushButtonWidgetClass, menu, args, n);
    XtAddCallback(menu_item[(int) DELETE],XmNactivateCallback,
	(XtCallbackProc)delete_it, &data);
    XmStringFree(xmtemp);

    xmtemp =  XmStringCreateSimple("Delete Pline");
    n = 0;
    XtSetArg(args[n], XmNlabelString, xmtemp); n++;
    menu_item[(int) DELETE_PLINE] = XtCreateManagedWidget("delete_pline", 
	xmPushButtonWidgetClass, menu, args, n);
    XtAddCallback(menu_item[(int) DELETE_PLINE],XmNactivateCallback,
	(XtCallbackProc)delete_pline, &data);
    XmStringFree(xmtemp);

    xmtemp =  XmStringCreateSimple("Add");
    n = 0;
    XtSetArg(args[n], XmNlabelString, xmtemp); n++;
    menu_item[(int) ADD] = XtCreateManagedWidget("add", 
	xmCascadeButtonWidgetClass, menu, args, n);
    XmStringFree(xmtemp);

    submenu = XmCreatePulldownMenu( menu, "addmenu", NULL, 0);
    XtSetArg(args[0], XmNsubMenuId, submenu);
    XtSetValues (menu_item[(int) ADD], args, 1);

    xmtemp = XmStringCreateSimple("Activity");
    n = 0;
    XtSetArg(args[n], XmNlabelString, xmtemp); n++;
    menu_item[(int) ADD_ACT] = XtCreateManagedWidget("add", 
	xmCascadeButtonWidgetClass, submenu, args, n);
    XmStringFree(xmtemp);

    actmenu = XmCreatePulldownMenu(submenu, "actmenu", NULL, 0);
    XtSetArg(args[0], XmNsubMenuId, actmenu);
    XtSetValues(menu_item[(int)ADD_ACT], args, 1);

    xmtemp =  XmStringCreateSimple("Simple");
    n = 0;
    XtSetArg(args[n], XmNlabelString, xmtemp); n++;
    menu_item[(int) ADD_SACT] = XtCreateManagedWidget("sactivity",
        xmPushButtonWidgetClass, actmenu, args, n);
    XtAddCallback(menu_item[(int) ADD_SACT], XmNactivateCallback, 
	(XtCallbackProc)call_sact, &data);
    XmStringFree(xmtemp);

    xmtemp =  XmStringCreateSimple("Complex");
    n = 0;
    XtSetArg(args[n], XmNlabelString, xmtemp); n++;
    menu_item[(int) NORMAL_ACT] = XtCreateManagedWidget("normal",
        xmPushButtonWidgetClass, actmenu, args, n);
    XtAddCallback(menu_item[(int) NORMAL_ACT], XmNactivateCallback, 
	(XtCallbackProc)call_act, &data);
    XmStringFree(xmtemp);

    xmtemp = XmStringCreateSimple("Chart Date");
    n = 0;
    XtSetArg(args[n], XmNlabelString, xmtemp); n++;
    menu_item[(int)ADD_CHDATE] = XtCreateManagedWidget("chdate",
	xmPushButtonWidgetClass, submenu, args, n);
    XtAddCallback(menu_item[(int)ADD_CHDATE], XmNactivateCallback, 
	(XtCallbackProc)call_chdate, &data);
    XmStringFree(xmtemp);

    xmtemp =  XmStringCreateSimple("Event");
    n = 0;
    XtSetArg(args[n], XmNlabelString, xmtemp); n++;
    menu_item[(int) ADD_EVENT] = XtCreateManagedWidget("event",
        xmPushButtonWidgetClass, submenu, args, n);
    XtAddCallback(menu_item[(int) ADD_EVENT], XmNactivateCallback, 
	(XtCallbackProc)call_event, &data);
    XmStringFree(xmtemp);

    xmtemp = XmStringCreateSimple("Level");
    n = 0;
    XtSetArg(args[n], XmNlabelString, xmtemp); n++;
    menu_item[(int)ADD_LEVEL] = XtCreateManagedWidget("level",
        xmPushButtonWidgetClass, submenu, args, n);
    XtAddCallback(menu_item[(int)ADD_LEVEL], XmNactivateCallback, 
	(XtCallbackProc)call_level, &data);
    XmStringFree(xmtemp);

    xmtemp = XmStringCreateSimple("Image");
    n = 0;
    XtSetArg(args[n], XmNlabelString, xmtemp); n++;
    menu_item[(int) ADD_IMAGE] = XtCreateManagedWidget("image", 
	xmPushButtonWidgetClass, submenu, args, n);
    XtAddCallback(menu_item[(int) ADD_IMAGE], XmNactivateCallback, 
	(XtCallbackProc)call_image, &data);
    XmStringFree(xmtemp);

    xmtemp = XmStringCreateSimple("Page");
    n = 0;
    XtSetArg(args[n], XmNlabelString, xmtemp); n++;
    menu_item[(int)ADD_PAGE] = XtCreateManagedWidget("page", 
	xmPushButtonWidgetClass, submenu, args, n);
    XtAddCallback(menu_item[(int)ADD_PAGE], XmNactivateCallback, 
	(XtCallbackProc)call_page, &data);
    XmStringFree(xmtemp);

    xmtemp =  XmStringCreateSimple("Sequence");
    n = 0;
    XtSetArg(args[n], XmNlabelString, xmtemp); n++;
    menu_item[(int) ADD_SEQ] = XtCreateManagedWidget("sequence",
        xmPushButtonWidgetClass, submenu, args, n);
    XtAddCallback(menu_item[(int) ADD_SEQ], XmNactivateCallback, 
	(XtCallbackProc)call_sequence, &data);
    XmStringFree(xmtemp);

    xmtemp = XmStringCreateSimple("Slip");
    n = 0;
    XtSetArg(args[n], XmNlabelString, xmtemp); n++;
    menu_item[(int) ADD_SLIP] = XtCreateManagedWidget("slip",
	xmPushButtonWidgetClass, submenu, args, n);
    XtAddCallback(menu_item[(int) ADD_SLIP], XmNactivateCallback, 
	(XtCallbackProc)call_slip, &data);
    XmStringFree(xmtemp);

    xmtemp = XmStringCreateSimple("Status");
    n = 0;
    XtSetArg(args[n], XmNlabelString, xmtemp); n++;
    menu_item[(int)ADD_STATUS] = XtCreateManagedWidget("status", 
	xmPushButtonWidgetClass, submenu, args, n);
    XtAddCallback(menu_item[(int)ADD_STATUS], XmNactivateCallback, 
	(XtCallbackProc)call_status, &data);
    XmStringFree(xmtemp);

    xmtemp = XmStringCreateSimple("Symbol");
    n = 0;
    XtSetArg(args[n], XmNlabelString, xmtemp); n++;
    menu_item[(int)ADD_SYM] = XtCreateManagedWidget("symbol", 
	xmPushButtonWidgetClass, submenu, args, n);
    XtAddCallback(menu_item[(int)ADD_SYM], XmNactivateCallback, 
	(XtCallbackProc)call_symbol, &data);
    XmStringFree(xmtemp);

    xmtemp =  XmStringCreateSimple("Text");
    n = 0;
    XtSetArg(args[n], XmNlabelString, xmtemp); n++;
    menu_item[(int) ADD_TEXT] = XtCreateManagedWidget("text", 
	xmPushButtonWidgetClass, submenu, args, n);
    XtAddCallback(menu_item[(int) ADD_TEXT], XmNactivateCallback, 
	(XtCallbackProc)call_text, &data);
    XmStringFree(xmtemp);

}

/***********************************************************************
 *
 * FUNCTION:
 *	init_hln_menu()
 *
 * INPUTS:
 *	parent  (Widget)
 *
 * OUTPUTS:
 *
 * RETURNS:
 *
 * EXTERNALLY READ:
 *
 * EXTERNALLY MODIFIED:
 *
 * DESCRIPTION:
 *	initializes the horizontal line popup menu
 */

void 
init_hln_menu(Widget parent)
{
    Arg args[10];
    XmString xmtemp;
    Cardinal n;

    /* 
     * Create the menu with a label and separator bar
     */
    hln_menu = XmCreatePopupMenu( parent, "hln_menu", NULL, 0);

    xmtemp = XmStringCreateSimple("Operations");
    n = 0;
    XtSetArg(args[n], XmNlabelString, xmtemp); n++;
    XtCreateManagedWidget( "operations", xmLabelWidgetClass, hln_menu, args, n);
    XmStringFree(xmtemp);

    XtCreateManagedWidget( "separator",xmSeparatorWidgetClass,hln_menu,NULL,0);

    /* 
     * Create the buttons to go in the menu
     */
    xmtemp = XmStringCreateSimple("Edit HLine");
    n = 0;
    XtSetArg(args[n], XmNlabelString, xmtemp); n++;
    hln_item[(int)HEDIT] = XtCreateManagedWidget("edit",xmPushButtonWidgetClass,
	hln_menu, args, n);
    XtAddCallback(hln_item[(int)HEDIT], XmNactivateCallback, 
	(XtCallbackProc)edit_hln, &data);
    XmStringFree(xmtemp);

    xmtemp = XmStringCreateSimple("Delete HLine");
    n = 0;
    XtSetArg(args[n], XmNlabelString, xmtemp); n++;
    hln_item[(int)HDELETE] = XtCreateManagedWidget("delete",
	xmPushButtonWidgetClass, hln_menu, args, n);
    XtAddCallback(hln_item[(int)HDELETE],XmNhelpCallback,
	(XtCallbackProc)ShowHelp,"delete_hln");
    XtAddCallback(hln_item[(int)HDELETE],XmNactivateCallback,
	(XtCallbackProc)delete_hln,&data);
    XmStringFree(xmtemp);

    xmtemp = XmStringCreateSimple("Insert New Line");
    n = 0;
    XtSetArg(args[n], XmNlabelString, xmtemp); n++;
    hln_item[(int)HINSERT] = XtCreateManagedWidget("insert", 
	xmPushButtonWidgetClass, hln_menu, args, n);
    XtAddCallback(hln_item[(int)HINSERT],XmNactivateCallback,
	(XtCallbackProc)insert_hln, &data);
    XtAddCallback(hln_item[(int)HINSERT],XmNhelpCallback,
	(XtCallbackProc)ShowHelp,"insert_hln");
    XmStringFree(xmtemp);

    n = 0;
    xmtemp = XmStringCreateSimple("Line Display ");
    XtSetArg(args[n], XmNlabelString, xmtemp); n++;
    hln_item[(int)HLINE] = XtCreateManagedWidget("line", 	
	xmPushButtonWidgetClass, hln_menu, args, n);
    XtAddCallback(hln_item[(int)HLINE], XmNactivateCallback, 
	(XtCallbackProc)tog_line, &data);
    XtAddCallback(hln_item[(int)HLINE],XmNhelpCallback,
	(XtCallbackProc)ShowHelp,"tog_line");
    XmStringFree(xmtemp);

    n = 0;
    xmtemp = XmStringCreateSimple("Number Display ");
    XtSetArg(args[n], XmNlabelString, xmtemp); n++;
    hln_item[(int)HNUMBER] = XtCreateManagedWidget("number",
        xmPushButtonWidgetClass, hln_menu, args, n);
    XtAddCallback(hln_item[(int)HNUMBER],XmNactivateCallback,
	(XtCallbackProc)tog_number,&data);
    XtAddCallback(hln_item[(int)HNUMBER],XmNhelpCallback,
	(XtCallbackProc)ShowHelp,"tog_number");
    XmStringFree(xmtemp);

}

/***********************************************************************
 *
 * FUNCTION:
 *	undo_it()
 *
 * INPUTS:
 *	w	(Widget)
 *	client_data	(struct cdata *)
 *	call_data	(XtPointer)	
 *
 * OUTPUTS:
 *
 * RETURNS:
 *
 * EXTERNALLY READ:
 *
 * EXTERNALLY MODIFIED:
 *
 * DESCRIPTION:
 *	undo previous operation
 */

static void 
undo_it(Widget w, struct cdata *client_data, XtPointer call_data)
{
    switch (sbck) {
    case BACK_EDIT:
        Message("Undo last edit");
        break;
    case BACK_MOVE:
        Message("Undo last move");
        break;
    case BACK_DEL:
        Message("Undo last delete");
        break;
    case BACK_ADD:
        Message("Undo last add");
        break;
    case BACK_NONE:
	break;
    }
   recall_object();
}

/***********************************************************************
 *
 * FUNCTION:
 *      copy_it()
 *
 * INPUTS:
 *      w       (Widget)
 *      client_data     (struct cdata *)
 *      call_data       (XtPointer)
 *
 * OUTPUTS:
 *
 * RETURNS:
 *
 * EXTERNALLY READ:
 *
 * EXTERNALLY MODIFIED:
 *
 * DESCRIPTION:
 *      copies the current object and adds one week so that they can
 *	be distinguished on the page
 */

static void 
copy_it(Widget w, struct cdata *client_data, XtPointer call_data)
{
    int i, co;
    int time_to_add;

    co = client_data->co;
    if (co == 0) {
	i = new_index(TRUE);
    } else {
        i = new_index(FALSE);
    }
    if ((objary[0].z.chtptr->end_date - objary[0].z.chtptr->start_date) <= 
	(UTC_ONE_DAY * 120)) {
	time_to_add = UTC_ONE_DAY;
    } else {
	time_to_add = UTC_ONE_DAY * 7;
    }
    (*(objary[co].opsptr->cpy))(&objary[i], &objary[co]);
    switch(objary[co].type) {
    case OBJ_EVT:
	objary[i].z.evtptr->edate += time_to_add;
	break;
    case OBJ_SACT:
	objary[i].z.sactptr->strtdate += time_to_add;
	objary[i].z.sactptr->endate += time_to_add;
	objary[i].z.sactptr->pctdate += time_to_add;
	break;
    case OBJ_ACT:
	objary[i].z.actptr->strtdate += time_to_add;
	objary[i].z.actptr->endate += time_to_add;
	objary[i].z.actptr->update += time_to_add;
	objary[i].z.actptr->dwndate += time_to_add;
	objary[i].z.actptr->b_strtdate += time_to_add;
	objary[i].z.actptr->b_endate += time_to_add;
	objary[i].z.actptr->pctdate += time_to_add;
	break;
    case OBJ_SLP:
	objary[i].z.slpptr->strtdate += time_to_add;
	objary[i].z.slpptr->endate += time_to_add;
	break;
    case OBJ_SEQ:
	objary[i].z.seqptr->strtdate += time_to_add;
	objary[i].z.seqptr->endate += time_to_add;
	break;
    default:
	break;
    }
    (*(objary[i].opsptr->loc))(i, OBJECT);
    exposeRectList(0, objary[0].rlist);
}

/***********************************************************************
 *
 * FUNCTION:
 *      evt2slp()
 *
 * INPUTS:
 *      w       (Widget)
 *      client_data     (struct cdata *)
 *      call_data       (XtPointer)
 *
 * OUTPUTS:
 *
 * RETURNS:
 *
 * EXTERNALLY READ:
 *
 * EXTERNALLY MODIFIED:
 *
 * DESCRIPTION:
 *      copies the current event object to a slip object
 */

static void 
evt2slp(Widget w, struct cdata *client_data, XtPointer call_data)
{
    int i, co;				/* temp object indices */
    char *text;				/* temp text buffer */
    int hpos, vpos, idhpos;		/* new text positions */
    struct evt *evtptr;			/* pointer to event object */
    RectList *temprlist;		/* temporary rect list */
    int cnt, p;				/* loop counter and pline index */
    int obj1, obj2;			/* index of pline objects */
    int tempco;				/* non-edited object of pline */
    int size = 0;			/* size of precptr for loop */
    XRectangle r;			/* refresh if plines changed */

    co = client_data->co;
    Message("Event object converted to Slip object");
    /*
     * expose event and save the rlist so it can be reexposed
     */
    exposeRectList(1, objary[co].rlist);
    temprlist = objary[co].rlist;

    /*
     * the text and positions must be transferred to temp variables
     * the positions are declared in different order for events and
     * slips so the value must be corrected
     */
    evtptr = objary[co].z.evtptr;
    if (strcmp(evtptr->text, "") != 0) {
	text = XtNewString(evtptr->text);
	hpos = evtptr->hpos1;
	vpos = evtptr->vpos1;
    } else if (strcmp(evtptr->text2, "") != 0) {
	Message("Text 2 used for slip text");
	text = XtNewString(evtptr->text2);
	hpos = evtptr->hpos2;
        vpos = evtptr->vpos2;
    } else {
	text = XtNewString("");
	hpos = 0;
	vpos = 0;
    }
    if (hpos == 1) {
	hpos = 2;
    } else if (hpos == 2) {
	hpos = 1;
    } else {
	hpos = 0;
    }
    if (evtptr->idhpos == 1) {
	idhpos = 2;
    } else if (evtptr->idhpos == 2) {
	idhpos = 1;
    } else {
	idhpos = 0;
    }
    /* 
     * add the new slip object 
     */
    i = add_slip(evtptr->edate, evtptr->edate, evtptr->line, evtptr->sym,
        evtptr->sym, evtptr->s_char, evtptr->s_char, 0, evtptr->color,
	evtptr->font, evtptr->point, text, hpos, 
	vpos, objary[co].layer, evtptr->disp, evtptr->idtext, evtptr->idtog,
	idhpos, evtptr->idvpos);
    (*(objary[i].opsptr->loc))(i, OBJECT);
    (*(objary[i].opsptr->edt))(i, TRUE);
    /*
     * if the event object had precedence lines copy them
     */
    if (objary[co].precptr != NULL) {
	size = sizeof_dynarray(objary[co].precptr);
	for (cnt = 0; cnt < size; cnt++) {
	    if (plnary[elemof_dynarray(objary[co].precptr, cnt)].obj1 == co) {
		obj1 = i;
		obj2 = plnary[elemof_dynarray(objary[co].precptr, cnt)].obj2;
		tempco = obj2;
	    } else {
		obj1 = plnary[elemof_dynarray(objary[co].precptr, cnt)].obj1;
		obj2 = i;
		tempco = obj1;
	    }
	    p = new_pline();
	    if (p != -1) {
	        add_pline(p, obj1, obj2);
	        if (objary[i].precptr == NULL) {
	            objary[i].precptr = new_dynarray();
	        }
	        append_dynarray(objary[i].precptr, p);
	        append_dynarray(objary[tempco].precptr, p);
	    } else {
		/*
		 * have to add precedence lines before deleting event
		 * precedence lines, so may not have enough plines
		 */
		Message("Cannot copy precedence line %d to %d", obj1, obj2);
		Message("you will have to readd it");
	    }
	}
    }
    for (cnt = 0; cnt < npln; cnt++) {
	loc_pline(cnt, OBJECT);
    }
    /* 
     * if the slip object was not cancelled, remove the event object 
     * and reexpose where the event object was
     */
    if (objary[i].type != OBJ_NUL) {
        (*(objary[co].opsptr->rem))(co, OBJECT);
        exposeRectList(0, temprlist);
        if (size > 0) {
            /*
             * have to refresh the screen so that plines are correct
	     * if plines existed
             */
            r.x = 0;
            r.y = 0;
            r.width = page_width;
            r.height = page_height;
            AddExposeEvent(0, &r);
        }
    } 
    issue_date();
    modified = TRUE;
}

/***********************************************************************
 *
 * FUNCTION:
 *	edit_it()
 *
 * INPUTS:
 *	w	(Widget)
 *	client_data	(struct cdata *)
 *	call_data	(XtPointer)
 *
 * OUTPUTS:
 *
 * RETURNS:
 *
 * EXTERNALLY READ:
 *
 * EXTERNALLY MODIFIED:
 *
 * DESCRIPTION:
 *	edits the current object
 */

static void 
edit_it(Widget w, struct cdata *client_data, XtPointer call_data)
{
    Message("Edit object");
    (*(objary[client_data->co].opsptr->edt))(client_data->co, FALSE);
}

/***********************************************************************
 *
 * FUNCTION:
 *	edit_hln()
 *
 * INPUTS:
 *	w       (Widget)
 *      client_data     (struct cdata *)
 *      call_data       (XtPointer)
 *
 * OUTPUTS:
 *
 * RETURNS:
 *
 * EXTERNALLY READ:
 *
 * EXTERNALLY MODIFIED:
 *
 * DESCRIPTION:
 *	edits the current horizontal line 
 */

static void 
edit_hln(Widget w, struct cdata *client_data, XtPointer call_data)
{
    Message("Edit Horizontal Line");
    (*(Hobjary[client_data->co].opsptr->edt))(client_data->co, FALSE);
}
    
/***********************************************************************
 *
 * FUNCTION:
 *	delete_it()
 *
 * INPUTS:
 *	w	(Widget)
 *	client_data 	(struct cdata *)
 *	call_data	(XtPointer)
 *
 * OUTPUTS:
 *
 * RETURNS:
 *
 * EXTERNALLY READ:
 *
 * EXTERNALLY MODIFIED:
 *
 * DESCRIPTION:
 *	deletes the current object
 */

static void 
delete_it(Widget w, struct cdata *client_data, XtPointer call_data)
{
    if (Beware(BEWARE)) {
        Message("Delete object");
        store_object(client_data->co, BACK_DEL, OBJECT);
        (*(objary[client_data->co].opsptr->rem))(client_data->co, OBJECT);
        issue_date();
        exposeRectList(0, objary[0].rlist);
        modified = TRUE;
    }
}

/***********************************************************************
 *
 * FUNCTION:
 *      delete_pline()
 *
 * INPUTS:
 *      w       (Widget)
 *      client_data     (struct cdata *)
 *      call_data       (XtPointer)
 *
 * OUTPUTS:
 *
 * RETURNS:
 *
 * EXTERNALLY READ:
 *
 * EXTERNALLY MODIFIED:
 *
 * DESCRIPTION:
 *      deletes the current precedence line
 */

static void 
delete_pline(Widget w, struct cdata *client_data, XtPointer call_data)
{
    int tempco;
   
    if (Beware(BEWARE)) { 
	tempco = find_pline(client_data->x, client_data->y);
        msg_pline(tempco, OBJECT);
        rem_pline(tempco, OBJECT);
        issue_date();
        exposeRectList(0, objary[0].rlist);
        modified = TRUE;
    }
}

/***********************************************************************
 *
 * FUNCTION:
 *	delete_hln()
 *
 * INPUTS:
 *	w       (Widget)
 *      client_data     (struct cdata *)
 *      call_data       (XtPointer)
 * 
 * OUTPUTS:
 *
 * RETURNS:
 *
 * EXTERNALLY READ:
 *
 * EXTERNALLY MODIFIED:
 *
 * DESCRIPTION:
 *	deletes the current Horizontal line object
 */

static void 
delete_hln(Widget w, struct cdata *client_data, XtPointer call_data)
{
    if (Beware(BEWARE)) {
        Message("Delete Horizontal Line");
        (*(Hobjary[client_data->co].opsptr->rem))(client_data->co, OBJECT);
        issue_date();
        modified = TRUE;
    }
}

/***********************************************************************
 *
 * FUNCTION:
 *	call_text()
 *
 * INPUTS:
 *	w	(Widget)
 *	client_data	(struct cdata *)
 *	call_data	(XtPointer)
 *
 * OUTPUTS:
 *
 * RETURNS:
 *
 * EXTERNALLY READ:
 *
 * EXTERNALLY MODIFIED:
 *
 * DESCRIPTION:
 *	adds text to the drawing area
 */

static void 
call_text(Widget w, struct cdata *client_data, XtPointer call_data)
{       
    int co;					/* current object index */ 

    Message("Add text object");
    co = add_text(client_data->x, client_data->y, 0, RSRC_FONT, RSRC_POINT, 0, 
	0, 1, "");
    (*(objary[co].opsptr->edt))(co, TRUE);
}

/***********************************************************************
 *
 * FUNCTION:
 *	call_sact()
 *
 * INPUTS:
 *	w	(Widget)
 *	client_data 	(struct cdata *)
 *	call_data	(XtPointer)
 *
 * OUTPUTS:
 *
 * RETURNS:
 *
 * EXTERNALLY READ:
 *
 * EXTERNALLY MODIFIED:
 *
 * DESCRIPTION:
 *	adds a sactivity object to the drawing area
 */

static void 
call_sact(Widget w, struct cdata *client_data, XtPointer call_data)
{
     int co;				/* current object */
     int line;				/* line of sactivity */
     utc_val utc_time;			/* time of sactivity */

    Message ("Add Simple Activity Object ");
    x_to_utc(client_data->x, &utc_time);
    line = ((client_data->y + 1 - y_act_bottom) / y_gap) + page_begin;
    co = add_sactivity(utc_time, utc_time, line, 0, 0, utc_time, 0, 1, 1,
	0, 0, 0, RSRC_FONT, RSRC_POINT, 0, "", "", (int)all_id_disp, 0, 2);
    (*(objary[co].opsptr->edt))(co, TRUE);
}

/***********************************************************************
 *
 * FUNCTION:
 *      call_act()
 *
 * INPUTS:
 *      w       (Widget)
 *      client_data     (struct cdata *)
 *      call_data       (XtPointer)
 *
 * OUTPUTS:
 *
 * RETURNS:
 *
 * EXTERNALLY READ:
 *
 * EXTERNALLY MODIFIED:
 *
 * DESCRIPTION:
 *      adds a activity object to the drawing area
 */

static void 
call_act(Widget w, struct cdata *client_data, XtPointer call_data)
{
     int co;                            /* current object */
     int line;                          /* line of activity */
     utc_val utc_time;                  /* time of activity */

    Message ("Add Activity Object ");
    x_to_utc(client_data->x, &utc_time);
    line = ((client_data->y + 1 - y_act_bottom) / y_gap) + page_begin;
    co = add_activity(utc_time, utc_time, utc_time, utc_time, line, 0, 0, 
	utc_time, 0, utc_time, utc_time, 1, 1, 0, 0, 0, RSRC_FONT, RSRC_POINT, 
	0, "", "", (int)all_id_disp, 0, 2);
    (*(objary[co].opsptr->edt))(co, TRUE);
}

/***********************************************************************
 *
 * FUNCTION:
 *	call_event()
 *
 * INPUTS:
 *	w	(Widget)
 *	client_data 	(struct cdata *)
 *	call_data	(XtPointer)
 *
 * OUTPUTS:
 *
 * RETURNS:
 *
 * EXTERNALLY READ:
 *
 * EXTERNALLY MODIFIED:
 *
 * DESCRIPTION:
 *	adds an event object to the drawing area
 */

static void 
call_event(Widget w, struct cdata *client_data, XtPointer call_data)
{
    int co;			/* current object */
    int line;			/* line of event */
    utc_val utc_time;		/* time of event */

    Message("Add event object");
    x_to_utc(client_data->x, &utc_time);
    line = ((client_data->y + 1 - y_act_bottom) / y_gap) + 
	page_begin;
    co = add_event(utc_time, line, 0, "", 0, "", "", RSRC_FONT, RSRC_POINT, 2, 
	2, 0, 1, 1, 0, 0, "", (int)all_id_disp, 0, 2);
    (*(objary[co].opsptr->edt))(co, TRUE);
}

/***********************************************************************
 *
 * FUNCTION:
 *	call_image()
 *
 * INPUTS:
 *	w	(Widget)
 *	client_data 	(struct cdata *)
 *	call_data	(XtPointer)
 *
 * OUTPUTS:
 *
 * RETURNS:
 *
 * EXTERNALLY READ:
 *
 * EXTERNALLY MODIFIED:
 *
 * DESCRIPTION:
 *	adds an image object to the drawing area
 */

static void 
call_image(Widget w, struct cdata *client_data, XtPointer call_data)
{
    int co;					/* current object index */

    Message("Add image object");
    co = add_image(client_data->x, client_data->y, 1, 0, 0, "");
    (*(objary[co].opsptr->edt))(co, TRUE);
}

/***********************************************************************
 *
 * FUNCTION:
 *      call_slip()
 *
 * INPUTS:
 *      w       	(Widget)
 *      client_data     (struct cdata *)
 *      call_data       (XtPointer)
 *
 * OUTPUTS:
 *
 * RETURNS:
 *
 * EXTERNALLY READ:
 *
 * EXTERNALLY MODIFIED:
 *
 * DESCRIPTION:
 *      adds a slip object to the drawing area
 */

static void 
call_slip(Widget w, struct cdata *client_data, XtPointer call_data)
{
    int co;                     /* current object index */
    int line;			/* line of event */
    utc_val utc_time;		/* time of event */

    Message("Add slip object");
    x_to_utc(client_data->x, &utc_time);
    line = ((client_data->y + 1 - y_act_bottom) / y_gap) + 
	page_begin;
    co = add_slip(utc_time, utc_time, line, 0, 0, "", "", 0, 0, RSRC_FONT, 
	    RSRC_POINT, "", 0, 2, 1, 0, "", (int)all_id_disp, 0, 2);
    (*(objary[co].opsptr->edt))(co, TRUE);
}

/***********************************************************************
 *
 * FUNCTION:
 *      call_status()
 *
 * INPUTS:
 *      w               (Widget)
 *      client_data     (struct cdata *)
 *      call_data       (XtPointer)
 *
 * OUTPUTS:
 *
 * RETURNS:
 *
 * EXTERNALLY READ:
 *
 * EXTERNALLY MODIFIED:
 *
 * DESCRIPTION:
 *      adds a status object to the drawing area
 */

static void 
call_status(Widget w, struct cdata *client_data, XtPointer call_data)
{
    int co;                     /* current object index */

    Message("Add Status object");
    co = add_status(client_data->x, client_data->y, RSRC_FONT, RSRC_POINT, 0,0);
    (*(objary[co].opsptr->edt))(co, TRUE);
}

/***********************************************************************
 *
 * FUNCTION:
 *      call_page()
 *
 * INPUTS:
 *      w               (Widget)
 *      client_data     (struct cdata *)
 *      call_data       (XtPointer)
 *
 * OUTPUTS:
 *
 * RETURNS:
 *
 * EXTERNALLY READ:
 *
 * EXTERNALLY MODIFIED:
 *
 * DESCRIPTION:
 *      adds a page object to the drawing area
 */

static void 
call_page(Widget w, struct cdata *client_data, XtPointer call_data)
{
    int co;                     /* current object index */

    Message("Add Page object");
    co = add_page(client_data->x, client_data->y, RSRC_FONT, RSRC_POINT, 0, 0);
    (*(objary[co].opsptr->edt))(co, TRUE);
}

/***********************************************************************
 *
 * FUNCTION:
 *      call_chdate()
 *
 * INPUTS:
 *      w               (Widget)
 *      client_data     (struct cdata *)
 *      call_data       (XtPointer)
 *
 * OUTPUTS:
 *
 * RETURNS:
 *
 * EXTERNALLY READ:
 *
 * EXTERNALLY MODIFIED:
 *
 * DESCRIPTION:
 *      adds a chdate object to the drawing area
 */

static void 
call_chdate(Widget w, struct cdata *client_data, XtPointer call_data)
{
    int co;                     /* current object index */

    Message("Add Chart Date object");
    co = add_chdate(client_data->x, client_data->y, GR_COURIER_BOLD, 12, 0, 
	0, 1);
    (*(objary[co].opsptr->edt))(co, TRUE);
}

/***********************************************************************
 *
 * FUNCTION:
 *      call_symbol()
 *
 * INPUTS:
 *      w               (Widget)
 *      client_data     (struct cdata *)
 *      call_data       (XtPointer)
 *
 * OUTPUTS:
 *
 * RETURNS:
 *
 * EXTERNALLY READ:
 *
 * EXTERNALLY MODIFIED:
 *
 * DESCRIPTION:
 *      adds a symbol object to the drawing area
 */

static void 
call_symbol(Widget w, struct cdata *client_data, XtPointer call_data)
{
    int co;                     /* current object index */

    Message("Add Symbol");
    co = add_symbol(client_data->x, client_data->y, 0, 1, 0, 0, 0);
    (*(objary[co].opsptr->edt))(co, TRUE);
}

/***********************************************************************
 *
 * FUNCTION:
 *      call_level()
 *
 * INPUTS:
 *      w               (Widget)
 *      client_data     (struct cdata *)
 *      call_data       (XtPointer)
 *
 * OUTPUTS:
 *
 * RETURNS:
 *
 * EXTERNALLY READ:
 *
 * EXTERNALLY MODIFIED:
 *
 * DESCRIPTION:
 *      adds a level object to the drawing area
 */

static void 
call_level(Widget w, struct cdata *client_data, XtPointer call_data)
{
    int co;                     /* current object index */

    Message("Add Level");
    co = add_level(client_data->x, client_data->y, "", RSRC_FONT, RSRC_POINT, 
	20, 1, 0, 0);
    (*(objary[co].opsptr->edt))(co, TRUE);
}

/***********************************************************************
 *
 * FUNCTION:
 *      call_sequence()
 *
 * INPUTS:
 *      w               (Widget)
 *      client_data     (struct cdata *)
 *      call_data       (XtPointer)
 *
 * OUTPUTS:
 *
 * RETURNS:
 *
 * EXTERNALLY READ:
 *
 * EXTERNALLY MODIFIED:
 *
 * DESCRIPTION:
 *      adds a sequence object to the drawing area
 */

static void 
call_sequence(Widget w, struct cdata *client_data, XtPointer call_data)
{
    int co;                     /* current object index */
    int line;			/* line of sequence */
    utc_val utc_time;		/* time of sequence */

    Message("Add Sequence");
    x_to_utc(client_data->x, &utc_time);
    line = ((client_data->y + 1 - y_act_bottom) / y_gap) + page_begin;
    co = add_sequence(utc_time, utc_time, 0, 0, 0, 0, line, RSRC_FONT, 
	RSRC_POINT, 1, 0, "", 0, "", (int)all_id_disp, 0, 2);
    (*(objary[co].opsptr->edt))(co, TRUE);
}

/***********************************************************************
 *
 * FUNCTION:
 *	insert_hln()
 *
 * INPUTS:
 *	w       (Widget)
 *      client_data     (struct cdata *)
 *      call_data       (XtPointer)
 *
 * OUTPUTS:
 *
 * RETURNS:
 *
 * EXTERNALLY READ:
 *
 * EXTERNALLY MODIFIED:
 *
 * DESCRIPTION:
 *	inserts a horizontal line object to the drawing area
 */

static void 
insert_hln(Widget w, struct cdata *client_data, XtPointer call_data)
{
    Message("Insert Horizontal Line");
    ins_hline(client_data->co);
    modified = TRUE;
}

/***********************************************************************
 *
 * FUNCTION:
 *	tog_line() 
 *
 * INPUTS:
 *	w       	(Widget)
 *      client_data     (struct cdata *)
 *      call_data       (XtPointer)
 *
 * OUTPUTS:
 *
 * RETURNS:
 *
 * EXTERNALLY READ:
 *
 * EXTERNALLY MODIFIED:
 *
 * DESCRIPTION:
 *	toggles the line display on/off
 */

static void 
tog_line(Widget w, struct cdata *client_data, XtPointer call_data)
{
    int co;					/* current object */

    co = find_H_object(client_data->x, client_data->y);
    tog_hline(co);
    modified = TRUE;
}

/***********************************************************************
 *
 * FUNCTION:
 *	tog_number()
 *
 * INPUTS:
 *	w       	(Widget)
 *      client_data     (struct cdata *)
 *      call_data       (XtPointer)
 *
 * OUTPUTS:
 *
 * RETURNS:
 *
 * EXTERNALLY READ:
 *
 * EXTERNALLY MODIFIED:
 *
 * DESCRIPTION:
 *	toggles the number display on/off
 */

static void 
tog_number(Widget w, struct cdata *client_data, XtPointer call_data)
{
    int co;					/* current object */
    
    co = find_H_object(client_data->x, client_data->y);
    tog_hnum(co);
    modified = TRUE;
}
