Changeset 2103
- Timestamp:
- 11/12/04 22:17:34 (4 years ago)
- Files:
-
- branches/overhaul/JVChatRoom.m (modified) (1 diff)
- branches/overhaul/JVDirectChat.h (modified) (1 diff)
- branches/overhaul/JVDirectChat.m (modified) (7 diffs)
- branches/overhaul/MVBuddyListController.m (modified) (3 diffs)
- branches/overhaul/MVConnectionsController.m (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
branches/overhaul/JVChatRoom.m
r1988 r2103 467 467 NSEnumerator *enumerator = [[[mbr menu] itemArray] objectEnumerator]; 468 468 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 } 469 493 } else { 470 494 item = [[[NSMenuItem alloc] initWithTitle:NSLocalizedString( @"Send Message", "send message contextual menu") action:NULL keyEquivalent:@""] autorelease]; branches/overhaul/JVDirectChat.h
r1987 r2103 36 36 long _previousLogOffset; 37 37 BOOL _forceSplitViewPosition; 38 39 BOOL _loadingPersonImage; 40 NSData *_personImageData; 38 41 } 39 42 - (id) initWithTarget:(id) target; branches/overhaul/JVDirectChat.m
r2017 r2103 97 97 static NSString *JVToolbarClearItemIdentifier = @"JVToolbarClearItem"; 98 98 99 @interface JVDirectChat (JVDirectChatPrivate) 99 @interface JVDirectChat (JVDirectChatPrivate) <ABImageClient> 100 100 - (void) addEventMessageToLogAndDisplay:(NSString *) message withName:(NSString *) name andAttributes:(NSDictionary *) attributes entityEncodeAttributes:(BOOL) encode; 101 101 - (void) addMessageToLogAndDisplay:(NSData *) message fromUser:(MVChatUser *) user asAction:(BOOL) action; … … 749 749 750 750 // 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; 752 752 753 753 _historyIndex = 0; … … 772 772 773 773 if( ( [subMsg length] >= 1 && range.length ) || ( [subMsg length] && ! range.length ) ) { 774 if( [[subMsg string] hasPrefix:@"/"] ) {774 if( [[subMsg string] hasPrefix:@"/"] && ! [[subMsg string] hasPrefix:@"//"] ) { 775 775 BOOL handled = NO; 776 776 NSScanner *scanner = [NSScanner scannerWithString:[subMsg string]]; … … 788 788 [[self connection] sendRawMessage:[command stringByAppendingFormat:@" %@", [arguments string]]]; 789 789 } else { 790 if( [[subMsg string] hasPrefix:@"//"] ) { 791 [subMsg deleteCharactersInRange:NSMakeRange(0,1)]; 792 } 790 793 if( [[NSUserDefaults standardUserDefaults] boolForKey:@"MVChatNaturalActions"] && ! action ) { 791 794 extern NSArray *JVAutoActionVerbs; … … 1129 1132 1130 1133 - (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]; 1139 1153 [item setTarget:self]; 1140 1154 [item setAction:@selector( clearDisplay: )]; 1141 1155 [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]]; 1143 1163 1144 1164 return ret; … … 1866 1886 } 1867 1887 1888 - (void) consumeImageData:(NSData *) data forTag:(int) tag { 1889 [_personImageData autorelease]; 1890 _personImageData = [data retain]; 1891 _loadingPersonImage = NO; 1892 } 1893 1868 1894 - (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; 1874 1904 return; 1875 1905 } 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 } 1879 1920 } 1880 1921 … … 1885 1926 return; 1886 1927 } 1887 if( [[NSFileManager defaultManager] isReadableFileAtPath:[NSString stringWithFormat:@"/tmp/%@.tif", [buddy uniqueIdentifier]]] ) 1888 return; 1928 1889 1929 [imageData writeToFile:[NSString stringWithFormat:@"/tmp/%@.tif", [buddy uniqueIdentifier]] atomically:NO]; 1890 1930 } branches/overhaul/MVBuddyListController.m
r2099 r2103 2 2 #import <ChatCore/MVChatConnection.h> 3 3 #import <ChatCore/NSStringAdditions.h> 4 #import <ChatCore/MVChatPluginManager.h> 5 #import <ChatCore/NSMethodSignatureAdditions.h> 4 6 5 7 #import "MVBuddyListController.h" … … 375 377 if( emailValue && index != NSNotFound ) { 376 378 [emailValue replaceValueAtIndex:index withValue:[email objectValue]]; 377 } else {379 } else if( [(NSString *)[email objectValue] length] ) { 378 380 emailValue = [[[ABMutableMultiValue alloc] init] autorelease]; 379 381 [emailValue addValue:[email objectValue] withLabel:kABOtherLabel]; 380 382 } 381 383 382 [person setValue:emailValue forProperty:kABEmailProperty]; 384 if( [emailValue count] ) 385 [person setValue:emailValue forProperty:kABEmailProperty]; 383 386 384 387 [person setImageData:[[image image] TIFFRepresentation]]; … … 741 744 742 745 - (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; 744 776 } 745 777 branches/overhaul/MVConnectionsController.m
r2082 r2103 895 895 - (NSMenu *) tableView:(NSTableView *) view menuForTableColumn:(NSTableColumn *) column row:(int) row { 896 896 if( view == connections ) { 897 MVChatConnection *connection = [[_bookmarks objectAtIndex:row] objectForKey:@"connection"]; 898 BOOL connected = [connection isConnected]; 897 899 NSMenu *menu = [[[NSMenu alloc] initWithTitle:@""] autorelease]; 898 900 NSMenuItem *item = nil; 899 BOOL connected = [(MVChatConnection *)[[_bookmarks objectAtIndex:row] objectForKey:@"connection"] isConnected];900 901 901 902 item = [[[NSMenuItem alloc] initWithTitle:NSLocalizedString( @"Get Info", "get info contextual menu item title" ) action:@selector( getInfo: ) keyEquivalent:@""] autorelease]; … … 930 931 [item setTarget:self]; 931 932 [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]]; 932 958 933 959 return [[menu retain] autorelease];
