- Timestamp:
- 10/20/02 05:39:33 (20 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Cocoa/F-Script Anywhere/Source/FSAViewAssociationController.m
r14 r19 27 27 #import "FSAViewAssociationController.h" 28 28 #import "FSAController.h" 29 #import "FSAWindowManager.h" 29 30 #import "FSAnywhere.h" 30 31 #import <FScript/FSInterpreter.h> … … 43 44 44 45 if (self != nil) { 46 NSImage *bullseyeImage = [[NSImage alloc] initByReferencingFile: [[NSBundle bundleForClass: [self class]] pathForResource: @"Bullseye menu cursor" ofType: @"tiff"]]; 47 NSString *label = [fsa interpreterLabel]; 48 45 49 interpreter = [[[fsa interpreterView] interpreter] retain]; 46 50 system = [fsa system]; 47 [self window]; 51 [[self window] setResizeIncrements: NSMakeSize(1, 12)]; 52 if (label != nil) [[self window] setTitle: [NSString stringWithFormat: @"%@: %@", [[self window] title], label]]; 53 bullseyeCursor = [[NSCursor alloc] initWithImage: bullseyeImage hotSpot: NSMakePoint(6, 7)]; 48 54 [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(controlTextDidChange:) name: NSControlTextDidChangeNotification object: variableNameField]; 49 55 [[captureButton cell] setShowsStateBy: NSContentsCellMask | NSChangeGrayCellMask]; 56 [captureButton setState: NSOffState]; 50 57 [self update: nil]; 51 58 } … … 56 63 { 57 64 [viewHierarchyMenu release]; 58 [selected Viewrelease];65 [selectedElement release]; 59 66 [interpreter release]; 67 [bullseyeCursor release]; 60 68 [[NSNotificationCenter defaultCenter] removeObserver: self]; 61 69 [super dealloc]; … … 66 74 NSString *variableName = [variableNameField stringValue]; 67 75 BOOL canAssignToVariable = NO; 68 [browseButton setEnabled: selected View!= nil];76 [browseButton setEnabled: selectedElement != nil]; 69 77 [statusField setStringValue: @""]; 70 78 if ([variableName length] != 0) { 71 79 if (![Compiler isValidIndentifier: variableName]) { 72 80 [statusField setStringValue: @"Invalid name: contains spaces, punctuation or non-ASCII characters"]; 73 } else if (selected View!= nil) {81 } else if (selectedElement != nil) { 74 82 [statusField setStringValue: @"Click ÒAssociateÓ to assign to this variable"]; 75 83 canAssignToVariable = YES; … … 80 88 } 81 89 82 - (void)stopCapturing ;90 - (void)stopCapturingVoluntarily:(BOOL)voluntary; 83 91 { 84 92 FSALog(@"stopping capture"); 93 [[NSNotificationCenter defaultCenter] removeObserver: self name: NSMenuWillSendActionNotification object: nil]; 85 94 [captureButton setState: NSOffState]; 86 [statusField setStringValue: @""];87 95 [self update: nil]; 88 [variableNameField becomeFirstResponder]; 96 if (voluntary) { 97 FSALog(@"voluntary!"); 98 [[self window] makeKeyAndOrderFront: self]; 99 [bullseyeCursor pop]; 100 [variableNameField becomeFirstResponder]; 101 } 102 } 103 104 - (void)_addElement:(id)element withLabel:(NSString *)label toSubmenuForItem:(NSMenuItem *)item; 105 { 106 NSMenu *submenu = [item submenu]; 107 NSMenuItem *subItem; 108 if (submenu == nil) { 109 id superElement = [item representedObject]; 110 submenu = [[NSMenu alloc] initWithTitle: @""]; 111 subItem = [submenu addItemWithTitle: NSStringFromClass([superElement class]) 112 action: @selector(elementSelected:) 113 keyEquivalent: @""]; 114 [subItem setTarget: self]; 115 [subItem setRepresentedObject: superElement]; 116 [item setSubmenu: submenu]; 117 [submenu release]; 118 } 119 [submenu addItem: [NSMenuItem separatorItem]]; 120 [submenu addItemWithTitle: label action: nil keyEquivalent: @""]; 121 subItem = [submenu addItemWithTitle: [@" " 122 stringByAppendingString: NSStringFromClass([element class])] 123 action: @selector(elementSelected:) 124 keyEquivalent: @""]; 125 [subItem setTarget: self]; 126 [subItem setRepresentedObject: element]; 127 } 128 129 - (void)_addValueForSelector:(SEL)sel withLabel:(NSString *)label toSubmenuForItem:(NSMenuItem *)item; 130 { 131 id obj = [item representedObject]; 132 if ([obj respondsToSelector: sel]) { 133 id value = [obj performSelector: sel]; 134 if (value == nil) return; 135 [self _addElement: value withLabel: label toSubmenuForItem: item]; 136 } 89 137 } 90 138 … … 99 147 [item setTarget: self]; 100 148 [item setRepresentedObject: element]; 149 [self _addValueForSelector: @selector(windowController) withLabel: @"Window Controller" toSubmenuForItem: item]; 150 [self _addValueForSelector: @selector(delegate) withLabel: @"Delegate" toSubmenuForItem: item]; 151 [self _addValueForSelector: @selector(dataSource) withLabel: @"Data Source" toSubmenuForItem: item]; 152 [self _addValueForSelector: @selector(target) withLabel: @"Target" toSubmenuForItem: item]; 153 [self _addValueForSelector: @selector(cell) withLabel: @"Cell" toSubmenuForItem: item]; 101 154 } 102 155 … … 106 159 NSView *view, *superView = nil, *contentView; 107 160 NSWindow *eventWindow; 108 109 FSALog(@"capturing one"); 161 static unsigned captureCount = 0; 162 unsigned capture = captureCount++; 163 164 FSALog(@"%4u>capturing one", capture); 110 165 [captureButton setState: NSOnState]; 111 112 event = [NSApp nextEventMatchingMask: NSLeftMouseDownMask | NSRightMouseDownMask | NSKeyUpMask 166 [bullseyeCursor push]; 167 168 captureElement: 169 [bullseyeCursor set]; 170 FSALog(@"%4u waiting for event...", capture); 171 [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(menuWillSendAction:) name: NSMenuWillSendActionNotification object: nil]; 172 event = [NSApp nextEventMatchingMask: NSLeftMouseDownMask | NSRightMouseDownMask | NSOtherMouseDownMask | NSKeyUpMask | NSAppKitDefinedMask 113 173 untilDate: [NSDate distantFuture] 114 174 inMode: NSEventTrackingRunLoopMode 115 175 dequeue: YES]; 176 FSALog(@"%4u got %@", capture, event); 177 [[NSNotificationCenter defaultCenter] removeObserver: self name: NSMenuWillSendActionNotification object: nil]; 178 if ([event type] == NSAppKitDefined) { 179 if ([event subtype] == NSApplicationDeactivatedEventType) { 180 [NSApp discardEventsMatchingMask: NSAnyEventMask beforeEvent: event]; 181 [self stopCapturingVoluntarily: NO]; 182 [NSApp sendEvent: event]; 183 return; 184 } 185 goto captureElement; 186 } 116 187 if ([event type] == NSKeyUp) { 117 [self stopCapturing]; 188 [NSApp discardEventsMatchingMask: NSAnyEventMask & ~NSKeyUpMask beforeEvent: event]; 189 FSALog(@"%4u<stop capture [key up]", capture); 190 [self stopCapturingVoluntarily: YES]; 118 191 return; 119 192 } … … 125 198 view = [[contentView superview] hitTest: [event locationInWindow]]; 126 199 if (view == captureButton) { 127 [self stopCapturing]; 200 [NSApp discardEventsMatchingMask: NSAnyEventMask & ~NSKeyUpMask beforeEvent: event]; 201 FSALog(@"%4u<stop capture [capture button]", capture); 202 [self stopCapturingVoluntarily: YES]; 203 NS_VOIDRETURN; 204 } 205 if (view == nil) { 206 [self captureOneView]; 128 207 NS_VOIDRETURN; 129 208 } … … 144 223 NS_ENDHANDLER 145 224 [NSMenu popUpContextMenu: viewHierarchyMenu withEvent: event forView: view]; 146 if ([captureButton state] == NSOnState) 147 [self captureOneView];225 if ([captureButton state] == NSOnState) goto captureElement; 226 FSALog(@"%4u<stop capture [fell through to end]", capture); 148 227 } 149 228 … … 151 230 { 152 231 [statusField setStringValue: @"Click inside one of this applicationÕs windows to select."]; 153 [selected View release]; selectedView= nil;232 [selectedElement release]; selectedElement = nil; 154 233 [self update: nil]; 155 234 [self captureOneView]; 156 235 } 157 236 158 - (void)elementSelected:(NSMenuItem *)sender; 159 { 160 NSView *element = [sender representedObject]; 161 FSALog(@"element selected: %@", sender); 237 - (void)setSelectedElement:(id)element; 238 { 239 FSALog(@"element selected: %@", element); 162 240 NS_DURING 163 241 [descriptionField setStringValue: [element description]]; 164 [selectedView release]; 165 selectedView = [element retain]; 242 [selectedElement release]; 243 selectedElement = [element retain]; 244 [[self window] orderFront: self]; 166 245 NS_HANDLER 167 246 [descriptionField setStringValue: … … 169 248 NS_ENDHANDLER 170 249 [viewHierarchyMenu release]; viewHierarchyMenu = nil; 250 } 251 252 - (void)elementSelected:(NSMenuItem *)sender; 253 { 254 [self setSelectedElement: [sender representedObject]]; 171 255 [self captureOneView]; 256 } 257 258 - (void)menuWillSendAction:(NSNotification *)notification; 259 { 260 NSMenuItem *item = [[notification userInfo] objectForKey: @"MenuItem"]; 261 [self setSelectedElement: item]; 262 [NSApp discardEventsMatchingMask: NSAnyEventMask beforeEvent: [NSApp currentEvent]]; 263 // we're already capturing, don't do it again 264 } 265 266 - (void)controlTextDidChange:(NSNotification *)notification; 267 { 268 [self update: nil]; 172 269 } 173 270 … … 178 275 NSString *variableName = [variableNameField stringValue]; 179 276 [statusField setStringValue: @"AssociatingÉ"]; 180 [interpreter setObject: selected ViewforIdentifier: variableName];277 [interpreter setObject: selectedElement forIdentifier: variableName]; 181 278 [statusField setStringValue: [NSString stringWithFormat: @"Assigned variable Ò%@Ó", variableName]]; 182 279 NS_HANDLER … … 188 285 { 189 286 FSALog(@"system: %@", system); 190 [system browse: selected View];287 [system browse: selectedElement]; 191 288 [statusField setStringValue: @"Opened object browser"]; 192 289 } 193 290 194 - (void)controlTextDidChange:(NSNotification *)notification;195 {196 [self update: nil];197 }198 199 291 @end
Note:
See TracChangeset
for help on using the changeset viewer.