adium 3260:af2eb0ac74e7: Add an "Any" option to the File -> New ...
commits at adium.im
commits at adium.im
Tue Jul 27 05:41:46 UTC 2010
details: http://hg.adium.im/adium/rev/af2eb0ac74e7
revision: 3260:af2eb0ac74e7
author: Thijs Alkemade <thijsalkemade at gmail.com>
date: Sat Jul 17 12:07:09 2010 +0200
Add an "Any" option to the File -> New Chat (and, as a consequence, Contact -> Get Info For Contact...) window that will search through all contacts on the contact list.
This works by allowing AIAccountMenu delegates to specify an item that is inserted before all accounts (this is now also used for "All" in the Privacy Settings and "Connect all accounts" in the File menu).
Fixes #4235
diffs (283 lines):
diff -r a71c719e9271 -r af2eb0ac74e7 Frameworks/Adium Framework/Source/AIAccountMenu.h
--- a/Frameworks/Adium Framework/Source/AIAccountMenu.h Sat Jul 17 23:23:51 2010 -0400
+++ b/Frameworks/Adium Framework/Source/AIAccountMenu.h Sat Jul 17 12:07:09 2010 +0200
@@ -37,7 +37,7 @@
BOOL showTitleVerbs;
BOOL includeDisabledAccountsMenu;
BOOL includeAddAccountsMenu;
- BOOL includeConnectAllMenuItem;
+ BOOL delegateRespondsToSpecialMenuItem;
NSControlSize controlSize;
@@ -77,8 +77,8 @@
//Should the account menu include a submenu of services for adding accounts?
- (BOOL)accountMenuShouldIncludeAddAccountsMenu:(AIAccountMenu *)inAccountMenu;
-//Should the account menu include a "connect all" menu item?
-- (BOOL)accountMenuShouldIncludeConnectAllMenuItem:(AIAccountMenu *)inAccountMenu;
+//Does the menu require a special topmost item + seperator?
+- (NSMenuItem *)accountMenuSpecialMenuItem:(AIAccountMenu *)inAccountMenu;
//Should the account menu include a submenu of 'disabled accounts'?
- (BOOL)accountMenuShouldIncludeDisabledAccountsMenu:(AIAccountMenu *)inAccountMenu;
diff -r a71c719e9271 -r af2eb0ac74e7 Frameworks/Adium Framework/Source/AIAccountMenu.m
--- a/Frameworks/Adium Framework/Source/AIAccountMenu.m Sat Jul 17 23:23:51 2010 -0400
+++ b/Frameworks/Adium Framework/Source/AIAccountMenu.m Sat Jul 17 12:07:09 2010 +0200
@@ -47,6 +47,7 @@
- (void)_updateMenuItem:(NSMenuItem *)menuItem;
- (NSString *)_titleForAccount:(AIAccount *)account;
- (NSMenu *)actionsMenuForAccount:(AIAccount *)inAccount;
+- (void)selectAccountMenuItem:(NSMenuItem *)menuItem;
- (void)menuNeedsUpdate:(NSMenu*)menu;
- (void)rebuildActionsSubmenu:(NSMenu*)actionsSubmenu withAccount:(AIAccount*)account;
- (void)toggleAccountEnabled:(id)sender;
@@ -175,8 +176,7 @@
includeDisabledAccountsMenu = ([delegate respondsToSelector:@selector(accountMenuShouldIncludeDisabledAccountsMenu:)] &&
[delegate accountMenuShouldIncludeDisabledAccountsMenu:self]);
- includeConnectAllMenuItem = ([delegate respondsToSelector:@selector(accountMenuShouldIncludeConnectAllMenuItem:)] &&
- [delegate accountMenuShouldIncludeConnectAllMenuItem:self]);
+ delegateRespondsToSpecialMenuItem = [delegate respondsToSelector:@selector(accountMenuSpecialMenuItem:)];
}
- (id<AIAccountMenuDelegate>)delegate
{
@@ -202,18 +202,6 @@
}
}
-/*!
- * @brief Connects all offline, enabled acounts
- */
-- (void)connectAllAccounts:(NSMenuItem *)menuItem
-{
- for (AIAccount *account in adium.accountController.accounts) {
- if (account.enabled && !account.online)
- [account setShouldBeOnline:YES];
- }
-}
-
-
//Account Menu ---------------------------------------------------------------------------------------------------------
#pragma mark Account Menu
/*!
@@ -224,15 +212,20 @@
NSMutableArray *menuItemArray = [NSMutableArray array];
NSArray *accounts = adium.accountController.accounts;
- if (includeConnectAllMenuItem) {
- NSMenuItem *menuItem = [[NSMenuItem allocWithZone:[NSMenu menuZone]] initWithTitle:AILocalizedString(@"Connect All Accounts",nil)
- target:self
- action:@selector(connectAllAccounts:)
- keyEquivalent:@"R"];
- [menuItem setKeyEquivalentModifierMask:NSCommandKeyMask];
- [menuItemArray addObject:menuItem];
- [menuItemArray addObject:[NSMenuItem separatorItem]];
- [menuItem release];
+ if (delegateRespondsToSpecialMenuItem) {
+
+ NSMenuItem *specialMenuItem = [delegate accountMenuSpecialMenuItem:self];
+
+ if (specialMenuItem) {
+ // unless overridden to a different action, just send -accountMenu:didSelectAccount: with nil when selected
+ if ([specialMenuItem target] == nil) {
+ [specialMenuItem setTarget:self];
+ [specialMenuItem setAction:@selector(selectAccountMenuItem:)];
+ }
+
+ [menuItemArray addObject:specialMenuItem];
+ [menuItemArray addObject:[NSMenuItem separatorItem]];
+ }
}
//Add a menuitem for each enabled account or accounts that the delegate allows
diff -r a71c719e9271 -r af2eb0ac74e7 Frameworks/Adium Framework/Source/AIAccountPlusFieldPromptController.m
--- a/Frameworks/Adium Framework/Source/AIAccountPlusFieldPromptController.m Sat Jul 17 23:23:51 2010 -0400
+++ b/Frameworks/Adium Framework/Source/AIAccountPlusFieldPromptController.m Sat Jul 17 12:07:09 2010 +0200
@@ -63,23 +63,29 @@
AIAccount *account = [[popUp_service selectedItem] representedObject];
id impliedValue = [textField_handle impliedValue];
- if ([impliedValue isKindOfClass:[AIMetaContact class]]) {
+
+ // It is not on our contact list, create a contact if possible and start a new chat, otherwise, tell the user they should be more specific.
+ if ([impliedValue isKindOfClass:[NSString class]]) {
+ if (account) {
+ UID = [account.service normalizeUID:impliedValue removeIgnoredCharacters:YES];
+
+ contact = [adium.contactController contactWithService:account.service
+ account:account
+ UID:UID];
+ } else {
+ NSRunAlertPanel(AILocalizedString(@"Contact not found", nil),
+ [NSString stringWithFormat:AILocalizedString(@"%@ is not on any account. Please select a specific account or add this contact first.", nil), impliedValue],
+ AILocalizedString(@"OK", nil),
+ nil,
+ nil);
+
+ return nil;
+ }
+ } else {
+ // Contact is on our list
contact = impliedValue;
-
- } else if ([impliedValue isKindOfClass:[AIListContact class]]) {
- UID = [(AIListContact *)impliedValue UID];
-
- } else if ([impliedValue isKindOfClass:[NSString class]]) {
- UID = [account.service normalizeUID:impliedValue removeIgnoredCharacters:YES];
}
-
- if (!contact && UID) {
- //Find the contact
- contact = [adium.contactController contactWithService:account.service
- account:account
- UID:UID];
- }
-
+
return contact;
}
@@ -90,14 +96,15 @@
/* Configure the auto-complete view to autocomplete for contacts matching the selected account's service
* Don't include meta contacts which don't currently contain any valid contacts
+ * If the account is nil, we show them all
*/
for (AIListContact *contact in adium.contactController.allContacts) {
- if ([contact.service.serviceClass isEqualToString:account.service.serviceClass] &&
- (![contact isKindOfClass:[AIMetaContact class]] || [(AIMetaContact *)contact uniqueContainedObjectsCount])) {
+ if (account == nil || ([contact.service.serviceClass isEqualToString:account.service.serviceClass] &&
+ (![contact isKindOfClass:[AIMetaContact class]] || [(AIMetaContact *)contact uniqueContainedObjectsCount]))) {
NSString *UID = contact.UID;
- [textField_handle addCompletionString:contact.formattedUID withImpliedCompletion:UID];
+ [textField_handle addCompletionString:contact.formattedUID withImpliedCompletion:contact];
+ [textField_handle addCompletionString:UID withImpliedCompletion:contact];
[textField_handle addCompletionString:contact.displayName withImpliedCompletion:contact];
- [textField_handle addCompletionString:UID];
}
}
}
@@ -192,7 +199,7 @@
#pragma mark Account menu
//Account menu delegate
- (void)accountMenu:(AIAccountMenu *)inAccountMenu didRebuildMenuItems:(NSArray *)menuItems {
- [popUp_service setMenu:[inAccountMenu menu]];
+ [popUp_service setMenu:[inAccountMenu menu]];
}
- (void)accountMenu:(AIAccountMenu *)inAccountMenu didSelectAccount:(AIAccount *)inAccount {
[self _configureTextFieldForAccount:inAccount];
@@ -201,6 +208,26 @@
return inAccount.online;
}
+- (NSMenuItem *)accountMenuSpecialMenuItem:(AIAccountMenu *)inAccountMenu
+{
+ NSMenuItem *anyItem = nil;
+ int numberOfOnlineAccounts = 0;
+
+ for (AIAccount *account in adium.accountController.accounts) {
+ if ([self accountMenu:inAccountMenu shouldIncludeAccount:account]) {
+ numberOfOnlineAccounts += 1;
+ if (numberOfOnlineAccounts > 1) {
+ anyItem = [[[NSMenuItem alloc] initWithTitle:AILocalizedString(@"Any", nil)
+ action:nil
+ keyEquivalent:@""] autorelease];
+ break;
+ }
+ }
+ }
+
+ return anyItem;
+}
+
//Select the last used account / Available online account
- (void)_selectLastUsedAccountInAccountMenu:(AIAccountMenu *)inAccountMenu
{
diff -r a71c719e9271 -r af2eb0ac74e7 Source/AIAccountMenuAccessPlugin.m
--- a/Source/AIAccountMenuAccessPlugin.m Sat Jul 17 23:23:51 2010 -0400
+++ b/Source/AIAccountMenuAccessPlugin.m Sat Jul 17 12:07:09 2010 +0200
@@ -25,6 +25,7 @@
@interface AIAccountMenuAccessPlugin ()
- (void)showGuestAccountWindow:(id)sender;
+- (void)connectAllAccounts:(NSMenuItem *)menuItem;
@end
/*!
@@ -95,9 +96,25 @@
return YES;
}
-- (BOOL)accountMenuShouldIncludeConnectAllMenuItem:(AIAccountMenu *)inAccountMenu
+- (NSMenuItem *)accountMenuSpecialMenuItem:(AIAccountMenu *)inAccountMenu
{
- return YES;
+ NSMenuItem *menuItem = [[NSMenuItem allocWithZone:[NSMenu menuZone]] initWithTitle:AILocalizedString(@"Connect All Accounts",nil)
+ target:self
+ action:@selector(connectAllAccounts:)
+ keyEquivalent:@"R"];
+ [menuItem setKeyEquivalentModifierMask:NSCommandKeyMask];
+ return [menuItem autorelease];
+}
+
+/*!
+ * @brief Connects all offline, enabled acounts
+ */
+- (void)connectAllAccounts:(NSMenuItem *)menuItem
+{
+ for (AIAccount *account in adium.accountController.accounts) {
+ if (account.enabled && !account.online)
+ [account setShouldBeOnline:YES];
+ }
}
#pragma mark Guest account access
diff -r a71c719e9271 -r af2eb0ac74e7 Source/RAFBlockEditorWindowController.m
--- a/Source/RAFBlockEditorWindowController.m Sat Jul 17 23:23:51 2010 -0400
+++ b/Source/RAFBlockEditorWindowController.m Sat Jul 17 12:07:09 2010 +0200
@@ -645,14 +645,6 @@
}
}
- //Add the All menu item first if we have more than one account listed
- if ([menuItems count] > 1) {
- [menu addItemWithTitle:AILocalizedString(@"All", nll)
- target:self
- action:@selector(selectedAllAccountItem:)
- keyEquivalent:@""];
- }
-
/*
* As we enumerate, we:
* 1) Determine what state the accounts within the menu are in
@@ -679,6 +671,28 @@
[menu release];
}
+//Add the All menu item first if we have more than one account listed
+- (NSMenuItem *)accountMenuSpecialMenuItem:(AIAccountMenu *)inAccountMenu
+{
+ NSMenuItem *allItem = nil;
+ int numberOfOnlineAccounts = 0;
+
+ for (AIAccount *account in adium.accountController.accounts) {
+ if ([self accountMenu:inAccountMenu shouldIncludeAccount:account]) {
+ numberOfOnlineAccounts += 1;
+ if (numberOfOnlineAccounts > 1) {
+ allItem = [[[NSMenuItem alloc] initWithTitle:AILocalizedString(@"All", nil)
+ target:self
+ action:@selector(selectedAllAccountItem:)
+ keyEquivalent:@""] autorelease];
+ break;
+ }
+ }
+ }
+
+ return allItem;
+}
+
- (BOOL)accountMenu:(AIAccountMenu *)inAccountMenu shouldIncludeAccount:(AIAccount *)inAccount
{
BOOL isPrimaryAccountMenu = (!accountMenu || (inAccountMenu == accountMenu));
More information about the commits
mailing list