This is PXKTextField.m in view mode; [Download] [Up]
/*
PXKTextField.m
NSTextField for GNUstep GUI X/DPS Backend.
Copyright (C) 1996 Free Software Foundation, Inc.
Author: Pascal Forget <pascal@wsc.com>
Date: March 1996
This file is part of the GNUstep GUI X/DPS Backend.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
If you are interested in a warranty or support for this source code,
contact Scott Christley <scottc@net-community.com> for more information.
You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free
Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <gnustep/xdps/PXKTextField.h>
#include <gnustep/xdps/PXKView.h>
#include <gnustep/xdps/PXKApplication.h>
XFontStruct *win_font;
@implementation PXKTextField
- initWithFrame:(NSRect)frameRect;
{
[super initWithFrame:frameRect];
// isBeingEdited = NO;
return self;
}
- (void)display;
{
[super display];
XClearWindow(pxkDisplay, [(PXKView *)self xWindow]);
if ([self isEnabled] == NO) {
XDefineCursor(pxkDisplay,[(PXKView *)self xWindow],
XCreateFontCursor(pxkDisplay, XC_xterm));
}
[self drawRect:bounds];
[self drawBorder];
}
- (void)drawRect:(NSRect)rect;
{
int len1;
int width;
int font_height;
NSString *value;
NSTextAlignment alignment = [self alignment];
/* need length for both XTextWidth and XDrawString */
value = [self stringValue];
len1 = [value length];
if (!win_font) {
fprintf(stderr, "Error loading font. Exiting.\n");
exit(-1);
}
/* get string widths for centering */
width = XTextWidth(win_font, [value cString], len1);
font_height = win_font->ascent + win_font->descent;
/*
* Wipe out the contents of the window by filling its
* area with the backGroundColor (defined in PXKView.h)
*/
XFillRectangle(pxkDisplay, [(PXKView *)self xWindow], pxkWhiteGC,
frame.origin.x+2, frame.origin.y+2,
frame.size.width-4, frame.size.height-4);
[self drawBorder];
if((alignment == NSLeftTextAlignment) && (width < frame.size.width)) {
XDrawString(pxkDisplay, [(PXKView *)self xWindow], pxkBlackGC,
5, font_height,
[value cString], len1);
} else if((alignment == NSRightTextAlignment)
&& ((width+5)<frame.size.width)) {
XDrawString(pxkDisplay, [(PXKView *)self xWindow], pxkBlackGC,
frame.size.width - 5 - width, font_height,
[value cString], len1);
} else {
if (width > (frame.size.width-4)) {
XDrawString(pxkDisplay, [(PXKView *)self xWindow], pxkBlackGC,
(frame.size.width - width-5),
font_height, [value cString], len1);
} else {
/* output text, centered on each line */
XDrawString(pxkDisplay, [(PXKView *)self xWindow], pxkBlackGC,
(frame.size.width - width-6)/2,
font_height, [value cString], len1);
}
}
}
- drawBorder;
{
if (!win_font) {
load_font(&win_font);
}
XDrawLine(pxkDisplay, [(PXKView *)self xWindow], pxkBlackGC,
0, 0, frame.size.width,0);
XDrawLine(pxkDisplay, [(PXKView *)self xWindow], pxkBlackGC,
0, 0, 0, frame.size.height);
XFlush(pxkDisplay);
/* Draw the bottom and right borders */
XDrawLine(pxkDisplay, [(PXKView *)self xWindow], pxkLightgrayGC,
2, frame.size.height-2,
frame.size.width,frame.size.height-2);
XDrawLine(pxkDisplay, [(PXKView *)self xWindow], pxkLightgrayGC,
frame.size.width-2, 2,
frame.size.width-2, frame.size.height-2);
return self;
}
/*
* Get characters until you encounter
* a carriage return, return number of characters.
* Deal with backspaces, etc. Deal with Expose events
* on all windows associated with this application.
* Deal with keyboard remapping.
*/
#if 0
- keyDown:(XEvent *)e;
{
XEvent report;
KeySym keysym;
XComposeStatus compose;
int count, length;
char buffer[MAX_MAPPED_STRING_LENGTH];
int bufsize=MAX_MAPPED_STRING_LENGTH;
report = *e;
fprintf(stdout, "PXKTextField keyDown:\n");
count = XLookupString(&report, buffer, bufsize, &keysym, &compose);
/*
* now need to do the right thing with
* every keysym possibility, as minimum:
*/
if ((keysym == XK_Return) ||
(keysym == XK_KP_Enter) ||
(keysym == XK_Linefeed))
{
//isBeingEdited = NO;
} else if (((keysym >= XK_KP_Space) && (keysym <= XK_KP_9))
||
((keysym >= XK_space) && (keysym <= XK_asciitilde)))
{
if ((strlen(stringValue) + count) >= 2048)
{
XBell(pxkDisplay, 0);
} else {
if (stringValue!= NULL) {
stringValue = realloc(stringValue,
strlen(stringValue) + count + 1);
} else {
stringValue = malloc(count + 1);
}
(void)strncat(stringValue, buffer, count);
}
}
else if ((keysym >= XK_Shift_L) && (keysym <= XK_Hyper_R))
;/* do nothing because its a modifier key */
else if ((keysym >= XK_F1) && (keysym <= XK_F35))
if (buffer == NULL)
printf("Unmapped function key\n");
else if ((strlen(stringValue) + count)>= MAX_POPUP_STRING_LENGTH)
{
XBell(pxkDisplay, 0);
} else {
if (stringValue!= NULL) {
stringValue = realloc(stringValue,
strlen(stringValue) + count + 1);
} else {
stringValue = malloc(count + 1);
}
(void)strncat(stringValue, buffer, count);
}
else if ((keysym == XK_BackSpace) || (keysym == XK_Delete)) {
if ((length = strlen(stringValue)) > 0) {
stringValue[length - 1] = NULL;
XClearWindow(pxkDisplay, xWindow);
} else {
XBell(pxkDisplay, 0);
}
}
else {
printf("keysym %s is not handled\n",
XKeysymToString(keysym));
XBell(pxkDisplay, 0);
}
[self display];
/* clear buffer so multi-character strings
* are properly supported, even though
* they can only be deleted one char at a
* time */
buffer[1] = NULL;
return self;
}
- mouseDown:(XEvent *)e;
{
fprintf(stdout, "PXKTextField mouseDown:\n");
// if (!isBeingEdited) {
XSelectInput(pxkDisplay, xWindow, (ExposureMask | KeyPressMask));
[self display];
//isBeingEdited = YES;
// } else {
/* Nothing to do (until selection is implemented) */
//}
return self;
}
#endif
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.