* 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 "OWSpellingPerContactPlugin.h" #import <Adium/AIListContact.h> #define GROUP_LAST_USED_SPELLING @"Last Used Spelling" #define KEY_LAST_USED_SPELLING @"Last Used Spelling Languge" @interface OWSpellingPerContactPlugin () - (void)chatWillClose:(NSNotification *)notification; - (void)chatBecameActive:(NSNotification *)notification; * @class OWSpellingPerContactPlugin * @brief Component to save and restore spelling dictionary language preferences on a per-contact basis for chats * Language settings on a group chat basis are not currently saved. @implementation OWSpellingPerContactPlugin NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; [notificationCenter addObserver:self selector:@selector(chatBecameActive:) [notificationCenter addObserver:self selector:@selector(chatWillClose:) languageDict = [[NSMutableDictionary alloc] init]; //Find the first language the user prefers which the spellchecker knows about, then keep it around for future reference NSArray *preferredLanguages = nil; preferredLanguages = [[NSSpellChecker sharedSpellChecker] userPreferredLanguages]; for (NSString *language in preferredLanguages) { if ([[NSSpellChecker sharedSpellChecker] setLanguage:language]) { preferredLanguage = [language retain]; [languageDict release]; languageDict = nil; [preferredLanguage release]; preferredLanguage = nil; [[NSNotificationCenter defaultCenter] removeObserver:self]; * @brief A chat became active; set the spelling language preference appropriately * If a chat was previously active, as indicated by the PreviouslyActiveChat key in the notification's userInfo, * its language preference is stored before switching. - (void)chatBecameActive:(NSNotification *)notification AIChat *newChat = [notification object]; AIChat *previousChat = [[notification userInfo] objectForKey:@"PreviouslyActiveChat"]; NSString *language = [[NSSpellChecker sharedSpellChecker] language]; NSString *chatID = [previousChat uniqueChatID]; ![[languageDict objectForKey:chatID] isEqualToString:language]) { //If this chat is not known to be in the current language, store its setting in our languageDict [languageDict setObject:language NSString *chatID = [newChat uniqueChatID]; NSString *newChatLanguage = [languageDict objectForKey:chatID]; //If we don't have a previously noted language, try to load one from a preference AIListObject *listObject = [newChat listObject]; //Load the preference if possible newChatLanguage = [listObject preferenceForKey:KEY_LAST_USED_SPELLING group:GROUP_LAST_USED_SPELLING]; //If no preference, use the preferred language newChatLanguage = preferredLanguage; [languageDict setObject:newChatLanguage [[NSSpellChecker sharedSpellChecker] setLanguage:newChatLanguage]; * @brief Chat will close; save the language preference for its contact before it closes - (void)chatWillClose:(NSNotification *)notification AIChat *chat = [notification object]; AIListContact *listObject = chat.listObject; NSString *chatID = chat.uniqueChatID; NSString *chatLanguage = [languageDict objectForKey:chatID]; //If we didn't cache a language for this chat, or the chat is currently the active chat, use the spell checker's value. if (!chatLanguage || adium.interfaceController.activeChat == chat) chatLanguage = [[NSSpellChecker sharedSpellChecker] language]; //Now, if we end up at the user's default language, we don't want to store anything if ([preferredLanguage isEqualToString:chatLanguage]) NSString *previousLanguage = [listObject preferenceForKey:KEY_LAST_USED_SPELLING group:GROUP_LAST_USED_SPELLING]; if ((previousLanguage && ![previousLanguage isEqualToString:chatLanguage]) || (!previousLanguage && chatLanguage)) { [listObject setPreference:chatLanguage forKey:KEY_LAST_USED_SPELLING group:GROUP_LAST_USED_SPELLING]; [languageDict removeObjectForKey:chatID];