Blame lib/Xm/TabList.c

Packit b099d7
/*
Packit b099d7
 * Motif
Packit b099d7
 *
Packit b099d7
 * Copyright (c) 1987-2012, The Open Group. All rights reserved.
Packit b099d7
 *
Packit b099d7
 * These libraries and programs are free software; you can
Packit b099d7
 * redistribute them and/or modify them under the terms of the GNU
Packit b099d7
 * Lesser General Public License as published by the Free Software
Packit b099d7
 * Foundation; either version 2 of the License, or (at your option)
Packit b099d7
 * any later version.
Packit b099d7
 *
Packit b099d7
 * These libraries and programs are distributed in the hope that
Packit b099d7
 * they will be useful, but WITHOUT ANY WARRANTY; without even the
Packit b099d7
 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
Packit b099d7
 * PURPOSE. See the GNU Lesser General Public License for more
Packit b099d7
 * details.
Packit b099d7
 *
Packit b099d7
 * You should have received a copy of the GNU Lesser General Public
Packit b099d7
 * License along with these librararies and programs; if not, write
Packit b099d7
 * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
Packit b099d7
 * Floor, Boston, MA 02110-1301 USA
Packit b099d7
 * 
Packit b099d7
 */
Packit b099d7
Packit b099d7
#include <Xm/Xm.h>
Packit b099d7
#include <Xm/Ext.h>
Packit b099d7
#include <Xm/TabList.h>
Packit b099d7
Packit b099d7
typedef struct _XmTabbedStackListRec {
Packit b099d7
    int    allocated;
Packit b099d7
    int    used;
Packit b099d7
    XmTabAttributes tabs;
Packit b099d7
} XmTabbedStackListRec;
Packit b099d7
Packit b099d7
#define XmLIST_GROWTH_FACTOR 10
Packit b099d7
#define XiXmStringCopy(s) (((s) == (XmString)NULL) ? NULL : XmStringCopy(s))
Packit b099d7
#define XiXmStringCompare(s1,s2) (((s1) == (s2)) ? True \
Packit b099d7
				  : ((s1) != NULL && (s2) != NULL) \
Packit b099d7
				  ? XmStringCompare(s1,s2) : False)
Packit b099d7
#define XiXmStringFree(s) if((s)!=(XmString)NULL)XmStringFree(s);else(s)=NULL
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Function:
Packit b099d7
 *      TabListCreate(void)
Packit b099d7
 * Description:
Packit b099d7
 *      Allocates and initializes an empty XmTabbedStackList structure and returns
Packit b099d7
 *      a pointer to the structure.
Packit b099d7
 * Input:
Packit b099d7
 *      None.
Packit b099d7
 * Output:
Packit b099d7
 *      XmTabbedStackList - an empty allocated XiTablist
Packit b099d7
 */
Packit b099d7
XmTabbedStackList
Packit b099d7
#ifndef _NO_PROTO
Packit b099d7
XmTabbedStackListCreate(void)
Packit b099d7
#else
Packit b099d7
XmTabbedStackListCreate()
Packit b099d7
#endif
Packit b099d7
{
Packit b099d7
    XmTabbedStackList tabList;
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Allocate the structure and zero it.  Then give it back to the
Packit b099d7
     * caller.
Packit b099d7
     */
Packit b099d7
    tabList = (XmTabbedStackList) XtMalloc(sizeof(XmTabbedStackListRec));
Packit b099d7
    tabList->allocated = tabList->used = 0;
Packit b099d7
    tabList->tabs = (XmTabAttributes) NULL;
Packit b099d7
Packit b099d7
    return( tabList );
Packit b099d7
}
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Function:
Packit b099d7
 *      XmTabbedStackListCopy(tab_list)
Packit b099d7
 * Description:
Packit b099d7
 *      This makes a copy of the given XmTabbedStackList and returns the
Packit b099d7
 *      copy.
Packit b099d7
 * Input:
Packit b099d7
 *      tab_list : XmTabbedStackList - the XmTabbedStackList to copy
Packit b099d7
 * Output:
Packit b099d7
 *      XmTabbedStackList - the copy of the given list
Packit b099d7
 */
Packit b099d7
XmTabbedStackList
Packit b099d7
#ifndef _NO_PROTO
Packit b099d7
XmTabbedStackListCopy(XmTabbedStackList tab_list)
Packit b099d7
#else
Packit b099d7
XmTabbedStackListCopy(tab_list)
Packit b099d7
    XmTabbedStackList tab_list;
