This is xmButtonCell.m in view mode; [Download] [Up]
/* WidgetSet category for implementation of ButtonCell class
*
* Copyright (C) 1994, 1995 The Board of Trustees of
* The Leland Stanford Junior University. All Rights Reserved.
*
* Authors: Scott Francis, Fred Harris, Paul Kunz, Imran Qureshi,
* and Libing Wang (SLAC)
* Mike Kienenberger (Alaska)
*
* This file is part of an Objective-C class library for X/Motif
*
* xmButtonCell.m,v 1.12 1995/04/22 23:12:35 pfkeb Exp
*/
#include "ButtonCell.h"
#include "xtCell.h"
#include "Application.h"
#include "Control.h"
#include "Window.h"
#include <stdlib.h>
#include <string.h>
#include "Motif.h"
#include <Xm/PushB.h>
#include <Xm/ToggleB.h>
char *ButtonCellInstanceName( void )
{
return "ButtonCell";
}
static void
thePushCallback(Widget w, XtPointer client_data, XtPointer call_data)
{
ButtonCell *butid = (ButtonCell*) client_data;
XmPushButtonCallbackStruct *cb = (XmPushButtonCallbackStruct *) call_data;
switch (cb->reason) {
case XmCR_ACTIVATE:
break;
case XmCR_ARM:
[butid setState:1];
break;
case XmCR_DISARM:
[butid _sendActionFrom:butid];
if ( ![butid _radioType] ) {
[butid setState:0];
}
break;
default:
}
return;
}
static void
theToggleCallback(Widget w, XtPointer client_data, XtPointer call_data)
{
ButtonCell *butid = (ButtonCell*) client_data;
XmToggleButtonCallbackStruct *cb
= (XmToggleButtonCallbackStruct *) call_data;
Boolean value;
switch (cb->reason) {
case XmCR_VALUE_CHANGED:
XtVaGetValues(w, XmNset, &value, NULL);
if ([butid _radioType] == 1) { /* If radio already set, do nothing */
if (!value) { /* We just turned it off, so */
value = 1; /* turn it back on again */
XtVaSetValues(w, XmNset, value, NULL);
return;
}
}
if (value) [butid setState:1];
else [butid setState:0];
[butid _sendActionFrom:butid];
break;
default:
}
return;
}
static Pixel
highlightColor( void )
{
Display *disp = [NXApp _X_display];
return XWhitePixel(disp, XDefaultScreen(disp) );
}
@implementation ButtonCell(WidgetSet)
/* initialization */
- _init
{
if (widgetType == NXBUTTON) {
classname = xmPushButtonWidgetClass;
} else {
classname = xmToggleButtonWidgetClass;
}
[self _addArg:XmNrecomputeSize:False];
return self;
}
- _copy
{
[super _copy];
[self _addArg:XmNrecomputeSize:False];
return self;
}
- _getSizeAdjust:(NXSize *)size
{
size->width = 4;
size->height = 4;
return self;
}
- _setStringValue:(const char *)aString
{
XmString xstring;
xstring = XmStringCreateLtoR((char *)aString, XmSTRING_DEFAULT_CHARSET);
[self _setArg:XmNlabelString to:(XtArgVal)xstring];
return self;
}
- _setState:(int)value
{
Pixel white;
int localState;
white = highlightColor();
if (widgetType == NXBUTTON) {
if (value) {
[self _setArg:XmNbackground to:white];
} else {
[self _setArg:XmNbackground to:backgroundColor];
}
} else {
localState = (value) ? 1 : 0;
[self _setArg:XmNset to:localState];
}
return self;
}
- _setPopUp
{
[self _setArg:XmNlabelType to:XmSTRING];
/* DO NOT CALL [self setStringValue:] */
[self _setStringValue:contents];
if (widgetType == NXBUTTON) {
if(icon) [self _setArg:XmNlabelType to:XmPIXMAP];
}
return self;
}
- _addCallback
{
if (widgetType == NXBUTTON) {
XtAddCallback(widgetid, XmNactivateCallback, thePushCallback, self);
XtAddCallback(widgetid, XmNarmCallback, thePushCallback, self);
XtAddCallback(widgetid, XmNdisarmCallback, thePushCallback, self);
} else {
XtAddCallback(widgetid, XmNvalueChangedCallback,
theToggleCallback, self);
}
return self;
}
- _managedBy:parent
{
Pixmap pixmap;
Pixel white, foreground, background;
Widget toplevel;
switch ( widgetType ) {
case NXRADIO :
[self _addArg:XmNindicatorType :XmONE_OF_MANY ];
break;
case NXSWITCH :
[self _addArg:XmNindicatorType :XmN_OF_MANY ];
break;
default:
}
if (widgetType != NXBUTTON) {
classname = xmToggleButtonWidgetClass;
}
[super _managedBy:parent];
if (widgetType == NXBUTTON) {
white = highlightColor();
[self _setArg:XmNarmColor to:white];
toplevel = [[controlView window] _widget];
XtVaGetValues(toplevel,XmNbackground, &backgroundColor, NULL);
if (icon) {
toplevel = [[parent window] _shell];
XtVaGetValues(toplevel, XmNforeground, &foreground,
XmNbackground, &background, NULL);
foreground = BlackPixelOfScreen(XtScreen(toplevel));
pixmap = XmGetPixmap(XtScreen(toplevel),
iconFile, foreground, background);
[self _setArg:XmNarmPixmap to:pixmap];
}
}
[self setState:[self state]];
parentid = parent;
return self;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.