/* 
 *  @OPENGROUP_COPYRIGHT@
 *  COPYRIGHT NOTICE
 *  Copyright (c) 1990, 1991, 1992, 1993 Open Software Foundation, Inc.
 *  Copyright (c) 1996, 1997, 1998, 1999, 2000 The Open Group
 *  ALL RIGHTS RESERVED (MOTIF). See the file named COPYRIGHT.MOTIF for
 *  the full copyright text.
 *  
 *  This software is subject to an open license. It may only be
 *  used on, with or for operating systems which are themselves open
 *  source systems. You must contact The Open Group for a license
 *  allowing distribution and sublicensing of this software on, with,
 *  or for operating systems which are not Open Source programs.
 *  
 *  See http://www.opengroup.org/openmotif/license for full
 *  details of the license agreement. Any use, reproduction, or
 *  distribution of the program constitutes recipient's acceptance of
 *  this agreement.
 *  
 *  EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
 *  PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 *  KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY
 *  WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
 *  OR FITNESS FOR A PARTICULAR PURPOSE
 *  
 *  EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT
 *  NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT,
 *  INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 *  DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED
 *  AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 *  LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
 *  ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE
 *  EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE
 *  POSSIBILITY OF SUCH DAMAGES.
*/ 
/* 
 * HISTORY
*/ 
#ifdef REV_INFO
#ifndef lint
static char rcsid[] = "$XConsortium: Navigation2.c /main/6 1995/07/13 19:42:18 drk $"
#endif
#endif
/*
*  (c) Copyright 1987, 1988, 1989 HEWLETT-PACKARD COMPANY */

#include <signal.h>
#include <X11/StringDefs.h>
#include <testlib.h>


Widget Form, Form1, Form2, Form3, Form4, Form5, Form6, Form7, Form8, Form9;
Widget PushButton1, PushButton2, PushButton3;
static void RunTest();
static void CreateForm();
static void DestroyForm();
static void PushButtonCallback();
static void CreateMatrix();
static char *color_name[] = {
  "Red",       "Green",       "Blue", 
  "Orange",    "Yellow",      "Pink",
  "Magenta",   "Brown",       "Violet",
};

enum { unmap, unmanage, insensitive, destroy } remove_mode;
extern char *UserData;
Widget frame;

/*  main  */

/*  main  */

void main (argc, argv)
unsigned int argc;
char **argv;
     
{
  Display *display;
  int screen;
  Arg args[25];
  int n;
  char c;

  /*  initialize toolkit  */
    CommonTestInit(argc, argv);

  if (UserData != NULL) {
    if (strcmp (UserData, "unmap") == 0) 
	remove_mode = unmap;
    else if (strcmp (UserData, "unmanage") == 0)
	remove_mode = unmanage;
    else if (strcmp (UserData, "insensitive") == 0)
 	remove_mode = insensitive;
    else 
        remove_mode = destroy;
  }
  else {
    printf ("Test error: no mode specified\n", UserData);
    exit (1);
  }
    
  n = 0;
  XtSetArg (args[n], XmNwidth, 1);               n++;
  XtSetArg (args[n], XmNheight, 1);              n++;
    XtSetValues(Shell1, args, n);
    
  XtRealizeWidget (Shell1);

  RunTest(Shell1);

  XtAppMainLoop(app_context);      
}


