Milán Major

netscape-revival

1 branch
Code

sun-java/awt/x/awt_List.c

/*
 * @(#)awt_List.c	1.22 95/12/02 Sami Shaio
 *
 * Copyright (c) 1994 Sun Microsystems, Inc. All Rights Reserved.
 *
 * Permission to use, copy, modify, and distribute this software
 * and its documentation for NON-COMMERCIAL purposes and without
 * fee is hereby granted provided that this copyright notice
 * appears in all copies. Please refer to the file "copyright.html"
 * for further important copyright and licensing information.
 *
 * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
 * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
 * TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
 * PARTICULAR PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR
 * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
 * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
 */
#include "awt_p.h"
#include "java_awt_List.h"
#include "sun_awt_motif_MListPeer.h"
#include "sun_awt_motif_MComponentPeer.h"
#include "ustring.h"

static void
Slist_callback(Widget w, XtPointer client_data, XtPointer call_data)
{
    XmListCallbackStruct *cbs = (XmListCallbackStruct *)call_data;

    switch (cbs->reason) {
      case XmCR_DEFAULT_ACTION:
	JAVA_UPCALL((EE(), (void *)client_data, "action","(I)V",
		     (cbs->item_position - 1)));
	break;
      case XmCR_SINGLE_SELECT:
	JAVA_UPCALL((EE(), (void *)client_data,
		     "handleListChanged","(I)V", (cbs->item_position - 1)));
	break;
      case XmCR_MULTIPLE_SELECT:
	JAVA_UPCALL((EE(), (void *)client_data,
		     "handleListChanged","(I)V", (cbs->item_position - 1)));
	break;
      default:
	break;
    }
}

void
sun_awt_motif_MListPeer_create(struct Hsun_awt_motif_MListPeer *this,
			       struct Hsun_awt_motif_MComponentPeer *parent)
{
    int				argc;
    Arg				args[40];
    struct ComponentData	*wdata;
    struct ListData		*sdata;
    Pixel			bg;

    AWT_LOCK();
    if (parent == 0 || unhand(parent)->pData == 0) {
	SignalError(0, JAVAPKG "NullPointerException", 0);
	AWT_UNLOCK();
	return;
    }

    wdata = (struct ComponentData *)unhand(parent)->pData;
    sdata = (struct ListData *)sysMalloc(sizeof(struct ListData));
    SET_PDATA(this, sdata);
    if (sdata == 0) {
	SignalError(0, JAVAPKG "OutOfMemoryError", 0);
	AWT_UNLOCK();
	return;
    }
    XtVaGetValues(wdata->widget, XmNbackground, &bg, NULL);
    argc = 0;
    XtSetArg(args[argc], XmNrecomputeSize, False); argc++;
    XtSetArg(args[argc], XmNbackground, bg); argc++;
    XtSetArg(args[argc], XmNlistSizePolicy, XmCONSTANT); argc++;
    XtSetArg(args[argc], XmNx, 0); argc++;
    XtSetArg(args[argc], XmNy, 0); argc++;
    XtSetArg(args[argc], XmNmarginTop, 0); argc++;
    XtSetArg(args[argc], XmNmarginBottom, 0); argc++;
    XtSetArg(args[argc], XmNmarginLeft, 0); argc++;
    XtSetArg(args[argc], XmNmarginRight, 0); argc++;
    XtSetArg(args[argc], XmNmarginHeight, 0); argc++;
    XtSetArg(args[argc], XmNmarginWidth, 0); argc++;
    XtSetArg(args[argc], XmNlistMarginHeight, 0); argc++;
    XtSetArg(args[argc], XmNlistMarginWidth, 0); argc++;
    XtSetArg(args[argc], XmNscrolledWindowMarginWidth, 0); argc++;
    XtSetArg(args[argc], XmNscrolledWindowMarginHeight, 0); argc++;
    sdata->list = XmCreateScrolledList(wdata->widget,
				       "slist",
				       args,
				       argc);
    sdata->comp.widget = XtParent(sdata->list);
    XtSetMappedWhenManaged(sdata->comp.widget, False);
    XtAddCallback(sdata->list,
		  XmNdefaultActionCallback,
		  Slist_callback,
		  (XtPointer)this);
    XtManageChild(sdata->list);
    XtManageChild(sdata->comp.widget);
    AWT_UNLOCK();
}


long
sun_awt_motif_MListPeer_isSelected(struct Hsun_awt_motif_MListPeer *this,
				   long pos)
{
    struct ListData *sdata;

    AWT_LOCK();
    sdata = PDATA(ListData,this);
    if (sdata == 0) {
	SignalError(0, JAVAPKG "NullPointerException", 0);
	AWT_UNLOCK();
	return 0;
    }
    pos++;
    if (XmListPosSelected(sdata->list, pos) == True) {
	AWT_UNLOCK();
	return 1;
    } else {
	AWT_UNLOCK();
	return 0;
    }
}

