This is MList.m in view mode; [Download] [Up]
/* Implementation of MList class * * Copyright (C) 1993, 1994, 1995 The Board of Trustees of * The Leland Stanford Junior University. All Rights Reserved. * * Authors: Scott Francis, Fred Harris, Paul Kunz, Tom Pavel, * Imran Qureshi, and Libing Wang * * This file is part of an Objective-C class library for X/Motif * * MList.m,v 1.42 1995/04/17 22:44:49 fedor Exp */ /* Implementation Note: This non-OpenStep class is used as * temporary replacement for a matrix of SelectionCells. It will * be eliminated later */ #include "MList.h" #include "xtResponder.h" /* Required for implementation: */ #include "Motif.h" #include <Xm/List.h> #include <Xm/TextF.h> #include <objc/List.h> #include "ActionCell.h" #include "Application.h" #include "Matrix.h" #include "ClipView.h" #include <stdlib.h> /* for free() */ #define CELL_HEIGHT 17 static void click(Widget w, XtPointer client_data, XtPointer call_data) { MList *listid = (MList *)client_data; XmListCallbackStruct *cb = (XmListCallbackStruct *) call_data; switch (cb->reason) { case XmCR_BROWSE_SELECT: [[listid target] perform:[listid action] with:listid]; break; case XmCR_DEFAULT_ACTION: [[listid target] perform:[listid doubleAction] with:listid]; break; default: break; } } @interface View(WidgetSet) - _init; @end @implementation MList - initFrame:(const NXRect *)frameRect { [super initFrame:frameRect]; instancename = "MList"; return self; } - _init { [super _init]; classname = xmListWidgetClass; return self; } - fillListFrom:(Matrix *)aMatrix { Cell *aCell; List *list; XmStringTable items; char *fontName = "-adobe-helvetica-medium-r-*-*-12-*-*-*-*-*-*-*"; XFontStruct *font; XmFontList fontList; Display *disp = [NXApp _X_display]; Pixel black; NXRect superframe; char *string; int i, count; [self empty]; if ( widgetid ) { XtUnmanageChild(widgetid); XtDestroyWidget(widgetid); } widgetid = NULL; list = [aMatrix cellList]; count = [list count]; if (count == 0) items = NULL; else items = (XmStringTable)malloc( count*sizeof(XmString *) ); for ( i = 0; i < count; i++ ) { aCell = [list objectAt:i]; string = (char *)[aCell stringValue]; items[i] = XmStringCreate(string, XmSTRING_DEFAULT_CHARSET); } frame.origin.x = frame.origin.y = 0; frame.size.height = count * CELL_HEIGHT + 0.4 * CELL_HEIGHT; [superview getFrame:&superframe]; if ( superframe.size.height > frame.size.height ) { frame.origin.y = superframe.size.height - frame.size.height; } font = XLoadQueryFont( disp, fontName ); fontList = XmFontListCreate( font, XmSTRING_DEFAULT_CHARSET ); black = XBlackPixel(disp, XDefaultScreen(disp)); [self _addArg:XmNwidth :frame.size.width]; [self _addArg:XmNheight :frame.size.height]; [self _addArg:XmNitemCount :count]; [self _addArg:XmNitems :(XtArgVal)items]; [self _addArg:XmNvisibleItemCount :count]; [self _addArg:XmNfontList :(XtArgVal)fontList]; [self _addArg:XmNforeground :black]; if ( [superview _widget] ) { [self _managedBy:superview]; [(ClipView *)superview _setScrollFloatValue:0.0 :0.0]; i = count; while ( i-- ) { XmStringFree( items[i] ); } free( items ); } return self; } - empty { if ( widgetid ) { XmListDeleteAllItems(widgetid); } return self; } - getSelectedCells:(List *)aList from:(Matrix *)cellMatrix { Cell *aCell; List *selList; int *position_list, position_count; int i, pos; Boolean flag; if ( aList ) { selList = aList; } else { selList = [[List alloc] init]; } flag = XmListGetSelectedPos(widgetid, &position_list, &position_count); if ( flag == FALSE ) return selList; for ( i = 0; i < position_count; i++ ) { pos = position_list[i] -1; aCell = [cellMatrix cellAt:pos :0]; [selList addObject:aCell]; } return selList; } - selectCellAt:(int)row { XmListSelectPos ( widgetid, row+1, False ); return self; } - setTarget:anObject { target = anObject; return self; } - target { return target; } - setAction:(SEL)aSelector { action = aSelector; return self; } - (SEL)action { return action; } - setDoubleAction:(SEL)aSelector { doubleAction = aSelector; return self; } - (SEL)doubleAction { return doubleAction; } -free { [self empty]; return [super free]; } - _addCallback { XtAddCallback(widgetid, XmNbrowseSelectionCallback, click, (XtPointer)self); XtAddCallback(widgetid, XmNdefaultActionCallback, click, (XtPointer)self); return self; } - _managedBy:parent wid:(void*)widget { int temp = 500; [self _addArg:XmNdoubleClickInterval:temp]; [self _addArg:XmNshadowThickness :0]; [super _managedBy:parent wid:widget]; return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.