#include static char tab2[6] = { 'a', 'b', 'c', 'd', '0', '?' }; static NSButton *tab1[sizeof(tab2)]; static char name_of(id v) { int i; tab1[sizeof(tab2) - 1] = v; for (i = 0; ; ++i) if (tab1[i] == v) return tab2[i]; } static void vkv(NSButton *v) { NSButton *nv = [v nextValidKeyView]; NSButton *pv = [v previousValidKeyView]; NSLog(@"valid key views: %c <- %c(%d) -> %c", name_of(pv), name_of(v), [v acceptsFirstResponder], name_of(nv)); if (nv && ![nv isEnabled]) NSLog(@"next valid key view is disabled?"); if (pv && ![pv isEnabled]) NSLog(@"previous valid key view is disabled?"); } static void enb(NSButton *v, BOOL f) { NSLog(@"%@able: %c", (f ? @"en" : @"dis"), name_of(v)); [v setEnabled:f]; } int main(int argc, char *argv[]) { CREATE_AUTORELEASE_POOL(pool); NSButton *a = tab1[0] = [NSButton new]; NSButton *b = tab1[1] = [NSButton new]; NSButton *c = tab1[2] = [NSButton new]; NSButton *d = tab1[3] = [NSButton new]; [a setNextKeyView:b]; [a setNextKeyView:c]; [b setNextKeyView:d]; [c setNextKeyView:d]; [d setNextKeyView:a]; enb(b, YES); enb(c, YES); vkv(a); vkv(b); vkv(c); vkv(d); enb(b, YES); enb(c, NO); vkv(a); vkv(b); vkv(c); vkv(d); enb(b, NO); enb(c, YES); vkv(a); vkv(b); vkv(c); vkv(d); enb(b, NO); enb(c, NO); vkv(a); vkv(b); vkv(c); vkv(d); enb(a, NO); enb(d, NO); NSLog(@"is your program caught in an infinite loop?"); vkv(a); vkv(b); vkv(c); vkv(d); NSLog(@"This is the end."); RELEASE(pool); return 0; }