Changeset 2103

Show
Ignore:
Timestamp:
11/12/04 22:17:34 (4 years ago)
Author:
timothy
Message:

Merged more of the trunk changes into the overhaul branch.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • branches/overhaul/JVChatRoom.m

    r1988 r2103  
    467467                        NSEnumerator *enumerator = [[[mbr menu] itemArray] objectEnumerator]; 
    468468                        while( ( item = [enumerator nextObject] ) ) [ret addObject:[[item copy] autorelease]]; 
     469 
     470                        NSMethodSignature *signature = [NSMethodSignature methodSignatureWithReturnAndArgumentTypes:@encode( NSArray * ), @encode( id ), @encode( id ), nil]; 
     471                        NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature]; 
     472 
     473                        [invocation setSelector:@selector( contextualMenuItemsForObject:inView: )]; 
     474                        [invocation setArgument:&mbr atIndex:2]; 
     475                        [invocation setArgument:&self atIndex:3]; 
     476 
     477                        NSArray *results = [[MVChatPluginManager defaultManager] makePluginsPerformInvocation:invocation]; 
     478                        if( [results count] ) { 
     479                                [ret addObject:[NSMenuItem separatorItem]]; 
     480 
     481                                NSArray *items = nil; 
     482                                enumerator = [results objectEnumerator]; 
     483                                while( ( items = [enumerator nextObject] ) ) { 
     484                                        if( ! [items respondsToSelector:@selector( objectEnumerator )] ) continue; 
     485                                        NSEnumerator *ienumerator = [items objectEnumerator]; 
     486                                        while( ( item = [ienumerator nextObject] ) ) 
     487                                                if( [item isKindOfClass:[NSMenuItem class]] ) [ret addObject:item]; 
     488                                } 
     489 
     490                                if( [[ret lastObject] isSeparatorItem] ) 
     491                                        [ret removeObjectIdenticalTo:[ret lastObject]]; 
     492                        } 
    469493                } else { 
    470494                        item = [[[NSMenuItem alloc] initWithTitle:NSLocalizedString( @"Send Message", "send message contextual menu") action:NULL keyEquivalent:@""] autorelease]; 
  • branches/overhaul/JVDirectChat.h

    r1987 r2103  
    3636        long _previousLogOffset; 
    3737        BOOL _forceSplitViewPosition; 
     38 
     39        BOOL _loadingPersonImage; 
     40        NSData *_personImageData; 
    3841} 
    3942- (id) initWithTarget:(id) target; 
  • branches/overhaul/JVDirectChat.m

    r2017 r2103  
    9797static NSString *JVToolbarClearItemIdentifier = @"JVToolbarClearItem"; 
    9898 
    99 @interface JVDirectChat (JVDirectChatPrivate) 
     99@interface JVDirectChat (JVDirectChatPrivate) <ABImageClient> 
    100100- (void) addEventMessageToLogAndDisplay:(NSString *) message withName:(NSString *) name andAttributes:(NSDictionary *) attributes entityEncodeAttributes:(BOOL) encode; 
    101101- (void) addMessageToLogAndDisplay:(NSData *) message fromUser:(MVChatUser *) user asAction:(BOOL) action; 
     
    749749 
    750750        // allow commands to be passed to plugins if we arn't connected, allow commands to pass to plugins and server if we are just out of the room 
    751         if( ( _cantSendMessages || ! [[self connection] isConnected] ) && ! [[[send textStorage] string] hasPrefix:@"/"] ) return; 
     751        if( ( _cantSendMessages || ! [[self connection] isConnected] ) && ( ! [[[send textStorage] string] hasPrefix:@"/"] || [[[send textStorage] string] hasPrefix:@"//"] ) ) return; 
    752752 
    753753        _historyIndex = 0; 
     
    772772 
    773773                if( ( [subMsg length] >= 1 && range.length ) || ( [subMsg length] && ! range.length ) ) { 
    774                         if( [[subMsg string] hasPrefix:@"/"] ) { 
     774                        if( [[subMsg string] hasPrefix:@"/"] && ! [[subMsg string] hasPrefix:@"//"] ) { 
    775775                                BOOL handled = NO; 
    776776                                NSScanner *scanner = [NSScanner scannerWithString:[subMsg string]]; 
     
    788788                                        [[self connection] sendRawMessage:[command stringByAppendingFormat:@" %@", [arguments string]]]; 
    789789                        } else { 
     790                                if( [[subMsg string] hasPrefix:@"//"] ) { 
     791                                        [subMsg deleteCharactersInRange:NSMakeRange(0,1)]; 
     792                                } 
    790793                                if( [[NSUserDefaults standardUserDefaults] boolForKey:@"MVChatNaturalActions"] && ! action ) { 
    791794                                        extern NSArray *JVAutoActionVerbs; 
     
    11291132 
    11301133- (NSArray *) webView:(WebView *) sender contextMenuItemsForElement:(NSDictionary *) element defaultMenuItems:(NSArray *) defaultMenuItems { 
    1131         NSMutableArray *ret = (NSMutableArray *)[super webView:sender contextMenuItemsForElement:element defaultMenuItems:defaultMenuItems]; 
    1132  
    1133         if( ! [defaultMenuItems count] && ! [[element objectForKey:WebElementIsSelectedKey] boolValue] ) { 
    1134                 NSMenuItem *item = [[[NSMenuItem alloc] initWithTitle:NSLocalizedString( @"Encoding", "encoding contextual menu" ) action:NULL keyEquivalent:@""] autorelease]; 
    1135                 [item setSubmenu:_spillEncodingMenu]; 
    1136                 [ret addObject:item]; 
    1137  
    1138                 item = [[[NSMenuItem alloc] initWithTitle:NSLocalizedString( @"Clear Display", "clear display contextual menu" ) action:NULL keyEquivalent:@""] autorelease]; 
     1134        NSMutableArray *ret = [NSMutableArray array]; 
     1135 
     1136        NSMenuItem *item = nil; 
     1137        unsigned i = 0; 
     1138        BOOL found = NO; 
     1139 
     1140        for( i = 0; i < [defaultMenuItems count]; i++ ) { 
     1141                item = [defaultMenuItems objectAtIndex:i]; 
     1142                switch( [item tag] ) { 
     1143                        case WebMenuItemTagCopy: 
     1144                        case WebMenuItemTagDownloadLinkToDisk: 
     1145                        case WebMenuItemTagDownloadImageToDisk: 
     1146                                found = YES; 
     1147                                break; 
     1148                } 
     1149        } 
     1150 
     1151        if( ! found && ! [[element objectForKey:WebElementIsSelectedKey] boolValue] ) { 
     1152                NSMenuItem *item = [[[NSMenuItem alloc] initWithTitle:NSLocalizedString( @"Clear Display", "clear display contextual menu" ) action:NULL keyEquivalent:@""] autorelease]; 
    11391153                [item setTarget:self]; 
    11401154                [item setAction:@selector( clearDisplay: )]; 
    11411155                [ret addObject:item]; 
    1142         } 
     1156 
     1157                item = [[[NSMenuItem alloc] initWithTitle:NSLocalizedString( @"Encoding", "encoding contextual menu" ) action:NULL keyEquivalent:@""] autorelease]; 
     1158                [item setSubmenu:_spillEncodingMenu]; 
     1159                [ret addObject:item]; 
     1160        } 
     1161 
     1162        [ret addObjectsFromArray:[super webView:sender contextMenuItemsForElement:element defaultMenuItems:defaultMenuItems]]; 
    11431163 
    11441164        return ret; 
     
    18661886} 
    18671887 
     1888- (void) consumeImageData:(NSData *) data forTag:(int) tag { 
     1889        [_personImageData autorelease]; 
     1890        _personImageData = [data retain]; 
     1891        _loadingPersonImage = NO; 
     1892} 
     1893 
    18681894- (void) _saveSelfIcon { 
    1869         ABPerson *_person = [[ABAddressBook sharedAddressBook] me]; 
    1870         NSImage *icon = [[[NSImage alloc] initWithData:[_person imageData]] autorelease]; 
    1871         NSData *imageData = [icon TIFFRepresentation]; 
    1872         if( ! [imageData length] ) { 
    1873                 [[NSFileManager defaultManager] removeFileAtPath:[NSString stringWithFormat:@"/tmp/%@.tif", [_person uniqueId]] handler:nil]; 
     1895        if( _loadingPersonImage ) return; 
     1896        _loadingPersonImage = YES; 
     1897 
     1898        ABPerson *me = [[ABAddressBook sharedAddressBook] me]; 
     1899 
     1900        @try { 
     1901                [me beginLoadingImageDataForClient:self]; 
     1902        } @catch ( NSException *exception ) { 
     1903                _loadingPersonImage = NO; 
    18741904                return; 
    18751905        } 
    1876         if( [[NSFileManager defaultManager] isReadableFileAtPath:[NSString stringWithFormat:@"/tmp/%@.tif", [_person uniqueId]]] ) 
    1877                 return; 
    1878         [imageData writeToFile:[NSString stringWithFormat:@"/tmp/%@.tif", [_person uniqueId]] atomically:NO]; 
     1906 
     1907        while( ! _personImageData && _loadingPersonImage ) // asynchronously load the image incase it is on the network 
     1908                [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; 
     1909 
     1910        if( ! [_personImageData length] ) { 
     1911                [[NSFileManager defaultManager] removeFileAtPath:[NSString stringWithFormat:@"/tmp/%@.tif", [me uniqueId]] handler:nil]; 
     1912        } else { 
     1913                NSImage *icon = [[[NSImage alloc] initWithData:_personImageData] autorelease]; 
     1914                NSData *imageData = [icon TIFFRepresentation]; 
     1915                [imageData writeToFile:[NSString stringWithFormat:@"/tmp/%@.tif", [me uniqueId]] atomically:NO]; 
     1916 
     1917                [_personImageData autorelease]; 
     1918                _personImageData = nil; 
     1919        } 
    18791920} 
    18801921 
     
    18851926                return; 
    18861927        } 
    1887         if( [[NSFileManager defaultManager] isReadableFileAtPath:[NSString stringWithFormat:@"/tmp/%@.tif", [buddy uniqueIdentifier]]] ) 
    1888                 return; 
     1928 
    18891929        [imageData writeToFile:[NSString stringWithFormat:@"/tmp/%@.tif", [buddy uniqueIdentifier]] atomically:NO]; 
    18901930} 
  • branches/overhaul/MVBuddyListController.m

    r2099 r2103  
    22#import <ChatCore/MVChatConnection.h> 
    33#import <ChatCore/NSStringAdditions.h> 
     4#import <ChatCore/MVChatPluginManager.h> 
     5#import <ChatCore/NSMethodSignatureAdditions.h> 
    46 
    57#import "MVBuddyListController.h" 
     
    375377                if( emailValue && index != NSNotFound ) { 
    376378                        [emailValue replaceValueAtIndex:index withValue:[email objectValue]]; 
    377                 } else
     379                } else if( [(NSString *)[email objectValue] length] )
    378380                        emailValue = [[[ABMutableMultiValue alloc] init] autorelease]; 
    379381                        [emailValue addValue:[email objectValue] withLabel:kABOtherLabel]; 
    380382                } 
    381383 
    382                 [person setValue:emailValue forProperty:kABEmailProperty]; 
     384                if( [emailValue count] ) 
     385                        [person setValue:emailValue forProperty:kABEmailProperty]; 
    383386 
    384387                [person setImageData:[[image image] TIFFRepresentation]]; 
     
    741744 
    742745- (NSMenu *) tableView:(MVTableView *) tableView menuForTableColumn:(NSTableColumn *) tableColumn row:(int) row { 
    743         return actionMenu; 
     746        NSMenu *menu = [[actionMenu copyWithZone:[self zone]] autorelease]; 
     747        JVBuddy *buddy = [_buddyOrder objectAtIndex:row]; 
     748 
     749        NSMethodSignature *signature = [NSMethodSignature methodSignatureWithReturnAndArgumentTypes:@encode( NSArray * ), @encode( id ), @encode( id ), nil]; 
     750        NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature]; 
     751        id view = nil; 
     752 
     753        [invocation setSelector:@selector( contextualMenuItemsForObject:inView: )]; 
     754        [invocation setArgument:&buddy atIndex:2]; 
     755        [invocation setArgument:&view atIndex:3]; 
     756 
     757        NSArray *results = [[MVChatPluginManager defaultManager] makePluginsPerformInvocation:invocation]; 
     758        if( [results count] ) { 
     759                [menu addItem:[NSMenuItem separatorItem]]; 
     760                 
     761                NSArray *items = nil; 
     762                NSMenuItem *item = nil; 
     763                NSEnumerator *enumerator = [results objectEnumerator]; 
     764                while( ( items = [enumerator nextObject] ) ) { 
     765                        if( ! [items respondsToSelector:@selector( objectEnumerator )] ) continue; 
     766                        NSEnumerator *ienumerator = [items objectEnumerator]; 
     767                        while( ( item = [ienumerator nextObject] ) ) 
     768                                if( [item isKindOfClass:[NSMenuItem class]] ) [menu addItem:item]; 
     769                } 
     770 
     771                if( [[[menu itemArray] lastObject] isSeparatorItem] ) 
     772                        [menu removeItem:[[menu itemArray] lastObject]]; 
     773        } 
     774 
     775        return menu; 
    744776} 
    745777 
  • branches/overhaul/MVConnectionsController.m

    r2082 r2103  
    895895- (NSMenu *) tableView:(NSTableView *) view menuForTableColumn:(NSTableColumn *) column row:(int) row { 
    896896        if( view == connections ) { 
     897                MVChatConnection *connection = [[_bookmarks objectAtIndex:row] objectForKey:@"connection"]; 
     898                BOOL connected = [connection isConnected]; 
    897899                NSMenu *menu = [[[NSMenu alloc] initWithTitle:@""] autorelease]; 
    898900                NSMenuItem *item = nil; 
    899                 BOOL connected = [(MVChatConnection *)[[_bookmarks objectAtIndex:row] objectForKey:@"connection"] isConnected]; 
    900901 
    901902                item = [[[NSMenuItem alloc] initWithTitle:NSLocalizedString( @"Get Info", "get info contextual menu item title" ) action:@selector( getInfo: ) keyEquivalent:@""] autorelease]; 
     
    930931                [item setTarget:self]; 
    931932                [menu addItem:item]; 
     933 
     934                NSMethodSignature *signature = [NSMethodSignature methodSignatureWithReturnAndArgumentTypes:@encode( NSArray * ), @encode( id ), @encode( id ), nil]; 
     935                NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature]; 
     936                id view = nil; 
     937 
     938                [invocation setSelector:@selector( contextualMenuItemsForObject:inView: )]; 
     939                [invocation setArgument:&connection atIndex:2]; 
     940                [invocation setArgument:&view atIndex:3]; 
     941 
     942                NSArray *results = [[MVChatPluginManager defaultManager] makePluginsPerformInvocation:invocation]; 
     943                if( [results count] ) { 
     944                        [menu addItem:[NSMenuItem separatorItem]]; 
     945                         
     946                        NSArray *items = nil; 
     947                        NSEnumerator *enumerator = [results objectEnumerator]; 
     948                        while( ( items = [enumerator nextObject] ) ) { 
     949                                if( ! [items respondsToSelector:@selector( objectEnumerator )] ) continue; 
     950                                NSEnumerator *ienumerator = [items objectEnumerator]; 
     951                                while( ( item = [ienumerator nextObject] ) ) 
     952                                        if( [item isKindOfClass:[NSMenuItem class]] ) [menu addItem:item]; 
     953                        } 
     954                } 
     955 
     956                if( [[[menu itemArray] lastObject] isSeparatorItem] ) 
     957                        [menu removeItem:[[menu itemArray] lastObject]]; 
    932958 
    933959                return [[menu retain] autorelease];