/*==================================================================
  ==================================================================
  ==	XMusic -- An Interactive Interface to Csound		  ==
  ==       Copyright (C) 1988 by George D. Drapeau                ==
  ==                  All Rights Reserved                         ==
  ==================================================================
  ==================================================================
*/
/* $Log:	callbacks.c,v $
 * Revision 1.3  89/08/06  17:57:39  drapeau
 * Cleaned up the code for first X11 release.
 *  */

#include <stdio.h>
#include <X11/Intrinsic.h>
#include <X11/StringDefs.h>
#include <X11/Box.h>
#include <X11/Command.h>
#include <X11/List.h>
#include <X11/Dialog.h>
#define USEBITMAPS
#include "defs.h"
#include "externs.h"


void SineCallback(widget,clientData,callData)
     Widget	widget;
     char *	clientData,*callData;
{
  PlaceTool(SineTool);
  PrintToolList();
}

void EnvCallback(widget,clientData,callData)
     Widget	widget;
     char *	clientData,*callData;
{
  PlaceTool(EnvTool);
  PrintToolList();
}

void SumCallback(widget,clientData,callData)
     Widget	widget;
     char *	clientData,*callData;
{
  PlaceTool(SumTool);
  PrintToolList();
  }

void AmpCallback(widget,clientData,callData)
     Widget	widget;
     char *	clientData,*callData;
{
  PlaceTool(AmpTool);
  PrintToolList();
}

void ParamCallback(widget,clientData,callData)
     Widget	widget;
     char *	clientData,*callData;
{
  PlaceTool(ParamTool);
  PrintToolList();
}

void NoiseCallback(widget,clientData,callData)
     Widget	widget;
     char *	clientData,*callData;
{
  PlaceTool(NoiseTool);
  PrintToolList();
}


void EQCallback(widget,clientData,callData)
     Widget	widget;
     char *	clientData,*callData;
{
  PlaceTool(EQTool);
  PrintToolList();
}

void Quit(widget,clientData,callData)
     Widget	widget;
     char *	clientData,*callData;
{
  printf("Quitting XMusic...\n");
  CleanUp();
  exit(0);
}

void Help(widget,clientData,callData)
     Widget	widget;
     char *	clientData,*callData;
{
  static int	poppedUp = False;
  
  if (poppedUp)							    /* Is the help text showing? */
    {
      XtPopdown(helpWidget);					    /* Yes, "popdown" the help text popup shell widget */
      poppedUp = False;
    }
  else
    {
      XtPopup(helpWidget,XtGrabNone);				    /* No, "popup" the help text popup shell widget */
      poppedUp = True;
    }
}

void Write(widget,clientData,callData)
     Widget	widget;
     char *	clientData,*callData;
{
  WriteOrchFile();
}

void Save(widget,clientData,callData)
     Widget	widget;
     char *	clientData,*callData;
{
  SaveDiagram();
}

void ExitCallback(widget,clientData,callData)
     Widget	widget;
     char *	clientData,*callData;
{
  XtPopup(exitWidget,XtGrabExclusive);
}

void ForgetExit(widget,clientData,callData)
     Widget	widget;
     char *	clientData,*callData;
{
  XtPopdown(exitWidget);
}

void AcceptInput(widget,clientData,callData)
     Widget	widget;
     char 	*clientData,*callData;
{
  strncpy(inputStr,XtDialogGetValueString(inputDialogWidget),MAXSTRLEN);
}

void ParamToolInput(widget,clientData,callData)
     Widget	widget;
     char 	*clientData,*callData;
{
  int	*xyPtr;
  int	x,y;
  
  xyPtr = (int *)clientData;					    /* Make xyPtr point to the clientData passed in */
  x = *xyPtr++;							    /* Set up x and y values from the clientData passed in */
  y = *xyPtr;
  strncpy(inputStr,XtDialogGetValueString(inputDialogWidget),MAXSTRLEN);
  (void)MakeParamTool(x,y);					    /* Make a ParamTool */
  XtPopdown(inputWidget);
  DrawMusicWin();						    /* Refresh the Music window to reflect new tool added */
}								    /* end function ParamToolInput */

