This is CalendarView.m in view mode; [Download] [Up]
// CalendarView.m
// By Jayson Adams, NeXT Developer Support Team
// You may freely copy, distribute and reuse the code in this example.
// NeXT disclaims any warranty of any kind, expressed or implied, as to its
// fitness for any particular use.
/* Modified by Scott Stark, Fri Jan 17 1992 */
#import "CalendarView.h"
#import <Date.h>
#import <appkit/appkit.h>
#import <math.h>
@implementation CalendarView
/* instance methods */
- initFrame : (NXRect *) frameRect
{
int i;
char *numberNames[] = {"Zero", "One", "Two", "Three", "Four", "Five",
"Six", "Seven", "Eight", "Nine", ""},
*smallNumberNames[] = {"SmallZero", "SmallOne", "SmallTwo", "SmallThree", "SmallFour",
"SmallFive","SmallSix", "SmallSeven", "SmallEight", "SmallNine", ""},
*dayNames[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat",""},
*monthNames[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul",
"Aug", "Sep", "Oct", "Nov", "Dec", ""};
[super initFrame:frameRect];
/* find all of the images */
calendarImage = [NXImage findImageNamed:"YearCalendar"];
for (i = 0; *numberNames[i]; i++)
{
numbers[i] = [NXImage findImageNamed: numberNames[i]];
smallNumbers[i] = [NXImage findImageNamed: smallNumberNames[i]];
}
for (i = 0; *dayNames[i]; i++)
days[i] = [NXImage findImageNamed: dayNames[i]];
for (i = 0; *monthNames[i]; i++)
months[i] = [NXImage findImageNamed: monthNames[i]];
/* Initialize the Date object to the current date */
dateObj = [[Date alloc] initFromNow];
return self;
}
- setDate:(long) julianDate
{
if( [dateObj initFromJulianDate: julianDate] == nil )
return nil;
[self display];
return self;
}
- setDate : (short) day : (short) month : (short) year
{
if( [dateObj initFromDate : day : month : year] == nil )
return nil;
[self display];
return self;
}
- today
{
if( [dateObj initFromNow] == nil )
return nil;
[self display];
return self;
}
- drawSelf:(NXRect *)rects :(int)count
{
NXSize calendarSize, unitSize, tenSize, size;
NXSize thousandSize,hundredSize;
NXPoint position;
float numberWidth,yOffset = 9.0;
short day,month,year,dayOfWeek;
short thousands,hundreds,tens,ones;
day = [dateObj day];
month = [dateObj month];
year = [dateObj year];
dayOfWeek = [dateObj weekDay];
[calendarImage getSize:&calendarSize];
/* draw the background */
[calendarImage composite:NX_SOVER toPoint:&(bounds.origin)];
/* we want to center the date on the calendar; compute its location */
[numbers[day % 10] getSize:&unitSize];
numberWidth = unitSize.width;
if (day / 10)
{
[numbers[day / 10] getSize:&tenSize];
numberWidth += tenSize.width;
}
position.x = floor((calendarSize.width - numberWidth) / 2.0) - 1.0;
position.y = 14.0 + yOffset;
/* draw the date */
if (day / 10)
{
[numbers[day / 10] composite:NX_SOVER toPoint:&position];
position.x += tenSize.width;
}
[numbers[day % 10] composite:NX_SOVER toPoint:&position];
/* draw the day */
[days[dayOfWeek] getSize:&size];
position.x = floor((calendarSize.width - size.width) / 2.0) - 2.0;
position.y = 33.0 + yOffset;
[days[dayOfWeek] composite:NX_SOVER toPoint:&position];
/* draw the month */
[months[month] getSize:&size];
position.x = floor((calendarSize.width - size.width) / 2.0) - 2.0;
position.y = 8.0 + yOffset;
[months[month] composite:NX_SOVER toPoint:&position];
/* Draw the year */
thousands = year / 1000;
hundreds = (year - 1000 * thousands) / 100;
tens = (year - 1000 * thousands - 100 * hundreds) / 10;
ones = (year - 1000 * thousands - 100 * hundreds - 10 * tens);
[smallNumbers[thousands] getSize: &thousandSize];
[smallNumbers[hundreds] getSize: &hundredSize];
[smallNumbers[tens] getSize: &tenSize];
[smallNumbers[ones] getSize: &unitSize];
numberWidth = thousandSize.width + hundredSize.width + tenSize.width + unitSize.width;
position.x = floor((calendarSize.width - numberWidth) / 2.0) - 2.0;
position.y = 1.0;
[smallNumbers[thousands] composite: NX_SOVER toPoint: &position];
position.x += thousandSize.width;
[smallNumbers[hundreds] composite: NX_SOVER toPoint: &position];
position.x += hundredSize.width;
[smallNumbers[tens] composite: NX_SOVER toPoint: &position];
position.x += tenSize.width;
[smallNumbers[ones] composite: NX_SOVER toPoint: &position];
return self;
}
@end
/* RCS Information:
$Author: me $;
$Date: 93/02/23 02:00:16 $;
$Source: /usr1/me/NeXTSrc/MyClasses/RCS/CalendarView.m,v $;
$Revision: 1.1 $;
*/
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.