home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Nebula
/
nebula.bin
/
SourceCode
/
Palettes
/
Clocks
/
CalendarClock.m
< prev
next >
Wrap
Text File
|
1992-12-05
|
9KB
|
358 lines
//----------------------------------------------------------------------------------------------------
//
// CalendarClock
//
// Inherits From: Clock
//
// Declared In: CalendarClock.h
//
// Disclaimer
//
// You may freely copy, distribute and reuse this software and its
// associated documentation. I disclaim any warranty of any kind,
// expressed or implied, as to its fitness for any particular use.
//
//----------------------------------------------------------------------------------------------------
#import "CalendarClock.h"
#define TIMESTRING_OFFSET 8.0
#define DAYSTRING_OFFSET 3.0
#define DATESTRING_OFFSET 28.0
#define MONTHSTRING_OFFSET 27.0
static const char* DAYS [7] = { "SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT" };
static const char* MONTHS [12] =
{ "JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC" };
static id timeFont;
static id dayOfWeekFont;
static id dateFont;
static id monthFont;
@implementation CalendarClock
//----------------------------------------------------------------------------------------------------
// Private Methods
//----------------------------------------------------------------------------------------------------
- (NXPoint) _locationForString: (STR)aString usingFont: aFont
{
NXPoint stringLocation;
stringLocation.x = ((NX_WIDTH(&bounds) - [aFont getWidthOf:aString]) / 2.0);
stringLocation.y = ((NX_HEIGHT(&bounds) / 2.0) + ([aFont pointSize] / 2.0));
return stringLocation;
}
- _drawDayOfWeek
{
char stringBuffer[5];
NXPoint stringLocation;
sprintf (stringBuffer,"%s", DAYS[WEEKDAY(displayTimeAndDate)]);
stringLocation = [self _locationForString:stringBuffer usingFont: dayOfWeekFont];
NXSetColor (weekdayColor);
[dayOfWeekFont set];
PSmoveto (stringLocation.x, stringLocation.y - DAYSTRING_OFFSET);
PSshow (stringBuffer);
return self;
}
- _drawDate
{
char stringBuffer[5];
NXPoint stringLocation;
sprintf (stringBuffer,"%d", DAY(displayTimeAndDate));
stringLocation = [self _locationForString:stringBuffer usingFont: dateFont];
NXSetColor (dateColor);
[dateFont set];
PSmoveto (stringLocation.x, stringLocation.y - DATESTRING_OFFSET);
PSshow (stringBuffer);
return self;
}
- _drawMonth
{
char stringBuffer[10];
NXPoint stringLocation;
if (wantsYear)
sprintf (stringBuffer,"%s%.2d",
MONTHS[MONTH(displayTimeAndDate)], YEAR(displayTimeAndDate));
else
sprintf (stringBuffer,"%s", MONTHS[MONTH(displayTimeAndDate)]);
stringLocation = [self _locationForString:stringBuffer usingFont: monthFont];
NXSetColor (monthColor);
[monthFont set];
PSmoveto (stringLocation.x, stringLocation.y - MONTHSTRING_OFFSET);
PSshow (stringBuffer);
return self;
}
//----------------------------------------------------------------------------------------------------
// Initialization and Freeing
//----------------------------------------------------------------------------------------------------
+ initialize
{
timeFont = [Font newFont:"Times-Italic" size:14 style:0 matrix:NX_IDENTITYMATRIX];
dayOfWeekFont = [Font newFont:"Helvetica" size:8 style:0 matrix:NX_IDENTITYMATRIX];
dateFont = [Font newFont:"Times-Roman" size:24 style:0 matrix:NX_IDENTITYMATRIX];
monthFont = [Font newFont:"Helvetica-Oblique" size:9 style:0 matrix:NX_IDENTITYMATRIX];
return self;
}
- initFrame: (const NXRect *)aRect
{
// Give default characteristics. Fix size to 64 x 64.
NXRect frameRect;
NXSetRect (&frameRect, NX_X(aRect), NX_Y(aRect), 64.0, 64.0);
[super initFrame:&frameRect];
[self clockFace: [NXImage findImageNamed: "CalendarFace"]];
[self timeColor: NX_COLORGREEN];
[self weekdayColor: NX_COLORBLACK];
[self dateColor: NX_COLORBLACK];
[self monthColor: NX_COLORRED];
[self wantsDate: YES];
[self wantsYear: NO];
return self;
}
//----------------------------------------------------------------------------------------------------
// Accessing Display Colors
//----------------------------------------------------------------------------------------------------
- timeColor: (NXColor) aColor
{
timeColor = aColor;
[self update];
return self;
}
- weekdayColor: (NXColor) aColor;
{
weekdayColor = aColor;
[self update];
return self;
}
- dateColor: (NXColor) aColor;
{
dateColor = aColor;
[self update];
return self;
}
- monthColor: (NXColor) aColor;
{
monthColor = aColor;
[self update];
return self;
}
- (NXColor) timeColor
{
return timeColor;
}
- (NXColor) weekdayColor;
{
return weekdayColor;
}
- (NXColor) dateColor;
{
return dateColor;
}
- (NXColor) monthColor;
{
return monthColor;
}
//----------------------------------------------------------------------------------------------------
// Enabling Year Display
//-----------------------------------------------------------------------------------------------------
- wantsYear: (BOOL) aFlag
{
wantsYear = aFlag;
[self update];
return self;
}
- (BOOL) wantsYear
{
return wantsYear;
}
//----------------------------------------------------------------------------------------------------
// Action Methods
//----------------------------------------------------------------------------------------------------
- takeWantsYearFlagFrom :sender
{
if ([sender isKindOf: [Matrix class]])
sender = [sender selectedCell];
if ([sender respondsTo: @selector (state)])
[self wantsYear: [sender state]];
return self;
}
- takeTimeColorFrom: sender
{
if ([sender respondsTo: @selector (color)]) [self timeColor: [sender color]];
return self;
}
- takeWeekdayColorFrom: sender
{
if ([sender respondsTo: @selector (color)]) [self weekdayColor: [sender color]];
return self;
}
- takeDateColorFrom: sender
{
if ([sender respondsTo: @selector (color)]) [self dateColor: [sender color]];
return self;
}
- takeMonthColorFrom: sender
{
if ([sender respondsTo: @selector (color)]) [self monthColor: [sender color]];
return self;
}
//-----------------------------------------------------------------------------------------------------
// Draw Methods
//-----------------------------------------------------------------------------------------------------
- drawTime
{
int hour = HOUR(displayTimeAndDate);
char stringBuffer[10];
NXPoint stringLocation;
if (! flags.wantsMilitaryTime)
{
hour = fmod (HOUR(displayTimeAndDate),12);
if (! hour) hour = 12;
}
if (flags.wantsMilitaryTime)
sprintf (stringBuffer, "%.2d:%.2d", hour, MINUTE(displayTimeAndDate));
else
sprintf (stringBuffer, "%d:%.2d", hour, MINUTE(displayTimeAndDate));
if (flags.wantsSeconds)
sprintf (stringBuffer, "%s:%.2d", stringBuffer, SECOND(displayTimeAndDate));
else
if (! flags.wantsMilitaryTime)
sprintf (stringBuffer, "%s %s",
stringBuffer,
(HOUR(displayTimeAndDate) < 12 ? "am" : "pm"));
stringLocation = [self _locationForString:stringBuffer usingFont: timeFont];
[timeFont set];
NXSetColor (timeColor);
PSmoveto (stringLocation.x, stringLocation.y + TIMESTRING_OFFSET);
PSshow (stringBuffer);
return self;
}
- drawDate
{
[self _drawDayOfWeek];
[self _drawDate];
[self _drawMonth];
return self;
}
//----------------------------------------------------------------------------------------------------
// Archiving Methods
//----------------------------------------------------------------------------------------------------
- read: (NXTypedStream*) stream
{
[super read: stream];
timeColor = NXReadColor (stream);
weekdayColor = NXReadColor (stream);
dateColor = NXReadColor (stream);
monthColor = NXReadColor (stream);
NXReadTypes (stream, "c", &wantsYear);
return self;
}
- write: (NXTypedStream*) stream
{
[super write: stream];
NXWriteColor (stream, timeColor);
NXWriteColor (stream, weekdayColor);
NXWriteColor (stream, dateColor);
NXWriteColor (stream, monthColor);
NXWriteTypes (stream, "c", &wantsYear);
return self;
}
//----------------------------------------------------------------------------------------------------
// Superclass Overrides
//----------------------------------------------------------------------------------------------------
- wantsDate: (BOOL) aFlag
{
return [super wantsDate: YES];
}
//----------------------------------------------------------------------------------------------------
// IB Methods
//----------------------------------------------------------------------------------------------------
- getMinSize:(NXSize *)minSize maxSize:(NXSize *)maxSize from:(int)where
{
// Constrains resize within IB.
minSize->width = maxSize->width = 64.0;
minSize->height = maxSize->height = 64.0;
return self;
}
- (const char*) getInspectorClassName
{
// Returns the name of the class responsible for managing custom
// IB Attributes inspection.
return "CalendarClockInspector";
}
@end