static void RunTest(Shell)
Widget Shell;
{
  Arg      args[MAX_ARGS];
  unsigned int n;
 
    n = 0;
    frame = XmCreateFrame(Shell, "frame", args, n);

		/* Part 1 of Test */

    CreateForm(frame);
    
    /*  Create the first Form.  */
    n = 0;
    XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM);	        n++;
    XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM);		n++;
    XtSetArg (args[n], XmNorientation, XmHORIZONTAL);			n++;
    XtSetArg (args[n], XmNpacking, XmPACK_COLUMN);                      n++;
    XtSetArg (args[n], XmNnumColumns, 3);				n++;
    Form1 = XmCreateRowColumn(Form, "Form1", args, n);
    
    /*  Create the second Form.  */
    n = 0;
    XtSetArg (args[n], XmNrightAttachment, XmATTACH_WIDGET);	        n++;
    XtSetArg (args[n], XmNrightWidget, Form1);		                n++;
    XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM);		n++;
    XtSetArg (args[n], XmNorientation, XmHORIZONTAL);                   n++;
    XtSetArg (args[n], XmNnumColumns, 3);                                  n++;
    XtSetArg (args[n], XmNpacking, XmPACK_COLUMN);                      n++;
    Form2 = XmCreateRowColumn(Form, "Form2", args, n);
    
    /*  Create the third Form.  */
    n = 0;
    XtSetArg (args[n], XmNrightAttachment, XmATTACH_WIDGET);	        n++;
    XtSetArg (args[n], XmNrightWidget, Form2); 	                        n++;
    XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM);               n++;
    XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM);		n++;
    XtSetArg (args[n], XmNorientation, XmHORIZONTAL);                   n++;
    XtSetArg (args[n], XmNnumColumns, 3);                                  n++;
    XtSetArg (args[n], XmNpacking, XmPACK_COLUMN);                      n++;
    Form3 = XmCreateRowColumn(Form, "Form3", args, n);
    
    /*  Create the fourth Form.  */
    n = 0;
    XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET);	        n++;
    XtSetArg (args[n], XmNtopWidget, Form1);	                        n++;
    XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM);	        n++;
    XtSetArg (args[n], XmNorientation, XmHORIZONTAL);                   n++;
    XtSetArg (args[n], XmNnumColumns, 3);                                  n++;
    XtSetArg (args[n], XmNpacking, XmPACK_COLUMN);                      n++;
    Form4 = XmCreateRowColumn(Form, "Form4", args, n);
    
    /*  Create the fifth Form.  */
    n = 0;
    XtSetArg (args[n], XmNrightAttachment, XmATTACH_WIDGET);	        n++;
    XtSetArg (args[n], XmNrightWidget, Form4);		                n++;
    XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET);	        n++;
    XtSetArg (args[n], XmNtopWidget, Form2);        	                n++;
    XtSetArg (args[n], XmNorientation, XmHORIZONTAL);                   n++;
    XtSetArg (args[n], XmNnumColumns, 3);                                  n++;
    XtSetArg (args[n], XmNpacking, XmPACK_COLUMN);                      n++;
    Form5 = XmCreateRowColumn(Form, "Form5", args, n);
    
    /*  Create the sixth Form.  */
    n = 0;
    XtSetArg (args[n], XmNrightAttachment, XmATTACH_WIDGET);	        n++;
    XtSetArg (args[n], XmNrightWidget, Form5); 	                        n++;
    XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM);               n++;
    XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET);	        n++;
    XtSetArg (args[n], XmNtopWidget, Form3);    	                n++;
    XtSetArg (args[n], XmNorientation, XmHORIZONTAL);                   n++;
    XtSetArg (args[n], XmNnumColumns, 3);                                  n++;
    XtSetArg (args[n], XmNpacking, XmPACK_COLUMN);                      n++;
    Form6 = XmCreateRowColumn(Form, "Form6", args, n);
    
    /*  Create the seventh Form.  */
    n = 0;
    XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM);	        n++;
    XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET);	        n++;
    XtSetArg (args[n], XmNtopWidget, Form4);    	                n++;
    XtSetArg (args[n], XmNbottomAttachment, XmATTACH_FORM);	        n++;
    XtSetArg (args[n], XmNorientation, XmHORIZONTAL);                   n++;
    XtSetArg (args[n], XmNnumColumns, 3);                                  n++;
    XtSetArg (args[n], XmNpacking, XmPACK_COLUMN);                      n++;
    Form7 = XmCreateRowColumn(Form, "Form7", args, n);
    
    /*  Create the eigth Form.  */
    n = 0;
    XtSetArg (args[n], XmNrightAttachment, XmATTACH_WIDGET);	        n++;
    XtSetArg (args[n], XmNrightWidget, Form7);		                n++;
    XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET);	        n++;
    XtSetArg (args[n], XmNtopWidget, Form5);        	                n++;
    XtSetArg (args[n], XmNbottomAttachment, XmATTACH_FORM);	        n++;
    XtSetArg (args[n], XmNorientation, XmHORIZONTAL);                   n++;
    XtSetArg (args[n], XmNnumColumns, 3);                                  n++;
    XtSetArg (args[n], XmNpacking, XmPACK_COLUMN);                      n++;
    Form8 = XmCreateRowColumn(Form, "Form8", args, n);
    
    /*  Create the ninth Form.  */
    n = 0;
    XtSetArg (args[n], XmNrightAttachment, XmATTACH_WIDGET);	        n++;
    XtSetArg (args[n], XmNrightWidget, Form8); 	                        n++;
    XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM);               n++;
    XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET);	        n++;
    XtSetArg (args[n], XmNtopWidget, Form6);         	                n++;
    XtSetArg (args[n], XmNbottomAttachment, XmATTACH_FORM);	        n++;
    XtSetArg (args[n], XmNorientation, XmHORIZONTAL);                   n++;
    XtSetArg (args[n], XmNnumColumns, 3);                                  n++;
    XtSetArg (args[n], XmNpacking, XmPACK_COLUMN);                      n++;
    Form9 = XmCreateRowColumn(Form, "Form9", args, n);

    /* Create Form Matrices. */
    CreateMatrix(Form1, color_name[0]);
    CreateMatrix(Form2, color_name[1]);
    CreateMatrix(Form3, color_name[2]);
    CreateMatrix(Form4, color_name[3]);
    CreateMatrix(Form5, color_name[4]);
    CreateMatrix(Form6, color_name[5]);
    CreateMatrix(Form7, color_name[6]);
    CreateMatrix(Form8, color_name[7]);
    CreateMatrix(Form9, color_name[8]);

    /* Manage children. */
    XtManageChild(Form1);
    XtManageChild(Form2);
    XtManageChild(Form3);
    XtManageChild(Form4);
    XtManageChild(Form5);
    XtManageChild(Form6);
    XtManageChild(Form7);
    XtManageChild(Form8);
    XtManageChild(Form9);
    XtManageChild(Form);
    XtManageChild (frame);
 
    CommonPause();

    DestroyForm();


}

