This is Overview.m in view mode; [Download] [Up]
// // Overview.m // Copyright (c) 1988, 1989, 1990 by Jiro Nakamura // All rights reserved // // Handles the Overview window for Cassandra // // by Jiro Nakamura (ac6y@vax5.cit.cornell.edu) // // RCS Information // Revision Number-> $Revision: 3.6 $ // Last Revised-> $Date: 90/12/03 01:56:28 $ // static char rcsid[] = "$Id: Overview.m,v 3.6 90/12/03 01:56:28 jiro Exp Locker: jiro $"; #import <appkit/Form.h> #import <appkit/ScrollView.h> #import <appkit/Window.h> #import <appkit/Bitmap.h> // for Miniworld bitmap #import <appkit/Panel.h> // for NXRunAlertPanel #import <appkit/Application.h> // for NX_MODALRESPTHRESHOLD #import <appkit/Font.h> // for Font #import <sys/time.h> #import <sys/file.h> #import <libc.h> #import <strings.h> #import "Overview.h" #import "Event.h" #import "Global.h" #import "misc.h" #import "calendar.h" // The font point size of the months #define FONTNAME_MONTHS "Courier" #define FONTSIZE_MONTHS 12.0 // The minimum dimensions of the overview window #define MIN_WIDTH 500.0 #define MIN_HEIGHT 280.0 // This function's predeclaration void showCalendar( int month, int year, id cal); @implementation Overview + new { char dumbChar[5]; // dumb references to some static constants, just // to avoid warning messages from the compiler (Garance) dumbChar[0] = rcsid[0]; // dumb de dumb #ifdef DEBUG fprintf(stderr,"Overview being created.\n"); #endif self = [super new]; [self setDelegate:self]; return self; } - free { [eventText free]; [super free]; return nil; } - open: sender { static alreadyInited = FALSE; if( !alreadyInited) { alreadyInited = TRUE; [self placeWindow: [global overviewFrame]]; showSeconds = [global showSeconds]; lowPriority = [global lowPriority]; militaryTime = [global militaryTime]; [lastMonthText setSelectable:NO]; [thisMonthText setSelectable:NO]; [nextMonthText setSelectable:NO]; [thisMonthText setOpaque: YES]; [lastMonthText setOpaque: YES]; [nextMonthText setOpaque: YES]; [thisMonthText setMonoFont: NO]; [lastMonthText setMonoFont: NO]; [nextMonthText setMonoFont: NO]; [thisMonthText setBackgroundGray: NX_LTGRAY]; [lastMonthText setBackgroundGray: NX_LTGRAY]; [nextMonthText setBackgroundGray: NX_LTGRAY]; [thisMonthText setTextGray: NX_BLACK]; [lastMonthText setTextGray: NX_DKGRAY]; [nextMonthText setTextGray: NX_DKGRAY]; [self windowDidUpdate: self]; [self setMiniwindowIcon: OVERVIEWICON]; priorityCutOff = [global lowPriority]; viewPopUp = [PopUpList new]; [viewPopUp addItem: "View All"]; [viewPopUp addItem: "View Mid~High"]; [viewPopUp addItem: "View Only High"]; [[viewPopUp itemList] selectCellAt:1:0]; NXAttachPopUpList(viewPopUpButton, viewPopUp); } [self makeKeyAndOrderFront: sender]; [self timeUpdate: self]; [self monthRedraw]; return self; } - close { [global saveThisWindowPosition: DEFAULTOVERVIEWFRAME: self]; [super close]; return self; } - printPSCode: sender { [eventText printPSCode: self]; return self; } - defaultsDidChange: sender { #ifdef DEBUG fprintf(stderr,"Defaults changed.... Overview compensating\n"); #endif showSeconds = [global showSeconds]; if( (militaryTime != [global militaryTime]) || (lowPriority != [global lowPriority])) { militaryTime = [global militaryTime]; lowPriority = [global lowPriority]; [self queueDidChange: self]; } return self; } - queueDidChange : sender { #ifdef DEBUG fprintf(stderr,"Queue changed.... Overview compensating\n"); #endif [self listUpdate:self]; return self; } - windowDidUpdate: sender { #ifdef DEBUG fprintf(stderr,"Yup, window updated.\n\n"); #endif eventText = [eventScroll docView]; [eventText setFont: [Font newFont: [global fontName] size: [global fontSize]]]; [eventText setEditable: FALSE]; monthNow = timeNow()->tm_mon; yearNow = timeNow()->tm_year; showCalendar( monthNow, yearNow, thisMonthText); showCalendar( monthNow+1, yearNow, nextMonthText); showCalendar( monthNow-1, yearNow, lastMonthText); [self listUpdate:self]; return self; } - windowWillResize: (id) sender toSize: (NXSize *) size { #ifdef DEBUG fprintf(stderr,"Window would have resized to %f x %f.\n", size->width, size->height); #endif if( size->width < MIN_WIDTH) size->width = MIN_WIDTH; if( size->height < MIN_HEIGHT) size->height = MIN_HEIGHT; #ifdef DEBUG fprintf(stderr,"Window will resize to %f x %f.\n", size->width, size->height); #endif return self; } // This method updates the event queue as displayed by the // Overview - listUpdate: sender { NXStream *output; Event *ev; int today, lastday, temp; char annvTemp[30]; static char * annv[5] = {"???","days","weeks","months","years"}; static char * annv2[5] = {"???","Daily","Weekly","Monthly","Yearly"}; // We want to read the eventFile pointed to by global ev = [Event newAt:[global eventFile]]; // We need a temporary memory stream to store the queue. if( (output = NXOpenMemory( NULL, 0, NX_READWRITE)) == NULL) { fprintf(stderr,"%s: Couldn't open memory stream for " "Overview queue scrollview. FATAL ERRROR.\n", PROGNAME); exit(1) ; } [ev firstEvent]; today = [ev mday]; NXPrintf(output, "{\\rtf0\\ansi{\\fonttbl\\f0\\fmodern " "%s;}\\fs%.0f\n", [global fontName], [global fontSize] * 2); /* Print all events for today regardless of priority, */ /* today being the */ /* first day in the event queue */ if( [ev present] == 0) /* If it is an empty queue */ NXPrintf(output, "{\\f0 " "---- Empty Event Queue ----" "\\par}\n"); else NXPrintf(output, "{\\f0\\b %s\\par}\n", ascMyDate([ev time])); while ( [ev present] != 0 && [ev mday] == today) { if( [ev anniversary]>0) /*If there is an anniversary event */ { if( [ev anniversary] % 100 > 1) sprintf(annvTemp, "(Every %d %s)", [ev anniversary] % 100, annv[ ( [ev anniversary] / 100) ]); else sprintf(annvTemp, "(%s)", annv2[ ( [ev anniversary] / 100) ]); } else strcpy(annvTemp , ""); if( [ev priority] > [global highPriority]) NXPrintf(output, "{\\f0\\b "); else NXPrintf(output, "{\\f0 "); if( [global militaryTime]) NXPrintf(output, " %3d] %2d:%02d \t%s" "\t%s\\par}", [ev present], [ev hour], [ev min], [ev message], annvTemp); else { temp = [ev hour]; if( temp > 12 ) temp -= 12; if( temp == 0 ) temp = 12; NXPrintf(output, " %3d] %2d:%02d %s \t%s" "\t%s\\par}", [ev present], temp, [ev min], ([ev hour]>11)?"pm":"am", [ev message], annvTemp); } [ev readEvent : [ev next]]; } NXPrintf(output, "{\\f0\\par -----------------------\\par}\n"); lastday = -1; // Make it an illegal day value /* Print all remaining events according to priority */ while ( [ev present] != 0) { // If the priority is high enough // (or if it is the first event), // then we will print this event // otherwise we skip it. if( [ev priority] < priorityCutOff && [ev previous] != 0) { #ifdef DEBUG fprintf(stderr,"Skipped %d\n", [ev present]); #endif [ev readEvent : [ev next]]; continue; } // If the event before was not on the // same day as the event // now, then print a line to space it somewhat if( lastday != [ev mday]) { NXPrintf(output, "{\\f0\\par\\b %s\\par}\n", ascMyDate([ev time])); lastday = [ev mday]; } if( [ev anniversary]>0) // An anniversary event { // If it is just a //once every _1_ event then we can print that if( [ev anniversary] % 100 > 1) sprintf(annvTemp, "(Every %d %s)", [ev anniversary] % 100, annv[ ( [ev anniversary] / 100) ] ); else sprintf(annvTemp, "(%s)", annv2[ ( [ev anniversary] / 100) ]); } else strcpy(annvTemp , ""); if( [ev priority] > [global highPriority]) NXPrintf(output, "{\\f0\\b "); else NXPrintf(output, "{\\f0 "); if( [global militaryTime]) NXPrintf(output, " %3d] %2d:%02d " "\t%s\t%s\\par}", [ev present], [ev hour], [ev min], [ev message], annvTemp); else { temp = [ev hour]; if( temp > 12 ) temp -= 12; if( temp == 0 ) temp = 12; NXPrintf(output, " %3d] %2d:%02d %s \t%s" "\t%s\\par}", [ev present], temp, [ev min], ([ev hour]>11)?"pm":"am", [ev message], annvTemp); } [ev readEvent : [ev next]]; } NXPrintf(output, "}\n"); NXSeek(output, 0, NX_FROMSTART); [eventText readRichText:output]; [eventText hideCaret]; // for some reason the Text // object sometimes leaves a caret... NXCloseMemory(output, NX_FREEBUFFER); return self; } - viewPopUpChanged:sender { switch( [[viewPopUp itemList] selectedRow]) { case 2: priorityCutOff = [global highPriority]; break; case 1: priorityCutOff = [global lowPriority]; break; case 0: default: priorityCutOff = 0; break; } #ifdef DEBUG fprintf(stderr, "Priority changed to %d.... (tag = %d)\n", priorityCutOff, [[viewPopUp itemList] selectedRow]); #endif [self listUpdate: self]; return self; } - timeUpdate:sender { if( [self isVisible]) [dateForm setStringValue : ascMyTime( (struct tm*) timeNow(), showSeconds, militaryTime) at:0]; return self; } - monthUpdate: sender { monthNow = timeNow()->tm_mon; yearNow = timeNow()->tm_year; [self monthRedraw]; return self; } - monthRedraw { if( [self isVisible] ) { showCalendar( monthNow, yearNow, thisMonthText); showCalendar( monthNow+1, yearNow, nextMonthText); showCalendar( monthNow-1, yearNow, lastMonthText); } return self; } - monthPrevious: sender { monthNow --; if( monthNow < 0) { monthNow += 12; yearNow --; } [self monthRedraw]; return self; } - monthNext: sender { monthNow ++; if( monthNow > 11) { monthNow -= 12; yearNow ++; } [self monthRedraw]; return self; } // Procedure: showCalendar // Arguments: month, year; Show the month calendar for this date // id cal; Put it up on this Text view. // Description: Writes up a small month calendar for the particular month. // If it is this month, bold face (high-light) today. void showCalendar(int month, int year, id cal) { NXStream *in; int day; if( month == timeNow()->tm_mon && year == timeNow() -> tm_year) day = timeNow()->tm_mday; else day = 0; if( month < 0) { month = 12; year --; } else { if( month > 11) { month = 1; year ++; } else month ++; } #ifdef DEBUG fprintf(stderr,"%s: Opening %d:%d for calendar.\n", PROGNAME, month, year); #endif in = NXOpenMemory(NULL, 0, NX_READWRITE ); printCalendarRTF( day, month, 1900+ year, in, FONTNAME_MONTHS, FONTSIZE_MONTHS); NXSeek(in, 0, NX_FROMSTART); [cal setRetainedWhileDrawing: YES]; [cal readRichText:in]; NXCloseMemory(in, NX_FREEBUFFER); } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.