This is STClockView.m in view mode; [Download] [Up]
#import "STClockView.h" #import <dpsclient/psops.h> @implementation STClockView - initFrame:(const NXRect *)frameRect { long now; [super initFrame:frameRect]; [self setOpaque:YES]; [self setClipping:NO]; NX_ASSERT(sizeof (int)==sizeof (long), "NeXT never should have assumed ints would always be 32 bits"); (void)time(&now); contents = *localtime((time_t *)&now); return self; } - setValue:(NSCalendarDate *)aValue { contents.tm_sec=[aValue secondOfMinute]; contents.tm_min=[aValue minuteOfHour]; contents.tm_hour=[aValue hourOfDay]; contents.tm_mday=[aValue dayOfMonth]; contents.tm_mon=[aValue monthOfYear]-1; contents.tm_year=[aValue yearOfCommonEra]; if(contents.tm_year>1000) { if(contents.tm_year<2000) contents.tm_year-=1900; else contents.tm_year-=2000; } contents.tm_zone=(char *)[[[aValue timeZoneDetail] timeZoneAbbreviation] cString]; if([window isDisplayEnabled]) [self display]; return self; } - setLongValue:(long)aLong { contents = *localtime((time_t *)&aLong); if([window isDisplayEnabled]) [self display]; return self; } - setTmValue:(struct tm *)tmp { contents = *tmp; if([window isDisplayEnabled]) [self display]; return self; } - drawSelf:(const NXRect *)rects :(int)rectCount { const NXRect bkgd={ { 191.0, 9.0 }, { 64.0, 71.0 } }, am={ { 179.0, 0.0 }, { 12.0, 6.0 } }, pm={ { 191.0, 0.0 }, { 12.0, 6.0 } }, colon={ { 175.0, 2.0 }, { 3.0, 6.0 } }, ydig[10]={ { { 12.0, 8.0 }, { 5.0, 5.0 } }, { { 0.0, 20.0 }, { 1.0, 5.0 } }, { { 2.0, 20.0 }, { 4.0, 5.0 } }, { { 7.0, 20.0 }, { 4.0, 5.0 } }, { { 12.0, 20.0 }, { 5.0, 5.0 } }, { { 0.0, 14.0 }, { 4.0, 5.0 } }, { { 5.0, 14.0 }, { 5.0, 5.0 } }, { { 11.0, 14.0 }, { 4.0, 5.0 } }, { { 0.0, 8.0 }, { 5.0, 5.0 } }, { { 6.0, 8.0 }, { 5.0, 5.0 } } }; const NXPoint ampm={ 43.0, 55.0 }, colpos={ 20.0, 55.0}, wdapos={ 21.0, 41.0 }, monpos={ 19.0, 16.0 }; const float dpos[]={ 166.0, 89.0, 93.0, 104.0, 112.0, 121.0, 130.0, 140.0, 148.0, 157.0 }, dwid[]={ 9.0, 4.0, 9.0, 8.0, 9.0, 9.0, 8.0, 8.0, 9.0, 9.0 }, mpos[]={ 172.0, 65.0, 76.0, 88.0, 100.0, 112.0, 124.0, 136.0, 148.0, 160.0 }, mwid[]={ 10.0, 8.0, 10.0, 9.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0 }; static NXRect r; static NXPoint p; register struct tm *tm; register int u, t; // you'd think the following could be done in initFrame:, but // that doesn't work in loadable palettes, grr... if (!clockbits) clockbits = [NXImage findImageNamed:"clockbits"]; [clockbits composite:NX_SOVER fromRect:&bkgd toPoint:&bounds.origin]; tm= &contents; if (tm->tm_hour>=0&&tm->tm_min>=0) { [clockbits composite:NX_SOVER fromRect:&colon toPoint:&colpos]; // hours if (tm->tm_hour>=12) { if (tm->tm_hour>12) { t=(tm->tm_hour-12)/10; u=(tm->tm_hour-12)%10; } else { t=tm->tm_hour/10; u=tm->tm_hour%10; } [clockbits composite:NX_SOVER fromRect:&pm toPoint:&m]; } else { if (tm->tm_hour==0) { t=1; u=2; } else { t=tm->tm_hour/10; u=tm->tm_hour%10; } [clockbits composite:NX_SOVER fromRect:&am toPoint:&m]; } r.origin.x = dpos[u]; r.origin.y = 0.0; r.size.width = dwid[u]; r.size.height = 11.0; p.x = colpos.x - r.size.width; p.y = colpos.y - 2.0; [clockbits composite:NX_SOVER fromRect:&r toPoint:&p]; if (t>0) { r.origin.x = dpos[t]; r.size.width = dwid[t]; p.x -= r.size.width; [clockbits composite:NX_SOVER fromRect:&r toPoint:&p]; } // minutes t=tm->tm_min/10; u=tm->tm_min%10; r.origin.x = dpos[t]; r.size.width = dwid[t]; p.x = colpos.x + colon.size.width; [clockbits composite:NX_SOVER fromRect:&r toPoint:&p]; p.x += r.size.width; r.origin.x = dpos[u]; r.size.width = dwid[u]; [clockbits composite:NX_SOVER fromRect:&r toPoint:&p]; } else { const NXRect timerect={ 4.0, 49.0, 55.0, 18.0 }; PSsetgray(NX_LTGRAY); NXRectFill(&timerect); } // day of week if (tm->tm_wday>=0) { r.origin.x = 0.0; r.origin.y = (float)(65-((tm->tm_wday+6)%7)*6); // barf r.size.width = 19.0; r.size.height = 5.0; [clockbits composite:NX_SOVER fromRect:&r toPoint:&wdapos]; } // day of month r.origin.y = 14.0; r.size.height = 17.0; p.y = 22.0; t = tm->tm_mday/10; u = tm->tm_mday%10; if (t > 0) { r.origin.x = mpos[t]; r.size.width = mwid[t]; p.x = 30.0-(mwid[t]+mwid[u]+1.0)/2.0; [clockbits composite:NX_SOVER fromRect:&r toPoint:&p]; p.x += r.size.width + 1.0; } else p.x = 30.0-mwid[u]/2.0; r.origin.x = mpos[u]; r.size.width = mwid[u]; [clockbits composite:NX_SOVER fromRect:&r toPoint:&p]; // month r.origin.x = 40.0; r.origin.y = (float)((11-tm->tm_mon)*6); r.size.width = 22.0; r.size.height = 5.0; [clockbits composite:NX_SOVER fromRect:&r toPoint:&monpos]; // year if (tm->tm_year>=0) { p.y = 2.0; t = tm->tm_year/10; u = tm->tm_year%10; if (t>9) { t-=10; // time runs out for UNIX in 2038 p.x = 21.0; r = ydig[2]; [clockbits composite:NX_SOVER fromRect:&r toPoint:&p]; p.x += r.size.width + 1.0; r = ydig[0]; } else { p.x = 23.0; r = ydig[1]; [clockbits composite:NX_SOVER fromRect:&r toPoint:&p]; p.x += r.size.width + 1.0; r = ydig[9]; } [clockbits composite:NX_SOVER fromRect:&r toPoint:&p]; p.x += r.size.width + 1.0; r = ydig[t]; [clockbits composite:NX_SOVER fromRect:&r toPoint:&p]; p.x += r.size.width + 1.0; r = ydig[u]; [clockbits composite:NX_SOVER fromRect:&r toPoint:&p]; } return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.