home *** CD-ROM | disk | FTP | other *** search
/ Tools / WinSN5.0Ver.iso / NETSCAP.50 / WIN1998.ZIP / ns / cmd / xfe / src / Toolbox.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1998-04-08  |  13.0 KB  |  477 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:        Toolbox.cpp                                                */
  21. /* Description:    XFE_Toolbox component source.                            */
  22. /* Author:        Ramiro Estrugo <ramiro@netscape.com>                    */
  23. /*                                                                        */
  24. /*----------------------------------------------------------------------*/
  25.  
  26.  
  27.  
  28. #include "Toolbox.h"
  29. #include "IconGroup.h"
  30.  
  31. #include "ToolboxItem.h"
  32.  
  33. #include <Xfe/ToolBox.h>
  34.  
  35. #define BOTTOM_ICON        DTB_bottom_group
  36. #define HORIZONTAL_ICON DTB_horizontal_group
  37. #define LEFT_ICON        DTB_left_group
  38. #define RIGHT_ICON        DTB_right_group
  39. #define TOP_ICON        DTB_top_group
  40. #define VERTICAL_ICON    DTB_vertical_group
  41.  
  42. // Invoked when one of the toolbars is closed
  43. const char * XFE_Toolbox::toolbarClose = "XFE_Toolbox::toolbarClose";
  44.  
  45. // Invoked when one of the toolbars is opened
  46. const char * XFE_Toolbox::toolbarOpen = "XFE_Toolbox::toolbarOpen";
  47.  
  48. // Invoked when one of the toolbars is snapped
  49. const char * XFE_Toolbox::toolbarSnap = "XFE_Toolbox::toolbarSnap";
  50.  
  51. // Invoked when one of the toolbars is swapped
  52. const char * XFE_Toolbox::toolbarSwap = "XFE_Toolbox::toolbarSwap";
  53.  
  54. //////////////////////////////////////////////////////////////////////////
  55. XFE_Toolbox::XFE_Toolbox(XFE_Component *    top_level,
  56.                          Widget                parent)
  57.     : XFE_Component(top_level)
  58. {
  59.     m_toolbox = NULL;
  60.  
  61.     createMain(parent);
  62. }
  63. //////////////////////////////////////////////////////////////////////////
  64. XFE_Toolbox::~XFE_Toolbox()
  65. {
  66. }
  67. //////////////////////////////////////////////////////////////////////////
  68. Widget
  69. XFE_Toolbox::getToolBoxWidget()
  70. {
  71.     return m_toolbox;
  72. }
  73. //////////////////////////////////////////////////////////////////////////
  74. Widget
  75. XFE_Toolbox::getLogoWidget()
  76. {
  77.     // write me
  78.     return NULL;
  79. }
  80. //////////////////////////////////////////////////////////////////////////
  81. void
  82. XFE_Toolbox::addDragDescendant(Widget descendant)
  83. {
  84.     XP_ASSERT( XfeIsAlive(m_widget) );
  85.  
  86.     XfeToolBoxAddDragDescendant(m_widget,descendant);
  87. }
  88. //////////////////////////////////////////////////////////////////////////
  89. void
  90. XFE_Toolbox::removeDragDescendant(Widget descendant)
  91. {
  92.     XP_ASSERT( XfeIsAlive(m_widget) );
  93.  
  94.     XfeToolBoxRemoveDragDescendant(m_widget,descendant);
  95. }
  96. //////////////////////////////////////////////////////////////////////////
  97. void
  98. XFE_Toolbox::toggleItemState(Widget item)
  99. {
  100.     XP_ASSERT( XfeIsAlive(m_widget) );
  101.  
  102.     XfeToolBoxItemToggleOpen(m_widget,item);
  103. }
  104. //////////////////////////////////////////////////////////////////////////
  105. void
  106. XFE_Toolbox::setItemPosition(Widget item,int position)
  107. {
  108.     XP_ASSERT( XfeIsAlive(m_widget) );
  109.     XP_ASSERT( XfeIsAlive(item) );
  110.  
  111.     XfeToolBoxItemSetPosition(m_widget,item,position);
  112. }
  113. //////////////////////////////////////////////////////////////////////////
  114. void
  115. XFE_Toolbox::setItemOpen(Widget item,XP_Bool open)
  116. {
  117.     XP_ASSERT( XfeIsAlive(m_widget) );
  118.     XP_ASSERT( XfeIsAlive(item) );
  119.  
  120.     XfeToolBoxItemSetOpen(m_widget,item,open);
  121. }
  122. //////////////////////////////////////////////////////////////////////////
  123. XP_Bool
  124. XFE_Toolbox::stateOfItem(Widget item)
  125. {
  126.     XP_ASSERT( XfeIsAlive(m_widget) );
  127.     XP_ASSERT( XfeIsAlive(item) );
  128.  
  129.     return (XP_Bool) XfeToolBoxItemGetOpen(m_widget,item);
  130. }
  131. //////////////////////////////////////////////////////////////////////////
  132. int
  133. XFE_Toolbox::positionOfItem(Widget item)
  134. {
  135.     XP_ASSERT( XfeIsAlive(m_widget) );
  136.     XP_ASSERT( XfeIsAlive(item) );
  137.  
  138. //    return XfeToolBoxItemGetPosition(m_widget,item);
  139.     return XfeToolBoxItemGetIndex(m_widget,item);
  140. }
  141. //////////////////////////////////////////////////////////////////////////
  142. Widget
  143. XFE_Toolbox::tabOfItem(Widget item,XP_Bool opened)
  144. {
  145.     XP_ASSERT( XfeIsAlive(m_widget) );
  146.     XP_ASSERT( XfeIsAlive(item) );
  147.  
  148.     return XfeToolBoxItemGetTab(m_widget,item,(Boolean) opened);
  149. }
  150. //////////////////////////////////////////////////////////////////////////
  151.  
  152.  
  153. //////////////////////////////////////////////////////////////////////////
  154. //
  155. // Item methods
  156. //
  157. //////////////////////////////////////////////////////////////////////////
  158. Cardinal
  159. XFE_Toolbox::getNumItems()
  160. {
  161.     XP_ASSERT( XfeIsAlive(m_widget) );
  162.  
  163.     Cardinal        item_count;
  164.  
  165.     XtVaGetValues(m_widget,XmNitemCount,&item_count,NULL);
  166.  
  167.     return item_count;
  168. }
  169. //////////////////////////////////////////////////////////////////////////
  170. WidgetList
  171. XFE_Toolbox::getItems()
  172. {
  173.     XP_ASSERT( XfeIsAlive(m_widget) );
  174.  
  175.     WidgetList        items;
  176.     
  177.     XtVaGetValues(m_widget,XmNitems,&items,NULL);
  178.  
  179.     return items;
  180. }
  181. //////////////////////////////////////////////////////////////////////////
  182. XFE_ToolboxItem *    
  183. XFE_Toolbox::getItemAtIndex(Cardinal index)
  184. {
  185.     XP_ASSERT( XfeIsAlive(m_widget) );
  186.     XP_ASSERT( index < getNumItems() );
  187.  
  188.     XP_ASSERT( XfeIsAlive(m_widget) );
  189.  
  190.     Widget item = XfeToolBoxItemGetByIndex(m_widget,index);
  191.  
  192.     XP_ASSERT( XfeIsAlive(item) );
  193.  
  194.     return (XFE_ToolboxItem *) XfeUserData(item);
  195. }
  196. //////////////////////////////////////////////////////////////////////////
  197. XFE_ToolboxItem *
  198. XFE_Toolbox::firstOpenItem()
  199. {
  200.     XP_ASSERT( XfeIsAlive(m_widget) );
  201.  
  202.     Cardinal    num_items = getNumItems();
  203.     Cardinal    i;
  204.  
  205.     // Make sure toolbox has items
  206.     if (!num_items)
  207.     {
  208.         return NULL;
  209.     }
  210.  
  211.     for (i = 0; i < num_items; i++)
  212.     {
  213.         Widget item = XfeToolBoxItemGetByIndex(m_widget,i);
  214.  
  215.         if (XfeIsAlive(item) && XfeToolBoxItemGetOpen(m_widget,item))
  216.         {
  217.             return (XFE_ToolboxItem *) XfeUserData(item);
  218.         }
  219.     }
  220.  
  221.     return NULL;
  222. }
  223. //////////////////////////////////////////////////////////////////////////
  224. XFE_ToolboxItem *
  225. XFE_Toolbox::firstManagedItem()
  226. {
  227.     XP_ASSERT( XfeIsAlive(m_widget) );
  228.  
  229.     Cardinal    num_items = getNumItems();
  230.     Cardinal    i;
  231.  
  232.     // Make sure toolbox has items
  233.     if (!num_items)
  234.     {
  235.         return NULL;
  236.     }
  237.  
  238.     for (i = 0; i < num_items; i++)
  239.     {
  240.         Widget item = XfeToolBoxItemGetByIndex(m_widget,i);
  241.  
  242.         if (XfeIsAlive(item) && XtIsManaged(item))
  243.         {
  244.             return (XFE_ToolboxItem *) XfeUserData(item);
  245.         }
  246.     }
  247.  
  248.     return NULL;
  249. }
  250. //////////////////////////////////////////////////////////////////////////
  251. XFE_ToolboxItem *
  252. XFE_Toolbox::firstOpenAndManagedItem()
  253. {
  254.     XP_ASSERT( XfeIsAlive(m_widget) );
  255.  
  256.     Cardinal    num_items = getNumItems();
  257.     Cardinal    i;
  258.  
  259.     // Make sure toolbox has items
  260.     if (!num_items)
  261.     {
  262.         return NULL;
  263.     }
  264.  
  265.     for (i = 0; i < num_items; i++)
  266.     {
  267.         Widget item = XfeToolBoxItemGetByIndex(m_widget,i);
  268.  
  269.         if (XfeIsAlive(item) && XtIsManaged(item) &&
  270.             XfeToolBoxItemGetOpen(m_widget,item))
  271.         {
  272.             return (XFE_ToolboxItem *) XfeUserData(item);
  273.         }
  274.     }
  275.  
  276.     return NULL;
  277. }
  278. //////////////////////////////////////////////////////////////////////////
  279. void
  280. XFE_Toolbox::createMain(Widget parent)
  281. {
  282.     XP_ASSERT( XfeIsAlive(parent) );
  283.  
  284.     // The main frame
  285.     m_widget = XtVaCreateWidget("toolBox",
  286.                                 xfeToolBoxWidgetClass,
  287.                                 parent,
  288.                                 XmNusePreferredWidth,        False,
  289. //                                XmNusePreferredHeight,        True,
  290.                                 XmNusePreferredHeight,        False,
  291.                                 XmNheight,                    200,
  292.                                 NULL);
  293.  
  294.     // Create all the tab icons
  295.     Pixel    fg = XfeForeground(m_widget);
  296.     Pixel    bg = XfeBackground(m_widget);
  297.     Widget    shell = XfeAncestorFindByClass(parent,
  298.                                            shellWidgetClass,
  299.                                            XfeFIND_ANY);
  300.  
  301.     IconGroup_createAllIcons(&BOTTOM_ICON,shell,fg,bg);
  302.     IconGroup_createAllIcons(&HORIZONTAL_ICON,shell,fg,bg);
  303.     IconGroup_createAllIcons(&LEFT_ICON,shell,fg,bg);
  304.     IconGroup_createAllIcons(&RIGHT_ICON,shell,fg,bg);
  305.     IconGroup_createAllIcons(&TOP_ICON,shell,fg,bg);
  306.     IconGroup_createAllIcons(&VERTICAL_ICON,shell,fg,bg);
  307.  
  308.     XtVaSetValues(
  309.         m_widget,
  310.         XmNbottomPixmap,            BOTTOM_ICON.pixmap_icon.pixmap,
  311.         XmNbottomRaisedPixmap,        BOTTOM_ICON.pixmap_mo_icon.pixmap,
  312.         XmNtopPixmap,                TOP_ICON.pixmap_icon.pixmap,
  313.         XmNtopRaisedPixmap,            TOP_ICON.pixmap_mo_icon.pixmap,
  314.         XmNleftPixmap,                LEFT_ICON.pixmap_icon.pixmap,
  315.         XmNleftRaisedPixmap,        LEFT_ICON.pixmap_mo_icon.pixmap,
  316.         XmNrightPixmap,                RIGHT_ICON.pixmap_icon.pixmap,
  317.         XmNrightRaisedPixmap,        RIGHT_ICON.pixmap_mo_icon.pixmap,
  318.         XmNverticalPixmap,            VERTICAL_ICON.pixmap_icon.pixmap,
  319.         XmNverticalRaisedPixmap,     VERTICAL_ICON.pixmap_mo_icon.pixmap,
  320.         XmNhorizontalPixmap,        HORIZONTAL_ICON.pixmap_icon.pixmap,
  321.         XmNhorizontalRaisedPixmap,    HORIZONTAL_ICON.pixmap_mo_icon.pixmap,
  322.         NULL);
  323.  
  324. #if notyet
  325.     // Set the hand cursor
  326.     Cursor hand_cursor = XfeCursorGetDragHand(parent);
  327.  
  328.     if (hand_cursor != None)
  329.     {
  330.         XtVaSetValues(m_widget,XmNdragCursor,hand_cursor,NULL);
  331.     }
  332. #endif
  333.  
  334.     // Add new item callback
  335.     XtAddCallback(m_widget,
  336.                   XmNnewItemCallback,
  337.                   &XFE_Toolbox::newItemCallback,
  338.                   (XtPointer) this);
  339.  
  340.     // Add swap callback
  341.     XtAddCallback(m_widget,
  342.                   XmNswapCallback,
  343.                   &XFE_Toolbox::swapCallback,
  344.                   (XtPointer) this);
  345.  
  346.  
  347.     // Add snap callback
  348.     XtAddCallback(m_widget,
  349.                   XmNsnapCallback,
  350.                   &XFE_Toolbox::snapCallback,
  351.                   (XtPointer) this);
  352.  
  353.     // Add close callback
  354.     XtAddCallback(m_widget,
  355.                   XmNcloseCallback,
  356.                   &XFE_Toolbox::closeCallback,
  357.                   (XtPointer) this);
  358.  
  359.     // Add open callback
  360.     XtAddCallback(m_widget,
  361.                   XmNopenCallback,
  362.                   &XFE_Toolbox::openCallback,
  363.                   (XtPointer) this);
  364.  
  365.  
  366.     installDestroyHandler();
  367. }
  368. //////////////////////////////////////////////////////////////////////////
  369.  
  370. //
  371. // Returns True if the toolbox is needed.  The toolbox is only needed if 
  372. // at least 1 item is managed or 1 tab is managed.
  373. //
  374. //////////////////////////////////////////////////////////////////////////
  375. XP_Bool
  376. XFE_Toolbox::isNeeded()
  377. {
  378.     XP_ASSERT( XfeIsAlive(m_widget) );
  379.  
  380.     return XfeToolBoxIsNeeded(m_widget);
  381. }
  382. //////////////////////////////////////////////////////////////////////////
  383. /* static */ void
  384. XFE_Toolbox::newItemCallback(Widget        /* w */,
  385.                              XtPointer    clientData,
  386.                              XtPointer    callData)
  387. {
  388.     XFE_Toolbox *                tb = (XFE_Toolbox *) clientData;
  389.     XfeToolBoxCallbackStruct *    cbs = (XfeToolBoxCallbackStruct *) callData;
  390.  
  391.     XP_ASSERT( tb != NULL );
  392.  
  393.     // Add a tool tip to the tab
  394.     fe_WidgetAddToolTips(cbs->closed_tab);
  395.     fe_WidgetAddToolTips(cbs->opened_tab);
  396. }
  397. //////////////////////////////////////////////////////////////////////////
  398. /* static */ void
  399. XFE_Toolbox::closeCallback(Widget        /* w */,
  400.                            XtPointer    clientData,
  401.                            XtPointer    callData)
  402. {
  403.     XFE_Toolbox *                tb = (XFE_Toolbox *) clientData;
  404.  
  405.     XP_ASSERT( tb != NULL );
  406.  
  407.     XfeToolBoxCallbackStruct *    cbs = (XfeToolBoxCallbackStruct *) callData;
  408.  
  409.     XP_ASSERT( cbs != NULL );
  410.  
  411.     XFE_ToolboxItem *        item = tb->getItemAtIndex(cbs->index);
  412.  
  413.     XP_ASSERT( item != NULL );
  414.  
  415.     // Send a message that will perform an action.
  416.     tb->notifyInterested(XFE_Toolbox::toolbarClose,(void *) item);
  417. }
  418. //////////////////////////////////////////////////////////////////////////
  419. /* static */ void
  420. XFE_Toolbox::openCallback(Widget        /* w */,
  421.                           XtPointer        clientData,
  422.                           XtPointer        callData)
  423. {
  424.     XFE_Toolbox *                tb = (XFE_Toolbox *) clientData;
  425.  
  426.     XP_ASSERT( tb != NULL );
  427.  
  428.     XfeToolBoxCallbackStruct *    cbs = (XfeToolBoxCallbackStruct *) callData;
  429.  
  430.     XP_ASSERT( cbs != NULL );
  431.  
  432.     XFE_ToolboxItem *        item = tb->getItemAtIndex(cbs->index);
  433.  
  434.     XP_ASSERT( item != NULL );
  435.  
  436.     // Send a message that will perform an action.
  437.     tb->notifyInterested(XFE_Toolbox::toolbarOpen,(void *) item);
  438. }
  439. //////////////////////////////////////////////////////////////////////////
  440. /* static */ void
  441. XFE_Toolbox::swapCallback(Widget    /* w */,
  442.                           XtPointer clientData,
  443.                           XtPointer    callData)
  444. {
  445.     XFE_Toolbox *                    tb = (XFE_Toolbox *) clientData;
  446.     
  447.     XfeToolBoxSwapCallbackStruct *    cbs = 
  448.         (XfeToolBoxSwapCallbackStruct *) callData;
  449.  
  450.     XFE_ToolboxItem *        item = 
  451.         (XFE_ToolboxItem *) XfeUserData(cbs->swapped);
  452.  
  453.     XP_ASSERT( item != NULL );
  454.  
  455.     // Send a message that will perform an action.
  456.     tb->notifyInterested(XFE_Toolbox::toolbarSwap,(void *) item);
  457. }
  458. //////////////////////////////////////////////////////////////////////////
  459. /* static */ void
  460. XFE_Toolbox::snapCallback(Widget    /* w */,
  461.                           XtPointer clientData,
  462.                           XtPointer    callData)
  463. {
  464.     XFE_Toolbox *                tb = (XFE_Toolbox *) clientData;
  465.  
  466.     XfeToolBoxCallbackStruct *    cbs = (XfeToolBoxCallbackStruct *) callData;
  467.  
  468.     XFE_ToolboxItem *        item = 
  469.         (XFE_ToolboxItem *) XfeUserData(cbs->item);
  470.  
  471.     XP_ASSERT( item != NULL );
  472.  
  473.     // Send a message that will perform an action.
  474.     tb->notifyInterested(XFE_Toolbox::toolbarSnap,(void *) item);
  475. }
  476. //////////////////////////////////////////////////////////////////////////
  477.