Packit b099d7
#endif
Packit b099d7
{
Packit b099d7
    XmTabbedStackList newList;
Packit b099d7
    int       i;
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * First if they gave us nothing, then lets return nothing to
Packit b099d7
     * them.
Packit b099d7
     */
Packit b099d7
    if( tab_list == NULL ) return( NULL );
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Now allocate the new structure and set its allocated and used
Packit b099d7
     * to the number of items we need.
Packit b099d7
     */
Packit b099d7
    newList = (XmTabbedStackList) XtMalloc(sizeof(XmTabbedStackListRec));
Packit b099d7
    newList->allocated = newList->used = tab_list->used;
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Now check if we have any items and if not just zero the
Packit b099d7
     * data, else we will have to copy item by item.
Packit b099d7
     */
Packit b099d7
    if( newList->used == 0 )
Packit b099d7
    {
Packit b099d7
        newList->tabs = (XmTabAttributes) NULL;
Packit b099d7
    }
Packit b099d7
    else
Packit b099d7
    {
Packit b099d7
        /*
Packit b099d7
         * First allocate the memory for all the entries. and then copy
Packit b099d7
         * item by item the list.
Packit b099d7
         */
Packit b099d7
        newList->tabs = (XmTabAttributes)
Packit b099d7
            XtMalloc(sizeof(XmTabAttributeRec) * newList->used);
Packit b099d7
Packit b099d7
        for( i = 0; i < newList->used; ++i )
Packit b099d7
        {
Packit b099d7
            newList->tabs[i].label_string =
Packit b099d7
                XiXmStringCopy(tab_list->tabs[i].label_string);
Packit b099d7
            newList->tabs[i].label_pixmap = tab_list->tabs[i].label_pixmap;
Packit b099d7
	    newList->tabs[i].string_direction =
Packit b099d7
		tab_list->tabs[i].string_direction;
Packit b099d7
	    newList->tabs[i].pixmap_placement =
Packit b099d7
		tab_list->tabs[i].pixmap_placement;
Packit b099d7
	    newList->tabs[i].label_alignment =
Packit b099d7
		tab_list->tabs[i].label_alignment;
Packit b099d7
            newList->tabs[i].foreground = tab_list->tabs[i].foreground;
Packit b099d7
            newList->tabs[i].background = tab_list->tabs[i].background;
Packit b099d7
	    newList->tabs[i].background_pixmap =
Packit b099d7
		tab_list->tabs[i].background_pixmap;
Packit b099d7
	    newList->tabs[i].sensitive = tab_list->tabs[i].sensitive;
Packit b099d7
            newList->tabs[i].value_mode = XmTAB_VALUE_COPY;
Packit b099d7
        }
Packit b099d7
    }
Packit b099d7
Packit b099d7
    return( newList );
Packit b099d7
}
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Function:
Packit b099d7
 *      XmTabbedStackListFree(tab_list)
Packit b099d7
 * Description:
Packit b099d7
 *      Deallocates the memory associated with the given tab list.
Packit b099d7
 * Input:
Packit b099d7
 *      tab_list : XiTablist - the XmTabbedStackList to deallocate
Packit b099d7
 * Output:
Packit b099d7
 *      None.
Packit b099d7
 */
Packit b099d7
void
Packit b099d7
#ifndef _NO_PROTO
Packit b099d7
XmTabbedStackListFree(XmTabbedStackList tab_list)
Packit b099d7
#else
Packit b099d7
XmTabbedStackListFree(tab_list)
Packit b099d7
    XmTabbedStackList tab_list;
Packit b099d7
#endif
Packit b099d7
{
Packit b099d7
    int i;
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * If we do not have anything to deallocate the lets just
Packit b099d7
     * get out of here.
Packit b099d7
     */
Packit b099d7
    if( tab_list == NULL ) return;
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * If we have used items then lets walk through the list and
Packit b099d7
     * deallocate anything we have to.
Packit b099d7
     */
Packit b099d7
    if( tab_list->used != 0 )
Packit b099d7
    {
Packit b099d7
        for( i = 0; i < tab_list->used; ++i )
Packit b099d7
        {
Packit b099d7
            if( tab_list->tabs[i].value_mode == XmTAB_VALUE_SHARE ) continue;
Packit b099d7
            
Packit b099d7
            XiXmStringFree(tab_list->tabs[i].label_string);
Packit b099d7
        }
Packit b099d7
    }
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * If we have any allocated slots lets deallocate them and finally
Packit b099d7
     * deallocate the parent structure.
Packit b099d7
     */
Packit b099d7
    if( tab_list->allocated != 0 )
Packit b099d7
    {
Packit b099d7
        XtFree((XtPointer) tab_list->tabs);
Packit b099d7
    }
Packit b099d7
    XtFree((XtPointer) tab_list);
Packit b099d7
}
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Function:
Packit b099d7
 *      XmTabbedStackListRemove(tab_list, position)
Packit b099d7
 * Description:
Packit b099d7
 *      Remove and deallocate the tab at the specified position in
Packit b099d7
 *      the list.
Packit b099d7
 * Input:
Packit b099d7
 *      tab_list : XmTabbedStackList - the XmTabbedStackList to work with
Packit b099d7
 *      position : int       - the position of the tab to remove
Packit b099d7
 * Output:
Packit b099d7
 *      None.
Packit b099d7
 */
Packit b099d7
void
Packit b099d7
#ifndef _NO_PROTO
Packit b099d7
XmTabbedStackListRemove(XmTabbedStackList tab_list, int position)
Packit b099d7
#else
Packit b099d7
XmTabbedStackListRemove(tab_list, position)
Packit b099d7
    XmTabbedStackList tab_list;
Packit b099d7
    int       position;
