/* 
 *  @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
<<<<<<< 1.6.8.2
static char rcsid[] = "$XConsortium: OptionMenu4.c /main/10 1995/07/13 18:50:16 drk $"
======
static char rcsid[] = "$XConsortium: OptionMenu4.c /main/10 1995/07/13 18:50:16 drk $"
>>>>>>> 1.6.7.2
#endif
#endif
/*
*  (c) Copyright 1987, 1988, 1989 HEWLETT-PACKARD COMPANY */

#include <testlib.h>

#define   NUM_RC_CHILDREN 9

Widget    RC;
Widget    RC_children[NUM_RC_CHILDREN];
static char *RC_children_names[] = { 
  "Himalyan",
  "Siamese",
  "D. Shorthair",
  "Maine Cat",
  "Burmese",
  "E. Shorthair",
  "Turkish Van",
  "Persian",
  "Russian Blue"
  };

Widget RC2, RC2pd, RC2b1, RC2b2, RC2b3, OM1, OM2, OM3;
Widget RC3, RC3pd, RC3pb1, RC3pb2, RC3pb3,RC3om;
Widget PushBtn1, PushBtn2, PushBtn3;
Widget SharedMenu, Form;
Widget mb1, om1, popupshell, itm1, itm2, itm3;
XmString  cmpLabel;

Widget AddMenuItem(Widget menu, char *itemName)
{
  Arg arg[10];
  int n;
  Widget menuItem;
  XmString tempString;

  n = 0;
  tempString = XmStringCreateLtoR(itemName, XmSTRING_DEFAULT_CHARSET);
  XtSetArg(arg[n], XmNlabelString, (XtArgVal) tempString);   n++;
  XtSetArg(arg[n], XmNsensitive, (XtArgVal) TRUE); n++;
  menuItem = XmCreatePushButtonGadget(menu, itemName, arg, n);
  XmStringFree(tempString);
  return(menuItem);
} /* AddMenuItem */

