/*
 * Copyright 1990 by Baylor College of Medicine ALL RIGHTS RESERVED. 
 *
 * This program is subject to a license agreement between 
 * Baylor College of Medicine and MIT. Any use inconsistent with
 * said license and any use by persons other than the faculty, 
 * students and staff at MIT or any use on a computer not operated 
 * as part of the Athena Computing Environment (ACE) is expressly 
 * prohibited.
 */
/****************************************************************
 * File: action_props.c
 * Date: 05/06/91
 *
 * Description:
 *   This file contains the functions for implementing the action
 *   properties in the property manager. 
 *
 * Revisions:
 ****************************************************************/
#include <Xm/Xm.h>
#include <Xm/PushB.h>
#include <Xm/ScrolledW.h>
#include <Xm/Label.h>
#include <Xm/TextF.h>
#include <X11/StringDefs.h>

#include <VList.h>

#include "VnsP.h"
#include "props.h"

/* external pixmaps */
extern Pixmap qmark_bitmap;
extern Pixmap action_link_bitmap;

static
void
add_action_vp(prop)
	VnsProp prop;
{
	Widget sw = XtVaCreateWidget("ActionViewport",xmScrolledWindowWidgetClass,prop->vp,
		XmNscrollingPolicy,XmAUTOMATIC,
		XmNvisualPolicy,XmVARIABLE,
		XtNstretchHoriz,True,
		XtNstretchVert,True,
		NULL);
	Widget frm = XtVaCreateManagedWidget("PropertiesBox",vListWidgetClass,sw,
		XtNnumColumns,2,
		XtNnumRows,1,
		XtNborderWidth,0,
		XtNhSpacing,2,
		XtNvSpacing,2,
		XtNstretchHoriz,True,
		XtNstretchVert,True,
		NULL);
	XtVaCreateManagedWidget("Command:",xmLabelWidgetClass,frm,
		NULL);
	XtVaCreateManagedWidget("ActionCommand",xmTextFieldWidgetClass,frm,
		XtNstretchHoriz,True,
		XmNwidth,280,
		NULL);
}

static
void
sel_action_props(w,prop)
	Widget w;
	VnsProp prop;
{
	Widget vp = XtNameToWidget(prop->vp,"*ActionViewport");

	VnsPropDisplay(vp);
}

static
void
add_action_button(prop)
	VnsProp prop;
{
	Widget cb = XtVaCreateManagedWidget("Action Properties",xmPushButtonWidgetClass,prop->buttons,
		NULL);
	XtAddCallback(cb,XmNactivateCallback,sel_action_props,(XtPointer)prop);
}

static
void
update_action(prop,obj)
	VnsProp prop;
	VnsObject *obj;
{
	Widget w_com = XtNameToWidget(prop->vp,"*ActionViewport*ActionCommand");

	/* update the action property viewport */
	XtVaSetValues(w_com,
		XmNvalue,obj->info.data.al_info.command,
		NULL);

	XmTextFieldShowPosition(w_com,0);

	/* update current color */
	VnsPropSetColor(obj->info.data.al_info.color);
	VnsPropSetFont(obj->info.data.al_info.font);
}

static
void
modify_action(prop,obj)
	VnsProp prop;
	VnsObject *obj;
{
	Widget w_com = XtNameToWidget(prop->vp,"*ActionViewport*ActionCommand");
	XFontStruct *font;
	char *command;
	char *color_name;
	char *font_name;
	long col;
	int len;

	/* obtain the object information */
	color_name = VnsPropGetColor();
	font_name = VnsPropGetFont();
	XtVaGetValues(w_com,
		XmNvalue,&command,
		NULL);

	/* update specific object info */
	strcpy(obj->info.data.al_info.color,color_name);
	strcpy(obj->info.data.al_info.font,font_name);
	strcpy(obj->info.data.al_info.command,command);

	/* modify the database */
	srv_modify_object(ObjectToSrv(obj),obj->parent->parent->nid,obj->parent->pid,
		obj->oid,&obj->info);

	/* modifiy the displayed object */
	len = strlen(command);
	if (len > 0)
	{
		XtVaSetValues(obj->auxil.link.button,
			XmNlabelPixmap,action_link_bitmap,
			NULL);
	}
	else
	{
		XtVaSetValues(obj->auxil.link.button,
			XmNlabelPixmap,qmark_bitmap,
			NULL);
	}
	col = VnsAllocNamedColor(ObjectToVns(obj),color_name);
	VtSetForeColor(obj->owd,col);
	font = alloc_named_font(ObjectToVns(obj),font_name);
	XtVaSetValues(obj->auxil.link.wd,
		XtNfont,font,
		NULL);
}

init_action_props(vns)
	VnsContext *vns;
{
	VnsProp prop;

	prop = VnsPropCreate(vns,"Action Link Object",VNS_OBJECT,OT_ACTION_LINK);
	add_action_button(prop);
	add_action_vp(prop);
	VnsPropAddColor(prop);
	VnsPropAddFonts(prop);
	VnsPropAddUpdate(prop,update_action);
	VnsPropAddModify(prop,modify_action);
}
