home *** CD-ROM | disk | FTP | other *** search
/ Tools / WinSN5.0Ver.iso / NETSCAP.50 / WIN1998.ZIP / ns / cmd / xfe / XfeWidgets / Xfe / ToolItem.c < prev    next >
Encoding:
C/C++ Source or Header  |  1998-04-08  |  12.4 KB  |  405 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:        <Xfe/ToolItem.c>                                        */
  21. /* Description:    XfeToolItem widget source.                                */
  22. /* Author:        Ramiro Estrugo <ramiro@netscape.com>                    */
  23. /*                                                                        */
  24. /*----------------------------------------------------------------------*/
  25.  
  26.  
  27. #include <Xfe/ToolItemP.h>
  28.  
  29. #include <Xm/Label.h>
  30. #include <Xm/PushB.h>
  31. #include <Xfe/Label.h>
  32. #include <Xfe/Button.h>
  33.  
  34. #define MESSAGE1 "Widget is not an XfeToolItem."
  35. #define MESSAGE2 "XmNitem is a read-only resource."
  36. #define MESSAGE3 "XmNlogo is a read-only resource."
  37.  
  38. /*----------------------------------------------------------------------*/
  39. /*                                                                        */
  40. /* Core class methods                                                    */
  41. /*                                                                        */
  42. /*----------------------------------------------------------------------*/
  43. static void     Initialize        (Widget,Widget,ArgList,Cardinal *);
  44. static void     Destroy            (Widget);
  45. static Boolean    SetValues        (Widget,Widget,Widget,ArgList,Cardinal *);
  46.  
  47. /*----------------------------------------------------------------------*/
  48. /*                                                                        */
  49. /* XfeManager class methods                                                */
  50. /*                                                                        */
  51. /*----------------------------------------------------------------------*/
  52. static void        PreferredGeometry    (Widget,Dimension *,Dimension *);
  53. static void        LayoutComponents    (Widget);
  54. static Boolean    AcceptChild            (Widget);
  55. static Boolean    DeleteChild            (Widget);
  56. static Boolean    InsertChild            (Widget);
  57.  
  58. /*----------------------------------------------------------------------*/
  59. /*                                                                        */
  60. /* XfeToolItem Resources                                                */
  61. /*                                                                        */
  62. /*----------------------------------------------------------------------*/
  63. static XtResource resources[] =     
  64. {                    
  65.     /* Components */
  66.     { 
  67.         XmNlogo,
  68.         XmCReadOnly,
  69.         XmRWidget,
  70.         sizeof(Widget),
  71.         XtOffsetOf(XfeToolItemRec , xfe_tool_item . logo),
  72.         XmRImmediate, 
  73.         (XtPointer) NULL
  74.     },
  75.     { 
  76.         XmNitem,
  77.         XmCReadOnly,
  78.         XmRWidget,
  79.         sizeof(Widget),
  80.         XtOffsetOf(XfeToolItemRec , xfe_tool_item . item),
  81.         XmRImmediate, 
  82.         (XtPointer) NULL
  83.     },
  84.     { 
  85.         XmNspacing,
  86.         XmCSpacing,
  87.         XmRHorizontalDimension,
  88.         sizeof(Dimension),
  89.         XtOffsetOf(XfeToolItemRec , xfe_tool_item . spacing),
  90.         XmRImmediate, 
  91.         (XtPointer) 2
  92.     },
  93. };   
  94.  
  95. /*----------------------------------------------------------------------*/
  96. /*                                                                        */
  97. /* XfeToolItem Synthetic Resources                                        */
  98. /*                                                                        */
  99. /*----------------------------------------------------------------------*/
  100. static XmSyntheticResource syn_resources[] =
  101. {
  102.    { 
  103.        XmNspacing,
  104.        sizeof(Dimension),
  105.        XtOffsetOf(XfeToolItemRec , xfe_tool_item . spacing),
  106.        _XmFromHorizontalPixels,
  107.        _XmToHorizontalPixels 
  108.    },
  109. };
  110.  
  111. /*----------------------------------------------------------------------*/
  112. /*                                                                        */
  113. /* Widget Class Record Initialization                                   */
  114. /*                                                                        */
  115. /*----------------------------------------------------------------------*/
  116. _XFE_WIDGET_CLASS_RECORD(toolitem,ToolItem) =
  117. {
  118.     {
  119.         (WidgetClass) &xfeManagerClassRec,        /* superclass           */
  120.         "XfeToolItem",                            /* class_name           */
  121.         sizeof(XfeToolItemRec),                    /* widget_size          */
  122.         NULL,                                    /* class_initialize     */
  123.         NULL,                                    /* class_part_initialize*/
  124.         FALSE,                                  /* class_inited         */
  125.         Initialize,                             /* initialize           */
  126.         NULL,                                   /* initialize_hook      */
  127.         XtInheritRealize,                        /* realize              */
  128.         NULL,                                    /* actions              */
  129.         0,                                        /* num_actions            */
  130.         resources,                              /* resources            */
  131.         XtNumber(resources),                    /* num_resources        */
  132.         NULLQUARK,                              /* xrm_class            */
  133.         TRUE,                                   /* compress_motion      */
  134.         XtExposeCompressMaximal,                /* compress_exposure    */
  135.         TRUE,                                   /* compress_enterleave    */
  136.         FALSE,                                  /* visible_interest     */
  137.         Destroy,                                /* destroy              */
  138.         XtInheritResize,                        /* resize               */
  139.         XtInheritExpose,                        /* expose               */
  140.         SetValues,                              /* set_values           */
  141.         NULL,                                   /* set_values_hook      */
  142.         XtInheritSetValuesAlmost,                /* set_values_almost    */
  143.         NULL,                                    /* get_values_hook      */
  144.         NULL,                                   /* accexfe_focus         */
  145.         XtVersion,                              /* version              */
  146.         NULL,                                   /* callback_private     */
  147.         XtInheritTranslations,                    /* tm_table                */
  148.         XtInheritQueryGeometry,                    /* query_geometry       */
  149.         XtInheritDisplayAccelerator,            /* display accel        */
  150.         NULL,                                   /* extension            */
  151.     },
  152.  
  153.     /* Composite Part */
  154.     {
  155.         XtInheritGeometryManager,                /* geometry_manager        */
  156.         XtInheritChangeManaged,                    /* change_managed        */
  157.         XtInheritInsertChild,                    /* insert_child            */
  158.         XtInheritDeleteChild,                    /* delete_child            */
  159.         NULL                                    /* extension            */
  160.     },
  161.  
  162.     /* Constraint Part */
  163.     {
  164.         NULL,                                    /* resource list           */
  165.         0,                                        /* num resources           */
  166.         sizeof(XfeManagerConstraintRec),        /* constraint size         */
  167.         NULL,                                    /* init proc               */
  168.         NULL,                                   /* destroy proc            */
  169.         NULL,                                    /* set values proc         */
  170.         NULL,                                   /* extension               */
  171.     },
  172.  
  173.     /* XmManager Part */
  174.     {
  175.         XtInheritTranslations,                    /* tm_table                */
  176.         syn_resources,                            /* syn resources           */
  177.         XtNumber(syn_resources),                /* num syn_resources       */
  178.         NULL,                                   /* syn_cont_resources      */
  179.         0,                                      /* num_syn_cont_resource*/
  180.         XmInheritParentProcess,                 /* parent_process          */
  181.         NULL,                                   /* extension               */
  182.     },
  183.  
  184.     /* XfeManager Part     */
  185.     {
  186.         XfeInheritBitGravity,                    /* bit_gravity            */
  187.         PreferredGeometry,                        /* preferred_geometry    */
  188.         XfeInheritMinimumGeometry,                /* minimum_geometry        */
  189.         XfeInheritUpdateRect,                    /* update_rect            */
  190.         AcceptChild,                            /* accept_child            */
  191.         InsertChild,                            /* insert_child            */
  192.         DeleteChild,                            /* delete_child            */
  193.         NULL,                                    /* change_managed        */
  194.         NULL,                                    /* prepare_components    */
  195.         LayoutComponents,                        /* layout_components    */
  196.         NULL,                                    /* layout_children        */
  197.         NULL,                                    /* draw_background        */
  198.         XfeInheritDrawShadow,                    /* draw_shadow            */
  199.         NULL,                                    /* draw_components        */
  200.         NULL,                                    /* extension              */
  201.     },
  202.  
  203.     /* XfeToolItem Part */
  204.     {
  205.         NULL,                                    /* extension              */
  206.     },
  207. };
  208.  
  209. /*----------------------------------------------------------------------*/
  210. /*                                                                        */
  211. /* xfeToolItemWidgetClass declaration.                                    */
  212. /*                                                                        */
  213. /*----------------------------------------------------------------------*/
  214. _XFE_WIDGET_CLASS(toolitem,ToolItem);
  215.  
  216. /*----------------------------------------------------------------------*/
  217. /*                                                                        */
  218. /* Core class methods                                                    */
  219. /*                                                                        */
  220. /*----------------------------------------------------------------------*/
  221. static void
  222. Initialize(Widget rw,Widget nw,ArgList args,Cardinal *nargs)
  223. {
  224.     /* Finish of initialization */
  225.     _XfeManagerChainInitialize(rw,nw,xfeToolItemWidgetClass);
  226. }
  227. /*----------------------------------------------------------------------*/
  228. static void
  229. Destroy(Widget w)
  230. {
  231. }
  232. /*----------------------------------------------------------------------*/
  233. static Boolean
  234. SetValues(Widget ow,Widget rw,Widget nw,ArgList args,Cardinal *nargs)
  235. {
  236.     XfeToolItemPart *        np = _XfeToolItemPart(nw);
  237.     XfeToolItemPart *        op = _XfeToolItemPart(ow);
  238.  
  239.     /* item */
  240.     if (np->item != op->item)
  241.     {
  242.         _XfeWarning(nw,MESSAGE2);
  243.         np->item = op->item;
  244.     }
  245.  
  246.     /* logo */
  247.     if (np->logo != op->logo)
  248.     {
  249.         _XfeWarning(nw,MESSAGE3);
  250.         np->logo = op->logo;
  251.     }
  252.  
  253.     if (np->spacing != op->spacing)
  254.     {
  255.         _XfemConfigFlags(nw) |= XfeConfigGLE;
  256.     }
  257.  
  258.     return _XfeManagerChainSetValues(ow,rw,nw,xfeToolItemWidgetClass);
  259. }
  260. /*----------------------------------------------------------------------*/
  261.  
  262. /*----------------------------------------------------------------------*/
  263. /*                                                                        */
  264. /* XfeManager class methods                                                */
  265. /*                                                                        */
  266. /*----------------------------------------------------------------------*/
  267. static void
  268. PreferredGeometry(Widget w,Dimension * width,Dimension * height)
  269. {
  270.     XfeToolItemPart *    tp = _XfeToolItemPart(w);
  271.  
  272.     *width  = _XfemOffsetLeft(w) + _XfemOffsetRight(w);
  273.     *height = _XfemOffsetTop(w) + _XfemOffsetBottom(w);
  274.  
  275.     if (_XfeChildIsShown(tp->item))
  276.     {
  277.         *height += _XfeHeight(tp->item);
  278.         *width  += _XfeWidth(tp->item);
  279.     }
  280.  
  281.     if (_XfeChildIsShown(tp->logo))
  282.     {
  283.         *width  += (_XfeWidth(tp->logo) + tp->spacing);
  284.     }
  285. }
  286. /*----------------------------------------------------------------------*/
  287. static void
  288. LayoutComponents(Widget w)
  289. {
  290.     XfeToolItemPart *    tp = _XfeToolItemPart(w);
  291.  
  292.     /* Configure the logo if needed */
  293.     if (_XfeChildIsShown(tp->logo))
  294.     {
  295.         /* Place the logo on the far right */
  296.         _XfeConfigureWidget(tp->logo,
  297.                             
  298.                             _XfeWidth(w) - 
  299.                             _XfemOffsetRight(w) -
  300.                             _XfeWidth(tp->logo),
  301.                             
  302.                             (_XfeHeight(w) - _XfeHeight(tp->logo)) / 2,
  303.                             
  304.                             _XfeWidth(tp->logo),
  305.                             
  306.                             _XfeHeight(tp->logo));
  307.     }
  308.  
  309.     /* Configure the tool bar */
  310.     if (_XfeChildIsShown(tp->item))
  311.     {
  312.         Dimension width = _XfemRectWidth(w);
  313.  
  314.         if (_XfeChildIsShown(tp->logo))
  315.         {
  316.             width -= (_XfeWidth(tp->logo) + tp->spacing);
  317.         }
  318.  
  319.         /* Place the logo on the far left and use all the space available */
  320.         _XfeConfigureWidget(tp->item,
  321.                             
  322.                             _XfemOffsetLeft(w),
  323.  
  324.                             (_XfeHeight(w) - XfeHeight(tp->item)) / 2,
  325.                             
  326.                              width,
  327.  
  328.                             _XfeHeight(tp->item));
  329.     }        
  330. }
  331. /*----------------------------------------------------------------------*/
  332. static Boolean
  333. AcceptChild(Widget child)
  334. {
  335.     Widget                    w = XtParent(child);
  336.     XfeToolItemPart *        tp = _XfeToolItemPart(w);
  337.     Boolean                    accept = False;
  338.  
  339.     /* logo */
  340.     if (XfeIsLogo(child))
  341.     {
  342.         accept = !tp->logo;
  343.     }
  344.     /* Item */
  345.     else
  346.     {
  347.         accept = !tp->item;
  348.     }
  349.  
  350.     return accept;
  351. }
  352. /*----------------------------------------------------------------------*/
  353. static Boolean
  354. InsertChild(Widget child)
  355. {
  356.     Widget                    w = XtParent(child);
  357.     XfeToolItemPart *        tp = _XfeToolItemPart(w);
  358.  
  359.     /* Logo for logo */
  360.     if (XfeIsLogo(child))
  361.     {
  362.         tp->logo = child;
  363.     }
  364.     /* Item */
  365.     else
  366.     {
  367.         tp->item = child;
  368.     }
  369.  
  370.     return True;
  371. }
  372. /*----------------------------------------------------------------------*/
  373. static Boolean
  374. DeleteChild(Widget child)
  375. {
  376.     Widget                    w = XtParent(child);
  377.     XfeToolItemPart *        tp = _XfeToolItemPart(w);
  378.  
  379.     /* Logo */
  380.     if (child == tp->logo)
  381.     {
  382.         tp->logo = NULL;
  383.     }
  384.     /* Item */
  385.     else if (child == tp->item)
  386.     {
  387.         tp->item = NULL;
  388.     }
  389.  
  390.     return True;
  391. }
  392. /*----------------------------------------------------------------------*/
  393.  
  394. /*----------------------------------------------------------------------*/
  395. /*                                                                        */
  396. /* XfeToolItem Public Methods                                            */
  397. /*                                                                        */
  398. /*----------------------------------------------------------------------*/
  399. /* extern*/ Widget
  400. XfeCreateToolItem(Widget pw,char * name,Arg * av,Cardinal ac)
  401. {
  402.    return XtCreateWidget(name,xfeToolItemWidgetClass,pw,av,ac);
  403. }
  404. /*----------------------------------------------------------------------*/
  405.