home *** CD-ROM | disk | FTP | other *** search
/ Tools / WinSN5.0Ver.iso / NETSCAP.50 / WIN1998.ZIP / ns / cmd / xfe / XfeWidgets / tests / PaneTestThree.c < prev    next >
Encoding:
C/C++ Source or Header  |  1998-04-08  |  22.4 KB  |  791 lines

  1. /* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
  2.  *
  3.  * The contents of this file are subject to the Netscape Public License
  4.  * Version 1.0 (the "NPL"); you may not use this file except in
  5.  * compliance with the NPL.  You may obtain a copy of the NPL at
  6.  * http://www.mozilla.org/NPL/
  7.  *
  8.  * Software distributed under the NPL is distributed on an "AS IS" basis,
  9.  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
  10.  * for the specific language governing rights and limitations under the
  11.  * NPL.
  12.  *
  13.  * The Initial Developer of this code under the NPL is Netscape
  14.  * Communications Corporation.  Portions created by Netscape are
  15.  * Copyright (C) 1998 Netscape Communications Corporation.  All Rights
  16.  * Reserved.
  17.  */
  18. /*-----------------------------------------*/
  19. /*                                                                        */
  20. /* Name:        PaneTestThree.c                                            */
  21. /* Description:    Test for XfePane widget.                                */
  22. /* Author:        Ramiro Estrugo <ramiro@netscape.com>                    */
  23. /*                                                                        */
  24. /*----------------------------------------------------------------------*/
  25.  
  26.  
  27. #include <Xfe/XfeTest.h>
  28.  
  29. static Widget    pane_create                    (Widget,String);
  30. static void        pane_add_buttons            (Widget,Widget,Widget);
  31. static void        pane_add_title                (Widget);
  32. static void        pane_add_forms                (Widget,Widget *,Widget *);
  33. static void        menu_item_cb                (Widget,XtPointer,XtPointer);
  34. static void        toggle_managed_cb            (Widget,XtPointer,XtPointer);
  35.  
  36. static Widget    create_simple_pane_frame    (String);
  37. static Widget    create_form_and_button        (Widget,unsigned char,
  38.                                              unsigned char,Widget,String,
  39.                                              String,Dimension);
  40.  
  41. static Widget    mail_create_pane            (Widget,String);
  42. static Widget    mail_create_frame            (String);
  43.  
  44.  
  45. /*----------------------------------------------------------------------*/
  46. static XfeMenuItemRec file_items[] =
  47. {
  48.     { "Open",            XfeMENU_PUSH },
  49.     { "Save",            XfeMENU_PUSH },
  50.     { "------------",    XfeMENU_SEP    },
  51.     { "Exit",            XfeMENU_PUSH,    XfeExitCallback    },
  52.     { NULL }
  53. };
  54. /*----------------------------------------------------------------------*/
  55. static XfeMenuItemRec orientation_items[] =
  56. {
  57.     { "OrientationVertical",    XfeMENU_RADIO,        menu_item_cb        },
  58.     { "OrientationHorizontal",    XfeMENU_RADIO,        menu_item_cb        },
  59.     { NULL }
  60. };
  61. /*----------------------------------------------------------------------*/
  62. static XfeMenuItemRec pane_sash_type_items[] =
  63. {
  64.     { "pane_sash_double_line",        XfeMENU_RADIO,        menu_item_cb    },
  65.     { "pane_sash_filled_rectangle",    XfeMENU_RADIO,        menu_item_cb    },
  66.     { "pane_sash_live",                XfeMENU_RADIO,        menu_item_cb    },
  67.     { "pane_sash_rectangle",        XfeMENU_RADIO,        menu_item_cb    },
  68.     { "pane_sash_single_line",        XfeMENU_RADIO,        menu_item_cb    },
  69.     { NULL }
  70. };
  71. /*----------------------------------------------------------------------*/
  72. static XfeMenuItemRec button_boolean_items[] =
  73. {
  74.     { "TraversalOn",            XfeMENU_TOGGLE,        menu_item_cb        },
  75.     { "------------",            XfeMENU_SEP    },
  76.     { "Sensitive",                XfeMENU_TOGGLE,        menu_item_cb        },
  77.     { "------------",            XfeMENU_SEP    },
  78.     { "UsePreferredWidth",        XfeMENU_TOGGLE,        menu_item_cb        },
  79.     { "UsePreferredHeight",        XfeMENU_TOGGLE,        menu_item_cb        },
  80.     { NULL }
  81. };
  82. /*----------------------------------------------------------------------*/
  83. static XfeMenuItemRec misc_items[] =
  84. {
  85.     { "Orientation",    XfeMENU_PANE,    NULL,    orientation_items        },
  86.     { "PaneSashType",    XfeMENU_PANE,    NULL,    pane_sash_type_items    },
  87.     { NULL }
  88. };
  89. /*----------------------------------------------------------------------*/
  90. static XfeMenuItemRec dimension_items[] =
  91. {
  92.     { "0",                XfeMENU_RADIO,        menu_item_cb        },
  93.     { "1",                XfeMENU_RADIO,        menu_item_cb        },
  94.     { "2",                XfeMENU_RADIO,        menu_item_cb        },
  95.     { "3",                XfeMENU_RADIO,        menu_item_cb        },
  96.     { "4",                XfeMENU_RADIO,        menu_item_cb        },
  97.     { "5",                XfeMENU_RADIO,        menu_item_cb        },
  98.     { "6",                XfeMENU_RADIO,        menu_item_cb        },
  99.     { "7",                XfeMENU_RADIO,        menu_item_cb        },
  100.     { "8",                XfeMENU_RADIO,        menu_item_cb        },
  101.     { "9",                XfeMENU_RADIO,        menu_item_cb        },
  102.     { "10",                XfeMENU_RADIO,        menu_item_cb        },
  103.     { "20",                XfeMENU_RADIO,        menu_item_cb        },
  104.     { "30",                XfeMENU_RADIO,        menu_item_cb        },
  105.     { "40",                XfeMENU_RADIO,        menu_item_cb        },
  106.     { "50",                XfeMENU_RADIO,        menu_item_cb        },
  107.     { "100",            XfeMENU_RADIO,        menu_item_cb        },
  108.     { "200",            XfeMENU_RADIO,        menu_item_cb        },
  109.     { "300",            XfeMENU_RADIO,        menu_item_cb        },
  110.     { "400",            XfeMENU_RADIO,        menu_item_cb        },
  111.     { "500",            XfeMENU_RADIO,        menu_item_cb        },
  112.     { "1000",            XfeMENU_RADIO,        menu_item_cb        },
  113.     { NULL }
  114. };
  115. /*----------------------------------------------------------------------*/
  116. static XfeMenuItemRec margin_items[] =
  117. {
  118.     { "MarginLeft",        XfeMENU_PANE,        NULL, dimension_items        },
  119.     { "MarginRight",    XfeMENU_PANE,        NULL, dimension_items        },
  120.     { "MarginTop",        XfeMENU_PANE,        NULL, dimension_items        },
  121.     { "MarginBottom",    XfeMENU_PANE,        NULL, dimension_items        },
  122.     { "------------",    XfeMENU_SEP    },
  123.     { "MarginAll"    ,    XfeMENU_PANE,        NULL, dimension_items        },
  124.     { NULL }
  125. };
  126. /*----------------------------------------------------------------------*/
  127. static XfeMenuItemRec managing_items[] =
  128. {
  129.     { "One"            ,        XfeMENU_TOGGLE,        menu_item_cb        },
  130.     { "OneTop"        ,        XfeMENU_TOGGLE,        menu_item_cb        },
  131.     { "OneBottom"    ,        XfeMENU_TOGGLE,        menu_item_cb        },
  132.     { "OneLeft"        ,        XfeMENU_TOGGLE,        menu_item_cb        },
  133.     { "OneRight"    ,        XfeMENU_TOGGLE,        menu_item_cb        },
  134.     { "------------",        XfeMENU_SEP    },
  135.     { "Two"            ,        XfeMENU_TOGGLE,        menu_item_cb        },
  136.     { "TwoTop"        ,        XfeMENU_TOGGLE,        menu_item_cb        },
  137.     { "TwoBottom"    ,        XfeMENU_TOGGLE,        menu_item_cb        },
  138.     { "TwoLeft"        ,        XfeMENU_TOGGLE,        menu_item_cb        },
  139.     { "TwoRight"    ,        XfeMENU_TOGGLE,        menu_item_cb        },
  140.     { NULL }
  141. };
  142. /*----------------------------------------------------------------------*/
  143. static XfeMenuItemRec dimensions_items[] =
  144. {
  145.     { "Width",                    XfeMENU_PANE,        NULL, dimension_items    },
  146.     { "Height",                    XfeMENU_PANE,        NULL, dimension_items    },
  147.     { "------------",            XfeMENU_SEP    },
  148.     { "HighlightThickness",        XfeMENU_PANE,        NULL, dimension_items    },
  149.     { "ShadowThickness",        XfeMENU_PANE,        NULL, dimension_items    },
  150.     { "------------",            XfeMENU_SEP    },
  151.     { "SashOffset",                XfeMENU_PANE,        NULL, dimension_items    },
  152.     { "SashShadowThickness",    XfeMENU_PANE,        NULL, dimension_items    },
  153.     { "SashSpacing",            XfeMENU_PANE,        NULL, dimension_items    },
  154.     { "SashThickness",            XfeMENU_PANE,        NULL, dimension_items    },
  155.     { "------------",            XfeMENU_SEP    },
  156.     { "Margins",                XfeMENU_PANE,        NULL, margin_items        },
  157.     { "RaiseBorderThickness",    XfeMENU_PANE,        NULL, dimension_items    },
  158.     { "------------",            XfeMENU_SEP    },
  159.     { "ArmOffset",                XfeMENU_PANE,        NULL, dimension_items    },
  160.     { "------------",            XfeMENU_SEP    },
  161.     { "SashPosition",            XfeMENU_PANE,        NULL, dimension_items    },
  162.     { NULL }
  163. };
  164. /*----------------------------------------------------------------------*/
  165. static XfeMenuPaneRec pane_items[] =
  166. {
  167.     { "File",            file_items                },
  168.     { "Managing",        managing_items            },
  169.     { "Dimensions",        dimensions_items        },
  170.     { "BooleanItems",    button_boolean_items    },
  171.     { "MiscItems",        misc_items                },
  172.     { NULL }
  173. };
  174. /*----------------------------------------------------------------------*/
  175.  
  176. /*----------------------------------------------------------------------*/
  177. int
  178. main(int argc,char *argv[])
  179. {
  180.     Widget    mail_frame;
  181.  
  182.     XfeAppCreate("PaneTestThree",&argc,argv);
  183.  
  184.     mail_frame = mail_create_frame("MailShell");
  185.  
  186.     XtPopup(mail_frame,XtGrabNone);
  187.  
  188.     XfeAppMainLoop();
  189.  
  190.     return 0;
  191. }
  192. /*----------------------------------------------------------------------*/
  193. static Widget
  194. pane_create(Widget parent,String name)
  195. {
  196.     Widget            pane;
  197.  
  198.     pane = XtVaCreateManagedWidget(name,
  199.                                    xfePaneWidgetClass,
  200.                                    parent,
  201.                                    NULL);
  202.     return pane;
  203. }
  204. /*----------------------------------------------------------------------*/
  205. static void
  206. pane_add_forms(Widget        pane,
  207.                Widget *        form_one_out,
  208.                Widget *        form_two_out)
  209. {
  210.     Widget            form_one = NULL;
  211.     Widget            form_two = NULL;
  212.     unsigned char    orientation;
  213.     String            form_one_name;
  214.     String            form_two_name;
  215.  
  216.     assert( XfeIsAlive(pane) );
  217.  
  218.     XtVaGetValues(pane,XmNorientation,&orientation,NULL);
  219.  
  220.     if (orientation == XmVERTICAL)
  221.     {
  222.         form_one_name = "TopForm";
  223.         form_two_name = "BottomForm";
  224.     }
  225.     else
  226.     {
  227.         form_one_name = "LeftForm";
  228.         form_two_name = "RightForm";
  229.     }
  230.  
  231.     form_one = XtVaCreateManagedWidget(form_one_name,
  232.                                        xmFormWidgetClass,
  233.                                        pane,
  234.                                        NULL);
  235.  
  236.     form_two = XtVaCreateManagedWidget(form_two_name,
  237.                                        xmFormWidgetClass,
  238.                                        pane,
  239.                                        NULL);
  240.  
  241.     *form_one_out = form_one;
  242.     *form_two_out = form_two;
  243. }
  244. /*----------------------------------------------------------------------*/
  245. static void
  246. pane_add_buttons(Widget            pane,
  247.                  Widget            form_one,
  248.                  Widget            form_two)
  249. {
  250.     Widget            button_one;
  251.     Widget            button_two;
  252.     unsigned char    orientation;
  253.     String            button_one_name;
  254.     String            button_two_name;
  255.  
  256.     assert( XfeIsAlive(pane) );
  257.     assert( XfeIsAlive(form_one) );
  258.     assert( XfeIsAlive(form_two) );
  259.  
  260.     XtVaGetValues(pane,XmNorientation,&orientation,NULL);
  261.  
  262.     if (orientation == XmVERTICAL)
  263.     {
  264.         button_one_name = "TopButton";
  265.         button_two_name = "BottomButton";
  266.     }
  267.     else
  268.     {
  269.         button_one_name = "LeftButton";
  270.         button_two_name = "RightButton";
  271.     }
  272.  
  273.     button_one = XtVaCreateManagedWidget(button_one_name,
  274.                                          xmPushButtonWidgetClass,
  275.                                          form_one,
  276.                                          NULL);
  277.  
  278.     button_two = XtVaCreateManagedWidget(button_two_name,
  279.                                          xmPushButtonWidgetClass,
  280.                                          form_two,
  281.                                          NULL);
  282. }
  283. /*----------------------------------------------------------------------*/
  284. static void
  285. pane_add_title(Widget pane)
  286. {
  287.     Widget            sash_form;
  288.     Widget            arrow;
  289.     Widget            label;
  290.     unsigned char    orientation;
  291.     String            arrow_name;
  292.     String            label_name;
  293.  
  294.     assert( XfeIsAlive(pane) );
  295.  
  296.     XtVaGetValues(pane,XmNorientation,&orientation,NULL);
  297.  
  298.     if (orientation == XmVERTICAL)
  299.     {
  300.         arrow_name = "VerticalArrow";
  301.         label_name = "VerticalLabel";
  302.     }
  303.     else
  304.     {
  305.         arrow_name = "HorizontalArrow";
  306.         label_name = "HorizontalLabel";
  307.     }
  308.  
  309. /*     XtVaGetValues(pane,XmNsashForm,&sash_form,NULL); */
  310.  
  311.     assert( XfeIsAlive(sash_form) );
  312.  
  313.     if (orientation == XmVERTICAL)
  314.     {
  315.         arrow = XtVaCreateManagedWidget(arrow_name,
  316.                                         xmArrowButtonWidgetClass,
  317.                                         sash_form,
  318.                                         NULL);
  319.     }
  320.  
  321.     label = XtVaCreateManagedWidget(label_name,
  322.                                     xmLabelWidgetClass,
  323.                                     sash_form,
  324.                                     XmNleftWidget,    arrow,
  325.                                     NULL);
  326. }
  327. /*----------------------------------------------------------------------*/
  328. static Widget
  329. create_simple_pane_frame(String frame_name)
  330. {
  331.     Widget    frame;
  332.     Widget    form;
  333.     Widget    menu;
  334.  
  335.     Widget    pane;
  336.  
  337.     Widget    one;
  338.     Widget    two;
  339.  
  340.     frame = XfeFrameCreate(frame_name,NULL,0);
  341.  
  342.     form = XfeDescendantFindByName(frame,"MainForm",XfeFIND_ANY,False);
  343.  
  344.     pane = XtVaCreateManagedWidget("Pane",xfePaneWidgetClass,form,NULL);
  345.  
  346.     menu = XfeMenuBarCreate(form,"MenuBar",pane_items,(XtPointer) pane,NULL,0);
  347.  
  348.     one =  XtVaCreateManagedWidget("One",xmFormWidgetClass,pane,NULL);
  349.  
  350.       two =  XtVaCreateManagedWidget("Two",xmFormWidgetClass,pane,NULL);
  351.  
  352.     create_form_and_button(pane,
  353.                            XmPANE_CHILD_ATTACHMENT_ONE,
  354.                            XmPANE_CHILD_ATTACH_TOP,
  355.                            one,"OneTop","Top",2);
  356.  
  357.     create_form_and_button(pane,
  358.                            XmPANE_CHILD_ATTACHMENT_ONE,
  359.                            XmPANE_CHILD_ATTACH_BOTTOM,
  360.                            one,"OneBottom","Bottom",2);
  361.  
  362.     create_form_and_button(pane,
  363.                            XmPANE_CHILD_ATTACHMENT_ONE,
  364.                            XmPANE_CHILD_ATTACH_LEFT,
  365.                            one,"OneLeft","Left",2);
  366.  
  367.     create_form_and_button(pane,
  368.                            XmPANE_CHILD_ATTACHMENT_ONE,
  369.                            XmPANE_CHILD_ATTACH_RIGHT,
  370.                            one,"OneRight","Right",2);
  371.  
  372.     create_form_and_button(pane,
  373.                            XmPANE_CHILD_ATTACHMENT_TWO,
  374.                            XmPANE_CHILD_ATTACH_TOP,
  375.                            two,"TwoTop","Top",2);
  376.  
  377.     create_form_and_button(pane,
  378.                            XmPANE_CHILD_ATTACHMENT_TWO,
  379.                            XmPANE_CHILD_ATTACH_BOTTOM,
  380.                            two,"TwoBottom","Bottom",2);
  381.  
  382.     create_form_and_button(pane,
  383.                            XmPANE_CHILD_ATTACHMENT_TWO,
  384.                            XmPANE_CHILD_ATTACH_LEFT,
  385.                            two,"TwoLeft","Left",2);
  386.  
  387.     create_form_and_button(pane,
  388.                            XmPANE_CHILD_ATTACHMENT_TWO,
  389.                            XmPANE_CHILD_ATTACH_RIGHT,
  390.                            two,"TwoRight","Right",2);
  391.     return frame;
  392. }
  393. /*----------------------------------------------------------------------*/
  394. static void
  395. menu_item_cb(Widget w,XtPointer client_data,XtPointer call_data)
  396. {
  397.     Widget        pane = (Widget) client_data;
  398.     String        name = XtName(w);
  399.     String        parent_name = XtName(XtParent(w));
  400.     Arg            av[20];
  401.     Cardinal    ac = 0;
  402.  
  403.     printf("menu_item_cb(%s,%s) pane = %s\n",name,parent_name,XtName(pane));
  404.  
  405.     if (!XfeIsAlive(pane))
  406.     {
  407.         return;
  408.     }
  409.  
  410.     if (strcmp(name,"TraversalOn") == 0)
  411.     {
  412.         XfeResourceToggleBoolean(pane,XmNtraversalOn);
  413.     }
  414.     else if (strcmp(name,"pane_sash_double_line") == 0)
  415.     {
  416.         XtSetArg(av[ac],XmNpaneSashType,XmPANE_SASH_DOUBLE_LINE); ac++;
  417.     }
  418.     else if (strcmp(name,"pane_sash_live") == 0)
  419.     {
  420.         XtSetArg(av[ac],XmNpaneSashType,XmPANE_SASH_LIVE); ac++;
  421.     }
  422.     else if (strcmp(name,"pane_sash_rectangle") == 0)
  423.     {
  424.         XtSetArg(av[ac],XmNpaneSashType,XmPANE_SASH_RECTANGLE); ac++;
  425.     }
  426.     else if (strcmp(name,"pane_sash_filled_rectangle") == 0)
  427.     {
  428.         XtSetArg(av[ac],XmNpaneSashType,XmPANE_SASH_FILLED_RECTANGLE); ac++;
  429.     }
  430.     else if (strcmp(name,"pane_sash_single_line") == 0)
  431.     {
  432.         XtSetArg(av[ac],XmNpaneSashType,XmPANE_SASH_SINGLE_LINE); ac++;
  433.     }
  434.     else if (strcmp(name,"Sensitive") == 0)
  435.     {
  436.         XfeResourceToggleBoolean(pane,XmNsensitive);
  437.     }
  438.     else if (strcmp(name,"UsePreferredWidth") == 0)
  439.     {
  440.         XfeResourceToggleBoolean(pane,XmNusePreferredWidth);
  441.     }
  442.     else if (strcmp(name,"UsePreferredHeight") == 0)
  443.     {
  444.         XfeResourceToggleBoolean(pane,XmNusePreferredHeight);
  445.     }
  446.     else if (strcmp(name,"ShadowIn") == 0)
  447.     {
  448.         XtSetArg(av[ac],XmNshadowType,XmSHADOW_IN); ac++;
  449.     }
  450.     else if (strcmp(name,"ShadowOut") == 0)
  451.     {
  452.         XtSetArg(av[ac],XmNshadowType,XmSHADOW_OUT); ac++;
  453.     }
  454.     else if (strcmp(name,"ShadowEtchedIn") == 0)
  455.     {
  456.         XtSetArg(av[ac],XmNshadowType,XmSHADOW_ETCHED_IN); ac++;
  457.     }
  458.     else if (strcmp(name,"ShadowEtchedOut") == 0)
  459.     {
  460.         XtSetArg(av[ac],XmNshadowType,XmSHADOW_ETCHED_OUT); ac++;
  461.     }
  462.     else if (strcmp(name,"AlignmentBeginning") == 0)
  463.     {
  464.         XtSetArg(av[ac],XmNlabelAlignment,XmALIGNMENT_BEGINNING); ac++;
  465.     }
  466.     else if (strcmp(name,"AlignmentCenter") == 0)
  467.     {
  468.         XtSetArg(av[ac],XmNlabelAlignment,XmALIGNMENT_CENTER); ac++;
  469.     }
  470.     else if (strcmp(name,"AlignmentEnd") == 0)
  471.     {
  472.         XtSetArg(av[ac],XmNlabelAlignment,XmALIGNMENT_END); ac++;
  473.     }
  474.  
  475.     if (strcmp(parent_name,"MarginLeft") == 0)
  476.     {
  477.         XtSetArg(av[ac],XmNmarginLeft,atoi(name)); ac++;
  478.     }
  479.     else if (strcmp(parent_name,"MarginRight") == 0)
  480.     {
  481.         XtSetArg(av[ac],XmNmarginRight,atoi(name)); ac++;
  482.     }
  483.     else if (strcmp(parent_name,"MarginTop") == 0)
  484.     {
  485.         XtSetArg(av[ac],XmNmarginTop,atoi(name)); ac++;
  486.     }
  487.     else if (strcmp(parent_name,"MarginBottom") == 0)
  488.     {
  489.         XtSetArg(av[ac],XmNmarginBottom,atoi(name)); ac++;
  490.     }
  491.     else if (strcmp(parent_name,"MarginAll") == 0)
  492.     {
  493.         XtSetArg(av[ac],XmNmarginLeft,atoi(name)); ac++;
  494.         XtSetArg(av[ac],XmNmarginRight,atoi(name)); ac++;
  495.         XtSetArg(av[ac],XmNmarginTop,atoi(name)); ac++;
  496.         XtSetArg(av[ac],XmNmarginBottom,atoi(name)); ac++;
  497.     }
  498.     else if (strcmp(parent_name,"Width") == 0)
  499.     {
  500.         XtSetArg(av[ac],XmNwidth,atoi(name)); ac++;
  501.     }
  502.     else if (strcmp(parent_name,"Height") == 0)
  503.     {
  504.         XtSetArg(av[ac],XmNheight,atoi(name)); ac++;
  505.     }
  506.     else if (strcmp(parent_name,"ShadowThickness") == 0)
  507.     {
  508.         XtSetArg(av[ac],XmNshadowThickness,atoi(name)); ac++;
  509.     }
  510.     else if (strcmp(parent_name,"SashOffset") == 0)
  511.     {
  512.         XtSetArg(av[ac],XmNsashOffset,atoi(name)); ac++;
  513.     }
  514.     else if (strcmp(parent_name,"SashSpacing") == 0)
  515.     {
  516.         XtSetArg(av[ac],XmNsashSpacing,atoi(name)); ac++;
  517.     }
  518.     else if (strcmp(parent_name,"SashThickness") == 0)
  519.     {
  520.         XtSetArg(av[ac],XmNsashThickness,atoi(name)); ac++;
  521.     }
  522.     else if (strcmp(parent_name,"SashShadowThickness") == 0)
  523.     {
  524.         XtSetArg(av[ac],XmNsashShadowThickness,atoi(name)); ac++;
  525.     }
  526.     else if (strcmp(parent_name,"HighlightThickness") == 0)
  527.     {
  528.         XtSetArg(av[ac],XmNhighlightThickness,atoi(name)); ac++;
  529.     }
  530.     else if (strcmp(parent_name,"RaiseBorderThickness") == 0)
  531.     {
  532.         XtSetArg(av[ac],XmNraiseBorderThickness,atoi(name)); ac++;
  533.     }
  534.     else if (strcmp(parent_name,"ArmOffset") == 0)
  535.     {
  536.         XtSetArg(av[ac],XmNarmOffset,atoi(name)); ac++;
  537.     }
  538.     else if (strcmp(name,"OrientationVertical") == 0)
  539.     {
  540.         XtSetArg(av[ac],XmNorientation,XmVERTICAL); ac++;
  541.     }
  542.     else if (strcmp(name,"OrientationHorizontal") == 0)
  543.     {
  544.         XtSetArg(av[ac],XmNorientation,XmHORIZONTAL); ac++;
  545.     }
  546.     else if (strcmp(parent_name,"Managing") == 0)
  547.     {
  548.         Widget child = XfeDescendantFindByName(pane,name,XfeFIND_ANY,False);
  549.  
  550.         if (XfeIsAlive(child))
  551.         {
  552.             XfeToggleManagedState(child);
  553.         }
  554.     }
  555.     else if (strcmp(parent_name,"SashPosition") == 0)
  556.     {
  557.         XtSetArg(av[ac],XmNsashPosition,atoi(name)); ac++;
  558.     }
  559.  
  560.     if (ac)
  561.     {
  562.         XtSetValues(pane,av,ac);
  563.     }
  564. }
  565. /*----------------------------------------------------------------------*/
  566. static void
  567. toggle_managed_cb(Widget w,XtPointer client_data,XtPointer call_data)
  568. {
  569.     Widget        pane = (Widget) client_data;
  570.  
  571.     if (XfeIsAlive(pane))
  572.     {
  573.         XfeToggleManagedState(pane);
  574.  
  575.         if (XfeIsArrow(w))
  576.         {
  577.             unsigned char arrow_direction;
  578.  
  579.             XtVaGetValues(w,XmNarrowDirection,&arrow_direction,NULL);
  580.  
  581.             if (arrow_direction == XmARROW_DOWN)
  582.             {
  583.                 arrow_direction = XmARROW_UP;
  584.             }
  585.             else if (arrow_direction == XmARROW_UP)
  586.             {
  587.                 arrow_direction = XmARROW_DOWN;
  588.             }
  589.             else if (arrow_direction == XmARROW_RIGHT)
  590.             {
  591.                 arrow_direction = XmARROW_LEFT;
  592.             }
  593.             else if (arrow_direction == XmARROW_LEFT)
  594.             {
  595.                 arrow_direction = XmARROW_RIGHT;
  596.             }
  597.  
  598.             XtVaSetValues(w,XmNarrowDirection,arrow_direction,NULL);
  599.         }
  600.     }
  601. }
  602. /*----------------------------------------------------------------------*/
  603. static Widget
  604. create_form_and_button(Widget            pw,
  605.                        unsigned char    child_type,
  606.                        unsigned char    child_attachment,
  607.                        Widget            target,
  608.                        String            form_name,
  609.                        String            button_name,
  610.                        Dimension        offset)
  611. {
  612.     Widget        form = NULL;
  613.     Widget        button = NULL;
  614.     Arg            av[20];
  615.     Cardinal    ac = 0;
  616.  
  617.     XtSetArg(av[ac],XmNpaneChildType,        child_type);        ac++;
  618.     XtSetArg(av[ac],XmNpaneChildAttachment,    child_attachment);    ac++;
  619.      XtSetArg(av[ac],XmNalwaysVisible,        True);                ac++;
  620.  
  621. #if 1
  622.  
  623.      form = XfeCreateFormAndButton(pw,form_name,button_name,offset,True,av,ac);
  624.  
  625.     button = XfeDescendantFindByName(form,button_name,XfeFIND_ANY,False);
  626.  
  627.     assert( XfeIsAlive(button) );
  628.  
  629.     XtAddCallback(button,XmNactivateCallback,toggle_managed_cb,target);
  630.  
  631. #else
  632.  
  633.      XtSetArg(av[ac],XmNwidth,                20);                ac++;
  634.      XtSetArg(av[ac],XmNheight,                20);                ac++;
  635.  
  636.     form = XtCreateManagedWidget(form_name,xmFormWidgetClass,pw,av,ac);
  637.  
  638. #endif
  639.  
  640.     return form;
  641. }
  642. /*----------------------------------------------------------------------*/
  643.  
  644. static Widget
  645. mail_create_pane(Widget pw,String name)
  646. {
  647.     Widget        mail_pane;
  648.     Widget        message_pane;
  649.     Widget        thread_form;
  650.     Widget        message_form;
  651.     Widget        folders_form;
  652.     Widget        main_tab;
  653.  
  654.     Widget        attachments_pane;
  655.     Widget        attachments_tool_bar;
  656.     Widget        attachments_form;
  657.     Widget        attachments_sw;
  658.  
  659.     Arg            av[20];
  660.     Cardinal    ac = 0;
  661.  
  662.     Widget        message_collapse_form;
  663.     Widget        message_collapse_arrow;
  664.     Widget        message_collapse_label;
  665.     Widget        folders_collapse_form;
  666.     Widget        folders_collapse_arrow;
  667.     Widget        folders_collapse_label;
  668.  
  669.     /* Main mail pane */
  670.     mail_pane = XtVaCreateManagedWidget(name,
  671.                                         xfePaneWidgetClass,
  672.                                         pw,
  673.                                         NULL);
  674.  
  675.     folders_form =  XtVaCreateManagedWidget("FoldersForm",
  676.                                             xmFormWidgetClass,
  677.                                             mail_pane,
  678.                                             NULL);
  679.  
  680.     /* Message pane */
  681.     message_pane = XtVaCreateManagedWidget("MessagePane",
  682.                                            xfePaneWidgetClass,
  683.                                            mail_pane,
  684.                                            NULL);
  685.     
  686.     thread_form =  XtVaCreateManagedWidget("ThreadForm",
  687.                                            xmFormWidgetClass,
  688.                                            message_pane,
  689.                                            NULL);
  690.  
  691.     /* Attachments pane */
  692.     attachments_pane = XtVaCreateManagedWidget("AttachmentsPane",
  693.                                                xfePaneWidgetClass,
  694.                                                message_pane,
  695.                                                NULL);
  696.  
  697.  
  698.     message_form =  XtVaCreateManagedWidget("MessageForm",
  699.                                             xmFormWidgetClass,
  700.                                             attachments_pane,
  701.                                             NULL);
  702.  
  703.     message_collapse_form = XtVaCreateManagedWidget("MessageCollapseForm",
  704.                                                     xmFormWidgetClass,
  705.                                                     message_pane,
  706.                                                     NULL);
  707.     
  708.     message_collapse_arrow = XtCreateManagedWidget("MessageCollapseArrow",
  709.                                                    xfeArrowWidgetClass,
  710.                                                    message_collapse_form,
  711.                                                    NULL,0);
  712.     
  713.     message_collapse_label = XtCreateManagedWidget("MessageCollapseLabel",
  714.                                                    xmLabelWidgetClass,
  715.                                                    message_collapse_form,
  716.                                                    NULL,0);
  717.  
  718.     /* Toggle the vertical attachments pane */
  719.     XtAddCallback(message_collapse_arrow,
  720.                   XmNactivateCallback,
  721.                   toggle_managed_cb,
  722.                   attachments_pane);
  723.  
  724.     /* Attachments form */
  725.     attachments_form =  XtVaCreateManagedWidget("AttachmentsForm",
  726.                                                 xmFormWidgetClass,
  727.                                                 attachments_pane,
  728.                                                 NULL);
  729.  
  730.     attachments_sw =  XtVaCreateManagedWidget("AttachmentsSW",
  731.                                               xmScrolledWindowWidgetClass,
  732.                                               attachments_form,
  733.                                               NULL);
  734.  
  735.     attachments_tool_bar = XfeCreateLoadedToolBar(attachments_sw,
  736.                                                   "AttachmentsToolBar",
  737.                                                   "Attach",
  738.                                                   14,
  739.                                                   4,
  740.                                                   NULL,
  741.                                                   NULL,
  742.                                                   NULL,
  743.                                                   NULL);
  744.  
  745.     /* Folders collapse form */
  746.     folders_collapse_form = XtVaCreateManagedWidget("FoldersCollapseForm",
  747.                                                     xmFormWidgetClass,
  748.                                                     mail_pane,
  749.                                                     NULL);
  750.     
  751.     folders_collapse_arrow = XtCreateManagedWidget("FoldersCollapseArrow",
  752.                                                    xfeArrowWidgetClass,
  753.                                                    folders_collapse_form,
  754.                                                    NULL,0);
  755.     
  756.     folders_collapse_label = XtCreateManagedWidget("FoldersCollapseLabel",
  757.                                                    xmLabelWidgetClass,
  758.                                                    folders_collapse_form,
  759.                                                    NULL,0);
  760.  
  761.     /* Toggle the main horizontal pane */
  762.     XtAddCallback(folders_collapse_arrow,
  763.                   XmNactivateCallback,
  764.                   toggle_managed_cb,
  765.                   folders_form);
  766.  
  767.     return mail_pane;
  768. }
  769. /*----------------------------------------------------------------------*/
  770. static Widget
  771. mail_create_frame(String frame_name)
  772. {
  773.     Widget    frame;
  774.     Widget    form;
  775.     Widget    menu;
  776.  
  777.     Widget    pane;
  778.  
  779.     Widget    one;
  780.     Widget    two;
  781.  
  782.     frame = XfeFrameCreate(frame_name,NULL,0);
  783.  
  784.     form = XfeDescendantFindByName(frame,"MainForm",XfeFIND_ANY,False);
  785.     
  786.     pane = mail_create_pane(form,"MailPane");
  787.  
  788.     return frame;
  789. }
  790. /*----------------------------------------------------------------------*/
  791.