This is BlinkTextField.m in view mode; [Download] [Up]
/* Blinking text object by Joe Freeman 1/10 */
/* ((Idea by Charles Oei)) */
/* Broken to work with IB by David Stutz 2/6 */
/*
/* Purpose:
/* supply a simple interface to make blinking text
/* for warning or informational messages
/*
/* Defaults
/* 1.0 second blink rate
/* centered text
/* no bezel
/* no border
/* no support
/* you really don't want to enable editing or selection, do you?
*/
#import "BlinkTextField.h"
#import <appkit/appkit.h>
#import <streams/error.h>
@implementation BlinkTextField
+ newFrame:(const NXRect *)frameRect
{
self = [super newFrame:frameRect];
[self setEditable:NO];
[self setSelectable:NO];
interval = 1.0;
priority = NX_RUNMODALTHRESHOLD;
which = 0;
teNum = 0;
[self setBackgroundGray:NX_LTGRAY];
[self setTextGray:NX_BLACK];
[self setAlignment:NX_CENTERED];
[self setBezeled:NO];
[self setBordered:NO];
[self setFont:[Font newFont:"Helvetica" size:18]];
[self setStringValue:"Blinker!"];
[self setBlink:NO];
return self;
}
- setTextGray:(float)newGray
{
realGray = newGray;
[super setTextGray:newGray];
return self;
}
- flashGray
{
if (which) {
[super setTextGray:[self backgroundGray]];
which = 0;
} else {
[super setTextGray:realGray];
which = 1;
}
return self;
}
- setEditable:(BOOL)flag
{
[super setEditable:NO];
return self;
}
- setSelectable:(BOOL)flag
{
[super setSelectable:NO];
return self;
}
- (float)realGray
{
return realGray;
}
- free
{
[self setBlink:NO];
// can't free here because of async notification from DPS
// this could be fixed with a delayed free easily, but I'm just a lazy kind of guy
return nil;
}
- read:(NXTypedStream*)s
{
[super read:s];
NXReadTypes(s,"fdii", &realGray, &interval, &active, &priority);
if (active)
[self setBlink:YES];
return self;
}
- write:(NXTypedStream*)s
{
[super write:s];
NXWriteTypes(s,"fdii", &realGray, &interval, &active, &priority);
return self;
}
DPSTimedEntryProc flashMsg (DPSTimedEntry teNum, double now, char* myself)
{
if ([(id)myself isBlinking])
[(id)myself flashGray];
}
- deferredSetBlink:(BOOL)flag
{
active = flag;
return self;
}
- setBlink:(BOOL)flag
{
if (flag){
teNum = DPSAddTimedEntry(interval, flashMsg, (void*)self, priority);
}else{
if (teNum != 0) {
DPSRemoveTimedEntry (teNum);
NXPing();
}
[super setTextGray:realGray];
teNum = 0;
}
active = flag;
return self;
}
- setBlinkRate:(double)theRate
{
if (theRate > 0.0){
interval = theRate;
if (teNum != 0){
[self setBlink:NO];
NXPing();
[self setBlink:YES];
}
}
return self;
}
- (double)blinkRate
{
return interval;
}
- (int)isBlinking
{
return active;
}
- (const char*)inspectorName
{
return "BTFInspector";
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.