Blame lib/Xm/ScrollFrameT.c

Packit b099d7
/* $XConsortium: ScrollFrameT.c /main/5 1995/07/15 20:55:20 drk $ */
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
 * HISTORY
Packit b099d7
 */
Packit b099d7
Packit b099d7
#ifdef HAVE_CONFIG_H
Packit b099d7
#include <config.h>
Packit b099d7
#endif
Packit b099d7
Packit b099d7
Packit b099d7
#include "XmI.h"
Packit b099d7
#include <Xm/TraitP.h>
Packit b099d7
#include <Xm/ScrollFrameT.h>
Packit b099d7
#include <Xm/NavigatorT.h>
Packit b099d7
#include "MessagesI.h"
Packit b099d7
#include "ScrollFramTI.h"
Packit b099d7
Packit b099d7
#define SWMessage3      _XmMMsgScrollFrameT_0000
Packit b099d7
#define SWMessage4      _XmMMsgScrollFrameT_0001
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  _XmSFAddNavigator convenience function
Packit b099d7
 *    Entering here, sf is an initialized scrollframe, and 
Packit b099d7
 *    scroll_frame_data is always valid (but the move_cb field can be 
Packit b099d7
 *    NULL, for pure APP_DEFINED case support).
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
void 
Packit b099d7
_XmSFAddNavigator(
Packit b099d7
    Widget sf,
Packit b099d7
    Widget nav,
Packit b099d7
    Mask dimMask,
Packit b099d7
    XmScrollFrameData scroll_frame_data)
Packit b099d7
{
Packit b099d7
    XmNavigatorTrait nav_trait ;
Packit b099d7
    XmNavigatorDataRec nav_data ;
Packit b099d7
Packit b099d7
    if ((nav_trait = (XmNavigatorTrait) 
Packit b099d7
	 XmeTraitGet((XtPointer) XtClass(nav), XmQTnavigator)) != NULL) {
Packit b099d7
	
Packit b099d7
	/* check for NULL move_cb */
Packit b099d7
	if (scroll_frame_data->move_cb)
Packit b099d7
	    nav_trait -> changeMoveCB(nav, scroll_frame_data->move_cb,
Packit b099d7
				      (XtPointer) scroll_frame_data->scrollable,
Packit b099d7
				      True) ;
Packit b099d7
Packit b099d7
	nav_data.valueMask = NavDimMask ;
Packit b099d7
	nav_data.dimMask = dimMask ;
Packit b099d7
	nav_trait -> setValue(nav, &nav_data, False);
Packit b099d7
Packit b099d7
	if (scroll_frame_data->num_nav_list == 
Packit b099d7
	    scroll_frame_data->num_nav_slots) {
Packit b099d7
	    /* Allocate more space */
Packit b099d7
	    scroll_frame_data->num_nav_slots +=  2;
Packit b099d7
	    scroll_frame_data->nav_list = 
Packit b099d7
		(WidgetList) XtRealloc((char*)scroll_frame_data->nav_list,
Packit b099d7
			scroll_frame_data->num_nav_slots * sizeof(Widget));
Packit b099d7
	}
Packit b099d7
Packit b099d7
	scroll_frame_data->nav_list[scroll_frame_data->num_nav_list] = nav;
Packit b099d7
	scroll_frame_data->num_nav_list++;
Packit b099d7
Packit b099d7
    } else {
Packit b099d7
	XmeWarning(sf, SWMessage3);
Packit b099d7
    }
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  _XmSFRemoveNavigator convenience function
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
void 
Packit b099d7
_XmSFRemoveNavigator(
Packit b099d7
    Widget sf,
Packit b099d7
    Widget nav,
Packit b099d7
    XmScrollFrameData scroll_frame_data)
Packit b099d7
{
Packit b099d7
    Cardinal	     position, i;
Packit b099d7
    XmNavigatorTrait nav_trait ;
Packit b099d7
Packit b099d7
    if ((nav_trait = (XmNavigatorTrait) 
Packit b099d7
	 XmeTraitGet((XtPointer) XtClass(nav), XmQTnavigator)) != NULL) {
Packit b099d7
Packit b099d7
	/* remove the move callback */
Packit b099d7
	if (scroll_frame_data->move_cb) 
Packit b099d7
	    nav_trait -> changeMoveCB(nav, scroll_frame_data->move_cb,
Packit b099d7
				(XtPointer) scroll_frame_data->scrollable,
Packit b099d7
				False) ;
Packit b099d7
    }  else {
Packit b099d7
	XmeWarning(sf, SWMessage4);
Packit b099d7
	return ;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    for (position = 0; position<scroll_frame_data->num_nav_list; position++) {
Packit b099d7
        if (scroll_frame_data->nav_list[position] == nav) {
Packit b099d7
	    break;
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
    if (position == scroll_frame_data->num_nav_list) return;
Packit b099d7
Packit b099d7
    
Packit b099d7
    scroll_frame_data->num_nav_list--;
Packit b099d7
    for (i = position; i < scroll_frame_data->num_nav_list; i++) {
Packit b099d7
        scroll_frame_data->nav_list[i] = scroll_frame_data->nav_list[i+1];
Packit b099d7
    }
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  _XmSFUpdateNavigatorsValues convenience function
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
void
Packit b099d7
_XmSFUpdateNavigatorsValue(
Packit b099d7
        Widget sf,
Packit b099d7
        XmNavigatorData nav_data,
Packit b099d7
        Boolean notify)
Packit b099d7
{
Packit b099d7
    Cardinal i, num_nav_list ;
Packit b099d7
    Widget * nav_list ;
Packit b099d7
    Boolean inited ;
Packit b099d7
Packit b099d7
    /* there is a possibility that the SW was not inited for
Packit b099d7
       navigation business: APP_DEFINED where no scrollbar have
Packit b099d7
       been added yet */
Packit b099d7
    inited =  ((XmScrollFrameTrait) 
Packit b099d7
	       XmeTraitGet((XtPointer) XtClass(sf), XmQTscrollFrame))
Packit b099d7
	->getInfo(sf, NULL, &nav_list, &num_nav_list);
Packit b099d7
Packit b099d7
    if (!inited) return ;
Packit b099d7
Packit b099d7
    /* loop over the associated navigator list and call the change value
Packit b099d7
       method for each navigator */
Packit b099d7
    /* Updating the first navigator only if notify is True is not
Packit b099d7
       enough, since the dimension is pertinent */
Packit b099d7
Packit b099d7
    for (i=0; i < num_nav_list; i++) {
Packit b099d7
	Widget nav = nav_list[i] ;
Packit b099d7
	XmNavigatorSetValueProc	nav_setValue =
Packit b099d7
	    ((XmNavigatorTrait) 
Packit b099d7
	     XmeTraitGet((XtPointer) XtClass(nav), XmQTnavigator))->setValue;
Packit b099d7
Packit b099d7
	nav_setValue(nav, nav_data, notify);
Packit b099d7
    }
Packit b099d7
}
Packit b099d7