This is xmText.m in view mode; [Download] [Up]
/* WidgetSet category for implementation of Text class
*
* Copyright (C) 1994 The Board of Trustees of
* The Leland Stanford Junior University. All Rights Reserved.
*
* Authors: Mike Kienenberger (Alaska) and Jeff Kamerer (SLAC)
*
* This file is part of an Objective-C class library for X/Motif
*
* xmText.m,v 1.11 1995/04/19 00:42:59 pfkeb Exp
*/
#include "Text.h"
#include "xtResponder.h"
#include "Application.h"
#include <stdlib.h>
#include <string.h>
#include "Motif.h"
#include "stdmacros.h"
#include <Xm/Text.h>
@interface View(WidgetSet)
- _init;
- _managedBy:parent wid:(void *)widget;
- _setFrame:(const NXRect *)aFrame;
@end
char *TextInstanceName( void )
{
return "Text";
}
static void theToggleCallback(Widget w, XtPointer client_data,
XtPointer call_data)
{
Text *textid = (Text *) client_data;
XmTextVerifyCallbackStruct *cb = (XmTextVerifyCallbackStruct *)call_data;
switch (cb->reason) {
case XmCR_VALUE_CHANGED:
[textid _textDidChange];
break;
case XmCR_MODIFYING_TEXT_VALUE:
[textid _textWillChange:cb];
break;
}
return;
}
@implementation Text(WidgetSet)
/* initialization */
- _textWillChange:(void *)tcb
{
XmTextVerifyCallbackStruct *cb = (XmTextVerifyCallbackStruct *) tcb;
char *theString;
int i;
if (_justKilledWidget) {
_justKilledWidget = NO;
return self;
}
theString = XmTextGetString(widgetid);
for (i = cb->startPos; i < cb->endPos; i++) {
if (theString[i] == '\n') {
_numTextLines--;
}
}
for (i = 0; i < cb->text->length; i++) {
if (cb->text->ptr[i] == '\n') {
_numTextLines++;
}
}
XtFree(theString);
return self;
}
- _textDidChange
{
short numRows;
Dimension width;
char *theString;
int length;
int nTextLines, widthInt;
if (_waitToKillWidget) {
return self;
}
theString = XmTextGetString(widgetid);
length = strlen(theString);
XtVaGetValues(widgetid, XmNrows, &numRows, NULL);
if (numRows < _numTextLines) {
if (_textString != theString) {
free(_textString);
_textString = malloc((length + 1) * sizeof(char));
strcpy(_textString, theString);
}
XtVaGetValues(widgetid, XmNwidth, &width, NULL);
XtDestroyWidget(widgetid);
widgetid = NULL;
_justKilledWidget = YES;
nTextLines = _numTextLines;
[self _addArg:XmNrows :nTextLines];
widthInt = width;
[self _addArg:XmNwidth :widthInt];
[self _managedBy:superview];
[superview descendantFrameChanged:self];
}
XtFree(theString);
return self;
}
- _addCallback
{
XtAddCallback(widgetid, XmNmodifyVerifyCallback,
theToggleCallback, self);
XtAddCallback(widgetid, XmNvalueChangedCallback,
theToggleCallback, self);
return self;
}
- _init;
{
if ( _justKilledWidget == NO ) {
[super _init]; // don't want frame initialization if re-sizing
}
classname = xmTextWidgetClass;
[self _addArg:XmNeditMode :XmMULTI_LINE_EDIT];
return self;
}
- _setText
{
char *p;
if (_textString) {
_waitToKillWidget = YES;
_numTextLines = 0;
for ( p = _textString; *p != '\0'; p++ ) {
if ( *p == '\n' ) {
_numTextLines++;
}
}
[self _setArg:XmNvalue to:(XtArgVal) _textString];
}
return self;
}
- _setFont
{
char *fontName = "-adobe-helvetica-medium-r-*-*-12-*-*-*-*-*-*-*";
XFontStruct *font;
XmFontList fontList;
Display *disp = [NXApp _X_display];
Pixel black, white;
font = XLoadQueryFont( disp, fontName );
fontList = XmFontListCreate( font, XmSTRING_DEFAULT_CHARSET );
black = XBlackPixel(disp, XDefaultScreen(disp));
white = XWhitePixel(disp, XDefaultScreen(disp));
[self _setArg:XmNfontList to:(XtArgVal)fontList];
[self _setArg:XmNforeground to:black];
[self _setArg:XmNbackground to:white];
return self;
}
- _managedBy:parent wid:(void *)widget
{
[super _managedBy:parent wid:widget];
if (widgetid) {
Dimension width, height;
XtVaGetValues(widgetid, XmNwidth, &width, NULL);
XtVaGetValues(widgetid, XmNheight, &height, NULL);
[self sizeTo:(int)width :(int)height];
[self _setFont];
[self _setArg:XmNvalue to:(XtArgVal)_textString];
}
return self;
}
- _setSel:(int)start :(int)end
{
if (widgetid) {
XmTextSetSelection(widgetid, start, end, 0);
}
return self;
}
- (int)_getSubstring:(char *)buf start:(int)startPos length:(int)numChars
{
char *wholeString = XmTextGetString(widgetid);
int length = strlen(wholeString);
int willMove;
if (startPos >= length) {
return (-1);
}
/* bug fix: added "+1" so that '\0' can be copied too if requested.
* (see NeXTStep reference) -MTL
*/
willMove = MIN(numChars, length - startPos+1);
strncpy(buf, &(wholeString[startPos]), willMove);
return willMove;
}
- (int)_textLength
{
if (widgetid) {
return XmTextGetLastPosition(widgetid);
}
return 0;
}
- _replaceSel:(const char *)aString
{
XmTextPosition start, end;
if (widgetid) {
_waitToKillWidget = YES;
XmTextGetSelectionPosition(widgetid, &start, &end);
XmTextReplace(widgetid, start, end, (char *)aString);
}
return self;
}
- _preReadText
{
_waitToKillWidget = YES;
return self;
}
- _postReadText
{
_waitToKillWidget = NO;
[self _textDidChange];
return self;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.