This is PasswordFieldCell.m in view mode; [Download] [Up]
#import "PasswordFieldCell.h"
#import <appkit/appkit.h>
#import <stdio.h>
@implementation PasswordFieldCell
static PasswordFieldCell *activeCell;
/*
typedef struct _NXLayInfo {
NXRect rect;
NXCoord descent;
NXCoord width;
NXCoord left;
NXCoord right;
NXCoord rightIndent;
NXLayArray *lays;
NXWidthArray *widths;
NXCharArray *chars;
NXTextCache cache;
NXRect *textClipRect;
struct _lFlags {
unsigned int horizCanGrow:1;
unsigned int vertCanGrow:1;
unsigned int erase:1;
unsigned int ping:1;
unsigned int endsParagraph:1;
unsigned int resetCache:1;
} lFlags;
} NXLayInfo;
typedef struct _NXSelPt {
int cp; // Character position
int line; // Offset of LineDesc in break table
NXCoord x; // x coordinate
NXCoord y; // y coordinate
int c1st; // Character position of first character on the line
NXCoord ht; // Line height
} NXSelPt;
*/
int DrawALine(Text *textObj, NXLayInfo *layInfo)
{
Font *fontObj;
int c, charCount;
const NXRect *rect = &layInfo->rect;
NXSelPt start, end;
PSsetgray([textObj backgroundGray]);
NXRectFill(rect);
if( [activeCell isVisible] == YES )
return NXDrawALine(textObj, layInfo);
charCount = layInfo->lays[0].lays[0].chars;
if( charCount == 1 )
if( layInfo->chars->text[0] == '\n' )
charCount = 0;
// Draw a string of charCount of the hiddenChar
if( charCount > 0 )
{
char buffer[charCount], hiddenChar;
fontObj = [textObj font];
[fontObj set];
PSsetgray([textObj textGray]);
PSmoveto(layInfo->rect.origin.x, layInfo->rect.size.height);
hiddenChar = [activeCell hiddenChar];
for(c = 0; c < charCount; c ++)
buffer[c] = hiddenChar;
buffer[c] = 0;
PSshow(buffer);
}
[textObj getSel: &start : &end];
if( end.cp > start.cp )
{ // Calc highlight area
NXRect hrect;
hrect.origin.x = start.x;
hrect.origin.y = start.y;
hrect.size.width = end.x - start.x;
hrect.size.height = start.ht;
NXHighlightRect(&hrect);
}
return 0;
}
- initTextCell:(const char *) aString
{
[super initTextCell: aString];
[super setScrollable: YES];
[super setWrap: NO];
password[0] = 0;
if( aString != 0 )
strcpy(password, aString);
hiddenChar = '*';
[self setIsVisible: NO];
editor = nil;
return self;
}
- (const char *) stringValue
{
//fprintf(stderr, "%s: stringValue<%s>\n", [self name], password);
if( password[0] == 0 )
return 0;
return password;
}
- setStringValue:(const char *) aString
{
//fprintf(stderr, "%s: setStringValue<%s>\n", [self name], aString);
password[0] = 0;
if( aString != 0 )
strcpy(password, aString);
if( isVisible == NO )
[self setStringValueNoCopy: [self hiddenString] shouldFree: NO];
else
[self setStringValueNoCopy: password shouldFree: NO];
return self;
}
- setIsVisible:(BOOL) flag
{
//fprintf(stderr, "%s: setIsVisible<%d>, pw=%s\n", [self name],
// flag, password);
isVisible = flag;
if( isVisible == NO )
contents = [self hiddenString];
else
contents = password;
return self;
}
- (BOOL) isVisible
{
return isVisible;
}
- editor
{
return editor;
}
- setHiddenChar:(unsigned short) value
{
hiddenChar = value;
return self;
}
- (const char *) hiddenString
{
static char buffer[128];
int c, charCount;
charCount = strlen(password);
for(c = 0; c < charCount; c ++)
buffer[c] = hiddenChar;
buffer[c] = 0;
return buffer;
}
- (unsigned short) hiddenChar
{
return hiddenChar;
}
- edit:(const NXRect *)aRect inView:controlView editor: textObj delegate:anObject event:(NXEvent *)theEvent
{
id ret;
//fprintf(stderr, "%s: edit\n", [self name]);
editor = textObj;
prevDrawFunc = [editor drawFunc];
activeCell = self;
contents = password;
[editor setDrawFunc:(NXTextFunc)DrawALine];
ret = [super edit: aRect inView: controlView editor: textObj
delegate: anObject event: theEvent];
return ret;
}
- select:(const NXRect *)aRect inView: aView editor: textObj
delegate: anObject start:(int) selStart length:(int) selLength
{
id ret;
//fprintf(stderr, "%s: select\n", [self name]);
editor = textObj;
prevDrawFunc = [editor drawFunc];
[editor setDrawFunc:(NXTextFunc)DrawALine];
activeCell = self;
contents = password;
ret = [super select: aRect inView: aView editor: textObj
delegate: anObject start: selStart length: selLength];
return ret;
}
- endEditing: textObject
{
id ret;
//fprintf(stderr, "%s: endEditing\n", [self name]);
ret = [super endEditing: textObject];
[textObject setDrawFunc: prevDrawFunc];
editor = nil;
activeCell = nil;
return ret;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.