This is LessonPlan.m in view mode; [Download] [Up]
// (C) Copyright 1992 Jim Patterson #import <objc/Object.h> #import <appkit/appkit.h> #import <sys/time.h> #import "LessonPlan.h" #define TA_HOME "asdfjkl;" #define TA_PUNCT "!,.'?\";:" #define TA_SYMBOL "@#$%^&=*()_+-+[]{}\\|/><" long random(void); void srandom(int); @implementation LessonPlan + new { self = [super new]; lessonNum = 1; srandom(5); return self; } - postInitialize { int i; for (i=0; i < 128; i++) keyboardKey[i] = [keyboardBox findViewWithTag:i]; compactedCapsToo = 0; [self flushKeyboard]; return self; } - setKeyboardBox:anObject { keyboardBox = anObject; return self; } - setLessonNumMatrix:anObject {lessonNumMatrix = anObject; return self; } - setLessonPlanWindow:anObject {lessonPlanWindow = anObject; return self; } - lessonNumMatrix {return lessonNumMatrix; } - setLessonNum:(int) newLessonNum {lessonNum = newLessonNum; return self; } - keyChanged:sender { int senderWasSelected = [sender state]; int key = [sender tag]; // key shift keys in parity if (key == TA_KEY_LEFTSHIFT) { [keyboardKey[TA_KEY_RIGHTSHIFT] setState:senderWasSelected]; keyIsIncluded[TA_KEY_RIGHTSHIFT] = senderWasSelected; } else if (key == TA_KEY_RIGHTSHIFT) { [keyboardKey[TA_KEY_LEFTSHIFT] setState:senderWasSelected]; keyIsIncluded[TA_KEY_LEFTSHIFT] = senderWasSelected; } keyIsIncluded[key] = senderWasSelected; // keep track of user changes if (lessonNum != 14) { lessonNum = 14; // automatically become custom lesson [lessonNumMatrix selectCellAt:6:1]; } [lessonPlanWindow setDocEdited:YES]; return self; } - (BOOL) keyIsSelected:(int) key { return keyIsIncluded[key];} - selectKey: (int) key { keyIsIncluded[key] = YES; [keyboardKey[key] setState:1]; return self; } - deselectKey: (int) key { keyIsIncluded[key] = NO; [keyboardKey[key] setState:1]; return self; } - selectKeysInStr :(char *) str { char *p = str; while (*p != '\0') keyIsIncluded[(int) *p++] = YES; // user must flushKeyboard return self; } - selectKeysBetween :(int) start :(int) finish // inclusive { int i; for (i=start; i<=finish; i++) keyIsIncluded[i] = YES; // user must flushKeyboard return self; } - deselectAll { int i; for (i=32; i<128; i++) keyIsIncluded[i] = NO; keyIsIncluded[TA_KEY_LEFTSHIFT] = keyIsIncluded[TA_KEY_RIGHTSHIFT] = NO; return self; } - flushKeyboard { int i,row,column; for (i=0; i<128; i++) { [keyboardKey[i] setState:keyIsIncluded[i]]; row = ((lessonNum -1) % 7); column = (lessonNum >=8); [lessonNumMatrix selectCellAt:row:column]; } return self; } // Methods to set and query lesson selections - lessonChanged:sender { // òBy the way, this is inlined to help optimized for speed // at the expense of code length, since otherwise changing huge // blocks of keys and redisplaying is very slow int oldLessonNum = lessonNum; lessonNum = [[sender selectedCell] tag]; if (lessonNum == oldLessonNum) return self; switch (lessonNum) { case 1: [self deselectAll]; // home keys [self selectKeysInStr:TA_HOME]; break; case 2: [self deselectAll]; // lower case [self selectKeysBetween:'a' :'z']; break; case 3: if (oldLessonNum != 2) [self deselectAll]; // upper & lower [self selectKeysBetween:'a' :'z']; // lower case keyIsIncluded[TA_KEY_LEFTSHIFT] = YES; keyIsIncluded[TA_KEY_RIGHTSHIFT] = YES; break; case 4: [self deselectAll]; // punctuation [self selectKeysInStr:TA_PUNCT]; break; case 5: if ((oldLessonNum < 2) || (oldLessonNum > 4)) // lower & punct [self deselectAll]; [self selectKeysBetween:'a' :'z']; [self selectKeysInStr:TA_PUNCT]; break; case 6: if ((oldLessonNum <2) || (oldLessonNum >5)) // upper, lower, punct [self deselectAll]; keyIsIncluded[TA_KEY_LEFTSHIFT] = YES; keyIsIncluded[TA_KEY_RIGHTSHIFT] = YES; [self selectKeysBetween:'a' :'z']; [self selectKeysInStr:TA_PUNCT]; break; case 7: [self deselectAll]; // digits [self selectKeysBetween:'0':'9']; break; case 8: if ((oldLessonNum != 7) && ((oldLessonNum <2 || oldLessonNum > 3))) [self deselectAll]; // dig, lett [self selectKeysBetween:'0':'9']; keyIsIncluded[TA_KEY_LEFTSHIFT] = YES; keyIsIncluded[TA_KEY_RIGHTSHIFT] = YES; [self selectKeysBetween:'a':'z']; break; case 9: if (oldLessonNum > 9) [self deselectAll]; // dig, lett,punct [self selectKeysBetween:'0':'9']; keyIsIncluded[TA_KEY_LEFTSHIFT] = YES; keyIsIncluded[TA_KEY_RIGHTSHIFT] = YES; [self selectKeysBetween:'a':'z']; [self selectKeysInStr:TA_PUNCT]; break; case 10: [self deselectAll]; [self selectKeysInStr:TA_SYMBOL]; // symbols break; case 11: if ((oldLessonNum != 10) && (oldLessonNum<2 || oldLessonNum>3)) [self deselectAll]; // sym, lett [self selectKeysInStr:TA_SYMBOL]; keyIsIncluded[TA_KEY_LEFTSHIFT] = YES; keyIsIncluded[TA_KEY_RIGHTSHIFT] = YES; [self selectKeysBetween:'a':'z']; break; case 12: if ((oldLessonNum == 13) || (oldLessonNum = 14) || (oldLessonNum = 9) || ((oldLessonNum >=4) && (oldLessonNum <=6))) [self deselectAll]; [self selectKeysBetween:'0':'9']; // sym, let, digits [self selectKeysInStr:TA_SYMBOL]; keyIsIncluded[TA_KEY_LEFTSHIFT] = YES; keyIsIncluded[TA_KEY_RIGHTSHIFT] = YES; [self selectKeysBetween:'a':'z']; break; case 13: [self selectKeysInStr:TA_PUNCT]; // punct, sym, let, digits [self selectKeysBetween:'0':'9']; [self selectKeysInStr:TA_SYMBOL]; keyIsIncluded[TA_KEY_LEFTSHIFT] = YES; keyIsIncluded[TA_KEY_RIGHTSHIFT] = YES; [self selectKeysBetween:'a':'z']; break; case 14: break; // custom } if (lessonNum !=14) [self flushKeyboard]; [lessonPlanWindow setDocEdited:YES]; return self; } - compactKeyList { int i,ch; numCompactedKeys=0; compactedCapsToo=0; for (i=32; i<128; i++) if (keyIsIncluded[i]) compactedKeyList[numCompactedKeys++] = (char) i; if (keyIsIncluded[TA_KEY_LEFTSHIFT]) // include caps if necessary for (ch=(int) 'a'; ch< ((int) 'z') + 1; ch++) if (keyIsIncluded[ch]) compactedKeyList[numCompactedKeys++] = (char) ch-32; return self; } - (int) randomBetween:(int) lowBound :(int) highBound { int temp = (int) random(); return ((temp % (highBound - lowBound +1)) + lowBound); } -(char) chooseChar // from compacted key List { if (!numCompactedKeys) return 'a'; // if no selected keys, return something at least return (compactedKeyList[[self randomBetween:0:numCompactedKeys-1]]); } - readInfo:(NXTypedStream *) tstream { int i; NXReadType(tstream,"i",&lessonNum); NXReadArray(tstream, "i", 128, keyIsIncluded); [lessonPlanWindow setDocEdited:NO]; [self flushKeyboard]; return self; } - writeInfo:(NXTypedStream *) tstream { NXWriteType(tstream,"i",&lessonNum); NXWriteArray(tstream, "i", 128, keyIsIncluded); [lessonPlanWindow setDocEdited:NO]; return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.