|
|
1.1 ! root 1: /* RadioAssociation.m ! 2: * ! 3: * You may freely copy, distribute, and reuse the code in this example. ! 4: * NeXT disclaims any warranty of any kind, expressed or implied, as to its ! 5: * fitness for any particular use. ! 6: * ! 7: * ! 8: * ! 9: */ ! 10: ! 11: #import <appkit/appkit.h> ! 12: #import <eointerface/eointerface.h> ! 13: ! 14: #import "RadioAssociation.h" ! 15: ! 16: // Add a category to ButtonCell class to recognize the RadioAssociation ! 17: // for Radio Buttons. ! 18: ! 19: @implementation ButtonCell (RadioAssociation) ! 20: - (Class)matrixAssociationClass:matrix ! 21: { ! 22: const char *iconname; ! 23: ! 24: if (([matrix mode] == NX_RADIOMODE) ! 25: && (iconname = [self icon]) ! 26: && !strcmp(iconname, "NXradio")) ! 27: return [RadioAssociation class]; ! 28: else ! 29: return [EOMatrixAssociation class]; ! 30: } ! 31: @end ! 32: ! 33: ! 34: // Override the standard matrix associationClass method to spot radio ! 35: // associations ! 36: ! 37: @implementation Matrix (RadioAssoc) ! 38: - (Class)associationClass ! 39: { ! 40: id acell; ! 41: ! 42: // Determine if we're a matrix of radio buttons! ! 43: acell = [self cellAt:0:0]; ! 44: if (acell && [acell respondsToSelector:@selector(matrixAssociationClass:)]) ! 45: return [acell matrixAssociationClass:self]; ! 46: ! 47: // Use the generic association ! 48: return [EOMatrixAssociation class]; ! 49: } ! 50: ! 51: @end ! 52: ! 53: ! 54: @implementation RadioAssociation ! 55: ! 56: - initWithController:(EOController *)aController ! 57: key: (NSString *)aKey destination: aDest ! 58: { ! 59: [super initWithController:aController key: aKey destination:aDest]; ! 60: ! 61: // This is needed to get rid of warning about multiple declarations. ! 62: [(Matrix *)aDest setTarget:self]; ! 63: [aDest setAction:@selector(controlActed:)]; ! 64: ! 65: // Allow empty selection for instances when the EO value doesn't ! 66: // match any of the values ! 67: ! 68: [aDest setEmptySelectionEnabled:YES]; ! 69: return self; ! 70: } ! 71: ! 72: - controlActed:sender ! 73: { ! 74: [controller associationDidEdit: self]; ! 75: return self; ! 76: } ! 77: ! 78: ! 79: // Return the selected cell string, or NULL if no cell is selected ! 80: ! 81: - value ! 82: { ! 83: const char *title = [[destination selectedCell] title]; ! 84: if (title) ! 85: return [NSString stringWithCString:title]; ! 86: else ! 87: return [EONull null]; ! 88: ! 89: } ! 90: ! 91: - (NSString *)currentValue ! 92: { ! 93: NSArray *selectedObjects = [controller selectedObjects]; ! 94: NSString *stringValue; ! 95: ! 96: if ([selectedObjects count] >= 1) { ! 97: id selectedObject, aDict, val; ! 98: id array = [[[NSArray alloc] initWithObjects: key, 0] autorelease]; ! 99: ! 100: selectedObject = [selectedObjects objectAtIndex: 0]; ! 101: aDict = [selectedObject valuesForKeys: array]; ! 102: val = [aDict objectForKey: key]; ! 103: if (!val) ! 104: stringValue = @""; ! 105: else ! 106: stringValue = [((NSObject *)val) description]; ! 107: } else { ! 108: stringValue = @""; ! 109: } ! 110: ! 111: return stringValue; ! 112: } ! 113: ! 114: - (void)selectionDidChange ! 115: { ! 116: [self contentsDidChange]; ! 117: } ! 118: ! 119: // ! 120: // If no cell matches title, then an empty selection is set ! 121: // ! 122: - (void)selectCellWithTitle:(NSString *)title ! 123: { ! 124: int col,row,numrows,numcols; ! 125: const char *titleCString = [title cString]; ! 126: ! 127: [destination getNumRows:&numrows numCols:&numcols]; ! 128: for(col=0; col<numcols;col++) { ! 129: for(row=0; row<numrows; row++) { ! 130: id cell = [destination cellAt:row :col]; ! 131: if (cell && !strcmp([cell title], titleCString)) { ! 132: [destination selectCellAt:row :col]; ! 133: return; ! 134: } ! 135: } ! 136: } ! 137: ! 138: // Clear the selection if no matching cell is found. ! 139: [destination selectCellAt:-1 :-1]; ! 140: } ! 141: ! 142: - (void)contentsDidChange ! 143: { ! 144: [self selectCellWithTitle:[self currentValue]]; ! 145: ! 146: // If there's not exactly one object selected, disable the control ! 147: ! 148: if ([[controller selectedObjects] count] == 1) ! 149: [destination setEnabled:YES]; ! 150: else ! 151: [destination setEnabled:NO]; ! 152: } ! 153: ! 154: @end ! 155: ! 156:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.