int main(int argc, char **argv)
{
  register int i,n;
  Arg args[MAX_ARGS];
  XmString tcs;
  char buf[32];

  CommonTestInit(argc, argv);

#ifdef MOTIF1_1
  n = 0;
  XtSetArg(args[n], XmNwidth, 10);	n++;
  XtSetArg(args[n], XmNheight, 10);	n++;
  XtSetArg(args[n], XmNallowShellResize, True); n++;
  XtSetValues(Shell1, args, n);
#endif /* MOTIF1_1 */
    
  n = 0;
  XtSetArg(args[n], XtNgeometry, "+0+350");  n++;
  XtSetValues(Shell1, args, n);
  
  /* 
   *  Test: nine Option Menu children of a Form. 
   */

  n = 0;
  RC = XmCreateForm (Shell1, "RC", args, n);
  XtManageChild (RC);

  /* 
   *  Put the nine cascadebutton children of RC into an array 
   */

  for (i = 0; i <= (NUM_RC_CHILDREN - 1); i++)
    {  
      n = 0;
      tcs = XmStringCreate(RC_children_names[i], XmSTRING_DEFAULT_CHARSET);
      sprintf (buf, "OptionMenu%d", i);
      /* this resource off for bug Pxxxx */
      XtSetArg(args[n], XmNnavigationType, XmNONE); n++;
      XtSetArg(args[n], XmNlabelString, tcs); n++;
      RC_children[i] = XmCreateOptionMenu(RC, buf, args, n);
      XmStringFree(tcs);

      /*
       *  Substituting Cascade Button children in MENU_BAR gets rid
       *  of all warnings
       */
      /*         RC_children[i] = XmCreateCascadeButton(RC, buf, args, n); */

      XtManageChild(RC_children[i]);
    }

  /*
   * Create the shared menu pane for children 0, 1 and 5.
   * First, put together the widget list for subMenuId.
   */

  n = 0;
  XtSetArg(args[n], XmNrowColumnType, XmMENU_PULLDOWN); n++; 
  SharedMenu = XmCreatePulldownMenu(RC, "SharedMenu", args, n);

  n = 0;
  tcs = XmStringCreate("Seal Point" , XmSTRING_DEFAULT_CHARSET);
  XtSetArg(args[n], XmNlabelString, tcs); n++;
  PushBtn1 = XmCreatePushButton(SharedMenu, "PushBtn1", args, 1);
  XmStringFree(tcs);

  n = 0;
  tcs = XmStringCreate("Lynx Point", XmSTRING_DEFAULT_CHARSET);
  XtSetArg(args[n], XmNlabelString, tcs); n++;
  PushBtn2 = XmCreatePushButton(SharedMenu, "PushBtn2", args, n);
  XmStringFree(tcs);

  n = 0;
  tcs = XmStringCreate("Chocolate Point", XmSTRING_DEFAULT_CHARSET);
  XtSetArg(args[n], XmNlabelString, tcs); n++;
  PushBtn3 = XmCreatePushButton(SharedMenu, "PushBtn3", args, n);
  XmStringFree(tcs);

  /*
   *  Manage the push buttons
   */

  XtManageChild(PushBtn1); 
  XtManageChild(PushBtn2); 
  XtManageChild(PushBtn3);

  n = 0;
  XtSetArg(args[n], XmNsubMenuId, SharedMenu); n++;
  XtSetValues(RC_children[0], args, n);
  XtSetValues(RC_children[1], args, n);
  XtSetValues(RC_children[5], args, n);

  /*  
   *  Set Form constraints.
   *  For Children 0,3,6 set top attachment ATTACH_FORM
   *  For all others, set top attachment to widget [i-1]
   */

  for (i = 0; i<=8; i++)
    {  
      n = 0;
      if (i%3)
	{ 
	  XtSetArg(args[n], XmNtopWidget, RC_children[i - 1]); n++;
	  XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
	  XtSetValues(RC_children[i], args, n);
	}
      else
	{ 
	  XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); n++;
	  XtSetValues (RC_children[i], args, n);
	}
    }
    
  /* 
   *  Set children 0,1 and 2 left-attach Form
   */

  for (i = 0; i<=2; i++)
    { 
      n = 0;
      XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); n++;
      XtSetValues(RC_children[i], args, n);
    }

  /* 
   *  Set all except above to left-attach, widget i - 3 
   */

  for (i=3; i <= 8; i++)
    { 
      n = 0;
      XtSetArg(args[n], XmNleftWidget, RC_children[i - 3]); n++;
      XtSetArg(args[n], XmNleftAttachment, XmATTACH_WIDGET); n++;
      XtSetValues(RC_children[i], args, n);
    }

  XtManageChild(RC);
  XtRealizeWidget(Shell1);
  CommonPause();

  /*
   *  Test 2: Verify different OptionMenu XmNmenuHistory settings
   *  for 3 OptionMenus sharing the same pulldown...
   */
  
  XtUnmanageChild(RC);

  /*
   *  Create a rowColumn
   */

  RC2 = XmCreateRowColumn(Shell1, "RC2", NULL, 0);

  RC2pd = XmCreatePulldownMenu(RC2, "RC2pd", NULL, 0);

  XtManageChild(RC2b1 = XmCreatePushButton(RC2pd, "Button1", NULL, 0));
  XtManageChild(RC2b2 = XmCreatePushButton(RC2pd, "Button2", NULL, 0));
  XtManageChild(RC2b3 = XmCreatePushButton(RC2pd, "Button3", NULL, 0));

  XtSetArg(args[0], XmNsubMenuId, RC2pd);
  XtSetArg(args[1], XmNmenuHistory, RC2b1);
  XtManageChild(XmCreateOptionMenu(RC2, "option1", args, 2));

  XtSetArg(args[1], XmNmenuHistory, RC2b3);
  XtManageChild(XmCreateOptionMenu(RC2, "option2", args, 2));

  XtSetArg(args[1], XmNmenuHistory, RC2b2); 
  XtManageChild(XmCreateOptionMenu(RC2, "option3", args, 2));

  XtManageChild(RC2);

  CommonPause();

  /*
   *  Test 3: Verify that when an OptionMenu is the child of
   *   a BulletinBoard, it can initialize its XmNmenuHistory
   *   correctly.
   */

  XtUnmanageChild(RC2);

  n=0;
  XtSetArg(args[n], XmNwidth, 600); n++;
  XtSetArg(args[n], XmNheight, 400); n++;
  RC3 = XmCreateRowColumn(Shell1, "RC3", args, n);

  RC3pd = XmCreatePulldownMenu(RC3, "RC3pd", args, 0);

  n=0;
  tcs = XmStringLtoRCreate("Item1", XmSTRING_DEFAULT_CHARSET);
  XtSetArg(args[n], XmNlabelString, tcs); n++;
  XtSetArg(args[n], XmNmarginLeft, 4); n++;
  XtSetArg(args[n],  XmNmarginRight, 4); n++;
  RC3pb1 = XmCreatePushButton(RC3pd, "PLBPB1", args, n);
  XmStringFree(tcs);

  /*
   * Create pushbutton 2
   */

  n = 0;
  tcs = XmStringLtoRCreate("A long item", XmSTRING_DEFAULT_CHARSET);
  XtSetArg(args[n], XmNlabelString, tcs); n++;
  XtSetArg(args[n],  XmNmarginLeft, 4); n++;
  XtSetArg(args[n],  XmNmarginRight,  4); n++;
  RC3pb2 = XmCreatePushButton(RC3pd, "PLBPB2", args, n);	
  XmStringFree(tcs);

  /*
   * Create pushbutton 3
   */

  n = 0;
  tcs = XmStringLtoRCreate("Item3", XmSTRING_DEFAULT_CHARSET);
  XtSetArg(args[n], XmNlabelString,  tcs); n++;
  XtSetArg(args[n], XmNmarginLeft, 4); n++;
  XtSetArg(args[n], XmNmarginRight, 4); n++;

  RC3pb3 = XmCreatePushButton(RC3pd, "PLBPB3", args, n);    	
  XmStringFree(tcs);

  /*
   * Create the option menu
   */

  n=0;
  XtSetArg(args[n], XmNsubMenuId,  RC3pd); n++;
  XtSetArg(args[n], XmNx, 50); n++;
  XtSetArg(args[n], XmNy, 10); n++;
  XtSetArg(args[n], XmNborderWidth, 0); n++;
  XtSetArg(args[n], XmNmenuHistory, RC3pb2); n++;
  XtSetArg(args[n], XmNshadowThickness, 2); n++;
  XtSetArg(args[n], XmNrowColumnType, XmMENU_OPTION); n++;

  RC3om = XmCreateOptionMenu(RC3, "RC3OM", args, n);  

  XtManageChild(RC3pb1);
  XtManageChild(RC3pb2);
  XtManageChild(RC3pb3);
  XtManageChild(RC3om);
  XtManageChild(RC3);

  CommonPause();

  XtUnmanageChild(RC3);

  /*
   *  Test 4.  Create an option menu.  Then change the contents of
   *   the default selected item.  It should be updated correctly.
   */

  n = 0;

  /*
   * Motif 1.1 has a bug where if the shell gets realized with no
   * children, an error occurs because the shell thinks it has no
   * width and height.  In Motif 1.2 this is supposed to get fixed.
   * BTW - this only surfaces during automation where widgets are 
   * managed as they are created.
   */

