Ignore:
Timestamp:
10/20/02 05:39:33 (22 years ago)
Author:
Nicholas Riley
Message:

F-Script Anywhere 1.1.6d1

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Cocoa/F-Script Anywhere/Source/FSAViewAssociationController.m

    r14 r19  
    2727#import "FSAViewAssociationController.h"
    2828#import "FSAController.h"
     29#import "FSAWindowManager.h"
    2930#import "FSAnywhere.h"
    3031#import <FScript/FSInterpreter.h>
     
    4344
    4445    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       
    4549        interpreter = [[[fsa interpreterView] interpreter] retain];
    4650        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)];
    4854        [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(controlTextDidChange:) name: NSControlTextDidChangeNotification object: variableNameField];
    4955        [[captureButton cell] setShowsStateBy: NSContentsCellMask | NSChangeGrayCellMask];
     56        [captureButton setState: NSOffState];
    5057        [self update: nil];
    5158    }
     
    5663{
    5764    [viewHierarchyMenu release];
    58     [selectedView release];
     65    [selectedElement release];
    5966    [interpreter release];
     67    [bullseyeCursor release];
    6068    [[NSNotificationCenter defaultCenter] removeObserver: self];
    6169    [super dealloc];
     
    6674    NSString *variableName = [variableNameField stringValue];
    6775    BOOL canAssignToVariable = NO;
    68     [browseButton setEnabled: selectedView != nil];
     76    [browseButton setEnabled: selectedElement != nil];
    6977    [statusField setStringValue: @""];
    7078    if ([variableName length] != 0) {
    7179        if (![Compiler isValidIndentifier: variableName]) {
    7280            [statusField setStringValue: @"Invalid name: contains spaces, punctuation or non-ASCII characters"];
    73         } else if (selectedView != nil) {
     81        } else if (selectedElement != nil) {
    7482            [statusField setStringValue: @"Click ÒAssociateÓ to assign to this variable"];
    7583            canAssignToVariable = YES;
     
    8088}
    8189
    82 - (void)stopCapturing;
     90- (void)stopCapturingVoluntarily:(BOOL)voluntary;
    8391{
    8492    FSALog(@"stopping capture");
     93    [[NSNotificationCenter defaultCenter] removeObserver: self name: NSMenuWillSendActionNotification object: nil];
    8594    [captureButton setState: NSOffState];
    86     [statusField setStringValue: @""];
    8795    [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    }
    89137}
    90138
     
    99147    [item setTarget: self];
    100148    [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];
    101154}
    102155
     
    106159    NSView *view, *superView = nil, *contentView;
    107160    NSWindow *eventWindow;
    108 
    109     FSALog(@"capturing one");
     161    static unsigned captureCount = 0;
     162    unsigned capture = captureCount++;
     163   
     164    FSALog(@"%4u>capturing one", capture);
    110165    [captureButton setState: NSOnState];
    111 
    112     event = [NSApp nextEventMatchingMask: NSLeftMouseDownMask | NSRightMouseDownMask | NSKeyUpMask
     166    [bullseyeCursor push];
     167
     168captureElement:
     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
    113173                               untilDate: [NSDate distantFuture]
    114174                                  inMode: NSEventTrackingRunLoopMode
    115175                                 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    }
    116187    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];
    118191        return;
    119192    }
     
    125198        view = [[contentView superview] hitTest: [event locationInWindow]];
    126199        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];
    128207            NS_VOIDRETURN;
    129208        }
     
    144223    NS_ENDHANDLER
    145224    [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);
    148227}
    149228
     
    151230{
    152231    [statusField setStringValue: @"Click inside one of this applicationÕs windows to select."];
    153     [selectedView release]; selectedView = nil;
     232    [selectedElement release]; selectedElement = nil;
    154233    [self update: nil];
    155234    [self captureOneView];
    156235}
    157236
    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);
    162240    NS_DURING
    163241        [descriptionField setStringValue: [element description]];
    164         [selectedView release];
    165         selectedView = [element retain];
     242        [selectedElement release];
     243        selectedElement = [element retain];
     244        [[self window] orderFront: self];
    166245    NS_HANDLER
    167246        [descriptionField setStringValue:
     
    169248    NS_ENDHANDLER
    170249    [viewHierarchyMenu release]; viewHierarchyMenu = nil;
     250}
     251
     252- (void)elementSelected:(NSMenuItem *)sender;
     253{
     254    [self setSelectedElement: [sender representedObject]];
    171255    [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];
    172269}
    173270
     
    178275        NSString *variableName = [variableNameField stringValue];
    179276        [statusField setStringValue: @"AssociatingÉ"];
    180         [interpreter setObject: selectedView forIdentifier: variableName];
     277        [interpreter setObject: selectedElement forIdentifier: variableName];
    181278        [statusField setStringValue: [NSString stringWithFormat: @"Assigned variable Ò%@Ó", variableName]];
    182279    NS_HANDLER
     
    188285{
    189286    FSALog(@"system: %@", system);
    190     [system browse: selectedView];
     287    [system browse: selectedElement];
    191288    [statusField setStringValue: @"Opened object browser"];
    192289}
    193290
    194 - (void)controlTextDidChange:(NSNotification *)notification;
    195 {
    196     [self update: nil];
    197 }
    198 
    199291@end
Note: See TracChangeset for help on using the changeset viewer.