This is MonthView.m in view mode; [Download] [Up]
/* kfc - Kurt's Free Calendar Copyright 1995 Kurt Werle This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #import "MonthView.h" #import "CalendarController.h" #import <math.h> @implementation MonthView - initFrame:(const NXRect *)frameRect { int i; [super initFrame:frameRect]; activeDay = nil; displayedMonthDay = [[MiscTime alloc] init]; [displayedMonthDay setDay:0]; [displayedMonthDay setHour:12]; for (i = 0; i < DAYSINMONTHVIEW; i++) { [self addSubview:monthDayView[i] = [[DayView alloc] init]]; } return self; } - free { if (displayedMonthDay) { [displayedMonthDay free]; } return[super free]; } /* Initialize one of my content days. */ - initDayNumber:(int)theDay forMonth:(id)thisMonth inView:(int)theView { id aDay; if (thisMonth) { aDay = [[MiscTime alloc] init]; [aDay copyTimeFrom:thisMonth]; [aDay setDay:theDay - 1]; } else aDay = nil; [monthDayView[theView] initDayViewDay:aDay]; if (aDay) { [aDay free]; } return self; } /* Highlight the current day. */ - flip_Highlight_of_activeDay { NXRect theRect; if (([activeDay month] == [displayedMonthDay month]) && ([activeDay year] == [displayedMonthDay year])) { [self lockFocus]; [monthDayView[[activeDay day] + [displayedMonthDay dayOfWeek]] getFrame:&theRect]; NXHighlightRect (&theRect); [self unlockFocus]; [[self window] flushWindow]; } return self; } - clear { [self lockFocus]; NXEraseRect (&bounds); NXFrameRect (&bounds); [self unlockFocus]; return self; } /* Frame all of my days. */ - drawSelf:(const NXRect *)rects :(int)rectCount { int i; NXRect DayViewRect; [super drawSelf:rects :rectCount]; PSsetgray (0.0); [self clear]; for (i = [displayedMonthDay dayOfWeek]; i < [displayedMonthDay dayOfWeek] + daysthismonth; i++) { [monthDayView[i] getFrame:&DayViewRect]; NXFrameRectWithWidth (&DayViewRect, 0); } [self flip_Highlight_of_activeDay]; return self; } /* Tell my delegate I need to display. */ - updateDisplay { if (([activeDay month] != [displayedMonthDay month]) || ([activeDay year] != [displayedMonthDay year])) { return[delegate update_MonthView_With_CurrentDay]; } [self flip_Highlight_of_activeDay]; return self; } /* Init the monthview so it displays the correct month. */ - initMonthWithFirstDay:(id)FirstDay { int i, PartialWeeksThisMonth; NXRect DayViewRect; [displayedMonthDay setMonth:[FirstDay month]]; [displayedMonthDay setYear:[FirstDay year]]; daysthismonth = [MiscTime daysInMonth:[displayedMonthDay month] ofYear:[displayedMonthDay year]]; /* Take care of all the days before the first day of the month. */ NXSetRect (&DayViewRect, 0.0, 0.0, 0.0, 0.0); for (i = 0; i < [displayedMonthDay dayOfWeek]; i++) { [self initDayNumber:-1 forMonth:nil inView:i]; [monthDayView[i] setFrame:&DayViewRect]; } PartialWeeksThisMonth = ceil (([displayedMonthDay dayOfWeek] + daysthismonth) / 7.0); for (i = [displayedMonthDay dayOfWeek]; i < [displayedMonthDay dayOfWeek] + daysthismonth; i++) { NXSetRect (&DayViewRect, (i % 7) * frame.size.width / 7, ((PartialWeeksThisMonth - 1) - (int)i / 7) * frame.size.height / PartialWeeksThisMonth, frame.size.width / 7, frame.size.height / PartialWeeksThisMonth); [monthDayView[i] setFrame:&DayViewRect]; [self initDayNumber:i - [displayedMonthDay dayOfWeek] + 1 forMonth:displayedMonthDay inView:i]; } /* Take care of all the days after the last day of the month. */ NXSetRect (&DayViewRect, 0.0, 0.0, 0.0, 0.0); for (i = [displayedMonthDay dayOfWeek] + daysthismonth; i < DAYSINMONTHVIEW; i++) { [self initDayNumber:-1 forMonth:nil inView:i]; [monthDayView[i] setFrame:&DayViewRect]; } return self; } /* Set the active day. */ - setActiveDay:(id)theDay { activeDay = theDay; return self; } /* Tell some of my dayviews to display a given appointment. */ - displayAppointment:theAppointment atTimes:timesToDisplay { int i; for (i = 0; i < [timesToDisplay count]; i++) { int daytodisplay; daytodisplay = [displayedMonthDay dayOfWeek] + [[timesToDisplay objectAt:i] day]; if ((daytodisplay - [displayedMonthDay dayOfWeek] >= 0) && (daytodisplay - [displayedMonthDay dayOfWeek] < daysthismonth)) { [monthDayView[daytodisplay] addAppointment:theAppointment]; } } return self; } - iWasClicked:sender { [self flip_Highlight_of_activeDay]; [activeDay copyTimeFrom:[sender myDate]]; [self flip_Highlight_of_activeDay]; return self; } - iWasDoubleClicked:sender { [delegate editDaysAppointments:sender]; return self; } /* This is totally wrong. It pisses me off that I can't seem to find a better place for 'arrow left' and 'arrow right' definitions. Is NeXT gonna fix this?!? */ - keyDown:(NXEvent *)theEvent { switch (theEvent -> data.key.charCode) { case 173: /* up */ { [self flip_Highlight_of_activeDay]; [activeDay subtractDays:7]; break; } case 172: /* left */ { [self flip_Highlight_of_activeDay]; [activeDay subtractDays:1]; break; } case 175: /* down */ { [self flip_Highlight_of_activeDay]; [activeDay addDays:7]; break; } case 174: /* right */ { [self flip_Highlight_of_activeDay]; [activeDay addDays:1]; break; } case '\r': { return[delegate editDaysAppointments: monthDayView[[activeDay day] + [displayedMonthDay dayOfWeek]]]; } default: { return[super keyDown:theEvent]; } } [self updateDisplay]; return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.