This is Controller.m in view mode; [Download] [Up]
// Controller.m #import "Controller.h" @implementation Controller - (void)addPrimal:(NXPoint)point { if ([enterMode selectedRow] == 0) { // in point mode if (numberOfPrimalPoints >= MAX_POINTS) { NXRunAlertPanel("Error", "Too many points", NULL, NULL, NULL); return; } sprintf(primalPoint[numberOfPrimalPoints].label, "%d", labelCounter++); primalPoint[numberOfPrimalPoints].color = [pointColorWell color]; primalPoint[numberOfPrimalPoints].a = point.x; primalPoint[numberOfPrimalPoints++].b = point.y; [pointBrowser loadColumnZero]; } else { if (numberOfPrimalLines >= MAX_POINTS) { NXRunAlertPanel("Error", "Too many lines", NULL, NULL, NULL); return; } if (!enter2) { point1 = point; enter2 = YES; } else { float a; enter2 = NO; if (point.x == point1.x) { NXRunAlertPanel("Error", "Can't have a vertical line", NULL, NULL, NULL); return; } a = (point.y - point1.y) / (point.x - point1.x); sprintf(primalLine[numberOfPrimalLines].label, "%d", labelCounter++); primalLine[numberOfPrimalLines].color = [lineColorWell color]; primalLine[numberOfPrimalLines].a = a; primalLine[numberOfPrimalLines++].b = point.y - a * point.x; [lineBrowser loadColumnZero]; } } [self draw:self]; } - (void)addDual:(NXPoint)point { if ([enterMode selectedRow] == 0) { // in point mode // a point in the dual plane corresponds to a line in the primal plane if (numberOfPrimalLines >= MAX_POINTS) { NXRunAlertPanel("Error", "Too many lines", NULL, NULL, NULL); return; } sprintf(primalLine[numberOfPrimalLines].label, "%d", labelCounter++); primalLine[numberOfPrimalLines].color = [pointColorWell color]; primalLine[numberOfPrimalLines].a = point.x; primalLine[numberOfPrimalLines++].b = -point.y; [lineBrowser loadColumnZero]; } else { // a line in the dual plane corresponds to a point in the primal plane if (numberOfPrimalPoints >= MAX_POINTS) { NXRunAlertPanel("Error", "Too many points", NULL, NULL, NULL); return; } if (!enter2) { point1 = point; enter2 = YES; } else { float a; enter2 = NO; if (point.x == point1.x) { NXRunAlertPanel("Error", "Can't have a vertical line", NULL, NULL, NULL); return; } a = (point.y - point1.y) / (point.x - point1.x); sprintf(primalPoint[numberOfPrimalPoints].label, "%d", labelCounter++); primalPoint[numberOfPrimalPoints].color = [lineColorWell color]; primalPoint[numberOfPrimalPoints].a = a; primalPoint[numberOfPrimalPoints++].b = -(point.y - a * point.x); [pointBrowser loadColumnZero]; } } [self draw:self]; } - (int)browser:sender fillMatrix:matrix inColumn:(int)column { int row; id cell; char buf[1000]; if (sender == pointBrowser) { for (row = 0; row < numberOfPrimalPoints; row++) { [matrix addRow]; cell = [matrix cellAt:row :0]; sprintf(buf, "%s: (%.2f,%.2f)", primalPoint[row].label, primalPoint[row].a, primalPoint[row].b); [cell setStringValue:buf]; [cell setLoaded:YES]; [cell setLeaf:YES]; } return row; } else { for (row = 0; row < numberOfPrimalLines; row++) { [matrix addRow]; cell = [matrix cellAt:row :0]; sprintf(buf, "%s: y = %.2f * x + %.2f", primalLine[row].label, primalLine[row].a, primalLine[row].b); [cell setStringValue:buf]; [cell setLoaded:YES]; [cell setLeaf:YES]; } return row; } } - (void)getPrimalPoints:(int *)num :(PointLine **)point; { *num = numberOfPrimalPoints; *point = primalPoint; } - (void)getPrimalLines:(int *)num :(PointLine **)line; { *num = numberOfPrimalLines; *line = primalLine; } - deletePoint:sender { Matrix *m = [pointBrowser matrixInColumn:0]; if ([m selectedRow] != -1) { int i; for (i = [m selectedRow]; i < numberOfPrimalPoints - 1; i++) primalPoint[i] = primalPoint[i+1]; numberOfPrimalPoints--; [self draw:self]; [pointBrowser loadColumnZero]; } return self; } - deleteAllPoints:sender { numberOfPrimalPoints = 0; [self draw:self]; [pointBrowser loadColumnZero]; return self; } - deleteLine:sender { Matrix *m = [lineBrowser matrixInColumn:0]; if ([m selectedRow] != -1) { int i; for (i = [m selectedRow]; i < numberOfPrimalLines - 1; i++) primalLine[i] = primalLine[i+1]; numberOfPrimalLines--; [self draw:self]; [lineBrowser loadColumnZero]; } return self; } - deleteAllLines:sender { numberOfPrimalLines = 0; [self draw:self]; [lineBrowser loadColumnZero]; return self; } - draw:sender { [primalPlaneView display]; [dualPlaneView display]; return self; } - newPointLabel:sender { Matrix *m = [pointBrowser matrixInColumn:0]; int row = [m selectedRow]; if (row != -1 && [pointLabel stringValue]) strcpy(primalPoint[row].label, [pointLabel stringValue]); [self draw:self]; [pointBrowser loadColumnZero]; return self; } - newLineLabel:sender { Matrix *m = [lineBrowser matrixInColumn:0]; int row = [m selectedRow]; if (row != -1 && [lineLabel stringValue]) strcpy(primalLine[row].label, [lineLabel stringValue]); [self draw:self]; [lineBrowser loadColumnZero]; return self; } - pointSelected:sender { Matrix *m = [pointBrowser matrixInColumn:0]; int row = [m selectedRow]; if (row != -1) [pointLabel setStringValue:primalPoint[row].label]; return self; } - lineSelected:sender { Matrix *m = [lineBrowser matrixInColumn:0]; int row = [m selectedRow]; if (row != -1) [lineLabel setStringValue:primalLine[row].label]; return self; } - newPointColor:sender { Matrix *m = [pointBrowser matrixInColumn:0]; int row = [m selectedRow]; if (row != -1) { primalPoint[row].color = [pointColorWell color]; [self draw:self]; } return self; } - newLineColor:sender { Matrix *m = [lineBrowser matrixInColumn:0]; int row = [m selectedRow]; if (row != -1) { primalLine[row].color = [lineColorWell color]; [self draw:self]; } return self; } - showInfo:sender { if (!infoPanel) infoPanel = [NXApp loadNibSection:"InfoPanel.nib" owner:self]; [infoPanel makeKeyAndOrderFront:self]; return self; } #define MAIL_ADDRESS "rgc@cs.umd.edu" #define SUBJECT "Suggestion/Bug for Dual" - suggestion:sender { id s = [NXApp appSpeaker]; NXPortFromName("Mail", NULL); // make sure app is launched [[NXApp appSpeaker] setSendPort:NXPortFromName("MailSendDemo", NULL)]; [s performRemoteMethod:"setTo:" with:MAIL_ADDRESS length:strlen(MAIL_ADDRESS)+1]; [s performRemoteMethod:"setSubject:" with:SUBJECT length:strlen(SUBJECT)+1]; return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.