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
- initFrame:(const NXRect *)frameRect
{
self = [super initFrame: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;
}
void 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,(DPSTimedEntryProc)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*)getInspectorClassName
{
return "BTFInspector";
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.