Packit b099d7
#endif
Packit b099d7
{
Packit b099d7
    XmTabAttributes to, from;
Packit b099d7
    int             count;
Packit b099d7
Packit b099d7
    if( tab_list == NULL || position < 0 ||
Packit b099d7
        (position > 0 && position >= tab_list->used) )
Packit b099d7
    {
Packit b099d7
        return;
Packit b099d7
    }
Packit b099d7
    to = &(tab_list->tabs[position]);
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Now deallocate the data associated with this tab, if needed.
Packit b099d7
     */
Packit b099d7
    if( to->value_mode == XmTAB_VALUE_COPY ) 
Packit b099d7
    {
Packit b099d7
        XmStringFree(to->label_string);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Now decrement the number of used slots and shift down any slots
Packit b099d7
     * above the one that is being deleted.
Packit b099d7
     */
Packit b099d7
    tab_list->used--;
Packit b099d7
    if( position != tab_list->used )
Packit b099d7
    {
Packit b099d7
        from = &(tab_list->tabs[position+1]);
Packit b099d7
        count = tab_list->used - position;
Packit b099d7
        memmove((XtPointer) to, (XtPointer) from,
Packit b099d7
                sizeof(XmTabAttributeRec) * count);
Packit b099d7
    }
Packit b099d7
}
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Function:
Packit b099d7
 *      XmTabbedStackListInsert(tab_list, position, mask, attributes)
Packit b099d7
 * Description:
Packit b099d7
 *      Adds a tab with the specified attributes to the given
Packit b099d7
 *      XmTabbedStackList.
Packit b099d7
 * Input:
Packit b099d7
 *      tab_list   : XmTabbedStackList       - the XmTabbedStackList to add the new tab to
Packit b099d7
 *      position   : int             - the position to place the new tab at
Packit b099d7
 *      mask       : XtValueMask     - the mask of attributes to set on the
Packit b099d7
 *                                     new tab
Packit b099d7
 *      attributes : XmTabAttributes - the list of attributes to set on the
Packit b099d7
 *				       new tab
Packit b099d7
 * Output:
Packit b099d7
 *      int - the position of the new tab in the list
Packit b099d7
 */
Packit b099d7
int
Packit b099d7
#ifndef _NO_PROTO
Packit b099d7
XmTabbedStackListInsert(XmTabbedStackList tab_list, int position, XtValueMask mask,
Packit b099d7
                XmTabAttributes attributes)
Packit b099d7
#else
Packit b099d7
XmTabbedStackListInsert(tab_list, position, mask, attributes)
Packit b099d7
    XmTabbedStackList       tab_list;
Packit b099d7
    int             position;
Packit b099d7
    XtValueMask     mask;
Packit b099d7
    XmTabAttributes attributes;
Packit b099d7
#endif
Packit b099d7
{
Packit b099d7
    XmTabAttributes newTab;
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * First let's see if they gave us a valid XmTabbedStackList and position
Packit b099d7
     * and if not let's just leave.
Packit b099d7
     */
Packit b099d7
    if( tab_list == NULL || position < XmTAB_LAST_POSITION ||
Packit b099d7
        (position > 0 && position >= tab_list->used) ) return XmTAB_NOT_FOUND;
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Now lets add our new tab to the list in the correct position.
Packit b099d7
     * If the list is not large enough to hold our new tab we will 
Packit b099d7
     * grow the list.
Packit b099d7
     */
Packit b099d7
    if( tab_list->allocated == tab_list->used )
Packit b099d7
    {
Packit b099d7
	/*
Packit b099d7
	 * Our list is not large enough to take another tab, so lets
Packit b099d7
	 * grow the list by XmLIST_GROWTH_FACTOR.
Packit b099d7
	 */
Packit b099d7
	tab_list->allocated += XmLIST_GROWTH_FACTOR;
Packit b099d7
	tab_list->tabs = (XmTabAttributes)
Packit b099d7
	    XtRealloc((XtPointer) tab_list->tabs,
Packit b099d7
		      sizeof(XmTabAttributeRec) * tab_list->allocated);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Once here we know that the list is large enough to hold our new
Packit b099d7
     * item so now lets move any existing items up to make room for our
Packit b099d7
     * new kiddie.
Packit b099d7
     */
Packit b099d7
    if( position == XmTAB_LAST_POSITION )
Packit b099d7
    {
Packit b099d7
	newTab = &(tab_list->tabs[tab_list->used]);
Packit b099d7
	position = tab_list->used;
Packit b099d7
    }
Packit b099d7
    else
Packit b099d7
    {
Packit b099d7
	XmTabAttributes to, from;
Packit b099d7
	int             count;
Packit b099d7
Packit b099d7
	from = &(tab_list->tabs[position]);
Packit b099d7
	to = &(tab_list->tabs[position+1]);
Packit b099d7
	count = tab_list->used - position;
Packit b099d7
	memmove(to, from, sizeof(XmTabAttributeRec) * count);
Packit b099d7
	newTab = &(tab_list->tabs[position]);
Packit b099d7
    }
Packit b099d7
    tab_list->used++;
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Now lets initialize the new tab.  After that we will take a look
Packit b099d7
     * at the mask and see what attributes were customized.
Packit b099d7
     */
Packit b099d7
    newTab->label_string = (XmString) NULL;
Packit b099d7
    newTab->string_direction = XmSTRING_DIRECTION_L_TO_R;
Packit b099d7
    newTab->label_pixmap = XmUNSPECIFIED_PIXMAP;
Packit b099d7
    newTab->label_alignment = XmALIGNMENT_CENTER;
Packit b099d7
    newTab->pixmap_placement = XmPIXMAP_RIGHT;
Packit b099d7
    newTab->foreground = XmCOLOR_DYNAMIC;
Packit b099d7
    newTab->background = XmCOLOR_DYNAMIC;
Packit b099d7
    newTab->background_pixmap = XmPIXMAP_DYNAMIC;
Packit b099d7
    newTab->sensitive = True;
Packit b099d7
    newTab->value_mode = XmTAB_VALUE_COPY;
Packit b099d7
Packit b099d7
    if( mask & XmTAB_VALUE_MODE )
Packit b099d7
    {
Packit b099d7
	newTab->value_mode = attributes->value_mode;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if( mask & XmTAB_LABEL_STRING )
Packit b099d7
    {
Packit b099d7
	if( newTab->value_mode == XmTAB_VALUE_COPY )
Packit b099d7
	{
Packit b099d7
	    newTab->label_string = XiXmStringCopy(attributes->label_string);
Packit b099d7
	}
Packit b099d7
	else
Packit b099d7
	{
Packit b099d7
	    newTab->label_string = attributes->label_string;
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
    
Packit b099d7
    if( mask & XmTAB_STRING_DIRECTION )
Packit b099d7
    {
Packit b099d7
	newTab->string_direction = attributes->string_direction;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if( mask & XmTAB_LABEL_PIXMAP )
Packit b099d7
    {
Packit b099d7
	newTab->label_pixmap = attributes->label_pixmap;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if( mask & XmTAB_PIXMAP_PLACEMENT )
Packit b099d7
    {
Packit b099d7
	newTab->pixmap_placement = attributes->pixmap_placement;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if( mask & XmTAB_BACKGROUND )
Packit b099d7
    {
Packit b099d7
	newTab->background = attributes->background;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if( mask & XmTAB_BACKGROUND_PIXMAP )
Packit b099d7
    {
Packit b099d7
	newTab->background_pixmap = attributes->background_pixmap;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if( mask * XmTAB_SENSITIVE )
Packit b099d7
    {
Packit b099d7
	newTab->sensitive = attributes->sensitive;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if( mask & XmTAB_FOREGROUND )
Packit b099d7
    {
Packit b099d7
	newTab->foreground = attributes->foreground;
Packit b099d7
    }
Packit b099d7
    
Packit b099d7
    if( mask & XmTAB_LABEL_ALIGNMENT )
Packit b099d7
    {
Packit b099d7
	newTab->label_alignment = attributes->label_alignment;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    return( position );
Packit b099d7
}
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Function:
Packit b099d7
 *	XmTabbedStackListAppend(tab_list, mask, attributes)
Packit b099d7
 * Description:
Packit b099d7
 *	Appends a new tab with the given attributes.
Packit b099d7
 * Input:
Packit b099d7
 *	tab_list   : XmTabbedStackList       - the XmTabbedStackList to append a tab to
Packit b099d7
 *	mask       : XtValueMask     - the mask of attributes to set on the
Packit b099d7
 *				       new tab
Packit b099d7
 *	attributes : XmTabAttributes - the list of attributes to set on the
Packit b099d7
 *				       new tab
Packit b099d7
 * Output:
Packit b099d7
 *	int - the position of the new tab
Packit b099d7
 */
Packit b099d7
int
Packit b099d7
#ifndef _NO_PROTO
Packit b099d7
XmTabbedStackListAppend(XmTabbedStackList tab_list, XtValueMask mask,
Packit b099d7
                XmTabAttributes attributes)
Packit b099d7
#else
Packit b099d7
XmTabbedStackListAppend(tab_list, mask, attributes)
Packit b099d7
    XmTabbedStackList       tab_list;
Packit b099d7
    XtValueMask     mask;
Packit b099d7
    XmTabAttributes attributes;
Packit b099d7
#endif
Packit b099d7
{
Packit b099d7
    /*
Packit b099d7
     * So we cheat a little here.  All we need to do is call insert and
Packit b099d7
     * lets that function know that we want it at the end of the list.
Packit b099d7
     */
Packit b099d7
    return( XmTabbedStackListInsert(tab_list, XmTAB_LAST_POSITION, mask, attributes) );
Packit b099d7
}
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Function:
Packit b099d7
 *	XmTabbedStackListModify(tab_list, position, mask, attributes)
Packit b099d7
 * Description:
Packit b099d7
 *	Change the specified attributes for the tab at the given position
Packit b099d7
 *	in the given XmTabbedStackList.
Packit b099d7
 * Input:
Packit b099d7
 *	tab_list   : XmTabbedStackList       - the XmTabbedStackList that contains the
Packit b099d7
 *				       tab to modify.
Packit b099d7
 *	position   : int             - the index of the tab to modify
Packit b099d7
 *	mask       : XtValueMask     - the mask of attributes to modify
Packit b099d7
 *	attributes : XmTabAttributes - the list of attributes to modify
Packit b099d7
 * Output:
Packit b099d7
 *	None.
Packit b099d7
 */
Packit b099d7
void
Packit b099d7
#ifndef _NO_PROTO
Packit b099d7
XmTabbedStackListModify(XmTabbedStackList tab_list, int position, XtValueMask mask,
Packit b099d7
                XmTabAttributes attributes)
Packit b099d7
#else
Packit b099d7
XmTabbedStackListModify(tab_list, position, mask, attributes)
Packit b099d7
    XmTabbedStackList       tab_list;
Packit b099d7
    int             position;
Packit b099d7
    XtValueMask     mask;
Packit b099d7
    XmTabAttributes attributes;
Packit b099d7
#endif
Packit b099d7
{
Packit b099d7
    XmTabAttributes tab;
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * First lets see if they gave us anything valid to work with and
Packit b099d7
     * if they did not lets vacate the premises.
Packit b099d7
     */
Packit b099d7
    if( tab_list == NULL || position < 0 || position >= tab_list->used )
Packit b099d7
    {
Packit b099d7
	return;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    tab = &(tab_list->tabs[position]);
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Now lets check the various flags and see what we need to 
Packit b099d7
     * change.
Packit b099d7
     */
Packit b099d7
    if( mask & XmTAB_VALUE_MODE && tab->value_mode != attributes->value_mode &&
Packit b099d7
        attributes->value_mode == XmTAB_VALUE_COPY )
Packit b099d7
    {
Packit b099d7
	/*
Packit b099d7
	 * Can only change this mode from share to copy, NOT from copy
Packit b099d7
	 * to share.
Packit b099d7
	 */
Packit b099d7
	tab->value_mode = attributes->value_mode;
Packit b099d7
	tab->label_string = XiXmStringCopy(attributes->label_string);
Packit b099d7
    }
Packit b099d7
    
Packit b099d7
    if( mask & XmTAB_LABEL_STRING )
Packit b099d7
    {
Packit b099d7
	if( tab->value_mode == XmTAB_VALUE_COPY )
Packit b099d7
	{
Packit b099d7
	    XiXmStringFree(tab->label_string);
Packit b099d7
	    tab->label_string = XiXmStringCopy(attributes->label_string);
Packit b099d7
	}
Packit b099d7
	else
Packit b099d7
	{
Packit b099d7
	    tab->label_string = attributes->label_string;
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if( mask & XmTAB_STRING_DIRECTION )
Packit b099d7
    {
Packit b099d7
	tab->string_direction = attributes->string_direction;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if( mask & XmTAB_LABEL_PIXMAP )
Packit b099d7
    {
Packit b099d7
	tab->label_pixmap = attributes->label_pixmap;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if( mask & XmTAB_PIXMAP_PLACEMENT )
Packit b099d7
    {
Packit b099d7
	tab->pixmap_placement = attributes->pixmap_placement;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if( mask & XmTAB_BACKGROUND )
Packit b099d7
    {
Packit b099d7
	tab->background = attributes->background;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if( mask & XmTAB_BACKGROUND_PIXMAP )
Packit b099d7
    {
Packit b099d7
	tab->background_pixmap = attributes->background_pixmap;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if( mask & XmTAB_SENSITIVE )
Packit b099d7
    {
Packit b099d7
	tab->sensitive = attributes->sensitive;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if( mask & XmTAB_FOREGROUND )
Packit b099d7
    {
Packit b099d7
	tab->foreground = attributes->foreground;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if( mask & XmTAB_LABEL_ALIGNMENT )
Packit b099d7
    {
Packit b099d7
	tab->label_alignment = attributes->label_alignment;
Packit b099d7
    }
Packit b099d7
}
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Function:
Packit b099d7
 *	XmTabbedStackListQuery(tab_list, position, mask, attributes)
Packit b099d7
 * Description:
Packit b099d7
 *	Retrieve attributes from the specified tab. (NOTE: This may be 
Packit b099d7
 *	a copy out, depends on value_mode, so be sure to free
Packit b099d7
 *	this when done.)
Packit b099d7
 * Input:
Packit b099d7
 *	tab_list   : XmTabbedStackList       - the tab list that contains the tab
Packit b099d7
 *	position   : int             - the tab index to query
Packit b099d7
 *	attributes : XmTabAttributes - the attributes returned.
Packit b099d7
 * Output:
Packit b099d7
 *	None.
Packit b099d7
 */
Packit b099d7
void
Packit b099d7
#ifndef _NO_PROTO
Packit b099d7
XmTabbedStackListQuery(XmTabbedStackList tab_list, int position, XmTabAttributes attributes)
Packit b099d7
#else
Packit b099d7
XmTabbedStackListQuery(tab_list, position, attributes)
Packit b099d7
    XmTabbedStackList       tab_list;
Packit b099d7
    int             position;
Packit b099d7
    XmTabAttributes attributes;
Packit b099d7
#endif
Packit b099d7
{
Packit b099d7
    XmTabAttributes tab;
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Make sure that we have valid data and if not "asta la vesta, baby"
Packit b099d7
     * I have NO idea how to spell that.
Packit b099d7
     */
Packit b099d7
    if( tab_list == NULL || position < 0 || position >= tab_list->used )
Packit b099d7
    {
Packit b099d7
	return;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    tab = &(tab_list->tabs[position]);
Packit b099d7
Packit b099d7
    if( tab->value_mode == XmTAB_VALUE_COPY )
Packit b099d7
    {
Packit b099d7
	attributes->label_string = XiXmStringCopy(tab->label_string);
Packit b099d7
    }
Packit b099d7
    else
Packit b099d7
    {
Packit b099d7
	attributes->label_string = tab->label_string;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    attributes->label_pixmap = tab->label_pixmap;
Packit b099d7
    attributes->string_direction = tab->string_direction;
Packit b099d7
    attributes->label_alignment = tab->label_alignment;
Packit b099d7
    attributes->pixmap_placement = tab->pixmap_placement;
Packit b099d7
    attributes->background = tab->background;
Packit b099d7
    attributes->background_pixmap = tab->background_pixmap;
Packit b099d7
    attributes->sensitive = tab->sensitive;
Packit b099d7
    attributes->foreground = tab->foreground;
Packit b099d7
    attributes->value_mode = tab->value_mode;
Packit b099d7
}
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Function:
Packit b099d7
 *	XmTabbedStackListFind(tab_list, label_string)
Packit b099d7
 * Description:
Packit b099d7
 *	Finds the first tab whose label_string matches the given
Packit b099d7
 *	and returns its index.
Packit b099d7
 * Input:
Packit b099d7
 *	tab_list     : XmTabbedStackList - the XmTabbedStackList to search
Packit b099d7
 *	label_string : XmString  - the label_string to search for
Packit b099d7
 * Output:
Packit b099d7
 *	int - the index of the tab found, or XmTAB_NOT_FOUND if 
Packit b099d7
 *	      a match is not found.
Packit b099d7
 */
Packit b099d7
int
Packit b099d7
#ifndef _NO_PROTO
Packit b099d7
XmTabbedStackListFind(XmTabbedStackList tab_list, XmString label_string)
Packit b099d7
#else
Packit b099d7
XmTabbedStackListFind(tab_list, label_string)
Packit b099d7
    XmTabbedStackList tab_list;
Packit b099d7
    XmString  label_string;
Packit b099d7
#endif
Packit b099d7
{
Packit b099d7
    int i;
Packit b099d7
Packit b099d7
    if( tab_list == NULL ) return( XmTAB_NOT_FOUND );
Packit b099d7
Packit b099d7
    for( i = 0; i < tab_list->used; ++i )
Packit b099d7
    {
Packit b099d7
	if( XiXmStringCompare(tab_list->tabs[i].label_string, label_string) )
Packit b099d7
	{
Packit b099d7
	    return( i );
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
    
Packit b099d7
    return( XmTAB_NOT_FOUND );
Packit b099d7
}
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Function:
Packit b099d7
 *	XmTabbedStackListSimpleRemove(tab_list, label_string)
Packit b099d7
 * Description:
Packit b099d7
 *	Removes the first tab from the given XmTabbedStackList that matches the
Packit b099d7
 *	given label string.
Packit b099d7
 * Input:
Packit b099d7
 *	tab_list     : XmTabbedStackList - tab list to remove the item from
Packit b099d7
 *	label_string : XmString  - the label string to match
Packit b099d7
 * Output:
Packit b099d7
 *	None.
Packit b099d7
 */
Packit b099d7
void
Packit b099d7
#ifndef _NO_PROTO
Packit b099d7
XmTabbedStackListSimpleRemove(XmTabbedStackList tab_list, XmString label_string)
Packit b099d7
#else
Packit b099d7
XmTabbedStackListSimpleRemove(tab_list, label_string)
Packit b099d7
    XmTabbedStackList tab_list;
Packit b099d7
    XmString  label_string;
Packit b099d7
#endif
Packit b099d7
{
Packit b099d7
    int position = XmTabbedStackListFind(tab_list, label_string);
Packit b099d7
Packit b099d7
    if( position != XmTAB_NOT_FOUND ) XmTabbedStackListRemove(tab_list, position);
Packit b099d7
}
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Function:
Packit b099d7
 *	XmTabbedStackListSimpleInsert(tab_list, position, label_string)
Packit b099d7
 * Description:
Packit b099d7
 *	Inserts a new tab with the specified label string at the
Packit b099d7
 *	specified position.
Packit b099d7
 * Input:
Packit b099d7
 *	tab_list     : XmTabbedStackList - the XmTabbedStackList to add a tab to
Packit b099d7
 *	position     : int       - the position to put the tab at
Packit b099d7
 *	label_string : XmString  - the label for the new tab
Packit b099d7
 * Output:
Packit b099d7
 *	int - the position of the new tab
Packit b099d7
 */
Packit b099d7
int
Packit b099d7
#ifndef _NO_PROTO
Packit b099d7
XmTabbedStackListSimpleInsert(XmTabbedStackList tab_list, int position, XmString label_string)
Packit b099d7
#else
Packit b099d7
XmTabbedStackListSimpleInsert(tab_list, position, label_string)
Packit b099d7
    XmTabbedStackList tab_list;
Packit b099d7
    int       position;
Packit b099d7
    XmString  label_string;
Packit b099d7
#endif
Packit b099d7
{
Packit b099d7
    XmTabAttributeRec attributes;
Packit b099d7
Packit b099d7
    attributes.label_string = label_string;
Packit b099d7
    
Packit b099d7
    return( XmTabbedStackListInsert(tab_list, position, XmTAB_LABEL_STRING,
Packit b099d7
			    &attributes) );
Packit b099d7
}
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Function:
Packit b099d7
 *	XmTabbedStackListSimpleAppend(tab_list, label_string)
Packit b099d7
 * Description:
Packit b099d7
 *	Append a new tab to the given tab list with the specified label
Packit b099d7
 *	string.
Packit b099d7
 * Input:
Packit b099d7
 *	tab_list     : XmTabbedStackList - the XmTabbedStackList to append a tab to
Packit b099d7
 *	label_string : XmString  - the label for the new tab
Packit b099d7
 * Output:
Packit b099d7
 *	int - the position of the new tab
Packit b099d7
 */
Packit b099d7
int
Packit b099d7
#ifndef _NO_PROTO
Packit b099d7
XmTabbedStackListSimpleAppend(XmTabbedStackList tab_list, XmString label_string)
Packit b099d7
#else
Packit b099d7
XmTabbedStackListSimpleAppend(tab_list, label_string)
Packit b099d7
    XmTabbedStackList tab_list;
Packit b099d7
    XmString  label_string;
Packit b099d7
#endif
Packit b099d7
{
Packit b099d7
    XmTabAttributeRec attributes;
Packit b099d7
Packit b099d7
    attributes.label_string = label_string;
Packit b099d7
    
Packit b099d7
    return( XmTabbedStackListAppend(tab_list, XmTAB_LABEL_STRING,
Packit b099d7
			    &attributes) );
Packit b099d7
}
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Function:
Packit b099d7
 *	XmTabbedStackListsimpleModify(tab_list, position, label_string)
Packit b099d7
 * Description:
Packit b099d7
 *	Changes the label string for the specified tab.
Packit b099d7
 * Input:
Packit b099d7
 *	tab_list     : XmTabbedStackList - the XmTabbedStackList that contains the tab to
Packit b099d7
 *				   change
Packit b099d7
 *	position     : int       - the tab to change
Packit b099d7
 * 	label_string : XmString  - the new value of the label string
Packit b099d7
 * Output:
Packit b099d7
 *	None.
Packit b099d7
 */
Packit b099d7
/* ARGSUSED */
Packit b099d7
void
Packit b099d7
#ifndef _NO_PROTO
Packit b099d7
XmTabbedStackListSimpleModify(XmTabbedStackList tab_list, int position, XmString label_string)
Packit b099d7
#else
Packit b099d7
XmTabbedStackListSimpleModify(tab_list, position, label_string)
Packit b099d7
    XmTabbedStackList tab_list;
Packit b099d7
    int       position;
Packit b099d7
    XmString  label_string;
Packit b099d7
#endif
Packit b099d7
{
Packit b099d7
    XmTabAttributeRec attributes;
Packit b099d7
Packit b099d7
    XmTabbedStackListModify(tab_list, position, XmTAB_LABEL_STRING, &attributes);
Packit b099d7
}
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Function:
Packit b099d7
 *	XmTabbedStackListSimpleQuery(tab_list, position)
Packit b099d7
 * Description:
Packit b099d7
 *	Query the label string from the specified tab
Packit b099d7
 * Input:
Packit b099d7
 *	tab_list : XmTabbedStackList - the XmTabbedStackList to query
Packit b099d7
 *	position : int       - the tab to query
Packit b099d7
 * Output:
Packit b099d7
 *	XmString - the label for the given tab (NOTE: this is a copy
Packit b099d7
 *	           so please free when you are done)
Packit b099d7
 */
Packit b099d7
XmString
Packit b099d7
#ifndef _NO_PROTO
Packit b099d7
XmTabbedStackListSimpleQuery(XmTabbedStackList tab_list, int position)
Packit b099d7
#else
Packit b099d7
XmTabbedStackListSimpleQuery(tab_list, position)
Packit b099d7
    XmTabbedStackList tab_list;
Packit b099d7
    int       position;
Packit b099d7
#endif
Packit b099d7
{
Packit b099d7
    XmTabAttributeRec attributes;
Packit b099d7
Packit b099d7
    XmTabbedStackListQuery(tab_list, position, &attributes);
Packit b099d7
Packit b099d7
    if( attributes.value_mode != XmTAB_VALUE_COPY )
Packit b099d7
    {
Packit b099d7
	attributes.label_string = XiXmStringCopy(attributes.label_string);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    return( attributes.label_string );
Packit b099d7
}
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Function:
Packit b099d7
 *	XmTabAttributesFree(attributes)
Packit b099d7
 * Description:
Packit b099d7
 *	This deallocates any memory that the attribute structure is
Packit b099d7
 *	using.  This does not free the attribute structure.
Packit b099d7
 * Input:
Packit b099d7
 *	attributes : XiAttributes - the structure whose contants should be
Packit b099d7
 *		                    deallocated.
Packit b099d7
 * Output:
Packit b099d7
 *	None.
Packit b099d7
 */
Packit b099d7
void
Packit b099d7
#ifndef _NO_PROTO
Packit b099d7
XmTabAttributesFree(XmTabAttributes attributes)
Packit b099d7
#else
Packit b099d7
XmTabAttributesFree(attributes)
Packit b099d7
    XmTabAttributes attributes;
Packit b099d7
#endif
Packit b099d7
{
Packit b099d7
    if( attributes->value_mode == XmTAB_VALUE_COPY )
Packit b099d7
    {
Packit b099d7
	XiXmStringFree(attributes->label_string);
Packit b099d7
    }
Packit b099d7
}
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Function:
Packit b099d7
 *	_XmTabbedStackListCount(tab_list)
Packit b099d7
 * Description:
Packit b099d7
 *	Returns the number of entries in the given XmTabbedStackList.
Packit b099d7
 * Input:
Packit b099d7
 *	tab_list : XmTabbedStackList - the tab list whose entries to count
Packit b099d7
 * Output:
Packit b099d7
 *	int - the number of items in the given XmTabbedStackList
Packit b099d7
 */
Packit b099d7
int
Packit b099d7
#ifndef _NO_PROTO
Packit b099d7
_XmTabbedStackListCount(XmTabbedStackList tab_list)
Packit b099d7
#else
Packit b099d7
_XmTabbedStackListCount(tab_list)
Packit b099d7
    XmTabbedStackList tab_list;
Packit b099d7
#endif
Packit b099d7
{
Packit b099d7
    if( tab_list == NULL ) return( 0 );
Packit b099d7
Packit b099d7
    return( tab_list->used );
Packit b099d7
}
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Function:
Packit b099d7
 *	_XmTabbedStackListGet(tab_list, position)
Packit b099d7
 * Description:
Packit b099d7
 *	Returns a pointer to the given element in the XmTabbedStackList.  Use
Packit b099d7
 *	with caution as it returns a pointer to live memory.
Packit b099d7
 * Input:
Packit b099d7
 *	tab_list : XmTabbedStackList - the tab list to index into
Packit b099d7
 *	int      : Position  - the index of the tab you want
Packit b099d7
 * Output:
Packit b099d7
 *	XmTabAttributes - a pointer to the specified tab
Packit b099d7
 */
Packit b099d7
XmTabAttributes
Packit b099d7
#ifndef _NO_PROTO
Packit b099d7
_XmTabbedStackListGet(XmTabbedStackList tab_list, int position)
Packit b099d7
#else
Packit b099d7
_XmTabbedStackListGet(tab_list, position)
Packit b099d7
    XmTabbedStackList tab_list;
Packit b099d7
    int       position;
Packit b099d7
#endif
Packit b099d7
{
Packit b099d7
    XmTabAttributes tab;
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Make sure that we have valid data and if not "asta la vesta, baby"
Packit b099d7
     * I have NO idea how to spell that.
Packit b099d7
     */
Packit b099d7
    if( tab_list == NULL || position < 0 || position >= tab_list->used )
Packit b099d7
    {
Packit b099d7
	return( NULL );
Packit b099d7
    }
Packit b099d7
Packit b099d7
    tab = &(tab_list->tabs[position]);
Packit b099d7
Packit b099d7
    return( tab );
Packit b099d7
}
Packit b099d7
Packit b099d7
XmTabAttributes
Packit b099d7
#ifndef _NO_PROTO
Packit b099d7
_XmTabbedStackListArray(XmTabbedStackList tab_list)
Packit b099d7
#else
Packit b099d7
_XmTabbedStackListArray(tab_list)
Packit b099d7
    XmTabbedStackList tab_list;
Packit b099d7
#endif
Packit b099d7
{
Packit b099d7
    /*
Packit b099d7
     * Make sure that we have valid data and if not "asta la vesta, baby"
Packit b099d7
     * I have NO idea how to spell that.
Packit b099d7
     */
Packit b099d7
    if( tab_list == NULL )
Packit b099d7
    {
Packit b099d7
	return( NULL );
Packit b099d7
    }
Packit b099d7
Packit b099d7
    return( tab_list->tabs );
Packit b099d7
}
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Function:
Packit b099d7
 *	XmTabbedStackListCompare(XmTabbedStackList list1, XmTabbedStackList list2)
Packit b099d7
 * Description:
Packit b099d7
 *	Compares to tab lists to see if they are logically 
Packit b099d7
 *	equivalent.
Packit b099d7
 * Input:
Packit b099d7
 *	list1 : XmTabbedStackList - tab list to compare
Packit b099d7
 *	list2 : XmTabbedStackList - tab list to compare
Packit b099d7
 * Output:
Packit b099d7
 *	XmTabResult - indicates the differences it any
Packit b099d7
 */
Packit b099d7
XmTabResult
Packit b099d7
#ifndef _NO_PROTO
Packit b099d7
XmTabbedStackListCompare(XmTabbedStackList list1, XmTabbedStackList list2)
Packit b099d7
#else
Packit b099d7
XmTabbedStackListCompare(list1, list2)
Packit b099d7
    XmTabbedStackList list1, list2;
Packit b099d7
#endif
Packit b099d7
{
Packit b099d7
    XmTabResult result = XmTAB_CMP_EQUAL;
Packit b099d7
    int         i;
Packit b099d7
Packit b099d7
    if( (list1 == NULL && list2 != NULL) ||
Packit b099d7
        (list1 != NULL && list2 == NULL) ||
Packit b099d7
        list1->used != list2->used ) return( XmTAB_CMP_SIZE );
Packit b099d7
Packit b099d7
    for( i = 0; i < list1->used; ++i )
Packit b099d7
    {
Packit b099d7
	if( list1->tabs[i].label_pixmap != list2->tabs[i].label_pixmap ||
Packit b099d7
	    !XiXmStringCompare(list1->tabs[i].label_string, 
Packit b099d7
			       list2->tabs[i].label_string) ||
Packit b099d7
 	    list1->tabs[i].pixmap_placement !=
Packit b099d7
	    list2->tabs[i].pixmap_placement )
Packit b099d7
	{
Packit b099d7
	    return( XmTAB_CMP_SIZE );
Packit b099d7
	}
Packit b099d7
	if( list1->tabs[i].string_direction !=
Packit b099d7
	    list2->tabs[i].string_direction ||
Packit b099d7
	    list1->tabs[i].label_alignment != list2->tabs[i].label_alignment ||
Packit b099d7
	    list1->tabs[i].foreground != list2->tabs[i].foreground ||
Packit b099d7
	    list1->tabs[i].background != list2->tabs[i].background ||
Packit b099d7
	    list1->tabs[i].sensitive != list2->tabs[i].sensitive ||
Packit b099d7
	    list1->tabs[i].background_pixmap != 
Packit b099d7
	    list2->tabs[i].background_pixmap )
Packit b099d7
	{
Packit b099d7
	    result = XmTAB_CMP_VISUAL;
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
    return( result );
Packit b099d7
}