void
sun_awt_motif_MListPeer_addItem(struct Hsun_awt_motif_MListPeer *this,
				Hjava_lang_String *item,
				long index)
{
    XmString		im;
    struct ListData	*sdata;

    AWT_LOCK();
    if (item == 0) {
	SignalError(0, JAVAPKG "NullPointerException", 0);
	AWT_UNLOCK();
	return;
    }
    sdata = PDATA(ListData,this);
    if (sdata == 0) {
	SignalError(0, JAVAPKG "NullPointerException", 0);
	AWT_UNLOCK();
	return;
    }
    
    im = makeXmString(item);
    if( im == NULL ) {
        AWT_UNLOCK();
        return;
    }
    
    /* motif uses 1-based indeces for the list operations with 0 */
    /* referring to the last item on the list. Thus if index is -1 */
    /* then we'll get the right effect of adding to the end of the */
    /* list. */
    index++;
    XmListAddItemUnselected(sdata->list, im, index);
    XmStringFree(im);
    AWT_UNLOCK();
}

void
sun_awt_motif_MListPeer_makeVisible(struct Hsun_awt_motif_MListPeer *this,
					long pos)
{
    int top, visible;
    struct ListData	*sdata;

    AWT_LOCK();
    sdata = PDATA(ListData,this);
    if (sdata == 0) {
	SignalError(0, JAVAPKG "NullPointerException", 0);
	AWT_UNLOCK();
	return;
    }
    XtVaGetValues(sdata->list,
		  XmNtopItemPosition, &top,
		  XmNvisibleItemCount, &visible,
		  NULL);
    pos++;
    if (pos < top) {
	XmListSetPos(sdata->list, pos);
    } else {
	XmListSetBottomPos(sdata->list, pos);
    }

    AWT_UNLOCK();
}

void
sun_awt_motif_MListPeer_select(struct Hsun_awt_motif_MListPeer *this,
			       long pos)
{
    struct ListData *sdata;

    AWT_LOCK();
    sdata = PDATA(ListData,this);
    if (sdata == 0) {
	SignalError(0, JAVAPKG "NullPointerException", 0);
	AWT_UNLOCK();
	return;
    }
    pos++;
    XmListSelectPos(sdata->list, pos, 0);
    AWT_UNLOCK();
}

void
sun_awt_motif_MListPeer_deselect(struct Hsun_awt_motif_MListPeer *this,
				 long pos)
{
    struct ListData *sdata;

    AWT_LOCK();
    sdata = PDATA(ListData,this);
    if (sdata == 0) {
	SignalError(0, JAVAPKG "NullPointerException", 0);
	AWT_UNLOCK();
	return;
    }
    pos++;
    XmListDeselectPos(sdata->list, pos);
    AWT_UNLOCK();
}

void
sun_awt_motif_MListPeer_delItems(struct Hsun_awt_motif_MListPeer *this,
				 long start, long end)
{
    struct ListData *sdata;

    AWT_LOCK();
    sdata = PDATA(ListData,this);
    if (sdata == 0) {
	SignalError(0, JAVAPKG "NullPointerException", 0);
	AWT_UNLOCK();
	return;
    }
    start++;
    end++;
    if (start == end) {
	XmListDeletePos(sdata->list, start);
    } else {
	XmListDeleteItemsPos(sdata->list, end - start + 1, start);
    }
    AWT_UNLOCK();
}	


void
sun_awt_motif_MListPeer_setMultipleSelections(struct Hsun_awt_motif_MListPeer *this,
					      long v)
{
    struct ListData *sdata;

    AWT_LOCK();
    sdata = PDATA(ListData,this);
    if (sdata == 0) {
	SignalError(0, JAVAPKG "NullPointerException", 0);
	AWT_UNLOCK();
	return;
    }
    if (v == 0) {
	XtVaSetValues(sdata->list,
		      XmNselectionPolicy, XmSINGLE_SELECT,
		      NULL);
	XtRemoveCallback(sdata->list,
			 XmNmultipleSelectionCallback,
			 Slist_callback,
			 (XtPointer)this);
	XtAddCallback(sdata->list,
		      XmNsingleSelectionCallback,
		      Slist_callback,
		      (XtPointer)this);
    } else {
	XtVaSetValues(sdata->list,
		      XmNselectionPolicy, XmMULTIPLE_SELECT,
		      NULL);
	XtRemoveCallback(sdata->list,
			 XmNsingleSelectionCallback,
			 Slist_callback,
			 (XtPointer)this);
	XtAddCallback(sdata->list,
		      XmNmultipleSelectionCallback,
		      Slist_callback,
		      (XtPointer)this);
    }
    AWT_UNLOCK();
}