* Adium is the legal property of its developers, whose names are listed in the copyright file included * with this source distribution. * This program is free software; you can redistribute it and/or modify it under the terms of the GNU * General Public License as published by the Free Software Foundation; either version 2 of the License, * or (at your option) any later version. * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General * Public License for more details. * You should have received a copy of the GNU General Public License along with this program; if not, * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #import "AIContactInfoWindowPlugin.h" #import "AIContactInfoWindowController.h" #import "ESShowContactInfoPromptController.h" #import <Adium/AIAccountControllerProtocol.h> #import <Adium/AIContactControllerProtocol.h> #import <Adium/AIMenuControllerProtocol.h> #import <Adium/AIInterfaceControllerProtocol.h> #import <Adium/AIToolbarControllerProtocol.h> #import <Adium/AIListObject.h> #import <Adium/AIListContact.h> #import <Adium/AIListBookmark.h> #import <AIUtilities/AIImageAdditions.h> #import <AIUtilities/AIMenuAdditions.h> #import <AIUtilities/AIStringAdditions.h> #import <AIUtilities/AIToolbarUtilities.h> #define VIEW_CONTACTS_INFO AILocalizedString(@"Get Info",nil) #define VIEW_CONTACTS_INFO_WITH_PROMPT [AILocalizedString(@"Get Info for Contact", nil) stringByAppendingEllipsis] #define VIEW_BOOKMARK_GET_INFO AILocalizedString(@"Get Info for Bookmark", nil) #define GET_INFO_MASK (NSCommandKeyMask | NSShiftKeyMask) #define ALTERNATE_GET_INFO_MASK (NSCommandKeyMask | NSShiftKeyMask | NSControlKeyMask) #define TITLE_SHOW_INFO AILocalizedString(@"Get Info",nil) #define TOOLTIP_SHOW_INFO AILocalizedString(@"Show information about this contact or group and change settings specific to it","Tooltip for the Get Info toolbar button") @interface AIContactInfoWindowPlugin () - ( void ) prepareContactInfo ; - ( void ) contactListDidBecomeMain: ( NSNotification * ) notification ; - ( void ) contactListDidResignMain: ( NSNotification * ) notification ; @implementation AIContactInfoWindowPlugin [ self prepareContactInfo ]; [[ NSNotificationCenter defaultCenter ] removeObserver : self ]; //Contact Info -------------------------------------------------------------------------------- #pragma mark Contact Info * @brief Show the information for a contact * Shows the information of a contact which is the object of the notification. - ( void ) showContactInfoForNotification: ( NSNotification * ) notification if ( ! notification . object ) [ AIContactInfoWindowController showInfoWindowForListObject : notification . object ]; //Show info for the selected contact - ( IBAction ) showContactInfo: ( id ) sender AIListObject * listObject = nil ; if ([ sender isKindOfClass : [ NSToolbarItem class ]]) { for ( NSWindow * currentWindow in [ NSApp windows ]) { if ( currentWindow . toolbar == (( NSToolbarItem * ) sender ). toolbar ) { AIChat * chat = [ adium . interfaceController activeChatInWindow : currentWindow ]; listObject = [ adium . contactController existingBookmarkForChat : chat ]; listObject = chat . listObject ; if ( ! listObject && adium . interfaceController . activeChat . isGroupChat && sender != menuItem_getInfoContextualContact ) { listObject = [ adium . contactController existingBookmarkForChat : adium . interfaceController . activeChat ]; if ( ! listObject && ( sender == menuItem_getInfoAlternate || sender == menuItem_getInfo )) { listObject = adium . interfaceController . selectedListObject ; listObject = adium . menuController . currentContextMenuObject ; if ([ listObject isKindOfClass : [ AIListObject class ]]) { [ NSApp activateIgnoringOtherApps : YES ]; [ AIContactInfoWindowController showInfoWindowForListObject : listObject ]; - ( IBAction ) showBookmarkInfo: ( id ) sender AIListBookmark * bookmark = [ adium . contactController existingBookmarkForChat : adium . menuController . currentContextMenuChat ]; [ NSApp activateIgnoringOtherApps : YES ]; [ AIContactInfoWindowController showInfoWindowForListObject : bookmark ]; - ( void ) showSpecifiedContactInfo: ( id ) sender [ ESShowContactInfoPromptController showPrompt ]; //Prepare the contact info menu and toolbar items - ( void ) prepareContactInfo //Add our get info contextual menu item menuItem_getInfoContextualContact = [[ NSMenuItem allocWithZone : [ NSMenu menuZone ]] initWithTitle : VIEW_CONTACTS_INFO action : @selector ( showContactInfo : ) [ adium . menuController addContextualMenuItem : menuItem_getInfoContextualContact toLocation : Context_Contact_Manage ]; menuItem_getInfoContextualGroup = [[ NSMenuItem allocWithZone : [ NSMenu menuZone ]] initWithTitle : VIEW_CONTACTS_INFO action : @selector ( showContactInfo : ) [ adium . menuController addContextualMenuItem : menuItem_getInfoContextualGroup toLocation : Context_Group_Manage ]; menuItem_getInfoContextualGroupChat = [[ NSMenuItem allocWithZone : [ NSMenu menuZone ]] initWithTitle : VIEW_BOOKMARK_GET_INFO action : @selector ( showBookmarkInfo : ) [ adium . menuController addContextualMenuItem : menuItem_getInfoContextualGroupChat toLocation : Context_GroupChat_Manage ]; //Install the standard Get Info menu item which will always be command-shift-I menuItem_getInfo = [[ NSMenuItem allocWithZone : [ NSMenu menuZone ]] initWithTitle : VIEW_CONTACTS_INFO action : @selector ( showContactInfo : ) [ menuItem_getInfo setKeyEquivalentModifierMask : GET_INFO_MASK ]; [ adium . menuController addMenuItem : menuItem_getInfo toLocation : LOC_Contact_Info ]; /* Install the alternate Get Info menu item which will be alternately command-I and command-shift-I, in the contact list * and in all other places, respectively. menuItem_getInfoAlternate = [[ NSMenuItem allocWithZone : [ NSMenu menuZone ]] initWithTitle : VIEW_CONTACTS_INFO action : @selector ( showContactInfo : ) [ menuItem_getInfoAlternate setKeyEquivalentModifierMask : ALTERNATE_GET_INFO_MASK ]; [ menuItem_getInfoAlternate setAlternate : YES ]; [ adium . menuController addMenuItem : menuItem_getInfoAlternate toLocation : LOC_Contact_Info ]; //Register for the contact list notifications [[ NSNotificationCenter defaultCenter ] addObserver : self selector : @selector ( contactListDidBecomeMain : ) name : Interface_ContactListDidBecomeMain [[ NSNotificationCenter defaultCenter ] addObserver : self selector : @selector ( contactListDidResignMain : ) name : Interface_ContactListDidResignMain //Watch changes in viewContactInfoMenuItem_alternate's menu so we can maintain its alternate status //(it will expand into showing both the normal and the alternate items when the menu changes) [[ NSNotificationCenter defaultCenter ] addObserver : self selector : @selector ( menuChanged : ) object :[ menuItem_getInfoAlternate menu ]]; //Install the Get Info (prompting for a contact name) menu item menuItem_getInfoWithPrompt = [[ NSMenuItem allocWithZone : [ NSMenu menuZone ]] initWithTitle : VIEW_CONTACTS_INFO_WITH_PROMPT action : @selector ( showSpecifiedContactInfo : ) [ menuItem_getInfoWithPrompt setKeyEquivalentModifierMask : ( NSCommandKeyMask | NSAlternateKeyMask )]; [ adium . menuController addMenuItem : menuItem_getInfoWithPrompt toLocation : LOC_Contact_Info ]; //Add our get info toolbar item NSToolbarItem * toolbarItem = [ AIToolbarUtilities toolbarItemWithIdentifier : @"ShowInfo" label : AILocalizedString ( @"Info" , nil ) paletteLabel : TITLE_SHOW_INFO toolTip : TOOLTIP_SHOW_INFO settingSelector : @selector ( setImage : ) itemContent :[ NSImage imageNamed : @"get-info" forClass : [ self class ] loadLazily : YES ] action : @selector ( showContactInfo : ) [ adium . toolbarController registerToolbarItem : toolbarItem forToolbarType : @"ListObject" ]; [[ NSNotificationCenter defaultCenter ] addObserver : self selector : @selector ( showContactInfoForNotification : ) name : @"AIShowContactInfo" //Always be able to show the inspector - ( BOOL ) validateMenuItem: ( NSMenuItem * ) menuItem if (( menuItem == menuItem_getInfo ) || ( menuItem == menuItem_getInfoAlternate )) { return adium . interfaceController . selectedListObject != nil || adium . interfaceController . activeChat . isGroupChat ; } else if (( menuItem == menuItem_getInfoContextualContact ) || ( menuItem == menuItem_getInfoContextualGroup )) { return adium . menuController . currentContextMenuObject != nil ; } else if ( menuItem == menuItem_getInfoWithPrompt ) { return [ adium . accountController oneOrMoreConnectedAccounts ]; } else if ([ menuItem . title isEqualToString : VIEW_BOOKMARK_GET_INFO ]) { // WKMV's context menu makes a copy of menu items; check against title. return ([ adium . contactController existingBookmarkForChat : adium . menuController . currentContextMenuChat ] != nil ); - ( BOOL ) validateToolbarItem: ( NSToolbarItem * ) toolbarItem for ( NSWindow * currentWindow in [ NSApp windows ]) { if ( currentWindow . toolbar == toolbarItem . toolbar ) { AIChat * chat = [ adium . interfaceController activeChatInWindow : currentWindow ]; if ( chat . isGroupChat && [ adium . contactController existingBookmarkForChat : chat ]) - ( void ) contactListDidBecomeMain: ( NSNotification * ) notification [ adium . menuController removeItalicsKeyEquivalent ]; [ menuItem_getInfoAlternate setKeyEquivalentModifierMask : ( NSCommandKeyMask )]; [ menuItem_getInfoAlternate setAlternate : YES ]; - ( void ) contactListDidResignMain: ( NSNotification * ) notification //set our alternate modifier mask back to the obscure combination [ menuItem_getInfoAlternate setKeyEquivalent : @"i" ]; [ menuItem_getInfoAlternate setKeyEquivalentModifierMask : ALTERNATE_GET_INFO_MASK ]; [ menuItem_getInfoAlternate setAlternate : YES ]; //Now give the italics its combination back [ adium . menuController restoreItalicsKeyEquivalent ]; - ( void ) menuChanged: ( NSNotification * ) notification [ NSMenu updateAlternateMenuItem : menuItem_getInfoAlternate ];