home *** CD-ROM | disk | FTP | other *** search
/ Nebula / nebula.bin / SourceCode / Palettes / Clocks / DigitalClock.m < prev    next >
Text File  |  1992-12-03  |  9KB  |  357 lines

  1. //----------------------------------------------------------------------------------------------------
  2. //
  3. //    DigitalClock
  4. //
  5. //    Inherits From:        Clock
  6. //
  7. //    Declared In:        DigitalClock.h
  8. //
  9. //    Disclaimer
  10. //
  11. //        You may freely copy, distribute and reuse this software and its
  12. //        associated documentation. I disclaim any warranty of any kind, 
  13. //        expressed or implied, as to its fitness for any particular use.
  14. //
  15. //----------------------------------------------------------------------------------------------------
  16. #import "DigitalClock.h"
  17.  
  18.  
  19. #define TIMESTRING_OFFSET        12.0
  20. #define DATESTRING_OFFSET        16.0
  21. #define YEARSTRING_OFFSET        26.0
  22.  
  23. #define DIAGONAL_CONSTANT        0.707
  24.  
  25. static const char*  DAYS [7] = { "SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT" };
  26. static const char*  MONTHS [12] = 
  27. { "JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC" };
  28.  
  29.  
  30. @implementation DigitalClock
  31.  
  32. //----------------------------------------------------------------------------------------------------
  33. //    Private Methods
  34. //----------------------------------------------------------------------------------------------------
  35. - (NXPoint) _locationForString: (STR)aString usingFont: aFont
  36. {
  37.     NXPoint    stringLocation;
  38.     float        stringHeight = [aFont pointSize];
  39.     float        stringWidth = [aFont getWidthOf:aString];
  40.     
  41.     if (style == DIGITAL_STYLE_DIAGONAL) 
  42.         stringWidth = (stringWidth * DIAGONAL_CONSTANT) - ([aFont pointSize] / 2.0) +2;
  43.     stringLocation.x = ((NX_WIDTH(&bounds) - stringWidth) / 2.0);
  44.  
  45.     if (style == DIGITAL_STYLE_DIAGONAL) stringHeight = -(stringWidth + [aFont pointSize] - 2);
  46.     stringLocation.y = ((NX_HEIGHT(&bounds) / 2.0) + (stringHeight / 2.0));
  47.  
  48.     return stringLocation;
  49. }
  50.  
  51.  
  52. - _updateFont
  53. {
  54.     //  Called when change to an instance variable that would effect
  55.     //  which font should be used.
  56.  
  57.      if (timeFont) [timeFont free];
  58.      if (dateFont) [dateFont free];
  59.      if (yearFont) [yearFont free];
  60.  
  61.     switch ([self style])
  62.         {
  63.         case DIGITAL_STYLE_DIAGONAL:
  64.                timeFont = [Font newFont:"Times-Roman" size:([self wantsSeconds] ? 20 : 30) 
  65.                 style:0 matrix:NX_IDENTITYMATRIX];
  66.             break;
  67.  
  68.         case DIGITAL_STYLE_STANDARD:
  69.         default:
  70.                 timeFont = [Font newFont:"Times-Roman" size:18 style:0                 matrix:NX_IDENTITYMATRIX];
  71.                 dateFont = [Font newFont:"Helvetica" size:8 style:0 matrix:NX_IDENTITYMATRIX];
  72.                 yearFont = [Font newFont:"Helvetica" size:9 style:0 matrix:NX_IDENTITYMATRIX];
  73.             break;
  74.         }
  75.             
  76.     return self;
  77. }
  78.  
  79.     
  80. //----------------------------------------------------------------------------------------------------
  81. //    Initialization and Freeing
  82. //----------------------------------------------------------------------------------------------------
  83. - initFrame: (const NXRect *)aRect
  84. {
  85.     //  Give default characteristics.  Fix size to 64 x 64. 
  86.     
  87.     NXRect    frameRect;
  88.     NXSetRect (&frameRect, NX_X(aRect), NX_Y(aRect), 64.0, 64.0);
  89.     [super initFrame:&frameRect];
  90.     [self style: DIGITAL_STYLE_STANDARD];
  91.     [self timeColor: NX_COLORBLACK];
  92.     [self dateColor: NX_COLORRED];
  93.     [self wantsYear: NO];
  94.     return self;
  95. }
  96.  
  97.  
  98. - free
  99. {
  100.      if (timeFont) [timeFont free];
  101.      if (dateFont) [dateFont free];
  102.      if (yearFont) [yearFont free];
  103.     return [super free];
  104. }
  105.  
  106.  
  107. //----------------------------------------------------------------------------------------------------
  108. //    Setting Style
  109. //-----------------------------------------------------------------------------------------------------
  110. - style: (int) aStyle
  111. {
  112.     style = aStyle;
  113.     [self _updateFont];
  114.     [self update];
  115.     return self;
  116. }
  117.  
  118.  
  119. - (int) style
  120. {
  121.     return style;
  122. }
  123.  
  124.  
  125. //----------------------------------------------------------------------------------------------------
  126. //    Enabling Year Display
  127. //-----------------------------------------------------------------------------------------------------
  128. - wantsYear: (BOOL) aFlag
  129. {
  130.     wantsYear = aFlag;
  131.     [self update];
  132.     return self;
  133. }
  134.  
  135.  
  136. - (BOOL) wantsYear
  137. {
  138.     return wantsYear;
  139. }
  140.  
  141.  
  142.  
  143. //----------------------------------------------------------------------------------------------------
  144. //    Accessing Display Colors
  145. //----------------------------------------------------------------------------------------------------
  146. - timeColor: (NXColor) aColor
  147. {
  148.     timeColor = aColor;
  149.     [self update];
  150.     return self;
  151. }
  152.  
  153.  
  154. - dateColor: (NXColor) aColor;
  155. {
  156.     dateColor = aColor;
  157.     [self update];
  158.     return self;
  159. }
  160.  
  161.  
  162. - (NXColor) timeColor
  163. {
  164.     return timeColor;
  165. }
  166.  
  167.  
  168. - (NXColor) dateColor;
  169. {
  170.     return dateColor;
  171. }
  172.  
  173.  
  174. //----------------------------------------------------------------------------------------------------
  175. //    Action Methods
  176. //----------------------------------------------------------------------------------------------------
  177. - takeClockStyleFlagFrom :sender
  178. {
  179.     if ([sender isKindOf: [Matrix class]])
  180.         sender = [sender selectedCell];
  181.         
  182.     if ([sender respondsTo: @selector (state)])
  183.         [self style: [sender state]];
  184.         
  185.     return self;
  186. }
  187.  
  188.  
  189. - takeWantsYearFlagFrom :sender
  190. {
  191.     if ([sender isKindOf: [Matrix class]])
  192.         sender = [sender selectedCell];
  193.         
  194.     if ([sender respondsTo: @selector (state)])
  195.         [self wantsYear: [sender state]];
  196.         
  197.     return self;
  198. }
  199.  
  200.  
  201. - takeTimeColorFrom: sender
  202. {
  203.     if ([sender respondsTo: @selector (color)]) [self timeColor: [sender color]];
  204.     return self;
  205. }
  206.  
  207.  
  208. - takeDateColorFrom: sender
  209. {
  210.     if ([sender respondsTo: @selector (color)]) [self dateColor: [sender color]];
  211.     return self;
  212. }
  213.  
  214.  
  215. //----------------------------------------------------------------------------------------------------
  216. //    Draw Methods
  217. //-----------------------------------------------------------------------------------------------------
  218. - drawClockFace
  219. {
  220.     return self;
  221. }
  222.  
  223.  
  224. - drawTime
  225. {
  226.         int         hour = HOUR(displayTimeAndDate);
  227.         char     stringBuffer[10];
  228.     NXPoint    stringLocation;
  229.     
  230.     if (! flags.wantsMilitaryTime)
  231.         {
  232.             hour = fmod (HOUR(displayTimeAndDate),12);
  233.             if (! hour) hour = 12;
  234.         }
  235.         
  236.     if (flags.wantsMilitaryTime)
  237.         sprintf (stringBuffer, "%.2d:%.2d", hour, MINUTE(displayTimeAndDate));
  238.     else
  239.         sprintf (stringBuffer, "%d:%.2d", hour, MINUTE(displayTimeAndDate));
  240.  
  241.         if (flags.wantsSeconds)
  242.             sprintf (stringBuffer,"%s:%.2d", stringBuffer, SECOND(displayTimeAndDate));
  243.  
  244.     stringLocation = [self _locationForString:stringBuffer usingFont: timeFont];
  245.  
  246.         [timeFont set];
  247.     NXSetColor (timeColor);
  248.     
  249.     if (style == DIGITAL_STYLE_DIAGONAL)
  250.         {
  251.         PSmoveto (stringLocation.x, (stringLocation.y));
  252.             PSrotate (45.0);
  253.         }
  254.     else
  255.         PSmoveto (stringLocation.x, (stringLocation.y - TIMESTRING_OFFSET));
  256.  
  257.     PSshow (stringBuffer);
  258.  
  259.     return self;
  260. }
  261.  
  262.  
  263. - drawDate
  264. {
  265.         char      stringBuffer[15];
  266.         NXPoint    stringLocation;
  267.         
  268.     if ( (flags.wantsDate == NO) || (style == DIGITAL_STYLE_DIAGONAL) ) return self;
  269.  
  270.     sprintf (stringBuffer,"%s %s %d", 
  271.         DAYS[WEEKDAY(displayTimeAndDate)],
  272.         MONTHS[MONTH(displayTimeAndDate)],
  273.         DAY(displayTimeAndDate));
  274.  
  275.     stringLocation = [self _locationForString:stringBuffer usingFont: dateFont];
  276.  
  277.         [dateFont set];
  278.     NXSetColor (dateColor);
  279.     PSmoveto (stringLocation.x, (stringLocation.y - DATESTRING_OFFSET));
  280.     PSshow (stringBuffer);
  281.  
  282.     if ( ! [self wantsYear]) return self;
  283.  
  284.     sprintf (stringBuffer,"%.4d", (1900 + YEAR(displayTimeAndDate)));
  285.     stringLocation = [self _locationForString:stringBuffer usingFont: yearFont];
  286.         [yearFont set];
  287.     PSmoveto (stringLocation.x, (stringLocation.y - YEARSTRING_OFFSET));
  288.     PSshow (stringBuffer);
  289.  
  290.     return self;
  291. }
  292.  
  293.  
  294. //----------------------------------------------------------------------------------------------------
  295. //    Archiving Methods
  296. //----------------------------------------------------------------------------------------------------
  297. - read: (NXTypedStream*) stream
  298. {
  299.     [super read: stream];
  300.     NXReadTypes (stream, "@@@ic", &timeFont, &dateFont, &yearFont, &style, &wantsYear);
  301.     timeColor = NXReadColor (stream);
  302.     dateColor = NXReadColor (stream);
  303.     return self;
  304. }
  305.  
  306.  
  307. - write: (NXTypedStream*) stream
  308. {
  309.     [super write: stream];
  310.     NXWriteTypes (stream, "@@@ic", &timeFont, &dateFont, &yearFont, &style, &wantsYear);
  311.     NXWriteColor (stream, timeColor);
  312.     NXWriteColor (stream, dateColor);
  313.     return self;
  314. }
  315.  
  316.  
  317. //----------------------------------------------------------------------------------------------------
  318. //    Superclass Overrides
  319. //-----------------------------------------------------------------------------------------------------
  320. - wantsSeconds: (BOOL) aFlag
  321. {
  322.     flags.wantsSeconds = aFlag;
  323.     [self _updateFont];
  324.     [self update];
  325.     return self;
  326. }
  327.  
  328.  
  329. - clockFace: (NXImage*) anImage
  330. {
  331.     return self;
  332. }
  333.  
  334.  
  335. //----------------------------------------------------------------------------------------------------
  336. //    IB Methods
  337. //----------------------------------------------------------------------------------------------------
  338. - getMinSize:(NXSize *)minSize maxSize:(NXSize *)maxSize from:(int)where
  339. {
  340.     //  Constrains resize within IB.
  341.     
  342.     minSize->width = maxSize->width = 64.0;
  343.     minSize->height = maxSize->height = 64.0;
  344.     return self;
  345. }
  346.  
  347.  
  348. - (const char*) getInspectorClassName
  349. {
  350.     //  Returns the name of the class responsible for managing custom 
  351.     //  IB Attributes inspection.
  352.         
  353.     return "DigitalClockInspector";
  354. }
  355.  
  356.  
  357. @end