static void CreateForm(Shell)
Widget Shell;
{
  unsigned int n;
  Arg args[MAX_ARGS];
  
  /*  The form creation. */
  n = 0;
  XtSetArg (args[n], XmNpacking, XmPACK_COLUMN); n++;
  XtSetArg (args[n], XmNnumColumns, 3); n++;
  XtSetArg (args[n], XmNorientation, XmHORIZONTAL); n++;
  Form = XmCreateRowColumn (Shell, "Form", args, n);

}


static void DestroyForm()
{
  XtDestroyWidget(Form);
}

static void PushButtonCallback (pb, client_data, call_data)
     Widget pb;
     XtPointer client_data;
     XtPointer call_data;
{
  Arg args[1];

  switch (remove_mode) {
  case unmap:
    XtSetMappedWhenManaged (pb, False);
    XtUnmapWidget(pb);
#ifndef MOTIF1_1
    printf ("Focus on %s\n", XtName(XmGetFocusWidget(frame)));
    fflush (stdout);
#endif
    break;
  case unmanage:
    XtUnmanageChild(pb);
    break;
  case insensitive:
    XtSetArg (args[0], XmNsensitive, False); 
    XtSetValues (pb, args, 1);
    break;
  case destroy:
    XtDestroyWidget(pb);
    break;
  }

}

