home *** CD-ROM | disk | FTP | other *** search
/ Nebula 1994 June / NEBULA_SE.ISO / SourceCode / Tutorial / Cookbook / 33.TeachTime / ClockView.m < prev    next >
Encoding:
Text File  |  1993-01-19  |  2.0 KB  |  101 lines

  1.  
  2. /* Generated by Interface Builder */
  3.  
  4. #import "ClockView.h"
  5. #import <dpsclient/wraps.h>
  6. #import <appkit/Control.h>
  7. #import <math.h>
  8.  
  9. #define LEFT_MARGIN (-40.0)
  10. #define RIGHT_MARGIN 0.0
  11. #define TOP_MARGIN 30.0
  12. #define BOTTOM_MARGIN (-30.0)
  13. #define TWO_PI 6.28318
  14.  
  15.  
  16. @implementation ClockView
  17.  
  18. +newFrame:(const NXRect *)tF {
  19.     self = [super newFrame:tF];
  20.     hour = 3;
  21.     minute = 60;
  22.     return self;
  23. }
  24.  
  25. - setHour:sender
  26. {
  27.     hour = [sender intValue];
  28.     [hourText setIntValue:hour];
  29.     [self display];
  30.     return self;
  31. }
  32.  
  33. - setMinute:sender
  34. {
  35.     minute = [sender intValue];
  36.     [minuteText setIntValue:minute];
  37.     [self display];
  38.     return self;
  39. }
  40.  
  41. - setHourText:anObject
  42. {
  43.     hourText = anObject;
  44.     return self;
  45. }
  46.  
  47. - setMinuteText:anObject
  48. {
  49.     minuteText = anObject;
  50.     return self;
  51. }
  52.  
  53. - drawSelf:(NXRect*)r :(int)c
  54. {
  55.     char str[10];
  56.     int i;
  57.     float centerX, centerY, scale;
  58.     float minuteHandLength, hourHandLength;
  59.     centerX = (bounds.size.width-RIGHT_MARGIN-LEFT_MARGIN)/2.0;
  60.     centerY = (bounds.size.height-TOP_MARGIN-BOTTOM_MARGIN)/2.0;
  61.     scale = (bounds.size.width-RIGHT_MARGIN-LEFT_MARGIN);
  62.     minuteHandLength = scale*0.4;
  63.     hourHandLength = scale*0.3;
  64.     PSsetgray(NX_WHITE);
  65.     NXRectFill(r);
  66.  
  67.     PStranslate(centerX+LEFT_MARGIN, centerY+BOTTOM_MARGIN);
  68.     
  69.     // draw numbers
  70.     PSsetgray(NX_BLACK);
  71.     PSselectfont("Helvetica", 80.0);
  72.     for (i=1; i<=12; i++) {
  73.         PSmoveto( sin((float)i/12.0*TWO_PI) * scale*0.4,
  74.                     cos((float)i/12.0*TWO_PI) * scale*0.4);
  75.         sprintf(str, "%d", i);
  76.         PSshow(str);
  77.     }
  78.  
  79.     // minute hand
  80.     PSsetgray(NX_BLACK);
  81.     PSsetlinewidth(20.0);
  82.     PSnewpath();
  83.         PSmoveto(0.0, 0.0);
  84.         PSrlineto( sin((float) minute/60.0*TWO_PI) * minuteHandLength,
  85.                     cos((float) minute/60.0*TWO_PI) * minuteHandLength);
  86.     PSstroke();
  87.     
  88.     // hour hand
  89.     PSsetgray(NX_BLACK);
  90.     PSsetlinewidth(30.0);
  91.     PSnewpath();
  92.         PSmoveto(0.0, 0.0);
  93.         PSrlineto( sin((float) hour/12.0*TWO_PI) * hourHandLength,
  94.                     cos((float) hour/12.0*TWO_PI) * hourHandLength);
  95.     PSstroke();
  96.     
  97.     return self;
  98. }
  99.  
  100. @end
  101.