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

  1. // Controller.m
  2.  
  3. #import "Controller.h"
  4.  
  5. @implementation Controller
  6.  
  7. - (void)addPrimal:(NXPoint)point
  8. {
  9.     if ([enterMode selectedRow] == 0) {    // in point mode
  10.         if (numberOfPrimalPoints >= MAX_POINTS) {
  11.             NXRunAlertPanel("Error", "Too many points", NULL, NULL, NULL);
  12.             return;
  13.         }
  14.         sprintf(primalPoint[numberOfPrimalPoints].label, "%d", labelCounter++);
  15.         primalPoint[numberOfPrimalPoints].color = [pointColorWell color];
  16.         primalPoint[numberOfPrimalPoints].a = point.x;
  17.         primalPoint[numberOfPrimalPoints++].b = point.y;
  18.         [pointBrowser loadColumnZero];
  19.     } else {
  20.         if (numberOfPrimalLines >= MAX_POINTS) {
  21.             NXRunAlertPanel("Error", "Too many lines", NULL, NULL, NULL);
  22.             return;
  23.         }
  24.         if (!enter2) {
  25.             point1 = point;
  26.             enter2 = YES;
  27.         } else {
  28.             float a;
  29.             
  30.             enter2 = NO;
  31.             if (point.x == point1.x) {
  32.                 NXRunAlertPanel("Error", "Can't have a vertical line", NULL, NULL, NULL);
  33.                 return;
  34.             }
  35.             a = (point.y - point1.y) / (point.x - point1.x);
  36.             sprintf(primalLine[numberOfPrimalLines].label, "%d", labelCounter++);
  37.             primalLine[numberOfPrimalLines].color = [lineColorWell color];
  38.             primalLine[numberOfPrimalLines].a = a;
  39.             primalLine[numberOfPrimalLines++].b = point.y - a * point.x;
  40.             [lineBrowser loadColumnZero];
  41.         }
  42.     }
  43.     
  44.     [self draw:self];
  45. }
  46.  
  47. - (void)addDual:(NXPoint)point
  48. {
  49.     if ([enterMode selectedRow] == 0) {    // in point mode
  50.         // a point in the dual plane corresponds to a line in the primal plane
  51.         if (numberOfPrimalLines >= MAX_POINTS) {
  52.             NXRunAlertPanel("Error", "Too many lines", NULL, NULL, NULL);
  53.             return;
  54.         }
  55.         sprintf(primalLine[numberOfPrimalLines].label, "%d", labelCounter++);
  56.         primalLine[numberOfPrimalLines].color = [pointColorWell color];
  57.         primalLine[numberOfPrimalLines].a = point.x;
  58.         primalLine[numberOfPrimalLines++].b = -point.y;
  59.         [lineBrowser loadColumnZero];
  60.     } else {
  61.         // a line in the dual plane corresponds to a point in the primal plane
  62.         if (numberOfPrimalPoints >= MAX_POINTS) {
  63.             NXRunAlertPanel("Error", "Too many points", NULL, NULL, NULL);
  64.             return;
  65.         }
  66.         if (!enter2) {
  67.             point1 = point;
  68.             enter2 = YES;
  69.         } else {
  70.             float a;
  71.             
  72.             enter2 = NO;
  73.             if (point.x == point1.x) {
  74.                 NXRunAlertPanel("Error", "Can't have a vertical line", NULL, NULL, NULL);
  75.                 return;
  76.             }
  77.             a = (point.y - point1.y) / (point.x - point1.x);
  78.             sprintf(primalPoint[numberOfPrimalPoints].label, "%d", labelCounter++);
  79.             primalPoint[numberOfPrimalPoints].color = [lineColorWell color];
  80.             primalPoint[numberOfPrimalPoints].a = a;
  81.             primalPoint[numberOfPrimalPoints++].b = -(point.y - a * point.x);
  82.             [pointBrowser loadColumnZero];
  83.         }
  84.     }
  85.     
  86.     [self draw:self];
  87. }
  88.  
  89. - (int)browser:sender fillMatrix:matrix inColumn:(int)column
  90. {
  91.     int row;
  92.     id cell;
  93.     char buf[1000];
  94.     
  95.     if (sender == pointBrowser) {
  96.         for (row = 0; row < numberOfPrimalPoints; row++) {
  97.             [matrix addRow];
  98.             cell = [matrix cellAt:row :0];
  99.             sprintf(buf, "%s: (%.2f,%.2f)", primalPoint[row].label, primalPoint[row].a,
  100.                 primalPoint[row].b);
  101.             [cell setStringValue:buf];
  102.             [cell setLoaded:YES];
  103.             [cell setLeaf:YES];
  104.         }
  105.         return row;
  106.     } else {
  107.         for (row = 0; row < numberOfPrimalLines; row++) {
  108.             [matrix addRow];
  109.             cell = [matrix cellAt:row :0];
  110.             sprintf(buf, "%s: y = %.2f * x + %.2f", primalLine[row].label, 
  111.                 primalLine[row].a, primalLine[row].b);
  112.             [cell setStringValue:buf];
  113.             [cell setLoaded:YES];
  114.             [cell setLeaf:YES];
  115.         }
  116.         return row;
  117.     }
  118. }
  119.  
  120. - (void)getPrimalPoints:(int *)num :(PointLine **)point;
  121. {
  122.     *num = numberOfPrimalPoints;
  123.     *point = primalPoint;
  124. }
  125.  
  126. - (void)getPrimalLines:(int *)num :(PointLine **)line;
  127. {
  128.     *num = numberOfPrimalLines;
  129.     *line = primalLine;
  130. }
  131.  
  132. - deletePoint:sender
  133. {
  134.     Matrix *m = [pointBrowser matrixInColumn:0];
  135.     if ([m selectedRow] != -1) {
  136.         int i;
  137.         for (i = [m selectedRow]; i < numberOfPrimalPoints - 1; i++)
  138.             primalPoint[i] = primalPoint[i+1];
  139.         numberOfPrimalPoints--;
  140.         [self draw:self];
  141.         [pointBrowser loadColumnZero];
  142.     }
  143.     return self;
  144. }
  145.  
  146. - deleteAllPoints:sender
  147. {
  148.     numberOfPrimalPoints = 0;
  149.     [self draw:self];
  150.     [pointBrowser loadColumnZero];
  151.     return self;
  152. }
  153.  
  154. - deleteLine:sender
  155. {
  156.     Matrix *m = [lineBrowser matrixInColumn:0];
  157.     if ([m selectedRow] != -1) {
  158.         int i;
  159.         for (i = [m selectedRow]; i < numberOfPrimalLines - 1; i++)
  160.             primalLine[i] = primalLine[i+1];
  161.         numberOfPrimalLines--;
  162.         [self draw:self];
  163.         [lineBrowser loadColumnZero];
  164.     }
  165.     return self;
  166. }
  167.  
  168. - deleteAllLines:sender
  169. {
  170.     numberOfPrimalLines = 0;
  171.     [self draw:self];
  172.     [lineBrowser loadColumnZero];
  173.     return self;
  174. }
  175.  
  176. - draw:sender
  177. {
  178.     [primalPlaneView display];
  179.     [dualPlaneView display];
  180.     return self;
  181. }
  182.  
  183. - newPointLabel:sender
  184. {
  185.     Matrix *m = [pointBrowser matrixInColumn:0];
  186.     int row = [m selectedRow];
  187.     if (row != -1 && [pointLabel stringValue])
  188.         strcpy(primalPoint[row].label, [pointLabel stringValue]);
  189.     [self draw:self];
  190.     [pointBrowser loadColumnZero];
  191.     return self;
  192. }
  193.  
  194. - newLineLabel:sender
  195. {
  196.     Matrix *m = [lineBrowser matrixInColumn:0];
  197.     int row = [m selectedRow];
  198.     if (row != -1 && [lineLabel stringValue])
  199.         strcpy(primalLine[row].label, [lineLabel stringValue]);
  200.     [self draw:self];
  201.     [lineBrowser loadColumnZero];
  202.     return self;
  203. }
  204.  
  205. - pointSelected:sender
  206. {
  207.     Matrix *m = [pointBrowser matrixInColumn:0];
  208.     int row = [m selectedRow];
  209.     if (row != -1)
  210.         [pointLabel setStringValue:primalPoint[row].label];
  211.     return self;
  212. }
  213.  
  214. - lineSelected:sender
  215. {
  216.     Matrix *m = [lineBrowser matrixInColumn:0];
  217.     int row = [m selectedRow];
  218.     if (row != -1)
  219.         [lineLabel setStringValue:primalLine[row].label];
  220.     return self;
  221. }
  222.  
  223. - newPointColor:sender
  224. {
  225.     Matrix *m = [pointBrowser matrixInColumn:0];
  226.     int row = [m selectedRow];
  227.     if (row != -1) {
  228.         primalPoint[row].color = [pointColorWell color];
  229.         [self draw:self];
  230.     }
  231.     return self;
  232. }
  233.  
  234. - newLineColor:sender
  235. {
  236.     Matrix *m = [lineBrowser matrixInColumn:0];
  237.     int row = [m selectedRow];
  238.     if (row != -1) {
  239.         primalLine[row].color = [lineColorWell color];
  240.         [self draw:self];
  241.     }
  242.     return self;
  243. }
  244.  
  245. - showInfo:sender
  246. {
  247.     if (!infoPanel)
  248.         infoPanel = [NXApp loadNibSection:"InfoPanel.nib" owner:self];
  249.     [infoPanel makeKeyAndOrderFront:self];
  250.     return self;    
  251. }
  252.  
  253. #define MAIL_ADDRESS "rgc@cs.umd.edu"
  254. #define SUBJECT "Suggestion/Bug for Dual"
  255.  
  256. - suggestion:sender
  257. {
  258.     id s = [NXApp appSpeaker];
  259.  
  260.     NXPortFromName("Mail", NULL); // make sure app is launched
  261.     [[NXApp appSpeaker] setSendPort:NXPortFromName("MailSendDemo", NULL)];
  262.     [s performRemoteMethod:"setTo:" with:MAIL_ADDRESS length:strlen(MAIL_ADDRESS)+1];
  263.     [s performRemoteMethod:"setSubject:" with:SUBJECT length:strlen(SUBJECT)+1];
  264.     return self;
  265. }
  266.  
  267. @end
  268.