static void CreateMatrix(form, color)
     Widget form;
     char* color;
{
  int n;
  Arg args[MAX_ARGS];
  Widget PushButton1;
  Widget PushButton2;
  Widget PushButton3;
  Widget PushButton4;
  Widget PushButton5;
  Widget PushButton6;
  Widget PushButton7;
  Widget PushButton8;
  Widget PushButton9;
  char buf[256];
  
  extern void PushButtonCallback();


  /*  Create the first PushButton.  */
  strcpy (buf, color);
  strcat (buf, "1");
  n = 0;
  XtSetArg (args[n], XmNbackground, CommonGetColor(color));     n++;
  XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM);	n++;
  XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM);		n++;
  PushButton1 = XmCreatePushButton(form, buf, args, n);
       
  /*  Create the second PushButton.  */
  strcpy (buf, color);
  strcat (buf, "2");
  n = 0;
  XtSetArg (args[n], XmNbackground, CommonGetColor(color));     n++;
  XtSetArg (args[n], XmNrightAttachment, XmATTACH_WIDGET);	n++;
  XtSetArg (args[n], XmNrightWidget, PushButton1);		n++;
  XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM);		n++;
  PushButton2 = XmCreatePushButton(form, buf, args, n);
  
  /*  Create the third PushButton.  */
  strcpy (buf, color);
  strcat (buf, "3");
  n = 0;
  XtSetArg (args[n], XmNbackground, CommonGetColor(color));     n++;
  XtSetArg (args[n], XmNrightAttachment, XmATTACH_WIDGET);	n++;
  XtSetArg (args[n], XmNrightWidget, PushButton2); 	        n++;
  XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM);         n++;
  XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM);		n++;
  PushButton3 = XmCreatePushButton(form, buf, args, n);

  /*  Create the fourth PushButton.  */
  strcpy (buf, color);
  strcat (buf, "4");
  n = 0;
  XtSetArg (args[n], XmNbackground, CommonGetColor(color));     n++;
  XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET);	n++;
  XtSetArg (args[n], XmNtopWidget, PushButton1);	        n++;
  XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM);	n++;
  PushButton4 = XmCreatePushButton(form, buf, args, n);
       
  /*  Create the fifth PushButton.  */
  strcpy (buf, color);
  strcat (buf, "5");
  n = 0;
  XtSetArg (args[n], XmNbackground, CommonGetColor(color));     n++;
  XtSetArg (args[n], XmNrightAttachment, XmATTACH_WIDGET);	n++;
  XtSetArg (args[n], XmNrightWidget, PushButton4);		n++;
  XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET);	n++;
  XtSetArg (args[n], XmNtopWidget, PushButton2);        	n++;
  PushButton5 = XmCreatePushButton(form, buf, args, n);

  /*  Create the sixth PushButton.  */
  strcpy (buf, color);
  strcat (buf, "6");
  n = 0;
  XtSetArg (args[n], XmNbackground, CommonGetColor(color));     n++;
  XtSetArg (args[n], XmNrightAttachment, XmATTACH_WIDGET);	n++;
  XtSetArg (args[n], XmNrightWidget, PushButton5); 	        n++;
  XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM);         n++;
  XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET);	n++;
  XtSetArg (args[n], XmNtopWidget, PushButton3);    		n++;
  PushButton6 = XmCreatePushButton(form, buf, args, n);
  
  /*  Create the seventh PushButton.  */
  strcpy (buf, color);
  strcat (buf, "7");
  n = 0;
  XtSetArg (args[n], XmNbackground, CommonGetColor(color));     n++;
  XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM);	n++;
  XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET);	n++;
  XtSetArg (args[n], XmNtopWidget, PushButton4);    		n++;
  XtSetArg (args[n], XmNbottomAttachment, XmATTACH_FORM);	n++;
  PushButton7 = XmCreatePushButton(form, buf, args, n);
       
  /*  Create the eigth PushButton.  */
  strcpy (buf, color);
  strcat (buf, "8");
  n = 0;
  XtSetArg (args[n], XmNbackground, CommonGetColor(color));     n++;
  XtSetArg (args[n], XmNrightAttachment, XmATTACH_WIDGET);	n++;
  XtSetArg (args[n], XmNrightWidget, PushButton7);		n++;
  XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET);	n++;
  XtSetArg (args[n], XmNtopWidget, PushButton5);        	n++;
  XtSetArg (args[n], XmNbottomAttachment, XmATTACH_FORM);	n++;
  PushButton8 = XmCreatePushButton(form, buf, args, n);
  
  /*  Create the ninth PushButton.  */
  strcpy (buf, color);
  strcat (buf, "9");
  n = 0;
  XtSetArg (args[n], XmNbackground, CommonGetColor(color));     n++;
  XtSetArg (args[n], XmNrightAttachment, XmATTACH_WIDGET);	n++;
  XtSetArg (args[n], XmNrightWidget, PushButton8); 	        n++;
  XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM);         n++;
  XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET);	n++;
  XtSetArg (args[n], XmNtopWidget, PushButton6);         	n++;
  XtSetArg (args[n], XmNbottomAttachment, XmATTACH_FORM);	n++;
  PushButton9 = XmCreatePushButton(form, buf, args, n);

  /* Add Callbacks. */
  XtAddCallback(PushButton1, XmNactivateCallback, PushButtonCallback, NULL);
  XtAddCallback(PushButton2, XmNactivateCallback, PushButtonCallback, NULL);
  XtAddCallback(PushButton3, XmNactivateCallback, PushButtonCallback, NULL);
  XtAddCallback(PushButton4, XmNactivateCallback, PushButtonCallback, NULL);
  XtAddCallback(PushButton5, XmNactivateCallback, PushButtonCallback, NULL);
  XtAddCallback(PushButton6, XmNactivateCallback, PushButtonCallback, NULL);
  XtAddCallback(PushButton7, XmNactivateCallback, PushButtonCallback, NULL);
  XtAddCallback(PushButton8, XmNactivateCallback, PushButtonCallback, NULL);
  XtAddCallback(PushButton9, XmNactivateCallback, PushButtonCallback, NULL);

  /* Manage children. */
  XtManageChild(PushButton1);
  XtManageChild(PushButton2);
  XtManageChild(PushButton3);
  XtManageChild(PushButton4);
  XtManageChild(PushButton5);
  XtManageChild(PushButton6);
  XtManageChild(PushButton7);
  XtManageChild(PushButton8);
  XtManageChild(PushButton9);

}
