This is MiscClockView.m in view mode; [Download] [Up]
//
// MiscClockView.m -- a simple view class for displaying date/time
// Written by Scott Anguish Copyright (c) 1993 by Scott Anguish.
// Version 1.2. All rights reserved.
//
// This notice may not be removed from this source code.
//
// This object is included in the MiscKit by permission from the author
// and its use is governed by the MiscKit license, found in the file
// "LICENSE.rtf" in the MiscKit distribution. Please refer to that file
// for a list of all applicable permissions and restrictions.
//
// Aug 30, 1996 Converted to OpenStep by Jeremy Bettis <jeremy@hksys.com>
#import <sys/time.h>
#import "MiscClockView.h"
#import <AppKit/NSImage.h>
#import <AppKit/psopsOpenStep.h>
@interface MiscClockView(private)
- (void)_setUp;
@end
@implementation MiscClockView
#define Misc_BuildRect(a, b, c, d, e) a = NSMakeRect((b), (c), (d), (e));
+ (void)initialize
{
[MiscClockView setVersion:4];
return;
}
- (void)_setUp
{
NSSize oneSize, twoSize;
if (theImage) return; // don't want to leak!
theImage = [[NSImage alloc] initByReferencingFile:[[NSBundle bundleForClass:[self class]] pathForResource:@"MiscClockStuff" ofType:@"tiff"]];
/* Yes this is ugly, and there is alot of extra junk in here, but to a
* large degree at this point I didn't know where else to store these
* co-ordinates where I wouldn't loose them! */
Misc_BuildRect (imageA, 65.0, 0.0, 9.0, 11.0);
Misc_BuildRect (imageP, 74.0, 0.0, 9.0, 11.0);
Misc_BuildRect (DigitalNumbers[1], 89.0, 0.0, 4.0, 11.0);
Misc_BuildRect (DigitalNumbers[2], 93.0, 0.0, 9.0, 11.0);
Misc_BuildRect (DigitalNumbers[3], 104.0, 0.0, 8.0, 11.0);
Misc_BuildRect (DigitalNumbers[4], 112.0, 0.0, 9.0, 11.0);
Misc_BuildRect (DigitalNumbers[5], 121.0, 0.0, 9.0, 11.0);
Misc_BuildRect (DigitalNumbers[6], 130.0, 0.0, 9.0, 11.0);
Misc_BuildRect (DigitalNumbers[7], 140.0, 0.0, 8.0, 11.0);
Misc_BuildRect (DigitalNumbers[8], 148.0, 0.0, 9.0, 11.0);
Misc_BuildRect (DigitalNumbers[9], 157.0, 0.0, 9.0, 11.0);
Misc_BuildRect (DigitalNumbers[0], 166.0, 0.0, 9.0, 11.0);
Misc_BuildRect (imageColon, 175.0, 0.0, 3.0, 11.0);
Misc_BuildRect (imageAM, 179.0, 0.0, 12.0, 6.0);
Misc_BuildRect (imagePM, 192.0, 0.0, 11.0, 6.0);
Misc_BuildRect (DayNames[1], 0, 65, 19, 5);
Misc_BuildRect (DayNames[2], 0, 59, 19, 5);
Misc_BuildRect (DayNames[3], 0, 53, 19, 5);
Misc_BuildRect (DayNames[4], 0, 47, 19, 5);
Misc_BuildRect (DayNames[5], 0, 41, 19, 5);
Misc_BuildRect (DayNames[6], 0, 35, 19, 5);
Misc_BuildRect (DayNames[0], 0, 29, 19, 5);
Misc_BuildRect (MonthNames[0], 40, 66, 22, 5);
Misc_BuildRect (MonthNames[1], 40, 60, 22, 5);
Misc_BuildRect (MonthNames[2], 40, 54, 22, 5);
Misc_BuildRect (MonthNames[3], 40, 48, 22, 5);
Misc_BuildRect (MonthNames[4], 40, 42, 22, 5);
Misc_BuildRect (MonthNames[5], 40, 36, 22, 5);
Misc_BuildRect (MonthNames[6], 40, 30, 22, 5);
Misc_BuildRect (MonthNames[7], 40, 24, 22, 5);
Misc_BuildRect (MonthNames[8], 40, 18, 22, 5);
Misc_BuildRect (MonthNames[9], 40, 12, 22, 5);
Misc_BuildRect (MonthNames[10], 40, 6, 22, 5);
Misc_BuildRect (MonthNames[11], 40, 0, 22, 5);
Misc_BuildRect (DateNumbers[0], 172.0, 14.0, 10.0, 17.0);
Misc_BuildRect (DateNumbers[1], 65.0, 14.0, 8.0, 17.0);
Misc_BuildRect (DateNumbers[2], 76.0, 14.0, 10.0, 17.0);
Misc_BuildRect (DateNumbers[3], 88.0, 14.0, 9.0, 17.0);
Misc_BuildRect (DateNumbers[4], 100.0, 14.0, 10.0, 17.0);
Misc_BuildRect (DateNumbers[5], 112.0, 14.0, 10.0, 17.0);
Misc_BuildRect (DateNumbers[6], 124.0, 14.0, 10.0, 17.0);
Misc_BuildRect (DateNumbers[7], 136.0, 14.0, 10.0, 17.0);
Misc_BuildRect (DateNumbers[8], 148.0, 14.0, 10.0, 17.0);
Misc_BuildRect (DateNumbers[9], 160.0, 14.0, 10.0, 17.0);
Misc_BuildRect (YearNumbers[0], 12.0, 8.0, 6.0, 5.0);
Misc_BuildRect (YearNumbers[1], 0.0, 20.0, 2.0, 5.0);
Misc_BuildRect (YearNumbers[2], 2.0, 20.0, 5.0, 5.0);
Misc_BuildRect (YearNumbers[3], 7.0, 20.0, 5.0, 5.0);
Misc_BuildRect (YearNumbers[4], 12.0, 20.0, 5.0, 5.0);
Misc_BuildRect (YearNumbers[5], 0.0, 14.0, 5.0, 5.0);
Misc_BuildRect (YearNumbers[6], 5.0, 14.0, 6.0, 5.0);
Misc_BuildRect (YearNumbers[7], 11.0, 14.0, 5.0, 5.0);
Misc_BuildRect (YearNumbers[8], 0.0, 8.0, 6.0, 5.0);
Misc_BuildRect (YearNumbers[9], 6.0, 8.0, 6.0, 5.0);
Misc_BuildRect (YearColon, 18.0, 25.0, 1.0, 5.0);
Misc_BuildRect (clockbase, 64, 72, 64, 64);
oneSize = DigitalNumbers[1].size;
twoSize = DigitalNumbers[2].size;
colonPosition.x = oneSize.width + twoSize.width + 7.0;
timedEntry = 0;
if (keepingTime)
{
[self startClock:self];
}
}
- initWithFrame:(NSRect)frameRect
{
[super initWithFrame:frameRect];
hidden=NO;
keepingTime=NO;
[self _setUp];
return self;
}
- (void)sizeToFit
{
[self setFrameSize:NSMakeSize(64,75)];
}
- (void)drawRect:(NSRect)rect
{
NSPoint imageOrigin;
NSSize size, theSize, tensSize = {0.0, 0.0}, onesSize, twoSize;
NSRect imageAyear, imageByear, imageCyear, imageDyear;
float width, widthA, widthB, widthC;
float imageAdjust;
int currentYear, hrs;
if (hidden) {
PSsetgray(NSLightGray);
NSRectFill([self bounds]);
}
onesSize = DigitalNumbers[1].size;
twoSize = DigitalNumbers[2].size;
if (!militaryTime)
colonPosition.x = onesSize.width + twoSize.width + 7.0;
else
colonPosition.x = 30;
if (showYear)
{
imageAdjust = 5;
colonPosition.y = 51;
}
else
{
imageAdjust = 0;
colonPosition.y = 46;
}
imageOrigin.x = 0;
imageOrigin.y = 0 + imageAdjust; //(0)
[theImage compositeToPoint:imageOrigin fromRect:clockbase operation:NSCompositeCopy];
if (militaryTime)
{
hrs = hours;
}
else
{
hrs = hours % 12;
if (!hrs) hrs = 12;
}
size = imageAM.size;
imageOrigin.x = 44;
imageOrigin.y = 48 + imageAdjust; //(48)
if (!militaryTime)
{
if (meridian)
{
imageOrigin.x = 45;
[theImage compositeToPoint:imageOrigin fromRect:imagePM operation:NSCompositeCopy];
}
else
[theImage compositeToPoint:imageOrigin fromRect:imageAM operation:NSCompositeCopy];
}
imageOrigin = colonPosition;
if (hrs / 10 || militaryTime)
tensSize = DigitalNumbers[hrs / 10].size;
onesSize = DigitalNumbers[hrs % 10].size;
imageOrigin.x -= tensSize.width + onesSize.width;
if (hrs / 10 || militaryTime)
{
[theImage compositeToPoint:imageOrigin fromRect:DigitalNumbers[hrs / 10] operation:NSCompositeCopy];
imageOrigin.x += tensSize.width;
}
[theImage compositeToPoint:imageOrigin fromRect:DigitalNumbers[hrs % 10] operation:NSCompositeCopy];
imageOrigin.x += onesSize.width;
size = imageColon.size;
[theImage compositeToPoint:imageOrigin fromRect:imageColon operation:NSCompositeCopy];
imageOrigin.x += size.width;
size = DigitalNumbers[minutes / 10].size;
[theImage compositeToPoint:imageOrigin fromRect:DigitalNumbers[minutes / 10] operation:NSCompositeCopy];
imageOrigin.x += size.width;
[theImage compositeToPoint:imageOrigin fromRect:DigitalNumbers[minutes % 10] operation:NSCompositeCopy];
imageOrigin.x = 21;
imageOrigin.y = 34 + imageAdjust; //(34)
[theImage compositeToPoint:imageOrigin fromRect:DayNames[weekday] operation:NSCompositeCopy];
imageOrigin.x = 19;
imageOrigin.y = 9 + imageAdjust; //(9)
[theImage compositeToPoint:imageOrigin fromRect:MonthNames[month] operation:NSCompositeCopy];
tensSize.width = 0.0;
tensSize.height = 0.0;
imageOrigin.x = 30;
imageOrigin.y = 15 + imageAdjust; //(15)
if (date / 10)
tensSize = DateNumbers[date / 10].size;
onesSize = DateNumbers[date % 10].size;
imageOrigin.x -= (tensSize.width + onesSize.width) / 2;
if (date / 10)
[theImage compositeToPoint:imageOrigin fromRect:DateNumbers[date / 10] operation:NSCompositeCopy];
imageOrigin.x += tensSize.width + 1;
[theImage compositeToPoint:imageOrigin fromRect:DateNumbers[date % 10] operation:NSCompositeCopy];
//Draw the year
if (showYear)
{
currentYear = [self yearOfCommonEra];
imageAyear = YearNumbers[currentYear / 1000];
currentYear = currentYear % 1000;
imageByear = YearNumbers[currentYear / 100];
currentYear = currentYear % 100;
imageCyear = YearNumbers[currentYear / 10];
currentYear = currentYear % 10;
imageDyear = YearNumbers[currentYear];
theSize = imageAyear.size;
widthA = theSize.width;
theSize = imageByear.size;
widthB = theSize.width;
theSize = imageCyear.size;
widthC = theSize.width;
theSize = imageDyear.size;
width = widthA + widthB + widthC + theSize.width;
imageOrigin.x = 32 - (width / 2.0);
imageOrigin.y = 0;
[theImage compositeToPoint:imageOrigin fromRect:imageAyear operation:NSCompositeCopy];
imageOrigin.x = imageOrigin.x + widthA;
[theImage compositeToPoint:imageOrigin fromRect:imageByear operation:NSCompositeCopy];
imageOrigin.x = imageOrigin.x + widthB;
[theImage compositeToPoint:imageOrigin fromRect:imageCyear operation:NSCompositeCopy];
imageOrigin.x = imageOrigin.x + widthC;
[theImage compositeToPoint:imageOrigin fromRect:imageDyear operation:NSCompositeCopy];
}
}
- (void)setSecondOfMinute:(int)theSeconds
{
seconds = theSeconds;
}
- (void)setMinuteOfHour:(int)theMinutes
{
minutes = theMinutes;
}
- (void)setHourOfDay:(int)theHours
{
hours = theHours % 24;
if (hours <= 12)
{
[self setMeridian:0];
}
else
{
[self setMeridian:1];
}
}
- (void)setDayOfWeek:(int)theWeekday
{
weekday = theWeekday;
}
- (void)setDayOfMonth:(int)theDate
{
date = theDate;
}
- (void)setMonthOfYear:(int)theMonth
{
month = theMonth;
}
- (void)setYearOfCommonEra:(int)theYear
{
year = theYear;
}
- (void)setMeridian:(int)theMeridian
{
meridian = theMeridian;
}
- (void)takeMinuteOfHourFrom:sender
{
[self setMinuteOfHour:[sender intValue]];
[self display];
}
- (void)takeHourOfDayFrom:sender
{
int localhours = [sender intValue];
localhours %= 24;
if (localhours <= 12)
{
[self setMeridian:0];
}
else
{
[self setMeridian:1];
}
[self setHourOfDay:localhours];
[self display];
}
- (void)takeDayOfWeekFrom:sender
{
[self setDayOfWeek:[sender intValue]];
[self display];
}
- (void)takeDayOfMonthFrom:sender
{
[self setDayOfMonth:[sender intValue]];
[self display];
}
- (void)takeMonthOfYearFrom:sender
{
[self setMonthOfYear:[sender intValue]];
[self display];
}
- (void)setTime:(struct tm *) theTime
{
seconds = theTime->tm_sec;
minutes = theTime->tm_min;
hours = theTime->tm_hour;
if (hours <= 12)
{
meridian = 0;
}
else
{
meridian = 1;
};
date = theTime->tm_mday;
month = theTime->tm_mon;
year = theTime->tm_year + 1900;
weekday = theTime->tm_wday;
};
- (int)yearOfCommonEra
{
return year;
}
- (int)monthOfYear
{
return month;
}
- (int)dayOfWeek
{
return weekday;
}
- (int)dayOfMonth
{
return date;
}
- (int)hourOfDay
{
return hours;
}
- (int)minuteOfHour
{
return minutes;
}
- (int)secondOfMinute
{
return seconds;
}
- (BOOL)militaryTime
{
return militaryTime;
}
- (BOOL)showYear
{
return showYear;
}
- (void)setShowYear:(BOOL)state
{
showYear = state;
}
- (void)setMilitaryTime:(BOOL)state
{
militaryTime = state;
}
- (BOOL)keepingTime
{
return keepingTime;
}
- (void)setKeepingTime:(BOOL)yesno
{
keepingTime = yesno;
}
- (id)initWithCoder:(NSCoder *)aDecoder
{
int myVersion = [aDecoder versionForClassName:NSStringFromClass([self class])];
[super initWithCoder:aDecoder];
if (myVersion < 2)
{
[aDecoder decodeValuesOfObjCTypes:"iiiiiiiiii", &seconds, &minutes, &hours,
&date, &month, &year, &weekday, &meridian, &showYear, &militaryTime];
}
else
{
[aDecoder decodeValuesOfObjCTypes:"iiiiiiiicc", &seconds, &minutes, &hours,
&date, &month, &year, &weekday, &meridian, &showYear, &militaryTime];
if (myVersion < 4)
year += 1900;
}
if (myVersion < 1)
{
keepingTime = NO;
}
else if (myVersion == 1)
{
[aDecoder decodeValueOfObjCType:"i" at:&keepingTime];
}
else
{
[aDecoder decodeValueOfObjCType:"c" at:&keepingTime];
}
if (myVersion > 2) {
[aDecoder decodeValueOfObjCType:"c" at:&hidden];
} else {
hidden = NO;
}
[self _setUp];
return self;
}
- (void)encodeWithCoder:(NSCoder *)aCoder
{
[super encodeWithCoder:aCoder];
[aCoder encodeValuesOfObjCTypes:"iiiiiiiicc", &seconds, &minutes, &hours,
&date, &month, &year, &weekday, &meridian, &showYear, &militaryTime];
[aCoder encodeValueOfObjCType:"c" at:&keepingTime];
[aCoder encodeValueOfObjCType:"c" at:&hidden];
}
- (void)setHide:(BOOL)hide
{
hidden = hide;
}
- (BOOL)isHidden
{
return hidden;
}
- (void)startClock:sender
{
if (!keepingTime)
{
[self setToCurrentTime:self];
timedEntry = [[NSTimer scheduledTimerWithTimeInterval:60 target:self selector:@selector(setToCurrentTime:) userInfo:0 repeats:YES] retain];
keepingTime = YES;
}
}
- (void)stopClock:sender
{
if (timedEntry)
{
[timedEntry invalidate];
[timedEntry release];
[self setToCurrentTime:self];
keepingTime = NO;
timedEntry = 0;
}
}
- (void)dealloc
{
[theImage release];
[timedEntry invalidate];
[timedEntry release];
[super dealloc];
}
- (void)setToCurrentTime:sender
{
struct timeval tp;
struct timezone tzp;
struct tm *tv;
gettimeofday (&tp, &tzp);
tv = localtime (&tp.tv_sec);
[self setTime:tv];
[self display];
}
- (void)setDate:(NSCalendarDate *)dateObj
{
[self setSecondOfMinute:[dateObj secondOfMinute]];
[self setMinuteOfHour:[dateObj minuteOfHour]];
[self setHourOfDay:[dateObj hourOfDay]];
[self setDayOfWeek:[dateObj dayOfWeek]];
[self setDayOfMonth:[dateObj dayOfMonth]];
[self setMonthOfYear:[dateObj monthOfYear]];
[self setYearOfCommonEra:[dateObj yearOfCommonEra]];
}
- (NSCalendarDate *)calendarDate
{
return [NSCalendarDate dateWithYear:year month:month day:date hour:hours minute:minutes second:seconds timeZone:[NSTimeZone localTimeZone]];
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.