void EQToolInput(widget,clientData,callData)
     Widget	widget;
     char 	*clientData,*callData;
{
  int	*xyPtr;
  int	x,y;
  
  xyPtr = (int *)clientData;					    /* Make xyPtr point to the clientData passed in */
  x = *xyPtr++;							    /* Set up x and y values from the clientData passed in */
  y = *xyPtr;
  strncpy(inputStr,XtDialogGetValueString(inputDialogWidget),MAXSTRLEN);
  (void)MakeEQTool(x,y);					    /* Make an EQTool */
  XtPopdown(inputWidget);
  DrawMusicWin();						    /* Refresh the Music window to reflect new tool added */
}								    /* end function EQToolInput */

void CancelInput(widget,clientData,callData)
     Widget	widget;
     char *	clientData,*callData;
{
  XtPopdown(inputWidget);
  XtDestroyWidget(inputWidget);
}


void DestroyInputWin(widget,clientData,callData)
     Widget	widget;
     char *	clientData,*callData;
{
  XtPopdown(inputWidget);
  XtDestroyWidget(inputWidget);
}

void HandleButtonEvent(w,clientData,event)
     Widget	w;
     char	*clientData;
     XEvent	*event;
{
  XButtonPressedEvent	*theEvent;

  theEvent = (XButtonPressedEvent *)event;
  
  switch (theEvent->button)
    {
    case Button1:
      ConnectTools();
      break;
    case Button2:
      MoveTool();
      break;
    case Button3:
      DisconnectTools();
      break;
    }								    /* end switch */
}								    /* end function HandleButtonEvent */

void	ShowToolInfo(w,clientData,event)
     Widget	w;
     char	*clientData;
     XEvent	*event;
{
  printf("Called ShowToolInfo.\n");
}								    /* end function ShowToolInfo */


void InfoCallback(widget,clientData,callData)
     Widget	widget;
     char 	*clientData,*callData;
{
  XtListReturnStruct	*listItem;
  int			index,row;
  Arg			argList[1];
  char			dialogString[MAXSTRLEN];
  
  listItem = (XtListReturnStruct *)callData;
  index = listItem->list_index;
  index = (index % 2 == 0) ? index+1 : index;			    /* Make sure index points to an elem on the right... */
  XtListHighlight(infoListWidget,index);			    /* Highlight the correct list element */
  listItem = XtListShowCurrent(infoListWidget);			    /* Get the new listItem being highlighted */
  row = (index/2);						    /* What row of the Info window are we looking at? */
  switch (row)							    /* Depending on what row is highlighted... */
    {
    case 1:							    /* Tool name is being changed */
      CreateInputWindow("Please enter a new name for this tool",
			listItem->string,
			ChangeArg,NULL);
      break;
    case 2:							    /* Tool rate is being changed */
      if (lastTool->rate >=2)
	lastTool->rate = 0;
      else
	lastTool->rate++;
      toolInfoList[5] = (String)RateToStr(lastTool->rate);	    /* Change third line, right side (tool rate) */
      XtListChange(infoListWidget,toolInfoList,0,0,True);	    /* Use the modified list for the InfoListWidget */
      changesMade = 1;
      break;
    case 3:							    /* Tool's csound function is being changed */
      CreateInputWindow("Please enter a new Csound function for this tool",
			listItem->string,
			ChangeArg,NULL);
      break;
    default:							    /* One of the tool's arguments is being changed */
      sprintf(dialogString,"Please enter a new name for %s",
	      toolInfoList[row*2]);
      CreateInputWindow(dialogString,
			listItem->string,
			ChangeArg,NULL);
      break;
    }								    /* end switch */
}								    /* end function InfoCallback */

