home *** CD-ROM | disk | FTP | other *** search
/ Nebula 1 / Nebula One.iso / Educational / CurveGrader / Source / CurveView.m < prev    next >
Encoding:
Text File  |  1995-06-12  |  3.6 KB  |  156 lines

  1. /*
  2.  *    A plotting view. 
  3.  *    Rob Ferrante
  4.  */
  5. #import "CurveView.h"
  6. #import "GradeSlider.h"
  7. #include "CV.h"
  8. #import <appkit/Matrix.h>
  9. #import <appkit/Cell.h>
  10. #import <objc/List.h>
  11. #import <dpsclient/wraps.h>
  12. #import <strings.h>
  13.  
  14. @implementation CurveView
  15.  
  16. float  scoreFromPos(int x)
  17. {
  18.     return 100.0 - x/5.0;
  19. }
  20.  
  21. - initFrame: (NXRect *)r
  22. {
  23.     int i;    
  24.     self = [super initFrame:r];
  25.     count = 0;
  26.     percentMode = NO;
  27.     topOfView = 399;
  28.     for (i=0;i<20;i++) scoreBin[i]=0;
  29.     posA = 100; posB=200; posC=300; posD=400;
  30.     return self;
  31. }
  32.  
  33. - setPercentMode:sender
  34. {
  35.     percentMode = ([[sender selectedCell] tag] == 1);
  36.     [self updateFields];
  37.     return self;
  38. }
  39.  
  40. - loadStudents:sender
  41. {
  42.     int num, i, maxBin=0;
  43.     [scoreMatrix getNumRows:&num numCols:&i]; // used i for cols, don't need
  44.     count = 0;
  45.     for (i=0;i<20;i++) scoreBin[i]=0;
  46.     for (i=0;i<num;i++) {
  47.         scores[i] = [[scoreMatrix cellAt:i :0] floatValue];
  48.         if (strlen([[nameMatrix cellAt:i :0] stringValue]) >0){
  49.             count++;
  50.             if (scores[i]>=100.0) scores[i]=99.9;
  51.             scoreBin[(int)(scores[i]/5.0)]++;
  52.         }
  53.     }
  54.     for (i=0;i<20;i++)
  55.         if (maxBin < scoreBin[i]) maxBin = scoreBin[i];
  56.     [self setDrawSize:500 :(topOfView=maxBin*1.25)];
  57.     [self display];
  58.     [self updateFields];
  59.     return self;
  60. }
  61.  
  62. - loadGrades:sender
  63. {
  64.     int i;
  65.     float cutA,cutB,cutC,cutD;
  66.     
  67.     cutA = scoreFromPos(posA);
  68.     cutB = scoreFromPos(posB);
  69.     cutC = scoreFromPos(posC);
  70.     cutD = scoreFromPos(posD);
  71.     for (i=0;i<count;i++) {
  72.         if (scores[i] >= cutA) [[gradeMatrix cellAt:i :0] setStringValue:"A"];
  73.         else if (scores[i] >= cutB) [[gradeMatrix cellAt:i :0] setStringValue:"B"];
  74.         else if (scores[i] >= cutC) [[gradeMatrix cellAt:i :0] setStringValue:"C"];
  75.         else if (scores[i] >= cutD) [[gradeMatrix cellAt:i :0] setStringValue:"D"];
  76.         else [[gradeMatrix cellAt:i :0] setStringValue:"F"];
  77.     }
  78.     return self;
  79. }
  80.  
  81. - drawSelf:(NXRect *)list:(int)count
  82. {
  83.     int i=19, k=0;
  84.     NXRect  bar;
  85.     NXEraseRect(&bounds);
  86.     PSsetgray(NX_DKGRAY);
  87.     while(i>=0) {
  88.         NXSetRect(&bar,k,0,25,scoreBin[i--]);
  89.         NXRectFill(&bar);
  90.         k +=25;
  91.     }
  92.     PSlines(posA, posB, posC, posD, topOfView);
  93.     return self;
  94. }
  95.  
  96. - moveA:sender
  97. {
  98.     posA = [sender posA];
  99.     [self display];
  100.     [fieldA setFloatValue:[self percentBetween:scoreFromPos(posA) :100.01]];
  101.     [fieldB setFloatValue:[self percentBetween:scoreFromPos(posB) :scoreFromPos(posA)]];
  102.     return self;
  103. }
  104.  
  105. - moveB:sender
  106. {
  107.     posB = [sender posB];
  108.     [self display];
  109.     [fieldB setFloatValue:[self percentBetween:scoreFromPos(posB) :scoreFromPos(posA)]];
  110.     [fieldC setFloatValue:[self percentBetween:scoreFromPos(posC) :scoreFromPos(posB)]];
  111.     return self;
  112. }
  113.  
  114. - moveC:sender
  115. {
  116.     posC = [sender posC];
  117.     [self display];
  118.     [fieldC setFloatValue:[self percentBetween:scoreFromPos(posC) :scoreFromPos(posB)]];
  119.     [fieldD setFloatValue:[self percentBetween:scoreFromPos(posD) :scoreFromPos(posC)]];
  120.     return self;
  121. }
  122.  
  123. - moveD:sender
  124. {
  125.     posD = [sender posD];
  126.     [self display];
  127.     [fieldD setFloatValue:[self percentBetween:scoreFromPos(posD) :scoreFromPos(posC)]];
  128.     [fieldF setFloatValue:[self percentBetween:0.0 :scoreFromPos(posD)]];
  129.     return self;
  130. }
  131.  
  132. - updateFields
  133. {
  134.     [fieldA setFloatValue:[self percentBetween:scoreFromPos(posA) :100.01]];
  135.     [fieldB setFloatValue:[self percentBetween:scoreFromPos(posB) :scoreFromPos(posA)]];
  136.     [fieldC setFloatValue:[self percentBetween:scoreFromPos(posC) :scoreFromPos(posB)]];
  137.     [fieldD setFloatValue:[self percentBetween:scoreFromPos(posD) :scoreFromPos(posC)]];
  138.     [fieldF setFloatValue:[self percentBetween:0.0 :scoreFromPos(posD)]];
  139.     return self;
  140. }
  141.  
  142. -(float)percentBetween:(float)low :(float)high
  143. {
  144.     int i,k=0;
  145.     
  146.     for (i=0; i<count;i++) {
  147.         if (scores[i]>=low && scores[i]<high) k++;
  148.     }
  149.     if (percentMode == YES) return (k/(float)count)*100.0;
  150.     else return k;
  151. }
  152.  
  153.  
  154.  
  155. @end
  156.