#ifdef MOTIF1_1
  XtSetArg(args[n], XmNwidth, 10); n++;
  XtSetArg(args[n], XmNheight, 10); n++;
#endif

  XtSetArg(args[n], XmNallowShellResize, True); n++;
  popupshell = XtCreatePopupShell("pshell",
				  applicationShellWidgetClass,
				  Shell1,
				  args,
				  n);

  om1 = XmCreatePulldownMenu(popupshell, "pulld", NULL, 0);
  n = 0;
  cmpLabel = XmStringCreate("ButtonLabel:", XmSTRING_DEFAULT_CHARSET);
  XtSetArg(args[n], XmNlabelString, cmpLabel); n++;
  XtSetArg(args[n], XmNsubMenuId, om1); n++;
  mb1 = XmCreateOptionMenu(popupshell, "mb1", args, n);
  XmStringFree(cmpLabel);
  XtManageChild(mb1);

  itm1 = AddMenuItem(om1, "Item1");
  XtManageChild(itm1);

  itm2 = AddMenuItem(om1, "Item2");
  XtManageChild(itm2);

  itm3 = AddMenuItem(om1, "Item3");
  XtManageChild(itm3);

  XtPopup(popupshell, XtGrabNone);

  cmpLabel = XmStringCreate("new long Text", XmSTRING_DEFAULT_CHARSET);
  XtSetArg(args[0], XmNlabelString, cmpLabel);
  XtSetValues(itm1, args, 1);
  XmStringFree(cmpLabel);
  
/* 
 * The below commented code resets menuHistory to another item, 
 *  and when setting it back to the original item, it then shows
 *  "new long Text" as the current item.
 */

/*   XtSetArg(args[0], XmNmenuHistory, NULL);
   XtSetValues(mb1, args, 1);
*/

  XtSetArg(args[0], XmNmenuHistory, itm1);
  XtSetValues(mb1, args, 1);

  CommonPause();

  XtAppMainLoop(app_context);

} /*  End main */

