/*****************************************************************************
  FILE           : d3_project.c
  SHORTNAME      : project.c
  SNNS VERSION   : 3.2

  PURPOSE        : controls the project pannel
  NOTES          :

  AUTHOR         : Ralf Huebner
  DATE           : 1.12.1991

  CHANGED BY     :
  IDENTIFICATION : @(#)d3_project.c	1.10 3/2/94
  SCCS VERSION   : 1.10
  LAST CHANGE    : 3/2/94

             Copyright (c) 1990-1994  SNNS Group, IPVR, Univ. Stuttgart, FRG
             
******************************************************************************/


#include <stdio.h>
#include <memory.h>

#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/Intrinsic.h>
#include <X11/StringDefs.h>
#include <X11/Shell.h>
#include <X11/Xaw/Simple.h>
#include <X11/Xaw/Box.h>
#include <X11/Xaw/Form.h>
#include <X11/Xaw/Toggle.h>

#include "glob_typ.h"
#include "ui.h"
#include "ui_xWidgets.h"
#include "d3_global.h"
#include "d3_xUtils.h"
#include "d3_main.h"

#include "d3_project.ph"


/*****************************************************************************
  FUNCTION : d3_closeProjectPannel

  PURPOSE  : close the project pannel
  RETURNS  : void
  NOTES    :

  UPDATE   :
******************************************************************************/

static void d3_closeProjectPannel (Widget w, Widget pannel, caddr_t call_data)

{
    temp_state.viewpoint [0] = ui_xFloatFromAsciiWidget (viewpointXwidget);
    temp_state.viewpoint [1] = ui_xFloatFromAsciiWidget (viewpointYwidget);
    temp_state.viewpoint [2] = ui_xFloatFromAsciiWidget (viewpointZwidget);
    XtDestroyWidget (pannel);
    if (memcmp (&d3_state, &temp_state, 
                sizeof (d3_state_type)) != 0) {
         memcpy (&d3_state, &temp_state, 
                 sizeof (d3_state_type)); 
         d3_drawNet ();
    }
}


/*****************************************************************************
  FUNCTION : setProjectToggleState

  PURPOSE  : sets the toggles in the project pannel
  RETURNS  : void
  NOTES    :

  UPDATE   :
******************************************************************************/

static void setProjectToggleState (void)

{
    switch (temp_state.projection_mode)
      {
        case parallel: ui_xSetToggleState (parallelButton, TRUE);
                       ui_xSetToggleState (centralButton, FALSE);
                       break;
        case central : ui_xSetToggleState (parallelButton, FALSE);
                       ui_xSetToggleState (centralButton, TRUE);
                       break;
      }
}


/*****************************************************************************
  FUNCTION : setParallelProjection

  PURPOSE  : sets mode to display the net with parallel projection
  RETURNS  : void
  NOTES    :

  UPDATE   :
******************************************************************************/

static void setParallelProjection (void)

{
    temp_state.projection_mode = parallel;
    setProjectToggleState ();
}


/*****************************************************************************
  FUNCTION : setCentralProjection

  PURPOSE  : sets mode to display the net with central projection
  RETURNS  : void
  NOTES    :

  UPDATE   :
******************************************************************************/

static void setCentralProjection (void)

{
    temp_state.projection_mode = central;
    setProjectToggleState ();
}


/*****************************************************************************
  FUNCTION : createProjectPannel

  PURPOSE  : creates the project pannel
  RETURNS  : void
  NOTES    :

  UPDATE   :
******************************************************************************/

void d3_createProjectPannel (Widget w, Widget button, caddr_t call_data)

{
    int n;
    Arg arg[10];
    char buf[20];
    Position xPos, yPos;
    Dimension width, height;
    Widget projectPannel, pannel, border, label, done;

    n = 0;
    XtSetArg (arg[0], XtNwidth, &width); n++;
    XtSetArg (arg[1], XtNheight, &height); n++;
    XtGetValues (button, arg, (unsigned int) n);

    XtTranslateCoords (button, (Position) (width / 2), (Position) (height / 2), &xPos, &yPos);

    n = 0;

    XtSetArg(arg[n], XtNx, xPos); n++;
    XtSetArg(arg[n], XtNy, yPos); n++;

    projectPannel = XtCreatePopupShell ("projection", transientShellWidgetClass, button, arg, (unsigned int) n);

    border = XtCreateManagedWidget("border", boxWidgetClass,
                                   projectPannel, NULL, ZERO);
    pannel = XtCreateManagedWidget("pannel", formWidgetClass, 
                                   border, NULL, ZERO);

    parallelButton = d3_xCreateToggleItem ("parallel", pannel, NULL, NULL, NULL);
    centralButton = d3_xCreateToggleItem ("central", pannel, NULL,
                                   parallelButton, NULL);

    label = ui_xCreateLabelItem ("  Viewpoint  X", pannel, d3_fontWidth * 14,
                                   NULL, centralButton); 

    sprintf (buf, "%.4f", d3_state.viewpoint[0]);
    viewpointXwidget = ui_xCreateDialogItem ("viewpointX", pannel,
                                   buf, d3_numberWidth, label, centralButton);

    label = ui_xCreateLabelItem ("             Y", pannel,  d3_fontWidth * 14,
                                   NULL, label); 

    sprintf (buf, "%.4f", d3_state.viewpoint[1]);
    viewpointYwidget = ui_xCreateDialogItem ("viewpointY", pannel,
                                buf, d3_numberWidth, label, viewpointXwidget);

    label = ui_xCreateLabelItem ("             Z", pannel, d3_fontWidth * 14,
                                   NULL, label); 

    sprintf (buf, "%.4f", d3_state.viewpoint[2]);
    viewpointZwidget = ui_xCreateDialogItem ("viewpointX", pannel,
                                   buf, d3_numberWidth, label, viewpointYwidget);

    done = d3_xCreateButtonItem ("done", border, NULL, label);


    XtAddCallback (parallelButton, XtNcallback, (XtCallbackProc) setParallelProjection, NULL);
    XtAddCallback (centralButton, XtNcallback, (XtCallbackProc) setCentralProjection, NULL);
    XtAddCallback (done, XtNcallback, (XtCallbackProc) d3_closeProjectPannel,
                   (Widget) projectPannel);

    memcpy (&temp_state, &d3_state, sizeof (d3_state_type)); 

    setProjectToggleState ();
  
    ui_checkWindowPosition(projectPannel);
    XtPopup (projectPannel, XtGrabExclusive);
    ui_xDontResizeWidget(projectPannel); 

}

/* end of file */
/* lines: 233 */
