adium/adium

Merged adium-1.6 into libotr4.0.0.
libotr4.0.0
2013-05-28, Thijs Alkemade
0fbb04961745
Merged adium-1.6 into libotr4.0.0.
  • +56 -4
    Adium.xcodeproj/project.pbxproj
  • +0 -0
    AdiumHelp/gfx/Adium-Extra.png
  • +0 -0
    AdiumHelp/gfx/Adium-Xtras.png
  • +0 -0
    AdiumHelp/gfx/Chat window-Encryption.png
  • +0 -0
    AdiumHelp/gfx/pref-sm.png
  • +10 -6
    AdiumHelp/pgs/AdiumDocumentation.html
  • +2 -2
    AdiumHelp/pgs/AdvancedFeatures-AdiumXtras.html
  • +89 -0
    AdiumHelp/pgs/AdvancedFeatures-OTREncryption.html
  • +29 -22
    Frameworks/AIUtilities Framework/Source/AIColorAdditions.m
  • +1 -2
    Frameworks/AIUtilities Framework/Source/AICompletingTextField.m
  • +0 -2
    Frameworks/AIUtilities Framework/Source/AIDateFormatterAdditions.m
  • +1 -1
    Frameworks/AIUtilities Framework/Source/AIImageViewWithImagePicker.m
  • +0 -4
    Frameworks/AIUtilities Framework/Source/AISmoothTooltipTracker.m
  • +0 -76
    Frameworks/AIUtilities Framework/Source/AIStringAdditions.m
  • +0 -3
    Frameworks/AIUtilities Framework/Source/AITextViewWithPlaceholder.m
  • +14 -5
    Frameworks/Adium Framework/Source/AIAbstractListController.m
  • +0 -2
    Frameworks/Adium Framework/Source/AIAccount.m
  • +2 -3
    Frameworks/Adium Framework/Source/AIAddressBookUserIconSource.m
  • +1 -0
    Frameworks/Adium Framework/Source/AIChat.m
  • +10 -1
    Frameworks/Adium Framework/Source/AIContentMessage.h
  • +23 -4
    Frameworks/Adium Framework/Source/AIContentMessage.m
  • +10 -0
    Frameworks/Adium Framework/Source/AIContentObject.h
  • +14 -1
    Frameworks/Adium Framework/Source/AIContentObject.m
  • +2 -1
    Frameworks/Adium Framework/Source/AIContentTopic.h
  • +2 -0
    Frameworks/Adium Framework/Source/AIContentTopic.m
  • +0 -2
    Frameworks/Adium Framework/Source/AIEditStateWindowController.m
  • +19 -14
    Frameworks/Adium Framework/Source/AIGroupChat.h
  • +142 -119
    Frameworks/Adium Framework/Source/AIGroupChat.m
  • +7 -9
    Frameworks/Adium Framework/Source/AIListContactGroupChatCell.m
  • +4 -11
    Frameworks/Adium Framework/Source/AIListGroupCell.m
  • +0 -1
    Frameworks/Adium Framework/Source/AILocalizationControl.m
  • +27 -12
    Frameworks/Adium Framework/Source/AIMessageEntryTextView.h
  • +379 -185
    Frameworks/Adium Framework/Source/AIMessageEntryTextView.m
  • +2 -0
    Frameworks/Adium Framework/Source/AIProxyListObject.h
  • +13 -1
    Frameworks/Adium Framework/Source/AIProxyListObject.m
  • +0 -3
    Frameworks/Adium Framework/Source/DCJoinChatViewController.m
  • +0 -1
    Frameworks/Adium Framework/Source/ESContactAlertsViewController.m
  • +1 -0
    Frameworks/Adium Framework/Source/ESFileTransfer.m
  • +0 -23
    Frameworks/PSMTabBarControl.framework/Versions/A/Headers/NSBezierPath_AMShading.h
  • +0 -0
    Frameworks/PSMTabBarControl.framework/Versions/A/PSMTabBarControl
  • +0 -0
    Frameworks/PSMTabBarControl.framework/Versions/A/Resources/English.lproj/InfoPlist.strings
  • +5 -5
    Frameworks/PSMTabBarControl.framework/Versions/A/Resources/Info.plist
  • +0 -0
    Frameworks/PSMTabBarControl.framework/Versions/A/Resources/Japanese.lproj/InfoPlist.strings
  • +0 -0
    Frameworks/PSMTabBarControl.framework/Versions/A/Resources/Japanese.lproj/Inspector.nib
  • +0 -0
    Frameworks/PSMTabBarControl.framework/Versions/A/Resources/Japanese.lproj/Library.nib
  • +0 -0
    Frameworks/PSMTabBarControl.framework/Versions/A/Resources/largeImage.png
  • +2 -0
    Frameworks/Sparkle.framework/Versions/A/Headers/SUAppcastItem.h
  • +2 -2
    Frameworks/Sparkle.framework/Versions/A/Headers/SUUpdater.h
  • +7 -7
    Frameworks/Sparkle.framework/Versions/A/Resources/Info.plist
  • +0 -115
    Frameworks/Sparkle.framework/Versions/A/Resources/License.txt
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/SUStatus.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/ar.lproj/SUAutomaticUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/ar.lproj/SUPasswordPrompt.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/ar.lproj/SUUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/ar.lproj/SUUpdatePermissionPrompt.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/ar.lproj/Sparkle.strings
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/cs.lproj/SUAutomaticUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/cs.lproj/SUUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/cs.lproj/SUUpdatePermissionPrompt.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/da.lproj/SUAutomaticUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/da.lproj/SUUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/da.lproj/SUUpdatePermissionPrompt.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/da.lproj/Sparkle.strings
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/de.lproj/SUAutomaticUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdatePermissionPrompt.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/en.lproj/SUAutomaticUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/en.lproj/SUPasswordPrompt.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdatePermissionPrompt.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/es.lproj/SUAutomaticUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdatePermissionPrompt.nib
  • +6 -6
    Frameworks/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Info.plist
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/MacOS/finish_installation
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/SUStatus.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/ar.lproj/Sparkle.strings
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/da.lproj/Sparkle.strings
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/is.lproj/Sparkle.strings
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/ja.lproj/Sparkle.strings
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/pt_BR.lproj/Sparkle.strings
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/ro.lproj/Sparkle.strings
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/ru.lproj/Sparkle.strings
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/sl.lproj/Sparkle.strings
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/th.lproj/Sparkle.strings
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/tr.lproj/Sparkle.strings
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/uk.lproj/Sparkle.strings
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/fr.lproj/SUAutomaticUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdatePermissionPrompt.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/is.lproj/SUAutomaticUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/is.lproj/SUUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/is.lproj/SUUpdatePermissionPrompt.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/is.lproj/Sparkle.strings
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/it.lproj/SUAutomaticUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdatePermissionPrompt.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/ja.lproj/SUAutomaticUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/ja.lproj/SUUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/ja.lproj/SUUpdatePermissionPrompt.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/ja.lproj/Sparkle.strings
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/ko.lproj/SUAutomaticUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/ko.lproj/SUUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/ko.lproj/SUUpdatePermissionPrompt.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/nl.lproj/SUAutomaticUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdatePermissionPrompt.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/pl.lproj/SUAutomaticUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/pl.lproj/SUUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/pl.lproj/SUUpdatePermissionPrompt.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/pt_BR.lproj/SUAutomaticUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/pt_BR.lproj/SUPasswordPrompt.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/pt_BR.lproj/SUUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/pt_BR.lproj/SUUpdatePermissionPrompt.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/pt_BR.lproj/Sparkle.strings
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/pt_PT.lproj/SUAutomaticUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/pt_PT.lproj/SUUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/pt_PT.lproj/SUUpdatePermissionPrompt.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/ro.lproj/SUAutomaticUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/ro.lproj/SUUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/ro.lproj/SUUpdatePermissionPrompt.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/ro.lproj/Sparkle.strings
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/ru.lproj/SUAutomaticUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdatePermissionPrompt.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/ru.lproj/Sparkle.strings
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/sk.lproj/SUAutomaticUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/sk.lproj/SUUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/sk.lproj/SUUpdatePermissionPrompt.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/sl.lproj/SUAutomaticUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/sl.lproj/SUUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/sl.lproj/SUUpdatePermissionPrompt.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/sl.lproj/Sparkle.strings
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/sv.lproj/SUAutomaticUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdatePermissionPrompt.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/th.lproj/SUAutomaticUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/th.lproj/SUPasswordPrompt.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/th.lproj/SUUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/th.lproj/SUUpdatePermissionPrompt.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/th.lproj/Sparkle.strings
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/tr.lproj/SUAutomaticUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/tr.lproj/SUUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/tr.lproj/SUUpdatePermissionPrompt.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/tr.lproj/Sparkle.strings
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/uk.lproj/SUAutomaticUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/uk.lproj/SUUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/uk.lproj/SUUpdatePermissionPrompt.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/uk.lproj/Sparkle.strings
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/zh_CN.lproj/SUAutomaticUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/zh_CN.lproj/SUUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/zh_CN.lproj/SUUpdatePermissionPrompt.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/zh_TW.lproj/SUAutomaticUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/zh_TW.lproj/SUUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/zh_TW.lproj/SUUpdatePermissionPrompt.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Sparkle
  • +1 -0
    Frameworks/libidn.framework/Headers
  • +1 -0
    Frameworks/libidn.framework/Resources
  • +74 -0
    Frameworks/libidn.framework/Versions/1.26/Headers/idn-free.h
  • +638 -0
    Frameworks/libidn.framework/Versions/1.26/Headers/idn-int.h
  • +123 -0
    Frameworks/libidn.framework/Versions/1.26/Headers/idna.h
  • +73 -0
    Frameworks/libidn.framework/Versions/1.26/Headers/pr29.h
  • +239 -0
    Frameworks/libidn.framework/Versions/1.26/Headers/punycode.h
  • +241 -0
    Frameworks/libidn.framework/Versions/1.26/Headers/stringprep.h
  • +135 -0
    Frameworks/libidn.framework/Versions/1.26/Headers/tld.h
  • +3 -0
    Frameworks/libidn.framework/Versions/1.26/Resources/English.lproj/InfoPlist.strings
  • +0 -0
    Frameworks/libidn.framework/Versions/1.26/Resources/Info.plist
  • +0 -0
    Frameworks/libidn.framework/Versions/1.26/libidn
  • +1 -0
    Frameworks/libidn.framework/Versions/Current
  • +1 -0
    Frameworks/libidn.framework/libidn
  • +1 -1
    Frameworks/libpurple.framework/Headers
  • +1 -1
    Frameworks/libpurple.framework/Resources
  • +1194 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/account.h
  • +395 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/accountopt.h
  • +67 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/auth.h
  • +1278 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/blist.h
  • +43 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/bosh.h
  • +125 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/buddy.h
  • +441 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/buddyicon.h
  • +57 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/buddylist.h
  • +129 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/caps.h
  • +843 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/certificate.h
  • +118 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/chat.h
  • +502 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/cipher.h
  • +118 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/circbuffer.h
  • +100 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/cmdproc.h
  • +250 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/cmds.h
  • +84 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/command.h
  • +626 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/connection.h
  • +746 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/contact.h
  • +1476 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/conversation.h
  • +251 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/core.h
  • +35 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/dbus-maybe.h
  • +243 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/debug.h
  • +172 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/desktopitem.h
  • +200 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/directconn.h
  • +180 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/dnsquery.h
  • +242 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/dnssrv.h
  • +57 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/error.h
  • +276 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/eventloop.h
  • +785 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/ft.h
  • +2317 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/gaim-compat.h
  • +72 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/gg.h
  • +109 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/group.h
  • +50 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/history.h
  • +112 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/httpconn.h
  • +104 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/idle.h
  • +230 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/imgstore.h
  • +229 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/internal.h
  • +116 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/iq.h
  • +224 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/irc.h
  • +425 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/jabber.h
  • +90 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/jutil.h
  • +2319 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/libgadu.h
  • +22 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/libpurple.h
  • +402 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/libymsg.h
  • +583 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/log.h
  • +76 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/marshallers.h
  • +201 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/media-gst.h
  • +446 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/media.h
  • +224 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/media/backend-iface.h
  • +252 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/media/candidate.h
  • +214 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/media/codec.h
  • +162 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/media/enum-types.h
  • +246 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/mediamanager.h
  • +218 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/mime.h
  • +325 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/msg.h
  • +158 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/msn.h
  • +244 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/msnutils.h
  • +118 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/namespaces.h
  • +77 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/nat-pmp.h
  • +359 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/network.h
  • +219 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/nexus.h
  • +124 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/notification.h
  • +814 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/notify.h
  • +73 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/ntlm.h
  • +276 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/object.h
  • +163 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/oim.h
  • +1350 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/oscar.h
  • +264 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/p2p.h
  • +81 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/page.h
  • +282 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/peer.h
  • +740 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/plugin.h
  • +269 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/pluginpref.h
  • +389 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/pounce.h
  • +371 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/prefs.h
  • +103 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/presence.h
  • +194 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/privacy.h
  • +372 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/proxy.h
  • +1015 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/prpl.h
  • +105 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/purple.h
  • +1608 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/request.h
  • +398 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/roomlist.h
  • +425 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/savedstatuses.h
  • +41 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/sbconn.h
  • +152 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/search.h
  • +193 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/servconn.h
  • +218 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/server.h
  • +245 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/session.h
  • +40 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/si.h
  • +380 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/signals.h
  • +51 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/slp.h
  • +98 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/slpcall.h
  • +98 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/slplink.h
  • +150 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/slpmsg.h
  • +66 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/slpmsg_part.h
  • +262 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/smiley.h
  • +287 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/snactypes.h
  • +52 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/soap.h
  • +71 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/sound-theme-loader.h
  • +108 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/sound-theme.h
  • +143 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/sound.h
  • +346 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/sslconn.h
  • +69 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/state.h
  • +1103 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/status.h
  • +138 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/stringref.h
  • +88 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/stun.h
  • +266 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/switchboard.h
  • +93 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/table.h
  • +93 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/theme-loader.h
  • +139 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/theme-manager.h
  • +175 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/theme.h
  • +77 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/tlv.h
  • +87 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/transaction.h
  • +132 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/upnp.h
  • +533 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/user.h
  • +112 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/userlist.h
  • +1489 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/util.h
  • +504 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/value.h
  • +88 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/version.h
  • +262 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/whiteboard.h
  • +67 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/xfer.h
  • +397 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/xmlnode.h
  • +41 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/yahoo_aliases.h
  • +131 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/yahoo_doodle.h
  • +70 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/yahoo_filexfer.h
  • +93 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/yahoo_friend.h
  • +150 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/yahoo_packet.h
  • +43 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/yahoo_picture.h
  • +66 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/yahoochat.h
  • +97 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Headers/ycht.h
  • +3 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Resources/English.lproj/InfoPlist.strings
  • +18 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Resources/Info.plist
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Resources/bn_IN/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Resources/ca/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Resources/cs/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Resources/da/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Resources/de/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Resources/el/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Resources/en_AU/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Resources/en_CA/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Resources/en_GB/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Resources/es/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Resources/fi/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Resources/fr/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Resources/hr/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Resources/hu/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Resources/it/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Resources/ja/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Resources/mai/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Resources/mhr/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Resources/mr/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Resources/nb/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Resources/nl/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Resources/pl/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Resources/pt/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Resources/pt_BR/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Resources/ru/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Resources/sl/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Resources/sv/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Resources/tr/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Resources/uk/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Resources/zh_CN/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/Resources/zh_TW/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.10.7r1836d0d921db/libpurple
  • +1 -1
    Frameworks/libpurple.framework/libpurple
  • +4 -4
    Plists/Info.plist
  • +0 -3
    Plugins/Bonjour/libezv/Classes/EKEzvIncomingFileTransfer.m
  • +1 -17
    Plugins/Bonjour/libezv/Private Classes/AWEzvRendezvousData.m
  • +23 -15
    Plugins/Dual Window Interface/AIMessageViewController.m
  • +0 -42
    Plugins/Dual Window Interface/AIMessageWindowController.m
  • +0 -8
    Plugins/Purple Service/AIFacebookXMPPOAuthWebViewWindowController.m
  • +3 -5
    Plugins/Purple Service/AIPurpleCertificateTrustWarningAlert.m
  • +5 -0
    Plugins/Purple Service/AMPurpleJabberNode.h
  • +33 -3
    Plugins/Purple Service/AMPurpleJabberNode.m
  • +6 -2
    Plugins/Purple Service/AMPurpleJabberServiceDiscoveryBrowserController.m
  • +2 -2
    Plugins/Purple Service/CBPurpleAccount.h
  • +59 -50
    Plugins/Purple Service/CBPurpleAccount.m
  • +1 -3
    Plugins/Purple Service/ESIRCAccount.m
  • +2 -1
    Plugins/Purple Service/ESPurpleAIMAccount.m
  • +0 -1
    Plugins/Purple Service/ESPurpleJabberAccount.m
  • +53 -53
    Plugins/Purple Service/adiumPurpleConversation.m
  • +1 -0
    Plugins/Twitter Plugin/AITwitterAccount.h
  • +65 -41
    Plugins/Twitter Plugin/AITwitterAccount.m
  • +10 -2
    Plugins/Twitter Plugin/STTwitter/STTwitterAPIWrapper.h
  • +27 -19
    Plugins/Twitter Plugin/STTwitter/STTwitterAPIWrapper.m
  • +35 -0
    Plugins/Twitter Plugin/STTwitter/STTwitterHTML.h
  • +142 -0
    Plugins/Twitter Plugin/STTwitter/STTwitterHTML.m
  • +35 -0
    Plugins/Twitter Plugin/STTwitter/STTwitterOAuthOSX.h
  • +181 -0
    Plugins/Twitter Plugin/STTwitter/STTwitterOAuthOSX.m
  • +84 -5
    Plugins/Twitter Plugin/STTwitter/Vendor/STHTTPRequest.m
  • +0 -2
    Plugins/WebKit Message View/AIWebKitDelegate.m
  • +35 -34
    Plugins/WebKit Message View/AIWebKitMessageViewController.m
  • +3 -3
    Plugins/WebKit Message View/AIWebkitMessageViewStyle.m
  • +2 -0
    Resources/LoggingDefaults.plist
  • +648 -0
    Resources/MessageViewEmoticonsMenu.xib
  • +0 -0
    Resources/emoticons_menu.png
  • +0 -0
    Resources/emoticons_menu@2x.png
  • +2 -2
    Source/AIAccountController.m
  • +1 -1
    Source/AIAccountListPreferences.m
  • +4 -3
    Source/AIChatController.m
  • +0 -1
    Source/AIContactController.m
  • +1 -19
    Source/AIContactInfoImageViewWithImagePicker.m
  • +14 -9
    Source/AIContactListEditorPlugin.m
  • +31 -30
    Source/AIGroupChatStatusTooltipPlugin.m
  • +1 -0
    Source/AILogViewerWindowController.h
  • +54 -13
    Source/AILogViewerWindowController.m
  • +1 -1
    Source/AILoggerPlugin.m
  • +13 -12
    Source/AIMentionEventPlugin.m
  • +65 -0
    Source/AIMessageViewEmoticonsController.h
  • +167 -0
    Source/AIMessageViewEmoticonsController.m
  • +1 -0
    Source/AINewContactWindowController.h
  • +42 -4
    Source/AINewContactWindowController.m
  • +1 -2
    Source/AIPreferenceWindowController.m
  • +7 -3
    Source/AIXMLChatlogConverter.m
  • +35 -7
    Source/AIXtrasManager.m
  • +1 -0
    Source/DCMessageContextDisplayPlugin.m
  • +0 -7
    Source/ESAddressBookIntegrationAdvancedPreferences.m
  • +0 -4
    Source/ESDebugWindowController.m
  • +0 -1
    Source/ESFileTransferProgressView.m
  • +0 -1
    Source/ESStatusPreferences.m
  • +0 -2
    Source/XtrasInstaller.m
  • +0 -1
    UnitTests/TestRichTextCoercion.m
  • --- a/Adium.xcodeproj/project.pbxproj Tue May 28 00:24:27 2013 +0200
    +++ b/Adium.xcodeproj/project.pbxproj Tue May 28 00:52:55 2013 +0200
    @@ -843,7 +843,6 @@
    34DC8ADC0A7EEEF7003E1636 /* AIContextMenuTextView.h in Headers */ = {isa = PBXBuildFile; fileRef = 7E1E8176063A3EEC00EB00F7 /* AIContextMenuTextView.h */; settings = {ATTRIBUTES = (Public, ); }; };
    34DC8ADD0A7EEEF7003E1636 /* AIContextMenuTextView.m in Sources */ = {isa = PBXBuildFile; fileRef = 7E1E8177063A3EEC00EB00F7 /* AIContextMenuTextView.m */; };
    34DC8AE00A7EEEF7003E1636 /* AIMessageEntryTextView.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B5827E80613CE9D0004BD25 /* AIMessageEntryTextView.h */; settings = {ATTRIBUTES = (Public, ); }; };
    - 34DC8AE10A7EEEF7003E1636 /* AIMessageEntryTextView.m in Sources */ = {isa = PBXBuildFile; fileRef = 4B5827E90613CE9D0004BD25 /* AIMessageEntryTextView.m */; };
    34DC8AE40A7EEEF7003E1636 /* stackImage.png in Resources */ = {isa = PBXBuildFile; fileRef = 349DDD5206406A7D00542726 /* stackImage.png */; };
    34DC8AE50A7EEEF7003E1636 /* AILocalizationAssistance.h in Headers */ = {isa = PBXBuildFile; fileRef = 34D189B1076131850075A380 /* AILocalizationAssistance.h */; settings = {ATTRIBUTES = (Public, ); }; };
    34DC8AE70A7EEEF7003E1636 /* AILocalizationButtonCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 078C5CD0079EFF87004C75A4 /* AILocalizationButtonCell.h */; settings = {ATTRIBUTES = (Public, ); }; };
    @@ -1019,6 +1018,7 @@
    4F1CB6400D640DA40073A1E6 /* get-info-advanced.tiff in Resources */ = {isa = PBXBuildFile; fileRef = 4F1CB63C0D640DA40073A1E6 /* get-info-advanced.tiff */; };
    4F1CB6410D640DA40073A1E6 /* get-info-events.tiff in Resources */ = {isa = PBXBuildFile; fileRef = 4F1CB63D0D640DA40073A1E6 /* get-info-events.tiff */; };
    4F1CB64C0D640F4F0073A1E6 /* ContactInfoInspector.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4F1CB64B0D640F4F0073A1E6 /* ContactInfoInspector.xib */; };
    + 5A0BBC4317400544002A7BE0 /* emoticons_menu@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 5A0BBC4217400544002A7BE0 /* emoticons_menu@2x.png */; };
    5A0D236A16F4C7BC005DF211 /* STTwitterAppOnly.m in Sources */ = {isa = PBXBuildFile; fileRef = 5A0D236816F4C7BC005DF211 /* STTwitterAppOnly.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; };
    5A1781860EC1215D00BA1E04 /* AIAutoScrollTextView.m in Sources */ = {isa = PBXBuildFile; fileRef = 5A1781850EC1215D00BA1E04 /* AIAutoScrollTextView.m */; };
    5A17D65D130F76B4002C852F /* AIGradientView.m in Sources */ = {isa = PBXBuildFile; fileRef = 5A17D65C130F76B4002C852F /* AIGradientView.m */; };
    @@ -1357,6 +1357,9 @@
    76731DE515F90582007728C3 /* libgpgerror.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = 76731DE115F90538007728C3 /* libgpgerror.framework */; };
    767870E41634045D00BD0E4D /* AIMessageViewTopBarController.m in Sources */ = {isa = PBXBuildFile; fileRef = 767870E31634045C00BD0E4D /* AIMessageViewTopBarController.m */; };
    76889DEB12D3CA17007AEF00 /* get-info.tiff in Resources */ = {isa = PBXBuildFile; fileRef = 76889DEA12D3CA17007AEF00 /* get-info.tiff */; };
    + 76980AC1173E6C8800FBDA15 /* libidn.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 76980AC0173E6C8800FBDA15 /* libidn.framework */; };
    + 76980AC5173E6CA700FBDA15 /* libidn.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = 76980AC0173E6C8800FBDA15 /* libidn.framework */; };
    + 769D634B17393CBE008B97BC /* AMPurpleJabberDiscoveryBrowser.xib in Resources */ = {isa = PBXBuildFile; fileRef = 769D634A17393CBE008B97BC /* AMPurpleJabberDiscoveryBrowser.xib */; };
    76A79E0B16349477007A0497 /* AIGroupChat.h in Headers */ = {isa = PBXBuildFile; fileRef = 76A79E0916349477007A0497 /* AIGroupChat.h */; settings = {ATTRIBUTES = (Public, ); }; };
    76A79E0C16349477007A0497 /* AIGroupChat.m in Sources */ = {isa = PBXBuildFile; fileRef = 76A79E0A16349477007A0497 /* AIGroupChat.m */; };
    76AA110C1635585E00A6EC4B /* AIAccountSelectionTopBar.xib in Resources */ = {isa = PBXBuildFile; fileRef = 76AA11091635585E00A6EC4B /* AIAccountSelectionTopBar.xib */; };
    @@ -1365,6 +1368,7 @@
    76B8B8EC16AF3A46009126FE /* AIOTRTopBarLoggingWarningController.m in Sources */ = {isa = PBXBuildFile; fileRef = 76B8B8EA16AF3A46009126FE /* AIOTRTopBarLoggingWarningController.m */; };
    76B8B8ED16AF3A46009126FE /* AIOTRTopBarLoggingWarningController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 76B8B8EB16AF3A46009126FE /* AIOTRTopBarLoggingWarningController.xib */; };
    76C1AF9C125A906A00D269A9 /* AIAdiumURLProtocol.m in Sources */ = {isa = PBXBuildFile; fileRef = 76C1AF9B125A906A00D269A9 /* AIAdiumURLProtocol.m */; };
    + 76FBDAC91733B9CA00C9F10B /* STTwitterHTML.m in Sources */ = {isa = PBXBuildFile; fileRef = 76FBDAC61733B9C900C9F10B /* STTwitterHTML.m */; };
    76FF925A14B524B40043E23B /* AIIRCConsoleController.h in Headers */ = {isa = PBXBuildFile; fileRef = 76FF925814B524B40043E23B /* AIIRCConsoleController.h */; };
    76FF925B14B524B40043E23B /* AIIRCConsoleController.m in Sources */ = {isa = PBXBuildFile; fileRef = 76FF925914B524B40043E23B /* AIIRCConsoleController.m */; };
    76FF926414B62A980043E23B /* AIConsole.xib in Resources */ = {isa = PBXBuildFile; fileRef = 76FF926314B62A980043E23B /* AIConsole.xib */; };
    @@ -1414,6 +1418,11 @@
    9719C92F1530EE4800217FBE /* FriBidi.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = 9719C92B1530EDF700217FBE /* FriBidi.framework */; };
    9719C9301530EE4800217FBE /* ShortcutRecorder.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = 9719C92D1530EE0C00217FBE /* ShortcutRecorder.framework */; };
    9722ABC813257D7F00CAB486 /* ContactListWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 9722ABC713257D7F00CAB486 /* ContactListWindow.xib */; };
    + 972AB3A11493CF2300381105 /* emoticons_menu.png in Resources */ = {isa = PBXBuildFile; fileRef = 974C7524148570E2000686BA /* emoticons_menu.png */; };
    + 972AB3A21493D1BA00381105 /* MessageViewEmoticonsMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 974C752C148578F6000686BA /* MessageViewEmoticonsMenu.xib */; };
    + 97483A011486DD87002D1FA8 /* AIMessageEntryTextView.m in Sources */ = {isa = PBXBuildFile; fileRef = 4B5827E90613CE9D0004BD25 /* AIMessageEntryTextView.m */; };
    + 97483A051486E92C002D1FA8 /* AIMessageViewEmoticonsController.h in Headers */ = {isa = PBXBuildFile; fileRef = 974C753314857BF4000686BA /* AIMessageViewEmoticonsController.h */; settings = {ATTRIBUTES = (Public, ); }; };
    + 97483A061486E93E002D1FA8 /* AIMessageViewEmoticonsController.m in Sources */ = {isa = PBXBuildFile; fileRef = 974C753414857BF4000686BA /* AIMessageViewEmoticonsController.m */; };
    9760D24613E49A560031FA1A /* AboutDialog_bg.png in Resources */ = {isa = PBXBuildFile; fileRef = 9760D24513E49A560031FA1A /* AboutDialog_bg.png */; };
    97AF5CDB13191DE200550C41 /* AIContactListUserPictureMenuController.m in Sources */ = {isa = PBXBuildFile; fileRef = 97AF5CDA13191DE200550C41 /* AIContactListUserPictureMenuController.m */; };
    97AF5CF413191E9A00550C41 /* ContactListChangeUserPictureMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 97AF5CF313191E9A00550C41 /* ContactListChangeUserPictureMenu.xib */; };
    @@ -1678,6 +1687,7 @@
    11EE1CCF0CDD01120097F246 /* libglib.framework in Copy Frameworks */,
    11EE1CD00CDD01120097F246 /* libgmodule.framework in Copy Frameworks */,
    11EE1CD10CDD01120097F246 /* libgobject.framework in Copy Frameworks */,
    + 76980AC5173E6CA700FBDA15 /* libidn.framework in Copy Frameworks */,
    11EE1CD20CDD01120097F246 /* libgthread.framework in Copy Frameworks */,
    7664EAA6162E0874008CF995 /* libffi.framework in Copy Frameworks */,
    11EE1CD30CDD01120097F246 /* libintl.framework in Copy Frameworks */,
    @@ -3867,6 +3877,7 @@
    4F1CB63C0D640DA40073A1E6 /* get-info-advanced.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = "get-info-advanced.tiff"; path = "Resources/get-info-advanced.tiff"; sourceTree = "<group>"; };
    4F1CB63D0D640DA40073A1E6 /* get-info-events.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = "get-info-events.tiff"; path = "Resources/get-info-events.tiff"; sourceTree = "<group>"; };
    4F1CB64B0D640F4F0073A1E6 /* ContactInfoInspector.xib */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xib; name = ContactInfoInspector.xib; path = Resources/ContactInfoInspector.xib; sourceTree = "<group>"; };
    + 5A0BBC4217400544002A7BE0 /* emoticons_menu@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "emoticons_menu@2x.png"; path = "Resources/emoticons_menu@2x.png"; sourceTree = "<group>"; };
    5A0D236816F4C7BC005DF211 /* STTwitterAppOnly.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = STTwitterAppOnly.m; path = "Plugins/Twitter Plugin/STTwitter/STTwitterAppOnly.m"; sourceTree = "<group>"; };
    5A0D236916F4C7BC005DF211 /* STTwitterAppOnly.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = STTwitterAppOnly.h; path = "Plugins/Twitter Plugin/STTwitter/STTwitterAppOnly.h"; sourceTree = "<group>"; };
    5A1781840EC1215D00BA1E04 /* AIAutoScrollTextView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AIAutoScrollTextView.h; path = Source/AIAutoScrollTextView.h; sourceTree = "<group>"; };
    @@ -4418,6 +4429,8 @@
    767870E21634045C00BD0E4D /* AIMessageViewTopBarController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AIMessageViewTopBarController.h; path = Source/AIMessageViewTopBarController.h; sourceTree = "<group>"; };
    767870E31634045C00BD0E4D /* AIMessageViewTopBarController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AIMessageViewTopBarController.m; path = Source/AIMessageViewTopBarController.m; sourceTree = "<group>"; };
    76889DEA12D3CA17007AEF00 /* get-info.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = "get-info.tiff"; path = "Resources/get-info.tiff"; sourceTree = "<group>"; };
    + 76980AC0173E6C8800FBDA15 /* libidn.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = libidn.framework; path = Frameworks/libidn.framework; sourceTree = "<group>"; };
    + 769D634A17393CBE008B97BC /* AMPurpleJabberDiscoveryBrowser.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = AMPurpleJabberDiscoveryBrowser.xib; path = "Plugins/Purple Service/AMPurpleJabberDiscoveryBrowser.xib"; sourceTree = "<group>"; };
    76A79E0916349477007A0497 /* AIGroupChat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AIGroupChat.h; path = "Frameworks/Adium Framework/Source/AIGroupChat.h"; sourceTree = "<group>"; };
    76A79E0A16349477007A0497 /* AIGroupChat.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AIGroupChat.m; path = "Frameworks/Adium Framework/Source/AIGroupChat.m"; sourceTree = "<group>"; };
    76AA11091635585E00A6EC4B /* AIAccountSelectionTopBar.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = AIAccountSelectionTopBar.xib; path = "Plugins/Dual Window Interface/AIAccountSelectionTopBar.xib"; sourceTree = "<group>"; };
    @@ -4430,6 +4443,10 @@
    76B8B8EB16AF3A46009126FE /* AIOTRTopBarLoggingWarningController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = AIOTRTopBarLoggingWarningController.xib; path = Source/AIOTRTopBarLoggingWarningController.xib; sourceTree = "<group>"; };
    76C1AF9A125A906A00D269A9 /* AIAdiumURLProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AIAdiumURLProtocol.h; path = "Plugins/WebKit Message View/AIAdiumURLProtocol.h"; sourceTree = "<group>"; };
    76C1AF9B125A906A00D269A9 /* AIAdiumURLProtocol.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AIAdiumURLProtocol.m; path = "Plugins/WebKit Message View/AIAdiumURLProtocol.m"; sourceTree = "<group>"; };
    + 76FBDAC51733B9C900C9F10B /* STTwitterHTML.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = STTwitterHTML.h; path = "Plugins/Twitter Plugin/STTwitter/STTwitterHTML.h"; sourceTree = "<group>"; };
    + 76FBDAC61733B9C900C9F10B /* STTwitterHTML.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = STTwitterHTML.m; path = "Plugins/Twitter Plugin/STTwitter/STTwitterHTML.m"; sourceTree = "<group>"; };
    + 76FBDAC71733B9C900C9F10B /* STTwitterOAuthOSX.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = STTwitterOAuthOSX.h; path = "Plugins/Twitter Plugin/STTwitter/STTwitterOAuthOSX.h"; sourceTree = "<group>"; };
    + 76FBDAC81733B9C900C9F10B /* STTwitterOAuthOSX.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = STTwitterOAuthOSX.m; path = "Plugins/Twitter Plugin/STTwitter/STTwitterOAuthOSX.m"; sourceTree = "<group>"; };
    76FF925814B524B40043E23B /* AIIRCConsoleController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AIIRCConsoleController.h; path = "Plugins/Purple Service/AIIRCConsoleController.h"; sourceTree = "<group>"; };
    76FF925914B524B40043E23B /* AIIRCConsoleController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AIIRCConsoleController.m; path = "Plugins/Purple Service/AIIRCConsoleController.m"; sourceTree = "<group>"; };
    76FF926314B62A980043E23B /* AIConsole.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = AIConsole.xib; path = "Frameworks/Adium Framework/Resources/AIConsole.xib"; sourceTree = "<group>"; };
    @@ -4482,6 +4499,10 @@
    9719C92B1530EDF700217FBE /* FriBidi.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = FriBidi.framework; path = Frameworks/FriBidi.framework; sourceTree = "<group>"; };
    9719C92D1530EE0C00217FBE /* ShortcutRecorder.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ShortcutRecorder.framework; path = Frameworks/ShortcutRecorder.framework; sourceTree = "<group>"; };
    9722ABC713257D7F00CAB486 /* ContactListWindow.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = ContactListWindow.xib; path = Resources/ContactListWindow.xib; sourceTree = "<group>"; };
    + 974C7524148570E2000686BA /* emoticons_menu.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = emoticons_menu.png; path = Resources/emoticons_menu.png; sourceTree = "<group>"; };
    + 974C752C148578F6000686BA /* MessageViewEmoticonsMenu.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = MessageViewEmoticonsMenu.xib; path = Resources/MessageViewEmoticonsMenu.xib; sourceTree = "<group>"; };
    + 974C753314857BF4000686BA /* AIMessageViewEmoticonsController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AIMessageViewEmoticonsController.h; path = Source/AIMessageViewEmoticonsController.h; sourceTree = "<group>"; };
    + 974C753414857BF4000686BA /* AIMessageViewEmoticonsController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AIMessageViewEmoticonsController.m; path = Source/AIMessageViewEmoticonsController.m; sourceTree = "<group>"; };
    9760D24513E49A560031FA1A /* AboutDialog_bg.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = AboutDialog_bg.png; path = Resources/AboutDialog_bg.png; sourceTree = "<group>"; };
    979AA6A514D59DC8008730DF /* AIBoolToControlTextColorTransformer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AIBoolToControlTextColorTransformer.h; path = "Frameworks/Adium Framework/Source/AIBoolToControlTextColorTransformer.h"; sourceTree = "<group>"; };
    979AA6A614D59DC8008730DF /* AIBoolToControlTextColorTransformer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AIBoolToControlTextColorTransformer.m; path = "Frameworks/Adium Framework/Source/AIBoolToControlTextColorTransformer.m"; sourceTree = "<group>"; };
    @@ -4787,6 +4808,7 @@
    811035180CDE783800EC6038 /* SecurityInterface.framework in Frameworks */,
    633405990F9C2C00003C77A9 /* AIUtilities.framework in Frameworks */,
    3485D8EB09EB446900232CC4 /* Adium.framework in Frameworks */,
    + 76980AC1173E6C8800FBDA15 /* libidn.framework in Frameworks */,
    );
    runOnlyForDeploymentPostprocessing = 0;
    };
    @@ -5006,6 +5028,13 @@
    11C157D504A88DE0008E0C76 /* Emoticons */ = {
    isa = PBXGroup;
    children = (
    + 11C157D804A88E04008E0C76 /* AIEmoticonController.h */,
    + 11C157D904A88E04008E0C76 /* AIEmoticonController.m */,
    + 974C753314857BF4000686BA /* AIMessageViewEmoticonsController.h */,
    + 974C753414857BF4000686BA /* AIMessageViewEmoticonsController.m */,
    + 974C752C148578F6000686BA /* MessageViewEmoticonsMenu.xib */,
    + 974C7524148570E2000686BA /* emoticons_menu.png */,
    + 5A0BBC4217400544002A7BE0 /* emoticons_menu@2x.png */,
    C4243C920638E4EA007AD2D9 /* BGEmoticonMenuPlugin.h */,
    C4243C930638E4EA007AD2D9 /* BGEmoticonMenuPlugin.m */,
    );
    @@ -5653,6 +5682,7 @@
    346545090C8F69280046ED68 /* Discovery Browsing */ = {
    isa = PBXGroup;
    children = (
    + 769D634A17393CBE008B97BC /* AMPurpleJabberDiscoveryBrowser.xib */,
    81DAED500C26F4F700780E4C /* AMPurpleJabberServiceDiscoveryBrowsing.h */,
    81DAED510C26F4F700780E4C /* AMPurpleJabberServiceDiscoveryBrowsing.m */,
    3465451A0C8F6A670046ED68 /* AMPurpleJabberServiceDiscoveryBrowserController.h */,
    @@ -5842,8 +5872,6 @@
    34B82C80085A85D800864531 /* AIChatController.m */,
    F55B415C03AB8B5601A8010A /* AIContentController.h */,
    F55B415D03AB8B5601A8010A /* AIContentController.m */,
    - 11C157D804A88E04008E0C76 /* AIEmoticonController.h */,
    - 11C157D904A88E04008E0C76 /* AIEmoticonController.m */,
    34CA15520CAFDFB2009AA5E3 /* sidebarActionWidget.png */,
    C6EE434115C0AA6F00A4B96C /* sidebarActionWidget@2x.png */,
    34A9707D0C96602200F46006 /* sidebarStatusAreaBackground.png */,
    @@ -7346,6 +7374,10 @@
    5A3B4D7116D878AB00903E40 /* STTwitterOAuth.h */,
    5A3B4D7216D878AB00903E40 /* STTwitterOAuth.m */,
    5A3B4D7516D878AB00903E40 /* STTwitterOAuthProtocol.h */,
    + 76FBDAC51733B9C900C9F10B /* STTwitterHTML.h */,
    + 76FBDAC61733B9C900C9F10B /* STTwitterHTML.m */,
    + 76FBDAC71733B9C900C9F10B /* STTwitterOAuthOSX.h */,
    + 76FBDAC81733B9C900C9F10B /* STTwitterOAuthOSX.m */,
    5A3B4D7616D878AC00903E40 /* Vendor */,
    );
    name = STTwitter;
    @@ -8284,6 +8316,7 @@
    979AA6A914D59EF3008730DF /* Others */ = {
    isa = PBXGroup;
    children = (
    + 76980AC0173E6C8800FBDA15 /* libidn.framework */,
    7664EAA4162E086A008CF995 /* libffi.framework */,
    76731DE015F90538007728C3 /* libgcrypt.framework */,
    76731DE115F90538007728C3 /* libgpgerror.framework */,
    @@ -9177,6 +9210,7 @@
    112B47670F82E0FC00690E84 /* AIXtraInfo.h in Headers */,
    34F17FCE0F8EAC34009C5A39 /* AIListOutlineView+Drawing.h in Headers */,
    63B0EC9D0F8FBB660062476B /* AIProxyListObject.h in Headers */,
    + 97483A051486E92C002D1FA8 /* AIMessageViewEmoticonsController.h in Headers */,
    76A79E0B16349477007A0497 /* AIGroupChat.h in Headers */,
    5A6298E31682BD9D00F51DED /* AIAdvancedPreferencePane.h in Headers */,
    );
    @@ -9634,6 +9668,7 @@
    1150A9960FBE48D600E0BD31 /* ESIRCAccountView.xib in Resources */,
    34D8153F13B663650022C8C4 /* AIFacebookXMPPOauthWebViewWindow.xib in Resources */,
    5A22D6E214834F44004E15F7 /* AIFacebookXMPPAccountView.xib in Resources */,
    + 769D634B17393CBE008B97BC /* AMPurpleJabberDiscoveryBrowser.xib in Resources */,
    );
    runOnlyForDeploymentPostprocessing = 0;
    };
    @@ -9857,6 +9892,8 @@
    5A4BD56A13F86B7E00A4D3F7 /* Preferences-Icons.xib in Resources */,
    5A4BD57F13F86BC500A4D3F7 /* Preferences-General.xib in Resources */,
    7EC033B214590E0700CF24FB /* MessageWindow.xib in Resources */,
    + 972AB3A11493CF2300381105 /* emoticons_menu.png in Resources */,
    + 972AB3A21493D1BA00381105 /* MessageViewEmoticonsMenu.xib in Resources */,
    5A27FA7E14A272330063489D /* pref-messagestyle.png in Resources */,
    5A1E3A1214DCE60400724574 /* Preferences-Xtras.xib in Resources */,
    5A8F637614DD1B21008412C8 /* Preferences-Privacy.xib in Resources */,
    @@ -9929,6 +9966,7 @@
    C613B143164112B3006683FF /* events-dock-name.tiff in Resources */,
    C613B1451641210B006683FF /* events-contact.tiff in Resources */,
    76B8B8ED16AF3A46009126FE /* AIOTRTopBarLoggingWarningController.xib in Resources */,
    + 5A0BBC4317400544002A7BE0 /* emoticons_menu@2x.png in Resources */,
    );
    runOnlyForDeploymentPostprocessing = 0;
    };
    @@ -10585,6 +10623,7 @@
    5A3B4D7E16D878AC00903E40 /* STHTTPRequest.m in Sources */,
    5A0D236A16F4C7BC005DF211 /* STTwitterAppOnly.m in Sources */,
    5A4B77E916FBDDC700DF398C /* NSData+Base64.m in Sources */,
    + 76FBDAC91733B9CA00C9F10B /* STTwitterHTML.m in Sources */,
    );
    runOnlyForDeploymentPostprocessing = 0;
    };
    @@ -10657,7 +10696,6 @@
    34DC8AD80A7EEEF7003E1636 /* DCJoinChatWindowController.m in Sources */,
    34DC8ADB0A7EEEF7003E1636 /* AIAccountPlusFieldPromptController.m in Sources */,
    34DC8ADD0A7EEEF7003E1636 /* AIContextMenuTextView.m in Sources */,
    - 34DC8AE10A7EEEF7003E1636 /* AIMessageEntryTextView.m in Sources */,
    34DC8AE80A7EEEF7003E1636 /* AILocalizationButtonCell.m in Sources */,
    34DC8AEA0A7EEEF7003E1636 /* AILocalizationTextField.m in Sources */,
    34DC8AEC0A7EEEF7003E1636 /* AILocalizationButton.m in Sources */,
    @@ -10691,6 +10729,8 @@
    112B47680F82E0FC00690E84 /* AIXtraInfo.m in Sources */,
    34F17FCF0F8EAC34009C5A39 /* AIListOutlineView+Drawing.m in Sources */,
    63B0EC9C0F8FBB660062476B /* AIProxyListObject.m in Sources */,
    + 97483A011486DD87002D1FA8 /* AIMessageEntryTextView.m in Sources */,
    + 97483A061486E93E002D1FA8 /* AIMessageViewEmoticonsController.m in Sources */,
    76FF926814B62AB80043E23B /* AIConsoleController.m in Sources */,
    5AEE60011602BAE200304672 /* AIBoolToControlTextColorTransformer.m in Sources */,
    76A79E0C16349477007A0497 /* AIGroupChat.m in Sources */,
    @@ -12388,6 +12428,10 @@
    isa = XCBuildConfiguration;
    baseConfigurationReference = 63C7E2060FAFAA4700B310AC /* AdiumLibpurple.xcconfig */;
    buildSettings = {
    + FRAMEWORK_SEARCH_PATHS = (
    + "$(inherited)",
    + "\"$(SRCROOT)/Frameworks\"",
    + );
    };
    name = Debug;
    };
    @@ -12395,6 +12439,10 @@
    isa = XCBuildConfiguration;
    baseConfigurationReference = 63C7E2060FAFAA4700B310AC /* AdiumLibpurple.xcconfig */;
    buildSettings = {
    + FRAMEWORK_SEARCH_PATHS = (
    + "$(inherited)",
    + "\"$(SRCROOT)/Frameworks\"",
    + );
    };
    name = Release;
    };
    @@ -12402,6 +12450,10 @@
    isa = XCBuildConfiguration;
    baseConfigurationReference = 63C7E2060FAFAA4700B310AC /* AdiumLibpurple.xcconfig */;
    buildSettings = {
    + FRAMEWORK_SEARCH_PATHS = (
    + "$(inherited)",
    + "\"$(SRCROOT)/Frameworks\"",
    + );
    };
    name = "Release-Debug";
    };
    Binary file AdiumHelp/gfx/Adium-Extra.png has changed
    Binary file AdiumHelp/gfx/Adium-Xtras.png has changed
    Binary file AdiumHelp/gfx/Chat window-Encryption.png has changed
    Binary file AdiumHelp/gfx/pref-sm.png has changed
    --- a/AdiumHelp/pgs/AdiumDocumentation.html Tue May 28 00:24:27 2013 +0200
    +++ b/AdiumHelp/pgs/AdiumDocumentation.html Tue May 28 00:52:55 2013 +0200
    @@ -37,7 +37,7 @@
    <li><a href="Accounts-CreatingAccounts.html">Creating accounts â–¸</a></li>
    <li><a href="Accounts-ContactIcons.html">Contact icons â–¸</a></li>
    <li><a href="Accounts-SettingYourStatus.html">Setting your status â–¸</a></li>
    - <li>Specific account use
    + <li>Service-specific information
    <ul>
    <li><a href="ServiceInformation-IRCSupport.html">IRC â–¸</a></li>
    <li><a href="ServiceInformation-TwitterSupport.html">Twitter â–¸</a></li>
    @@ -109,11 +109,15 @@
    <td><ul>
    <li><a href="AdvancedFeatures-AdiumXtras.html">Adium Xtras â–¸</a></li>
    <li><a href="AdvancedFeatures-GrowlSupport.html">Growl support â–¸</a></li>
    + <li><a href="AdvancedFeatures-FileTransfer.html">File transfer â–¸</a></li>
    <li><a href="AdvancedFeatures-AddressBookIntegration.html">Address Book integration â–¸</a></li>
    - <li><a href="AdvancedFeatures-FileTransfer.html">File transfer â–¸</a></li>
    - <li><a href="AdvancedFeatures-DirectConnect.html">AIM: Direct Connect â–¸</a></li>
    - <li><a href="AdvancedFeatures-SearchForBuddyBy Email.html">AIM: Search for buddy by email address â–¸</a></li>
    - <li><a href="AdvancedFeatures-NudgeBuzz.html">MSN: Nudge / Yahoo: Buzz â–¸</a></li>
    + <li><a href="AdvancedFeatures-OTREncryption.html">OTR encryption â–¸</a></li>
    + <li>Service-specific information</li>
    + <ul>
    + <li><a href="AdvancedFeatures-DirectConnect.html">AIM: Direct Connect â–¸</a></li>
    + <li><a href="AdvancedFeatures-SearchForBuddyBy Email.html">AIM: Search for buddy by email address â–¸</a></li>
    + <li><a href="AdvancedFeatures-NudgeBuzz.html">MSN: Nudge / Yahoo: Buzz â–¸</a></li>
    + </ul>
    </ul></td>
    </tr>
    </table>
    @@ -144,7 +148,7 @@
    </div>
    <div class="taskboxline">
    <div class="taskboxheader">
    - <h3>Information about the services supported</h3>
    + <h3>Services supported</h3>
    </div>
    <div class="taskboxtable">
    <table width="100%" border="0" cellspacing="0" cellpadding="0" summary="One column table with heading">
    --- a/AdiumHelp/pgs/AdvancedFeatures-AdiumXtras.html Tue May 28 00:24:27 2013 +0200
    +++ b/AdiumHelp/pgs/AdvancedFeatures-AdiumXtras.html Tue May 28 00:52:55 2013 +0200
    @@ -23,7 +23,7 @@
    <h3>Installing Adium Xtras</h3>
    </div>
    <div class="taskboxtext">
    - <p>To install an Xtra from the <a class="ext_link" href="http://xtras.adium.im/">AdiumXtras website</a>, click the install link on the Xtra's webpage. To install an extra that you have already downloaded, simply doubleclick it. In either case, Adium will launch and put the Xtra into the correct place for you.</p>
    + <p>To install an Xtra from the <a class="ext_link" href="http://xtras.adium.im/">AdiumXtras website</a>, click the install link on the Xtra's webpage. To install an Xtra that you have already downloaded, simply doubleclick it. In either case, Adium will launch and put the Xtra into the correct place for you.</p>
    </div>
    </div>
    <div class="taskboxline">
    @@ -32,7 +32,7 @@
    </div>
    <div class="taskboxtext">
    <p>Xtras are stored in subfolders of this folder: (Your Home Folder)/Library/Application Support/Adium 2.0. Each folder contains a different type of Xtra.</p>
    - <p align="center"> <img src="../gfx/Adium-Extra.png" alt="" width="400" height="112" /></p>
    + <p align="center"> <img src="../gfx/Adium-Xtras.png" alt="" width="400" height="112" /></p>
    <ul>
    <li>Contact List - Contact list layouts and themes (<a href="AdvancedFeatures-AdiumXtras-ListLayouts.html">.ListLayout</a>, <a href="AdvancedFeatures-AdiumXtras-ListTheme.html">.ListTheme</a>)</li>
    <li>Dock Icons - Dock-icon packs (<a href="AdvancedFeatures-AdiumXtras-DockIcons.html">.AdiumIcon</a>)</li>
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/AdiumHelp/pgs/AdvancedFeatures-OTREncryption.html Tue May 28 00:52:55 2013 +0200
    @@ -0,0 +1,89 @@
    +<?xml version="1.0" encoding="utf-8"?>
    +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    +<html xmlns="http://www.w3.org/1999/xhtml">
    +<head>
    +<meta http-equiv="content-type" content="text/html; charset=utf-8" />
    +<meta name="keywords" content="otr, encryption, off-the-record" />
    +<meta name="description" content="otr encryption" />
    +<title>OTR encryption</title>
    +<link href="../css/topicpage.css" type="text/css" rel="stylesheet" media="all" />
    +</head>
    +<body>
    +<div id="banner"> <a name="tabs" id="tabs"></a>
    + <div id="navleft"><a class="navleftsty" href="../AdiumHelp.html">Adium Help</a> <a class="navleftsty" href="AdiumDocumentation.html">Adium Documentation</a></div>
    +</div>
    +<div id="mainbox">
    + <div id="caticon"> <img src="../gfx/AdiumIcon.png" alt="Adium Icon" height="32" width="32" border="0" /> </div>
    + <div id="pagetitle">
    + <h1>OTR encryption</h1>
    + </div>
    + <p><a href="http://www.cypherpunks.ca/otr/">Off-the-Record (OTR) Messaging</a> enables you to have private conversations over instant messaging. According to the OTR Development Team, it aims to provide the following:</p>
    + <ul>
    + <li>"Encryption: No one else can read your instant messages."</li>
    + <li>"Authentication: You are assured the correspondent is who you think it is."</li>
    + <li>"Deniability: The messages you send do not have digital signatures that are checkable by a third party. Anyone can forge messages after a conversation to make them look like they came from you. However, during a conversation, your correspondent is assured the messages he sees are authentic and unmodified."</li>
    + <li>"Perfect forward secrecy: If you lose control of your private keys, no previous conversation is compromised."</li>
    + </ul>
    + <div class="taskboxline">
    + <div class="taskboxheader">
    + <h3>Setup</h3>
    + </div>
    + <div class="taskboxtext">
    + <ul>
    + <li>Generate an OTR fingerprint:</li>
    + <ol>
    + <li>Open the preferences, accessible via the <strong>Adium</strong> menu in the menu bar, and select the <strong>Encryption</strong> pane.</li>
    + <li>Click the <strong>Generate</strong> button. This fingerprint is unique for the account selected in the dropdown.</li>
    + </ol>
    + <li>Make sure you have the "Encryption" (lock) item in the chat window's toolbar. If not, click "Customise Toolbar..." from the <strong>View</strong> menu and add it.</li>
    + </ul>
    + <p align="center"> <img src="../gfx/Chat window-Encryption.png" alt="" width="" height="" /></p>
    + </div>
    + </div>
    + <div class="taskboxline">
    + <div class="taskboxheader">
    + <h3>Initiating an OTR-encrypted chat</h3>
    + </div>
    + <div class="taskboxtext">
    + <p></p>
    + <ol>
    + <li>Open a chat with the contact with whom you want to have a private conversation.</li>
    + <li>Notice the "Encryption" item in the toolbar appears unlocked. It signifies the chat currently is not encrypted. Click the icon and select "Initiate Encrypted OTR Chat".</li>
    + <li>You will be prompted to verify the fingerprint. If you are certain of its trustworthy origin click "Accept".</li>
    + <li>Notice the previously unlocked icon is now locked and the message "Encrypted OTR chat initiated" is displayed in the message view.</li>
    + </ol>
    + </div>
    + </div>
    + <div class="taskboxline">
    + <div class="taskboxheader">
    + <h3>Encryption settings</h3>
    + </div>
    + <div class="taskboxtext">
    + <p>There are four different settings which can be adjusted on a per-account and on a per-contact basis: "Disable chat encryption", "Encrypt chats as requested", "Encrypt chats automatically" and "Force encryption and refuse plaintext".</p>
    + <p><strong>Per-account</strong></p>
    + <ul>
    + <li>Open preferences, select the <strong>Accounts</strong> pane and double-click the account.</li>
    + <li>Click the "Privacy" tab and choose your option for this account from the dropdown.</li>
    + </ul>
    + <p><strong>Per-contact</strong></p>
    + <ul>
    + <li>In the chat window/tab you have open with the contact in question, click the lock in the toolbar and choose your option via "Encryption Settings".</li>
    + </ul>
    + </div>
    + </div>
    + <div class="taskboxline">
    + <div class="taskboxheader">
    + <h3>Disabling chat logging on your computer</h3>
    + </div>
    + <div class="taskboxtext">
    + <p>By default, Adium stores all of your chats locally. You might want to disable logging of chats on your computer entirely or just for OTR-encrypted chats or specific accounts.</p>
    + <ul>
    + <li>Open preferences, select the <strong>Messages</strong> pane.</li>
    + <li>Tick the appropriate checkboxes.</li>
    + </ul>
    + </div>
    + </div>
    +</div>
    +<script type="text/javascript" src="../js/help.js"></script>
    +</body>
    +</html>
    --- a/Frameworks/AIUtilities Framework/Source/AIColorAdditions.m Tue May 28 00:24:27 2013 +0200
    +++ b/Frameworks/AIUtilities Framework/Source/AIColorAdditions.m Tue May 28 00:52:55 2013 +0200
    @@ -151,26 +151,9 @@
    + (NSDictionary *)colorNamesDictionary
    {
    - if (!RGBColorValues) {
    - RGBColorValues = [[NSMutableDictionary alloc] initWithObjectsAndKeys:
    - [NSColor colorWithHTMLString:@"#000"], @"black",
    - [NSColor colorWithHTMLString:@"#c0c0c0"], @"silver",
    - [NSColor colorWithHTMLString:@"#808080"], @"gray",
    - [NSColor colorWithHTMLString:@"#808080"], @"grey",
    - [NSColor colorWithHTMLString:@"#fff"], @"white",
    - [NSColor colorWithHTMLString:@"#800000"], @"maroon",
    - [NSColor colorWithHTMLString:@"#f00"], @"red",
    - [NSColor colorWithHTMLString:@"#800080"], @"purple",
    - [NSColor colorWithHTMLString:@"#f0f"], @"fuchsia",
    - [NSColor colorWithHTMLString:@"#008000"], @"green",
    - [NSColor colorWithHTMLString:@"#0f0"], @"lime",
    - [NSColor colorWithHTMLString:@"#808000"], @"olive",
    - [NSColor colorWithHTMLString:@"#ff0"], @"yellow",
    - [NSColor colorWithHTMLString:@"#000080"], @"navy",
    - [NSColor colorWithHTMLString:@"#00f"], @"blue",
    - [NSColor colorWithHTMLString:@"#008080"], @"teal",
    - [NSColor colorWithHTMLString:@"#0ff"], @"aqua",
    - nil];
    + static dispatch_once_t onceToken;
    + dispatch_once(&onceToken, ^{
    + RGBColorValues = [[NSMutableDictionary alloc] init];
    NSArray *paths = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:defaultRGBTxtLocation1 error:NULL];
    for (NSString *middlePath in paths) {
    NSString *path = [defaultRGBTxtLocation1 stringByAppendingPathComponent:[middlePath stringByAppendingPathComponent:defaultRGBTxtLocation2]];
    @@ -183,7 +166,29 @@
    break;
    }
    }
    - }
    + [RGBColorValues addEntriesFromDictionary:@{
    + @"black": [NSColor colorWithHTMLString:@"#000"],
    + @"silver": [NSColor colorWithHTMLString:@"#c0c0c0"],
    + @"gray": [NSColor colorWithHTMLString:@"#808080"],
    + @"grey": [NSColor colorWithHTMLString:@"#808080"],
    + @"white": [NSColor colorWithHTMLString:@"#fff"],
    + @"maroon": [NSColor colorWithHTMLString:@"#800000"],
    + @"red": [NSColor colorWithHTMLString:@"#f00"],
    + @"purple": [NSColor colorWithHTMLString:@"#800080"],
    + @"fuchsia": [NSColor colorWithHTMLString:@"#f0f"],
    + @"green": [NSColor colorWithHTMLString:@"#008000"],
    + @"lime": [NSColor colorWithHTMLString:@"#0f0"],
    + @"olive": [NSColor colorWithHTMLString:@"#808000"],
    + @"yellow": [NSColor colorWithHTMLString:@"#ff0"],
    + @"navy": [NSColor colorWithHTMLString:@"#000080"],
    + @"blue": [NSColor colorWithHTMLString:@"#00f"],
    + @"teal": [NSColor colorWithHTMLString:@"#008080"],
    + @"aqua": [NSColor colorWithHTMLString:@"#0ff"],
    + @"indigo": [NSColor colorWithHTMLString:@"#4b0082"],
    + @"crimson": [NSColor colorWithHTMLString:@"#dc143c"]
    + }];
    + });
    +
    return RGBColorValues;
    }
    @@ -534,7 +539,9 @@
    NSDictionary *colorValues = [self colorNamesDictionary];
    colorValue = [colorValues objectForKey:str];
    if (!colorValue) colorValue = [colorValues objectForKey:[str lowercaseString]];
    - if (!colorValue) {
    + if (colorValue) {
    + return colorValue;
    + } else {
    #if COLOR_DEBUG
    NSLog(@"+[NSColor(AIColorAdditions) colorWithHTMLString:] called with unrecognised color name (str is %@); returning %@", str, defaultColor);
    #endif
    --- a/Frameworks/AIUtilities Framework/Source/AICompletingTextField.m Tue May 28 00:24:27 2013 +0200
    +++ b/Frameworks/AIUtilities Framework/Source/AICompletingTextField.m Tue May 28 00:52:55 2013 +0200
    @@ -220,10 +220,9 @@
    [possibleCompletions release];
    + //When the AICompletingTextfield is modified to be able to provide multiple choices of completions, the entire array can be used later.
    if ([sortedArray count] > 0){
    return [sortedArray objectAtIndex:0];
    - //When the AICompletingTextfield is modified to be able to provide multiple choices of completions, the entire array can be used later.
    - //return sortedArray;
    }
    return nil;
    --- a/Frameworks/AIUtilities Framework/Source/AIDateFormatterAdditions.m Tue May 28 00:24:27 2013 +0200
    +++ b/Frameworks/AIUtilities Framework/Source/AIDateFormatterAdditions.m Tue May 28 00:52:55 2013 +0200
    @@ -609,8 +609,6 @@
    [newFormat appendString:@"%%"];
    [scanner setScanLocation:[scanner scanLocation] - [span length] + 1];
    - } else {
    - //NSLog(@"Unhandled format %@", span);
    }
    }
    --- a/Frameworks/AIUtilities Framework/Source/AIImageViewWithImagePicker.m Tue May 28 00:24:27 2013 +0200
    +++ b/Frameworks/AIUtilities Framework/Source/AIImageViewWithImagePicker.m Tue May 28 00:52:55 2013 +0200
    @@ -263,7 +263,7 @@
    //Draw our original image as 50% transparent
    [dragImage lockFocus];
    - [[self image] dissolveToPoint:NSZeroPoint fraction:0.5f];
    + [[self image] drawAtPoint:NSZeroPoint fromRect:NSMakeRect(0, 0, self.image.size.width, self.image.size.height) operation:NSCompositeCopy fraction:0.5f];
    [dragImage unlockFocus];
    //We want the image to resize
    --- a/Frameworks/AIUtilities Framework/Source/AISmoothTooltipTracker.m Tue May 28 00:24:27 2013 +0200
    +++ b/Frameworks/AIUtilities Framework/Source/AISmoothTooltipTracker.m Tue May 28 00:52:55 2013 +0200
    @@ -276,12 +276,8 @@
    #if LOG_TRACKING_INFO
    NSLog(@"%@: Visible: %i ; Point %@ in %@ = %i", self,
    [[view window] isVisible],
    -/* NSStringFromPoint([[view superview] convertPoint:[[view window] convertScreenToBase:mouseLocation] fromView:[[view window] contentView]]),*/
    NSStringFromPoint([[view window] convertScreenToBase:mouseLocation]),
    -/* NSStringFromRect([view frame]),*/
    NSStringFromRect([[[view window] contentView] convertRect:[view frame] fromView:[view superview]]),
    -/* NSPointInRect([[view window] convertScreenToBase:mouseLocation], [view frame])*/
    - /*NSPointInRect([[view superview] convertPoint:[[view window] convertScreenToBase:mouseLocation] fromView:[[view window] contentView]],[view frame])*/
    NSPointInRect([[view window] convertScreenToBase:mouseLocation],[[[view window] contentView] convertRect:[view frame] fromView:[view superview]]));
    #endif
    --- a/Frameworks/AIUtilities Framework/Source/AIStringAdditions.m Tue May 28 00:24:27 2013 +0200
    +++ b/Frameworks/AIUtilities Framework/Source/AIStringAdditions.m Tue May 28 00:52:55 2013 +0200
    @@ -283,82 +283,6 @@
    return [string autorelease];
    }
    -//- (NSString *)stringByEncodingURLEscapes
    -//{
    -// NSScanner *s = [NSScanner scannerWithString:self];
    -// NSCharacterSet *notUrlCode = [[NSCharacterSet characterSetWithCharactersInString:
    -// @"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789$-_.+!*'(),;/?:@=&"] invertedSet];
    -// NSMutableString *encodedString = [[NSMutableString alloc] initWithString:@""];
    -// NSString *read;
    -//
    -// while (![s isAtEnd])
    -// {
    -// [s scanUpToCharactersFromSet:notUrlCode intoString:&read];
    -// if (read)
    -// [encodedString appendString:read];
    -// if (![s isAtEnd])
    -// {
    -// [encodedString appendFormat:@"%%%x", [self characterAtIndex:[s scanLocation]]];
    -// [s setScanLocation:[s scanLocation]+1];
    -// }
    -// }
    -//
    -// return [encodedString autorelease];
    -//}
    -//
    -//- (NSString *)stringByDecodingURLEscapes
    -//{
    -// NSScanner *s = [NSScanner scannerWithString:self];
    -// NSMutableString *decodedString = [[NSMutableString alloc] initWithString:@""];
    -// NSString *read;
    -//
    -// while (![s isAtEnd])
    -// {
    -// [s scanUpToString:@"%" intoString:&read];
    -// if (read)
    -// [decodedString appendString:read];
    -// if (![s isAtEnd])
    -// {
    -// [decodedString appendString:[NSString stringWithFormat:@"%c",
    -// [[NSString stringWithFormat:@"%li",
    -// strtol([[self substringWithRange:NSMakeRange([s scanLocation]+1, 2)] cString],
    -// NULL, 16)]
    -// intValue]]];
    -//
    -// [s setScanLocation:[s scanLocation]+3];
    -//
    -// }
    -// }
    -// return [decodedString autorelease];
    -//
    -//}
    -//
    -//- (BOOL)isURLEncoded
    -//{
    -// NSCharacterSet *notUrlCode = [[NSCharacterSet characterSetWithCharactersInString:
    -// @"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789$-_.+!*'(),;/?:@=&"] invertedSet];
    -// NSCharacterSet *notHexSet = [[NSCharacterSet characterSetWithCharactersInString:@"0123456789ABCEFabcdef"]
    -// invertedSet];
    -// NSScanner *s = [NSScanner scannerWithString:self];
    -//
    -// if ([self rangeOfCharacterFromSet:notUrlCode].location != NSNotFound)
    -// return NO;
    -//
    -// while (![s isAtEnd])
    -// {
    -// [s scanUpToString:@"%" intoString:nil];
    -//
    -// if ([[self substringWithRange:NSMakeRange([s scanLocation]+1, 2)] rangeOfCharacterFromSet:notHexSet].location != NSNotFound)
    -// return NO;
    -// }
    -//
    -// return YES;
    -//}
    -
    -
    -
    -
    -
    //stringByEncodingURLEscapes
    // Percent escape all characters except for a-z, A-Z, 0-9, '_', and '-'
    // Convert spaces to '+'
    --- a/Frameworks/AIUtilities Framework/Source/AITextViewWithPlaceholder.m Tue May 28 00:24:27 2013 +0200
    +++ b/Frameworks/AIUtilities Framework/Source/AITextViewWithPlaceholder.m Tue May 28 00:52:55 2013 +0200
    @@ -24,9 +24,6 @@
    - (void)setPlaceholderString:(NSString *)inPlaceholderString
    {
    - // NSDictionary *attributes;
    -
    -// attributes = [NSDictionary dictionaryWithObjectsAndKeys:[NSColor grayColor], NSForegroundColorAttributeName, nil];
    [self setPlaceholder:[[[NSAttributedString alloc] initWithString:inPlaceholderString
    attributes:nil] autorelease]];
    }
    --- a/Frameworks/Adium Framework/Source/AIAbstractListController.m Tue May 28 00:24:27 2013 +0200
    +++ b/Frameworks/Adium Framework/Source/AIAbstractListController.m Tue May 28 00:52:55 2013 +0200
    @@ -610,11 +610,20 @@
    id<AIContainingObject> listObject = (id<AIContainingObject>)(item.listObject);
    proxyListObject = [AIProxyListObject proxyListObjectForListObject:[listObject visibleObjectAtIndex:idx]
    inListObject:listObject];
    -
    - } else if (hideRoot)
    - proxyListObject = [AIProxyListObject proxyListObjectForListObject:[contactList visibleObjectAtIndex:idx]
    - inListObject:contactList];
    - else
    +
    + } else if (hideRoot) {
    + if ([contactList isKindOfClass:[AIGroupChat class]]) {
    + NSString *nick = [(AIGroupChat *)contactList visibleObjectAtIndex:idx];
    + AIListObject *listObject = [(AIGroupChat *)contactList contactForNick:nick];
    +
    + proxyListObject = [AIProxyListObject proxyListObjectForListObject:listObject
    + inListObject:contactList
    + withNick:nick];
    + } else {
    + proxyListObject = [AIProxyListObject proxyListObjectForListObject:[contactList visibleObjectAtIndex:idx]
    + inListObject:contactList];
    + }
    + } else
    proxyListObject = [AIProxyListObject proxyListObjectForListObject:contactList
    inListObject:nil];
    --- a/Frameworks/Adium Framework/Source/AIAccount.m Tue May 28 00:24:27 2013 +0200
    +++ b/Frameworks/Adium Framework/Source/AIAccount.m Tue May 28 00:52:55 2013 +0200
    @@ -1183,7 +1183,6 @@
    }
    AIChat *newChat = [adium.chatController chatWithContact:contact];
    - // NSLog(@"Making new chat %@ in chat window %@:%@",newChat,chatWindowController,[chatWindowController containerID]);
    [adium.interfaceController openChat:newChat inContainerWithID:[chatWindowController containerID] atIndex:index];
    return newChat;
    } else {
    @@ -1204,7 +1203,6 @@
    [newParticipants addObject:[[participants objectAtIndex:i] objectsByEvaluatingSpecifier]];
    }
    - //AIChat *newChat = [adium.chatController chatWithName:name identifier:nil onAccount:self chatCreationInfo:nil];
    DCJoinChatViewController *chatController = [DCJoinChatViewController joinChatView];
    [chatController doJoinChatWithName:name onAccount:self chatCreationInfo:nil invitingContacts:newParticipants withInvitationMessage:@"Hey, wanna join my chat?"];
    return [adium.chatController existingChatWithName:name onAccount:self];
    --- a/Frameworks/Adium Framework/Source/AIAddressBookUserIconSource.m Tue May 28 00:24:27 2013 +0200
    +++ b/Frameworks/Adium Framework/Source/AIAddressBookUserIconSource.m Tue May 28 00:52:55 2013 +0200
    @@ -137,7 +137,6 @@
    if (useABImages) {
    NSNumber *tagNumber;
    NSImage *image;
    - // AIListContact *parentContact;
    NSString *uniqueID;
    id setOrObject;
    @@ -164,7 +163,7 @@
    asynchronously:YES
    forObject:listObject];
    - } else /*if ([setOrObject isKindOfClass:[NSSet class]])*/{
    + } else {
    //Apply the image to each listObject at the appropriate priority
    for (AIListObject *listObject in [[(NSSet *)setOrObject copy] autorelease]) {
    [AIUserIcons userIconSource:self
    @@ -224,7 +223,7 @@
    [trackingDict setObject:objectSet forKey:tagNumber];
    }
    - } else /*if ([previousValue isKindOfClass:[NSMutableSet class]])*/{
    + } else {
    //Add the new object to the previously-created set
    [(NSMutableSet *)previousValue addObject:inObject];
    }
    --- a/Frameworks/Adium Framework/Source/AIChat.m Tue May 28 00:24:27 2013 +0200
    +++ b/Frameworks/Adium Framework/Source/AIChat.m Tue May 28 00:52:55 2013 +0200
    @@ -641,6 +641,7 @@
    AIContentMessage *messageContent;
    messageContent = [AIContentMessage messageInChat:self
    withSource:self.account
    + sourceNick:nil
    destination:self.listObject
    date:nil
    message:attributedMessage
    --- a/Frameworks/Adium Framework/Source/AIContentMessage.h Tue May 28 00:24:27 2013 +0200
    +++ b/Frameworks/Adium Framework/Source/AIContentMessage.h Tue May 28 00:52:55 2013 +0200
    @@ -45,7 +45,15 @@
    withSource:(id)inSource
    destination:(id)inDest
    date:(NSDate *)inDate
    - message:(NSAttributedString *)inMessage
    + message:(NSAttributedString *)inMessage
    + autoreply:(BOOL)inAutoReply;
    +
    ++ (id)messageInChat:(AIChat *)inChat
    + withSource:(id)inSource
    + sourceNick:(NSString *)inSourceNick
    + destination:(id)inDest
    + date:(NSDate *)inDate
    + message:(NSAttributedString *)inMessage
    autoreply:(BOOL)inAutoreply;
    /*! @brief Create an AIContentMessage.
    @@ -56,6 +64,7 @@
    */
    - (id)initWithChat:(AIChat *)inChat
    source:(id)inSource
    + sourceNick:(NSString *)inSourceNick
    destination:(id)inDest
    date:(NSDate *)inDate
    message:(NSAttributedString *)inMessage
    --- a/Frameworks/Adium Framework/Source/AIContentMessage.m Tue May 28 00:24:27 2013 +0200
    +++ b/Frameworks/Adium Framework/Source/AIContentMessage.m Tue May 28 00:52:55 2013 +0200
    @@ -23,7 +23,6 @@
    @implementation AIContentMessage
    -//Create a content message
    + (id)messageInChat:(AIChat *)inChat
    withSource:(id)inSource
    destination:(id)inDest
    @@ -31,8 +30,27 @@
    message:(NSAttributedString *)inMessage
    autoreply:(BOOL)inAutoReply
    {
    + return [[[self alloc] initWithChat:inChat
    + source:inSource
    + sourceNick:nil
    + destination:inDest
    + date:inDate
    + message:inMessage
    + autoreply:inAutoReply] autorelease];
    +}
    +
    +//Create a content message
    ++ (id)messageInChat:(AIChat *)inChat
    + withSource:(id)inSource
    + sourceNick:(NSString *)inSourceNick
    + destination:(id)inDest
    + date:(NSDate *)inDate
    + message:(NSAttributedString *)inMessage
    + autoreply:(BOOL)inAutoReply
    +{
    return [[[self alloc] initWithChat:inChat
    source:inSource
    + sourceNick:inSourceNick
    destination:inDest
    date:inDate
    message:inMessage
    @@ -48,12 +66,13 @@
    //Init
    - (id)initWithChat:(AIChat *)inChat
    source:(id)inSource
    + sourceNick:(NSString *)inSourceNick
    destination:(id)inDest
    date:(NSDate *)inDate
    message:(NSAttributedString *)inMessage
    autoreply:(BOOL)inAutoReply
    {
    - if ((self = [super initWithChat:inChat source:inSource destination:inDest date:inDate message:inMessage])) {
    + if ((self = [super initWithChat:inChat source:inSource sourceNick:inSourceNick destination:inDest date:inDate message:inMessage])) {
    isAutoreply = inAutoReply;
    encodedMessage = nil;
    encodedMessageAccountData = nil;
    @@ -78,7 +97,7 @@
    [classes addObject:@"message"];
    if(isAutoreply) [classes addObject:@"autoreply"];
    if(self.chat.isGroupChat) {
    - AIGroupChatFlags flags = [(AIGroupChat *)self.chat flagsForContact:(AIListContact *)self.source];
    + AIGroupChatFlags flags = [(AIGroupChat *)self.chat flagsForNick:self.sourceNick];
    if (flags & AIGroupChatOp)
    [classes addObject:@"op"];
    if (flags & AIGroupChatHalfOp)
    @@ -95,7 +114,7 @@
    {
    if (!self.chat.isGroupChat) return @"";
    - AIGroupChatFlags flags = [(AIGroupChat *)self.chat flagsForContact:(AIListContact *)self.source];
    + AIGroupChatFlags flags = [(AIGroupChat *)self.chat flagsForNick:self.sourceNick];
    if ((flags & AIGroupChatFounder) == AIGroupChatFounder) {
    return @"~";
    --- a/Frameworks/Adium Framework/Source/AIContentObject.h Tue May 28 00:24:27 2013 +0200
    +++ b/Frameworks/Adium Framework/Source/AIContentObject.h Tue May 28 00:52:55 2013 +0200
    @@ -38,6 +38,7 @@
    AIChat *chat;
    AIListObject *source;
    AIListObject *destination;
    + NSString *sourceNick;
    BOOL outgoing;
    NSAttributedString *message;
    @@ -86,6 +87,13 @@
    date:(NSDate*)inDate
    message:(NSAttributedString *)inMessage;
    +- (id)initWithChat:(AIChat *)inChat
    + source:(AIListObject *)inSource
    + sourceNick:(NSString *)inSourceNick
    + destination:(AIListObject *)inDest
    + date:(NSDate*)inDate
    + message:(NSAttributedString *)inMessage;
    +
    /*! @brief The type of content.
    *
    * @par There is at least one type defined for every concrete subclass of \c AIContentObject.
    @@ -254,4 +262,6 @@
    */
    @property (nonatomic) BOOL postProcessContent;
    +@property (nonatomic, retain) NSString *sourceNick;
    +
    @end
    --- a/Frameworks/Adium Framework/Source/AIContentObject.m Tue May 28 00:24:27 2013 +0200
    +++ b/Frameworks/Adium Framework/Source/AIContentObject.m Tue May 28 00:52:55 2013 +0200
    @@ -24,7 +24,7 @@
    @implementation AIContentObject
    @synthesize source, destination, date, isOutgoing = outgoing, chat, message, userInfo;
    -@synthesize filterContent, trackContent, displayContent, displayContentImmediately, sendContent, postProcessContent;
    +@synthesize filterContent, trackContent, displayContent, displayContentImmediately, sendContent, postProcessContent, sourceNick;
    - (id)initWithChat:(AIChat *)inChat
    source:(AIListObject *)inSource
    @@ -33,12 +33,23 @@
    {
    return [self initWithChat:inChat source:inSource destination:inDest date:inDate message:nil];
    }
    +
    - (id)initWithChat:(AIChat *)inChat
    source:(AIListObject *)inSource
    destination:(AIListObject *)inDest
    date:(NSDate*)inDate
    message:(NSAttributedString *)inMessage
    {
    + return [self initWithChat:inChat source:inSource sourceNick:nil destination:inDest date:inDate message:inMessage];
    +}
    +
    +- (id)initWithChat:(AIChat *)inChat
    + source:(AIListObject *)inSource
    + sourceNick:(NSString *)inSourceNick
    + destination:(AIListObject *)inDest
    + date:(NSDate*)inDate
    + message:(NSAttributedString *)inMessage
    +{
    if ((self = [super init]))
    {
    //Default Behavior
    @@ -51,6 +62,7 @@
    //Store source, dest, chat, ...
    source = [inSource retain];
    + sourceNick = [inSourceNick retain];
    destination = [inDest retain];
    message = [inMessage retain];
    date = [(inDate ? inDate : [NSDate date]) retain];
    @@ -66,6 +78,7 @@
    - (void)dealloc
    {
    [source release]; source = nil;
    + [sourceNick release]; sourceNick = nil;
    [destination release]; destination = nil;
    [date release]; date = nil;
    [message release]; message = nil;
    --- a/Frameworks/Adium Framework/Source/AIContentTopic.h Tue May 28 00:24:27 2013 +0200
    +++ b/Frameworks/Adium Framework/Source/AIContentTopic.h Tue May 28 00:52:55 2013 +0200
    @@ -27,8 +27,9 @@
    + (id)topicInChat:(AIChat *)inChat
    withSource:(id)inSource
    + sourceNick:(NSString *)inSourceNick
    destination:(id)inDest
    - date:(NSDate *)inDate
    + date:(NSDate *)inDate
    message:(NSAttributedString *)inMessage;
    @property (nonatomic) BOOL actuallyBlank;
    --- a/Frameworks/Adium Framework/Source/AIContentTopic.m Tue May 28 00:24:27 2013 +0200
    +++ b/Frameworks/Adium Framework/Source/AIContentTopic.m Tue May 28 00:52:55 2013 +0200
    @@ -20,12 +20,14 @@
    @implementation AIContentTopic
    + (id)topicInChat:(AIChat *)inChat
    withSource:(id)inSource
    + sourceNick:(NSString *)inSourceNick
    destination:(id)inDest
    date:(NSDate *)inDate
    message:(NSAttributedString *)inMessage
    {
    return [super messageInChat:inChat
    withSource:inSource
    + sourceNick:inSourceNick
    destination:inDest
    date:inDate
    message:inMessage
    --- a/Frameworks/Adium Framework/Source/AIEditStateWindowController.m Tue May 28 00:24:27 2013 +0200
    +++ b/Frameworks/Adium Framework/Source/AIEditStateWindowController.m Tue May 28 00:52:55 2013 +0200
    @@ -178,8 +178,6 @@
    */
    - (void)windowDidLoad
    {
    -// NSNumberFormatter *intFormatter;
    -
    [scrollView_statusMessage setAutohidesScrollers:YES];
    [scrollView_statusMessage setAlwaysDrawFocusRingIfFocused:YES];
    [textView_statusMessage setTarget:self action:@selector(okay:)];
    --- a/Frameworks/Adium Framework/Source/AIGroupChat.h Tue May 28 00:24:27 2013 +0200
    +++ b/Frameworks/Adium Framework/Source/AIGroupChat.h Tue May 28 00:52:55 2013 +0200
    @@ -18,11 +18,11 @@
    @interface AIGroupChat : AIChat <AIContainingObject> {
    NSString *topic;
    - AIListContact *topicSetter;
    + NSString *topicSetter;
    - NSMutableDictionary *participatingContactsFlags;
    - NSMutableDictionary *participatingContactsAliases;
    - NSMutableArray *participatingContacts;
    + NSMutableDictionary *participatingNicksFlags;
    + NSMutableDictionary *participatingNicksContacts;
    + NSMutableArray *participatingNicks;
    BOOL showJoinLeave;
    BOOL expanded;
    @@ -34,26 +34,31 @@
    @property (readonly, nonatomic) BOOL supportsTopic;
    -- (void)updateTopic:(NSString *)inTopic withSource:(AIListContact *)contact;
    +- (void)updateTopic:(NSString *)inTopic withSource:(NSString *)contact;
    - (void)setTopic:(NSString *)inTopic;
    @property (readwrite, copy, nonatomic) NSDate *lastMessageDate;
    // Group chat participants.
    -- (NSString *)displayNameForContact:(AIListObject *)contact;
    -- (AIGroupChatFlags)flagsForContact:(AIListObject *)contact;
    -- (NSString *)aliasForContact:(AIListObject *)contact;
    -- (void)setFlags:(AIGroupChatFlags)flags forContact:(AIListObject *)contact;
    -- (void)setAlias:(NSString *)alias forContact:(AIListObject *)contact;
    -- (void)removeSavedValuesForContactUID:(NSString *)contactUID;
    +- (AIListContact *)contactForNick:(NSString *)nick;
    +- (AIGroupChatFlags)flagsForNick:(NSString *)nick;
    +- (void)setFlags:(AIGroupChatFlags)flags forNick:(NSString *)nick;
    +- (void)setContact:(AIListContact *)contact forNick:(NSString *)nick;
    +- (void)changeNick:(NSString *)from to:(NSString *)to;
    +- (void)removeSavedValuesForNick:(NSString *)nick;
    +- (NSArray *)nicksForContact:(AIListObject *)contact;
    -- (void)addParticipatingListObject:(AIListContact *)inObject notify:(BOOL)notify;
    -- (void)addParticipatingListObjects:(NSArray *)inObjects notify:(BOOL)notify;
    +- (void)addParticipatingNick:(NSString *)inObject notify:(BOOL)notify;
    +- (void)addParticipatingNicks:(NSArray *)inObjects notify:(BOOL)notify;
    - (void)removeAllParticipatingContactsSilently;
    -- (void)removeObject:(AIListObject *)inObject;
    +- (void)removeObject:(NSString *)inObject;
    - (BOOL)inviteListContact:(AIListContact *)inObject withMessage:(NSString *)inviteMessage;
    - (void)resortParticipants;
    +- (NSString *)visibleObjectAtIndex:(NSUInteger)idx;
    +
    +- (NSString *)displayNameForContact:(AIListObject *)contact __attribute__((deprecated));
    +
    @end
    --- a/Frameworks/Adium Framework/Source/AIGroupChat.m Tue May 28 00:24:27 2013 +0200
    +++ b/Frameworks/Adium Framework/Source/AIGroupChat.m Tue May 28 00:52:55 2013 +0200
    @@ -32,7 +32,6 @@
    @interface AIGroupChat ()
    - (void)contentObjectAdded:(NSNotification *)notification;
    -- (AIListContact *)visibleObjectAtIndex:(NSUInteger)idx;
    @end
    @@ -47,9 +46,9 @@
    if ((self = [super initForAccount:inAccount])) {
    showJoinLeave = YES;
    expanded = YES;
    - participatingContacts = [[NSMutableArray alloc] init];
    - participatingContactsFlags = [[NSMutableDictionary alloc] init];
    - participatingContactsAliases = [[NSMutableDictionary alloc] init];
    + participatingNicks = [[NSMutableArray alloc] init];
    + participatingNicksFlags = [[NSMutableDictionary alloc] init];
    + participatingNicksContacts = [[NSMutableDictionary alloc] init];
    [[NSNotificationCenter defaultCenter] addObserver:self
    @@ -68,9 +67,9 @@
    [self removeAllParticipatingContactsSilently];
    [lastMessageDate release];
    - [participatingContacts release];
    - [participatingContactsFlags release];
    - [participatingContactsAliases release];
    + [participatingNicks release];
    + [participatingNicksFlags release];
    + [participatingNicksContacts release];
    [super dealloc];
    }
    @@ -127,20 +126,6 @@
    [super object:inObject didChangeValueForProperty:key notify:notify];
    }
    -/*!
    - * @brief The alias for a given contact
    - */
    -- (NSString *)aliasForContact:(AIListObject *)contact
    -{
    - NSString *alias = [participatingContactsAliases objectForKey:contact.UID];
    -
    - if (!alias) {
    - alias = [self.account fallbackAliasForContact:(AIListContact *)contact inChat:self];
    - }
    -
    - return alias;
    -}
    -
    AIGroupChatFlags highestFlag(AIGroupChatFlags flags)
    {
    if ((flags & AIGroupChatFounder) == AIGroupChatFounder)
    @@ -204,15 +189,18 @@
    /*!
    * @brief Update the topic.
    */
    -- (void)updateTopic:(NSString *)inTopic withSource:(AIListContact *)contact
    +- (void)updateTopic:(NSString *)inTopic withSource:(NSString *)nick
    {
    + AIListContact *contact = [self contactForNick:nick];
    +
    [self setValue:inTopic forProperty:KEY_TOPIC notify:NotifyNow];
    - [self setValue:contact forProperty:KEY_TOPIC_SETTER notify:NotifyNow];
    + [self setValue:nick forProperty:KEY_TOPIC_SETTER notify:NotifyNow];
    // Apply the new topic to the message view
    AIContentTopic *contentTopic = [AIContentTopic topicInChat:self
    withSource:contact
    + sourceNick:nick
    destination:nil
    date:[NSDate date]
    message:[NSAttributedString stringWithString:[self valueForProperty:KEY_TOPIC] ?: @""]];
    @@ -260,15 +248,15 @@
    */
    - (void)resortParticipants
    {
    - [participatingContacts sortUsingComparator:^(id objectA, id objectB){
    - AIGroupChatFlags flagA = highestFlag([self flagsForContact:objectA]), flagB = highestFlag([self flagsForContact:objectB]);
    + [participatingNicks sortUsingComparator:^(id objectA, id objectB){
    + AIGroupChatFlags flagA = highestFlag([self flagsForNick:objectA]), flagB = highestFlag([self flagsForNick:objectB]);
    if(flagA > flagB) {
    return (NSComparisonResult)NSOrderedAscending;
    } else if (flagA < flagB) {
    return (NSComparisonResult)NSOrderedDescending;
    } else {
    - return [[self displayNameForContact:objectA] localizedCaseInsensitiveCompare:[self displayNameForContact:objectB]];
    + return [objectA localizedCaseInsensitiveCompare:objectB];
    }
    }];
    }
    @@ -276,46 +264,42 @@
    //Participating ListObjects --------------------------------------------------------------------------------------------
    #pragma mark Participating ListObjects
    -/*!
    - * @brief The display name for the contact in this chat.
    - *
    - * @param contact The AIListObject whose display name should be created
    - *
    - * If the user has an alias set, the alias is used, otherwise the display name.
    - *
    - * @returns Display name
    - */
    -- (NSString *)displayNameForContact:(AIListObject *)contact
    +- (AIListObject *)contactForNick:(NSString *)nick
    +{
    + return [participatingNicksContacts objectForKey:nick];
    +}
    +
    +- (AIGroupChatFlags)flagsForNick:(NSString *)nick
    {
    - return [self aliasForContact:contact] ?: contact.displayName;
    + return [[participatingNicksFlags objectForKey:nick] intValue];
    +}
    +
    +- (void)setFlags:(AIGroupChatFlags)flags forNick:(NSString *)nick
    +{
    + [participatingNicksFlags setObject:@(flags)
    + forKey:nick];
    }
    -/*!
    - * @brief The flags for a given contact.
    - */
    -- (AIGroupChatFlags)flagsForContact:(AIListObject *)contact
    +- (void)setContact:(AIListContact *)contact forNick:(NSString *)nick
    {
    - return [(NSNumber *)[participatingContactsFlags objectForKey:contact.UID] intValue];
    + NSParameterAssert(contact != nil);
    +
    + [participatingNicksContacts setObject:contact
    + forKey:nick];
    }
    -/*!
    - * @brief Set the flags for a contact
    - *
    - * Note that this doesn't set the bitwise or; this directly sets the value passed.
    - */
    -- (void)setFlags:(AIGroupChatFlags)flags forContact:(AIListObject *)contact
    +- (void)changeNick:(NSString *)from to:(NSString *)to
    {
    - [participatingContactsFlags setObject:[NSNumber numberWithInteger:flags]
    - forKey:contact.UID];
    -}
    -
    -/*!
    - * @brief Set the alias for a contact.
    - */
    -- (void)setAlias:(NSString *)alias forContact:(AIListObject *)contact
    -{
    - [participatingContactsAliases setObject:alias
    - forKey:contact.UID];
    + [participatingNicks removeObject:from];
    + [participatingNicks addObject:to];
    +
    + NSNumber *flags = [participatingNicksFlags objectForKey:from];
    + [participatingNicksFlags removeObjectForKey:from];
    + if (flags) [participatingNicksFlags setObject:flags forKey:to];
    +
    + AIListObject *contact = [participatingNicksContacts objectForKey:from];
    + [participatingNicksContacts removeObjectForKey:from];
    + if (contact) [participatingNicksContacts setObject:contact forKey:to];
    }
    /*!
    @@ -324,36 +308,41 @@
    * Removes any values which are dependent upon the contact, such as
    * its flags or alias.
    */
    -- (void)removeSavedValuesForContactUID:(NSString *)contactUID
    +- (void)removeSavedValuesForNick:(NSString *)nick
    {
    - [participatingContactsFlags removeObjectForKey:contactUID];
    - [participatingContactsAliases removeObjectForKey:contactUID];
    -}
    -
    -- (void)addParticipatingListObject:(AIListContact *)inObject notify:(BOOL)notify
    -{
    - [self addParticipatingListObjects:[NSArray arrayWithObject:inObject] notify:notify];
    + [participatingNicksFlags removeObjectForKey:nick];
    + [participatingNicksContacts removeObjectForKey:nick];
    }
    -- (void)addParticipatingListObjects:(NSArray *)inObjects notify:(BOOL)notify
    +- (NSArray *)nicksForContact:(AIListObject *)contact
    {
    - NSMutableArray *contacts = [inObjects mutableCopy];
    -
    - for (AIListObject *obj in inObjects) {
    - if ([self containsObject:obj] || ![self canContainObject:obj])
    - [contacts removeObject:obj];
    + NSMutableArray *nicks = [NSMutableArray array];
    +
    + for (NSString *nick in participatingNicks) {
    + if ([[participatingNicksContacts objectForKey:nick] isEqual:contact]) {
    + [nicks addObject:nick];
    + }
    }
    - [participatingContacts addObjectsFromArray:contacts];
    - [adium.chatController chat:self addedListContacts:contacts notify:notify];
    - [contacts release];
    + return nicks;
    +}
    +
    +- (void)addParticipatingNick:(NSString *)inObject notify:(BOOL)notify
    +{
    + [self addParticipatingNicks:[NSArray arrayWithObject:inObject] notify:notify];
    }
    -- (BOOL)addObject:(AIListObject *)inObject
    +- (void)addParticipatingNicks:(NSArray *)inObjects notify:(BOOL)notify
    {
    - NSParameterAssert([inObject isKindOfClass:[AIListContact class]]);
    + [participatingNicks addObjectsFromArray:inObjects];
    + [adium.chatController chat:self addedListContacts:inObjects notify:notify];
    +}
    +
    +- (BOOL)addObject:(NSString *)inObject
    +{
    + NSParameterAssert([inObject isKindOfClass:[NSString class]]);
    - [self addParticipatingListObject:(AIListContact *)inObject notify:YES];
    + [self addParticipatingNick:inObject notify:YES];
    return YES;
    }
    @@ -363,78 +352,91 @@
    return ([self.account inviteContact:inContact toChat:self withMessage:inviteMessage]);
    }
    -#pragma mark AIContainingObject protocol
    +- (NSArray *)containedObjects
    +{
    + return [participatingNicksContacts allValues];
    +}
    +
    - (NSArray *)visibleContainedObjects
    {
    return self.containedObjects;
    }
    -- (NSArray *)containedObjects
    -{
    - return participatingContacts;
    -}
    +
    - (NSUInteger)countOfContainedObjects
    {
    - return [participatingContacts count];
    + return [participatingNicks count];
    }
    - (BOOL)containsObject:(AIListObject *)inObject
    {
    - return [participatingContacts containsObjectIdenticalTo:inObject];
    + return [[participatingNicksContacts allValues] containsObjectIdenticalTo:inObject];
    }
    -- (AIListContact *)visibleObjectAtIndex:(NSUInteger)idx
    +- (NSString *)visibleObjectAtIndex:(NSUInteger)idx
    {
    - return [participatingContacts objectAtIndex:idx];
    + return [participatingNicks objectAtIndex:idx];
    }
    - (NSUInteger)visibleIndexOfObject:(AIListObject *)obj
    {
    if(![[AIContactHidingController sharedController] visibilityOfListObject:obj inContainer:self])
    return NSNotFound;
    - return [participatingContacts indexOfObject:obj];
    + for (NSString *nick in participatingNicks) {
    + if ([[participatingNicksContacts objectForKey:nick] isEqual:obj]) {
    + return [participatingNicks indexOfObject:nick];
    + }
    + }
    +
    + return NSNotFound;
    }
    - (NSArray *)uniqueContainedObjects
    {
    - return self.containedObjects;
    + NSMutableArray *contacts = [NSMutableArray array];
    +
    + for (AIListContact *contact in [participatingNicksContacts allValues]) {
    + if (![contacts containsObject:contacts]) {
    + [contacts addObject:contact];
    + }
    + }
    +
    + return contacts;
    }
    -- (void)removeObject:(AIListObject *)inObject
    +- (void)removeObject:(NSString *)inObject
    {
    - if ([self containsObject:inObject]) {
    - AIListContact *contact = (AIListContact *)inObject; //if we contain it, it has to be an AIListContact
    -
    - //make sure removing it from the array doesn't deallocate it immediately, since we need it for -chat:removedListContact:
    - [inObject retain];
    -
    - [participatingContacts removeObject:inObject];
    + AIListContact *contact = [participatingNicksContacts valueForKey:inObject];
    +
    + //make sure removing it from the array doesn't deallocate it immediately, since we need it for -chat:removedListContact:
    + [contact retain];
    +
    + [participatingNicks removeObject:inObject];
    +
    + [self removeSavedValuesForNick:inObject];
    +
    + [adium.chatController chat:self removedListContact:contact];
    +
    + if (contact.isStranger &&
    + ![adium.chatController allGroupChatsContainingContact:contact.parentContact].count &&
    + ![adium.chatController existingChatWithContact:contact.parentContact]) {
    - [self removeSavedValuesForContactUID:inObject.UID];
    -
    - [adium.chatController chat:self removedListContact:contact];
    -
    - if (contact.isStranger &&
    - ![adium.chatController allGroupChatsContainingContact:contact.parentContact].count &&
    - ![adium.chatController existingChatWithContact:contact.parentContact]) {
    -
    - [[AIContactObserverManager sharedManager] delayListObjectNotifications];
    - [adium.contactController accountDidStopTrackingContact:contact];
    - [[AIContactObserverManager sharedManager] endListObjectNotificationsDelaysImmediately];
    - }
    -
    - [inObject release];
    + [[AIContactObserverManager sharedManager] delayListObjectNotifications];
    + [adium.contactController accountDidStopTrackingContact:contact];
    + [[AIContactObserverManager sharedManager] endListObjectNotificationsDelaysImmediately];
    }
    +
    + [contact release];
    }
    -- (void)removeObjectAfterAccountStopsTracking:(AIListObject *)object
    +- (void)removeObjectAfterAccountStopsTracking:(NSString *)object
    {
    - [self removeObject:object]; //does nothing if we've already removed it
    + [self removeObject:object];
    }
    - (void)removeAllParticipatingContactsSilently
    {
    /* Note that allGroupChatsContainingContact won't count this chat if it's already marked as not open */
    - for (AIListContact *listContact in self) {
    + for (AIListContact *listContact in [participatingNicksContacts allValues]) {
    if (listContact.isStranger &&
    ![adium.chatController existingChatWithContact:listContact.parentContact] &&
    ([adium.chatController allGroupChatsContainingContact:listContact.parentContact].count == 0)) {
    @@ -442,9 +444,9 @@
    }
    }
    - [participatingContacts removeAllObjects];
    - [participatingContactsFlags removeAllObjects];
    - [participatingContactsAliases removeAllObjects];
    + [participatingNicks removeAllObjects];
    + [participatingNicksFlags removeAllObjects];
    + [participatingNicksContacts removeAllObjects];
    [[NSNotificationCenter defaultCenter] postNotificationName:Chat_ParticipatingListObjectsChanged
    object:self];
    @@ -464,7 +466,7 @@
    - (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state objects:(id *)stackbuf count:(NSUInteger)len
    {
    - return [self.containedObjects countByEnumeratingWithState:state objects:stackbuf count:len];
    + return [participatingNicks countByEnumeratingWithState:state objects:stackbuf count:len];
    }
    - (BOOL) canContainObject:(id)obj
    @@ -502,4 +504,25 @@
    return YES;
    }
    +
    +#pragma mark 1.5 compat
    +
    +- (NSString *)displayNameForContact:(AIListObject *)contact
    +{
    + static dispatch_once_t onceToken;
    + dispatch_once(&onceToken, ^{
    + NSLog(@"-displayNameForContact: is deprecated in Adium 1.6 and above. Use -nicksForContact: or track participants by nickname. This message will be logged only once.");
    + AILogWithSignature(@"-displayNameForContact: is deprecated in Adium 1.6 and above. Use -nicksForContact: or track participants by nickname. This message will be logged only once.");
    + AILogBacktrace();
    + });
    +
    + for (NSString *nick in participatingNicks) {
    + if ([[participatingNicksContacts objectForKey:nick] isEqualTo:contact]) {
    + return nick;
    + }
    + }
    +
    + return nil;
    +}
    +
    @end
    --- a/Frameworks/Adium Framework/Source/AIListContactGroupChatCell.m Tue May 28 00:24:27 2013 +0200
    +++ b/Frameworks/Adium Framework/Source/AIListContactGroupChatCell.m Tue May 28 00:52:55 2013 +0200
    @@ -22,6 +22,7 @@
    @implementation AIListContactGroupChatCell
    @synthesize chat;
    +
    - (void)dealloc
    {
    [chat release];
    @@ -30,11 +31,10 @@
    - (NSString *)labelString
    {
    - AIListObject *listObject = [proxyObject listObject];
    NSString *label;
    - if (chat && [chat displayNameForContact:listObject]) {
    - label = [chat displayNameForContact:listObject];
    + if (proxyObject.nick) {
    + label = proxyObject.nick;
    } else {
    label = [super labelString];
    }
    @@ -44,23 +44,21 @@
    - (NSImage *)statusImage
    {
    - AIListObject *listObject = [proxyObject listObject];
    - return [[AIGroupChatStatusIcons sharedIcons] imageForFlag:[chat flagsForContact:listObject]];
    + return [[AIGroupChatStatusIcons sharedIcons] imageForFlag:[chat flagsForNick:proxyObject.nick]];
    }
    - (NSImage *)serviceImage
    {
    // We can't use [listObject statusIcon] because it will show unknown for strangers.
    - AIListObject *listObject = [proxyObject listObject];
    - return [AIStatusIcons statusIconForListObject:listObject
    + AIListContact *listObject = [chat contactForNick:proxyObject.nick];
    + return [AIStatusIcons statusIconForListObject:(AIListObject *)listObject
    type:AIStatusIconTab
    direction:AIIconFlipped];
    }
    - (NSColor *)textColor
    {
    - AIListObject *listObject = [proxyObject listObject];
    - return [[AIGroupChatStatusIcons sharedIcons] colorForFlag:[chat flagsForContact:listObject]];
    + return [[AIGroupChatStatusIcons sharedIcons] colorForFlag:[chat flagsForNick:proxyObject.nick]];
    }
    - (float)imageOpacityForDrawing
    --- a/Frameworks/Adium Framework/Source/AIListGroupCell.m Tue May 28 00:24:27 2013 +0200
    +++ b/Frameworks/Adium Framework/Source/AIListGroupCell.m Tue May 28 00:52:55 2013 +0200
    @@ -158,13 +158,8 @@
    */
    - (CGFloat)flippyIndent
    {
    -// if ([self textAlignment] != NSCenterTextAlignment) {
    - NSSize size = [self cellSize];
    - return size.height*0.4f + size.height*0.2f + FLIPPY_TEXT_PADDING;
    -/* } else {
    - return 0;
    - }
    -*/
    + NSSize size = [self cellSize];
    + return size.height*0.4f + size.height*0.2f + FLIPPY_TEXT_PADDING;
    }
    @@ -194,10 +189,8 @@
    [arrowPath closePath];
    [arrowPath fill];
    -// if ([self textAlignment] != NSCenterTextAlignment) {
    - rect.origin.x += rect.size.height*0.4f + rect.size.height*0.2f + FLIPPY_TEXT_PADDING;
    - rect.size.width -= rect.size.height*0.4f + rect.size.height*0.2f + FLIPPY_TEXT_PADDING;
    -// }
    + rect.origin.x += rect.size.height*0.4f + rect.size.height*0.2f + FLIPPY_TEXT_PADDING;
    + rect.size.width -= rect.size.height*0.4f + rect.size.height*0.2f + FLIPPY_TEXT_PADDING;
    if ([listObject boolValueForProperty:@"showCount"]) {
    rect = [self drawGroupCountWithFrame:rect];
    --- a/Frameworks/Adium Framework/Source/AILocalizationControl.m Tue May 28 00:24:27 2013 +0200
    +++ b/Frameworks/Adium Framework/Source/AILocalizationControl.m Tue May 28 00:52:55 2013 +0200
    @@ -120,7 +120,6 @@
    newFrame.size.width = AIround(NSWidth(newFrame));
    //Enforce a minimum width of the original frame width
    -// NSLog(@"%@: new is %@; original is %@",inStringValue,NSStringFromRect(newFrame),NSStringFromRect(originalFrame));
    if (NSWidth(newFrame) < NSWidth(originalFrame)) {
    newFrame.size.width = NSWidth(originalFrame);
    }
    --- a/Frameworks/Adium Framework/Source/AIMessageEntryTextView.h Tue May 28 00:24:27 2013 +0200
    +++ b/Frameworks/Adium Framework/Source/AIMessageEntryTextView.h Tue May 28 00:52:55 2013 +0200
    @@ -21,6 +21,7 @@
    @class AIListContact, AIAccount, AIChat;
    @protocol AIMessageEntryTextViewDelegate <NSTextViewDelegate,NSObject>
    +
    @optional
    /*!
    * @brief Should the tab key trigger an autocomplete?
    @@ -35,9 +36,9 @@
    }
    @property (readwrite, retain, nonatomic) NSAttributedString *string;
    +
    @end
    -
    @interface AIMessageEntryTextView : AISendingTextView <AITextEntryView, AIListObjectObserver> {
    AIChat *chat;
    @@ -64,18 +65,34 @@
    AISimpleTextView *characterCounter;
    NSString *characterCounterPrefix;
    - NSInteger maxCharacters;
    + NSInteger maxCharacters;
    NSColor *savedTextColor;
    +
    +@protected
    + // Emoticons
    + BOOL hasEmoticonsMenu;
    + NSButton *emoticonsMenuButton;
    }
    @property (readwrite, assign, nonatomic) id<AIMessageEntryTextViewDelegate> delegate;
    -//Configure
    +// Configure
    @property (readwrite, nonatomic) BOOL clearOnEscape;
    @property (readwrite, nonatomic) BOOL homeToStartOfLine;
    @property (readwrite, retain, nonatomic) NSView *associatedView;
    -//Adium Text Entry
    +// Context
    +@property (readwrite, retain, nonatomic) AIChat *chat;
    +@property (readonly, nonatomic) AIListContact *listObject;
    +
    +// History
    +@property (readwrite, nonatomic) BOOL historyEnabled;
    +
    +// Emoticons
    +@property (assign) BOOL hasEmoticonsMenu;
    +@property (retain) NSButton *emoticonsMenuButton;
    +
    +// Adium Text Entry
    - (void)setAttributedString:(NSAttributedString *)inAttributedString;
    - (void)setString:(NSString *)string;
    - (void)setTypingAttributes:(NSDictionary *)attrs;
    @@ -83,23 +100,21 @@
    - (void)pasteAsRichText:(id)sender;
    - (NSSize)desiredSize;
    -//Context
    -@property (readwrite, retain, nonatomic) AIChat *chat;
    -@property (readonly, nonatomic) AIListContact *listObject;
    -
    -//Paging
    +// Paging
    - (void)scrollPageUp:(id)sender;
    - (void)scrollPageDown:(id)sender;
    -//History
    -@property (readwrite, nonatomic) BOOL historyEnabled;
    +// History
    - (void)historyUp;
    - (void)historyDown;
    -//Push and Pop
    +// Push and Pop
    - (void)setPushPopEnabled:(BOOL)inBool;
    - (void)pushContent;
    - (void)popContent;
    - (void)swapContent;
    +// Emoticons
    +- (void)popUpEmoticonsMenu;
    +
    @end
    --- a/Frameworks/Adium Framework/Source/AIMessageEntryTextView.m Tue May 28 00:24:27 2013 +0200
    +++ b/Frameworks/Adium Framework/Source/AIMessageEntryTextView.m Tue May 28 00:52:55 2013 +0200
    @@ -27,6 +27,8 @@
    #import <Adium/AIInterfaceControllerProtocol.h>
    #import <Adium/AIContentContext.h>
    +#import <Adium/AIMessageViewEmoticonsController.h>
    +
    #import <AIUtilities/AIAttributedStringAdditions.h>
    #import <AIUtilities/AIColorAdditions.h>
    #import <AIUtilities/AITextAttributes.h>
    @@ -38,8 +40,9 @@
    #import <FriBidi/NSString-FBAdditions.h>
    -#define MAX_HISTORY 25 //Number of messages to remember in history
    -#define ENTRY_TEXTVIEW_PADDING 6 //Padding for auto-sizing
    +
    +#define MAX_HISTORY 25 // Number of messages to remember in history
    +#define ENTRY_TEXTVIEW_PADDING 6 // Padding for auto-sizing
    #define KEY_DISABLE_TYPING_NOTIFICATIONS @"Disable Typing Notifications"
    @@ -55,7 +58,7 @@
    #define KEY_SUBSTITUTION_QUOTE @"Smart Quote Substitutions"
    #define KEY_SUBSTITUTION_LINK @"Smart Links Substitutions"
    -#define INDICATOR_RIGHT_PADDING 2 // Padding between right side of the message view and the rightmost indicator
    +#define INDICATOR_RIGHT_PADDING 2 // Padding between right side of the message view and the rightmost indicator
    #define PREF_GROUP_CHARACTER_COUNTER @"Character Counter"
    #define KEY_CHARACTER_COUNTER_ENABLED @"Character Counter Enabled"
    @@ -67,6 +70,8 @@
    #define PASS_TO_SUPERCLASS_DRAG_TYPE_ARRAY [NSArray arrayWithObjects: \
    NSRTFPboardType, NSStringPboardType, nil]
    +#pragma mark -
    +
    /**
    * @class AISimpleTextView
    * @brief Just draws an attributed string. That's it.
    @@ -78,6 +83,7 @@
    @implementation AISimpleTextView
    @synthesize string;
    +
    - (void)dealloc
    {
    [string release];
    @@ -86,11 +92,15 @@
    - (void)drawRect:(NSRect)rect
    {
    - [string drawInRect:self.bounds];
    + [string drawInRect:[self bounds]];
    }
    +
    @end
    +#pragma mark -
    +
    @interface AIMessageEntryTextView ()
    +
    - (void)_setPushIndicatorVisible:(BOOL)visible;
    - (void)positionPushIndicator;
    - (void)_resetCacheAndPostSizeChanged;
    @@ -112,12 +122,21 @@
    - (void)frameDidChange:(NSNotification *)notification;
    - (void)toggleMessageSending:(NSNotification *)not;
    - (void)contentObjectAdded:(NSNotification *)notification;
    +
    +- (void)updateEmoticonsMenuButton;
    +
    @end
    +#pragma mark -
    +
    @interface NSMutableAttributedString (AIMessageEntryTextViewAdditions)
    +
    - (void)convertForPasteWithTraitsUsingAttributes:(NSDictionary *)inAttributes;
    +
    @end
    +#pragma mark - AIMessageEntryTextView
    +
    @implementation AIMessageEntryTextView
    - (void)_initMessageEntryTextView
    @@ -131,7 +150,7 @@
    homeToStartOfLine = YES;
    resizing = NO;
    enableTypingNotifications = NO;
    - historyArray = [[NSMutableArray alloc] initWithObjects:@"",nil];
    + historyArray = [[NSMutableArray alloc] initWithObjects:@"", nil];
    pushArray = [[NSMutableArray alloc] init];
    currentHistoryLocation = 0;
    [self setDrawsBackground:YES];
    @@ -140,10 +159,12 @@
    characterCounterPrefix = nil;
    maxCharacters = 0;
    savedTextColor = nil;
    -
    + hasEmoticonsMenu = NO;
    +
    if ([self respondsToSelector:@selector(setAllowsUndo:)]) {
    [self setAllowsUndo:YES];
    }
    +
    if ([self respondsToSelector:@selector(setAllowsDocumentBackgroundColorChange:)]) {
    [self setAllowsDocumentBackgroundColorChange:YES];
    }
    @@ -154,25 +175,28 @@
    selector:@selector(textDidChange:)
    name:NSTextDidChangeNotification
    object:self];
    +
    [[NSNotificationCenter defaultCenter] addObserver:self
    selector:@selector(frameDidChange:)
    name:NSViewFrameDidChangeNotification
    object:self];
    +
    [[NSNotificationCenter defaultCenter] addObserver:self
    - selector:@selector(toggleMessageSending:)
    - name:@"AIChatDidChangeCanSendMessagesNotification"
    - object:chat];
    - [[NSNotificationCenter defaultCenter] addObserver:self
    - selector:@selector(contentObjectAdded:)
    - name:Content_ContentObjectAdded
    - object:nil];
    + selector:@selector(toggleMessageSending:)
    + name:@"AIChatDidChangeCanSendMessagesNotification"
    + object:chat];
    +
    + [[NSNotificationCenter defaultCenter] addObserver:self
    + selector:@selector(contentObjectAdded:)
    + name:Content_ContentObjectAdded
    + object:nil];
    [adium.preferenceController registerPreferenceObserver:self forGroup:PREF_GROUP_DUAL_WINDOW_INTERFACE];
    [[AIContactObserverManager sharedManager] registerListObjectObserver:self];
    }
    -//Init the text view
    +// Init the text view
    - (id)initWithFrame:(NSRect)frameRect textContainer:(NSTextContainer *)aTextContainer
    {
    if ((self = [super initWithFrame:frameRect textContainer:aTextContainer])) {
    @@ -209,6 +233,7 @@
    [associatedView release];
    [historyArray release]; historyArray = nil;
    [pushArray release]; pushArray = nil;
    + [emoticonsMenuButton release];
    [super dealloc];
    }
    @@ -231,9 +256,8 @@
    unichar inChar = [charactersIgnoringModifiers characterAtIndex:0];
    NSUInteger flags = [inEvent modifierFlags];
    - //We have to test ctrl before option, because otherwise we'd miss ctrl-option-* events
    - if (pushPopEnabled &&
    - (flags & NSControlKeyMask) && !(flags & NSShiftKeyMask)) {
    + // We have to test ctrl before option, because otherwise we'd miss ctrl-option-* events
    + if (pushPopEnabled && (flags & NSControlKeyMask) && !(flags & NSShiftKeyMask)) {
    if (inChar == NSUpArrowFunctionKey) {
    [self popContent];
    } else if (inChar == NSDownArrowFunctionKey) {
    @@ -243,9 +267,7 @@
    } else {
    [super keyDown:inEvent];
    }
    -
    - } else if (historyEnabled &&
    - (flags & NSAlternateKeyMask) && !(flags & NSShiftKeyMask)) {
    + } else if (historyEnabled && (flags & NSAlternateKeyMask) && !(flags & NSShiftKeyMask)) {
    if (inChar == NSUpArrowFunctionKey) {
    [self historyUp];
    } else if (inChar == NSDownArrowFunctionKey) {
    @@ -253,13 +275,12 @@
    } else {
    [super keyDown:inEvent];
    }
    -
    - } else if (associatedView &&
    - (flags & NSCommandKeyMask) && !(flags & NSShiftKeyMask)) {
    + } else if (associatedView && (flags & NSCommandKeyMask) && !(flags & NSShiftKeyMask)) {
    if ((inChar == NSUpArrowFunctionKey || inChar == NSDownArrowFunctionKey) ||
    (inChar == NSHomeFunctionKey || inChar == NSEndFunctionKey) ||
    (inChar == NSPageUpFunctionKey || inChar == NSPageDownFunctionKey)) {
    - //Pass the associatedView a keyDown event equivalent equal to inEvent except without the modifier flags
    +
    + // Pass the associatedView a keyDown event equivalent equal to inEvent except without the modifier flags
    [associatedView keyDown:[NSEvent keyEventWithType:[inEvent type]
    location:[inEvent locationInWindow]
    modifierFlags:0
    @@ -273,24 +294,21 @@
    } else {
    [super keyDown:inEvent];
    }
    -
    - } else if (associatedView &&
    - (inChar == NSPageUpFunctionKey || inChar == NSPageDownFunctionKey)) {
    - [associatedView keyDown:inEvent];
    -
    + } else if (associatedView && (inChar == NSPageUpFunctionKey || inChar == NSPageDownFunctionKey)) {
    + [associatedView keyDown:inEvent];
    } else if (inChar == NSHomeFunctionKey || inChar == NSEndFunctionKey) {
    if (homeToStartOfLine) {
    NSRange newRange;
    if (flags & NSShiftKeyMask) {
    - //With shift, select to the beginning/end of the line
    + // With shift, select to the beginning/end of the line
    NSRange selectedRange = [self selectedRange];
    if (inChar == NSHomeFunctionKey) {
    - //Home: from 0 to the current location
    + // Home: from 0 to the current location
    newRange.location = 0;
    newRange.length = selectedRange.location;
    } else {
    - //End: from current location to the end
    + // End: from current location to the end
    newRange.location = selectedRange.location;
    newRange.length = [[self string] length] - newRange.location;
    }
    @@ -301,16 +319,14 @@
    }
    [self setSelectedRange:newRange];
    -
    - } else {
    - //If !homeToStartOfLine, pass the keypress to our associated view.
    + } else {
    + // If !homeToStartOfLine, pass the keypress to our associated view.
    if (associatedView) {
    [associatedView keyDown:inEvent];
    } else {
    [super keyDown:inEvent];
    }
    }
    -
    } else if (inChar == NSTabCharacter) {
    if ([self.delegate respondsToSelector:@selector(textViewShouldTabComplete:)] &&
    [self.delegate textViewShouldTabComplete:self]) {
    @@ -340,21 +356,21 @@
    [self.enclosingScrollView scrollWheel:anEvent];
    }
    -//Text changed
    +// Text changed
    - (void)textDidChange:(NSNotification *)notification
    {
    - //Update typing status
    + // Update typing status
    if (enableTypingNotifications) {
    [adium.contentController userIsTypingContentForChat:chat hasEnteredText:[[self textStorage] length] > 0];
    }
    - //Hide any existing contact list tooltip when we begin typing
    + // Hide any existing contact list tooltip when we begin typing
    [adium.interfaceController showTooltipForListObject:nil atScreenPoint:NSZeroPoint onWindow:nil];
    - //Reset cache and resize
    + // Reset cache and resize
    [self _resetCacheAndPostSizeChanged];
    - //Update the character counter
    + // Update the character counter
    if (characterCounter) {
    [self updateCharacterCounter];
    }
    @@ -400,9 +416,8 @@
    }
    }
    +#pragma mark - Configure
    -//Configure ------------------------------------------------------------------------------------------------------------
    -#pragma mark Configure
    @synthesize clearOnEscape, homeToStartOfLine, associatedView;
    - (void)preferencesChangedForGroup:(NSString *)group key:(NSString *)key
    @@ -412,7 +427,7 @@
    [group isEqualToString:GROUP_ACCOUNT_STATUS] &&
    (!key || [key isEqualToString:KEY_DISABLE_TYPING_NOTIFICATIONS])) {
    enableTypingNotifications = ![[chat.account preferenceForKey:KEY_DISABLE_TYPING_NOTIFICATIONS
    - group:GROUP_ACCOUNT_STATUS] boolValue];
    + group:GROUP_ACCOUNT_STATUS] boolValue];
    }
    if (!object && [group isEqualToString:PREF_GROUP_DUAL_WINDOW_INTERFACE]) {
    @@ -454,15 +469,15 @@
    }
    }
    -//Adium Text Entry -----------------------------------------------------------------------------------------------------
    -#pragma mark Adium Text Entry
    +#pragma mark - Adium Text Entry
    /*!
    * @brief Toggle whether message sending is enabled based on a notification. The notification object is the AIChat of the appropriate message entry view
    */
    - (void)toggleMessageSending:(NSNotification *)not
    {
    - //XXX - We really should query the AIChat about this, but AIChat's "can't send" is really designed for handling offline, not banned. Bringing up the offline messaging dialog when banned would make no sense.
    + // XXX - We really should query the AIChat about this, but AIChat's "can't send" is really designed for handling offline, not banned.
    + // Bringing up the offline messaging dialog when banned would make no sense.
    [self setSendingEnabled:[[[not userInfo] objectForKey:@"TypingEnabled"] boolValue]];
    }
    @@ -474,16 +489,16 @@
    return self.sendingEnabled;
    }
    -//Set our string, preserving the selected range
    +// Set our string, preserving the selected range
    - (void)setAttributedString:(NSAttributedString *)inAttributedString
    {
    NSUInteger length = [inAttributedString length];
    NSRange oldRange = [self selectedRange];
    - //Change our string
    + // Change our string
    [[self textStorage] setAttributedString:inAttributedString];
    - //Restore the old selected range
    + // Restore the old selected range
    if (oldRange.location < length) {
    if (oldRange.location + oldRange.length <= length) {
    [self setSelectedRange:oldRange];
    @@ -492,20 +507,20 @@
    }
    }
    - //Notify everyone that our text changed
    + // Notify everyone that our text changed
    [[NSNotificationCenter defaultCenter] postNotificationName:NSTextDidChangeNotification object:self];
    }
    -//Set our string (plain text)
    +// Set our string (plain text)
    - (void)setString:(NSString *)string
    {
    [super setString:string];
    - //Notify everyone that our text changed
    + // Notify everyone that our text changed
    [[NSNotificationCenter defaultCenter] postNotificationName:NSTextDidChangeNotification object:self];
    }
    -//Set our typing format
    +// Set our typing format
    - (void)setTypingAttributes:(NSDictionary *)attrs
    {
    [super setTypingAttributes:attrs];
    @@ -513,14 +528,14 @@
    [self setInsertionPointColor:[[attrs objectForKey:NSBackgroundColorAttributeName] contrastingColor]];
    }
    -#pragma mark Pasting
    +#pragma mark - Pasting
    - (BOOL)handlePasteAsRichText
    {
    NSPasteboard *generalPasteboard = [NSPasteboard generalPasteboard];
    BOOL handledPaste = NO;
    - //Types is ordered by the preference for handling of the data; enumerating it lets us allow the sending application's hints to be followed.
    + // Types is ordered by the preference for handling of the data; enumerating it lets us allow the sending application's hints to be followed.
    for (NSString *type in generalPasteboard.types) {
    if ([type isEqualToString:NSRTFDPboardType]) {
    NSData *data = [generalPasteboard dataForType:NSRTFDPboardType];
    @@ -528,7 +543,7 @@
    handledPaste = YES;
    } else if ([PASS_TO_SUPERCLASS_DRAG_TYPE_ARRAY containsObject:type]) {
    - //When we hit a type we should let the superclass handle, break without doing anything
    + // When we hit a type we should let the superclass handle, break without doing anything
    break;
    } else if ([FILES_AND_IMAGES_TYPES containsObject:type]) {
    @@ -543,7 +558,7 @@
    return handledPaste;
    }
    -//Paste as rich text without altering our typing attributes
    +// Paste as rich text without altering our typing attributes
    - (void)pasteAsRichText:(id)sender
    {
    NSDictionary *attributes = [[self typingAttributes] copy];
    @@ -586,7 +601,7 @@
    data = nil;
    }
    - //Failed. Try again with the string type.
    + // Failed. Try again with the string type.
    if (!data && ![type isEqualToString:NSStringPboardType]) {
    if ([[[NSPasteboard generalPasteboard] types] containsObject:NSStringPboardType]) {
    type = NSStringPboardType;
    @@ -599,7 +614,7 @@
    }
    if (!data) {
    - //We still didn't get valid data... maybe super can handle it
    + // We still didn't get valid data... maybe super can handle it
    @try {
    [self paste:sender];
    } @catch (NSException *localException) {
    @@ -629,7 +644,7 @@
    documentAttributes:NULL];
    }
    } @catch (NSException *localException) {
    - //Error while reading the RTF or HTML data, which can happen. Fall back on plain text
    + // Error while reading the RTF or HTML data, which can happen. Fall back on plain text
    if ([[[NSPasteboard generalPasteboard] types] containsObject:NSStringPboardType]) {
    data = [generalPasteboard dataForType:NSStringPboardType];
    NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    @@ -652,20 +667,20 @@
    NSRange selectedRange = [self selectedRange];
    NSTextStorage *textStorage = [self textStorage];
    - //Prepare the undo operation
    + // Prepare the undo operation
    NSUndoManager *undoManager = [self undoManager];
    [[undoManager prepareWithInvocationTarget:textStorage]
    replaceCharactersInRange:NSMakeRange(selectedRange.location, [attributedString length])
    withAttributedString:[textStorage attributedSubstringFromRange:selectedRange]];
    [undoManager setActionName:AILocalizedString(@"Paste", nil)];
    - //Perform the paste
    + // Perform the paste
    [textStorage replaceCharactersInRange:selectedRange
    withAttributedString:attributedString];
    // Align our text properly (only need to if the first character was changed)
    if (selectedRange.location == 0)
    [self setBaseWritingDirection:[[textStorage string] baseWritingDirection]];
    - //Notify that we changed our text
    + // Notify that we changed our text
    [[NSNotificationCenter defaultCenter] postNotificationName:NSTextDidChangeNotification
    object:self];
    [attributedString release];
    @@ -677,7 +692,7 @@
    }
    } else {
    - //If we didn't handle it yet, let super try to deal with it
    + // If we didn't handle it yet, let super try to deal with it
    [self paste:sender];
    }
    @@ -690,22 +705,22 @@
    [self scrollRangeToVisible:[self selectedRange]];
    }
    -#pragma mark Deletion
    +#pragma mark - Deletion
    - (void)deleteBackward:(id)sender
    {
    - //Perform the delete
    + // Perform the delete
    [super deleteBackward:sender];
    - //If we are now an empty string, and we still have a link active, clear the link
    + // If we are now an empty string, and we still have a link active, clear the link
    if ([[self textStorage] length] == 0) {
    [self clearLinkAttribute];
    }
    }
    -//Contact menu ---------------------------------------------------------------------------------------------------------
    -#pragma mark Contact menu
    -//Set and return the selected chat (to auto-configure the contact menu)
    +#pragma mark - Contact menu
    +
    +// Set and return the selected chat (to auto-configure the contact menu)
    - (void)setChat:(AIChat *)inChat
    {
    if (chat != inChat) {
    @@ -730,12 +745,12 @@
    context:NULL];
    }
    - //Observe preferences changes for typing enable/disable
    + // Observe preferences changes for typing enable/disable
    [adium.preferenceController registerPreferenceObserver:self forGroup:GROUP_ACCOUNT_STATUS];
    }
    - //Set up the character counter for this chat's list object.
    - //This is done regardless of a chat changing because destination changes need to trigger this.
    + // Set up the character counter for this chat's list object.
    + // This is done regardless of a chat changing because destination changes need to trigger this.
    if(!chat.isGroupChat) {
    [self setCharacterCounterMaximum:[chat.listObject integerValueForProperty:@"Character Counter Max"]];
    [self setCharacterCounterVisible:([chat.listObject valueForProperty:@"Character Counter Max"] != nil)];
    @@ -748,7 +763,7 @@
    return chat;
    }
    -//Return the selected list object (to auto-configure the contact menu)
    +// Return the selected list object (to auto-configure the contact menu)
    - (AIListContact *)listObject
    {
    return chat.listObject;
    @@ -759,23 +774,22 @@
    return [chat preferredListObject];
    }
    -//Auto Sizing ----------------------------------------------------------------------------------------------------------
    -#pragma mark Auto-sizing
    -//Returns our desired size
    +#pragma mark - Auto-sizing
    +
    +// Returns our desired size
    - (NSSize)desiredSize
    {
    if (_desiredSizeCached.width == 0) {
    CGFloat textHeight;
    if ([[self textStorage] length] != 0) {
    - //If there is text in this view, let the container tell us its height
    + // If there is text in this view, let the container tell us its height
    - //Force glyph generation. We must do this or usedRectForTextContainer might only return a rect for a
    - //portion of our text.
    + // Force glyph generation. We must do this or usedRectForTextContainer might only return a rect for a portion of our text.
    [[self layoutManager] glyphRangeForTextContainer:[self textContainer]];
    textHeight = [[self layoutManager] usedRectForTextContainer:[self textContainer]].size.height;
    } else {
    - //Otherwise, we use the current typing attributes to guess what the height of a line should be
    + // Otherwise, we use the current typing attributes to guess what the height of a line should be
    textHeight = [NSAttributedString stringHeightForAttributes:[self typingAttributes]];
    }
    @@ -792,10 +806,10 @@
    return _desiredSizeCached;
    }
    -//Reset the desired size cache when our frame changes
    - (void)frameDidChange:(NSNotification *)notification
    {
    - //resetCacheAndPostSizeChanged can get us right back to here, resulting in an infinite loop if we're not careful
    + // Reset the desired size cache when our frame changes
    + // resetCacheAndPostSizeChanged can get us right back to here, resulting in an infinite loop if we're not careful
    if (!resizing) {
    resizing = YES;
    [self _resetCacheAndPostSizeChanged];
    @@ -816,9 +830,9 @@
    }
    }
    -//Paging ---------------------------------------------------------------------------------------------------------------
    -#pragma mark Paging
    -//Page up or down in the message view
    +#pragma mark - Paging
    +
    +// Page up or down in the message view
    - (void)scrollPageUp:(id)sender
    {
    if (associatedView && [associatedView respondsToSelector:@selector(pageUp:)]) {
    @@ -827,6 +841,7 @@
    [super scrollPageUp:sender];
    }
    }
    +
    - (void)scrollPageDown:(id)sender
    {
    if (associatedView && [associatedView respondsToSelector:@selector(pageDown:)]) {
    @@ -836,61 +851,60 @@
    }
    }
    +#pragma mark - History
    -//History --------------------------------------------------------------------------------------------------------------
    -#pragma mark History
    @synthesize historyEnabled;
    -//Move up through the history
    +// Move up through the history
    - (void)historyUp
    {
    if (currentHistoryLocation == 0) {
    - //Store current message
    + // Store current message
    [historyArray replaceObjectAtIndex:0 withObject:[[[self textStorage] copy] autorelease]];
    }
    if (currentHistoryLocation < [historyArray count]-1) {
    - //Move up
    + // Move up
    currentHistoryLocation++;
    - //Display history
    + // Display history
    [self setAttributedString:[historyArray objectAtIndex:currentHistoryLocation]];
    }
    }
    -//Move down through history
    +// Move down through history
    - (void)historyDown
    {
    if (currentHistoryLocation > 0) {
    - //Move down
    + // Move down
    currentHistoryLocation--;
    - //Display history
    + // Display history
    [self setAttributedString:[historyArray objectAtIndex:currentHistoryLocation]];
    }
    }
    -//Update history when content is sent
    +// Update history when content is sent
    - (IBAction)sendContent:(id)sender
    {
    NSAttributedString *textStorage = [self textStorage];
    - //Add to history if there is text being sent
    + // Add to history if there is text being sent
    [historyArray insertObject:[[textStorage copy] autorelease] atIndex:1];
    if ([historyArray count] > MAX_HISTORY) {
    [historyArray removeLastObject];
    }
    - currentHistoryLocation = 0; //Move back to bottom of history
    + currentHistoryLocation = 0; // Move back to bottom of history
    - //Send the content
    + // Send the content
    [super sendContent:sender];
    - //Clear the undo/redo stack as it makes no sense to carry between sends (the history is for that)
    + // Clear the undo/redo stack as it makes no sense to carry between sends (the history is for that)
    [[self undoManager] removeAllActions];
    }
    -//Populate the history with messages from the message history
    +// Populate the history with messages from the message history
    - (void)contentObjectAdded:(NSNotification *)notification
    {
    AIContentObject *content = [notification.userInfo objectForKey:@"AIContentObject"];
    @@ -904,15 +918,15 @@
    }
    }
    -//Push and Pop ---------------------------------------------------------------------------------------------------------
    -#pragma mark Push and Pop
    -//Enable/Disable push-pop
    +#pragma mark - Push and Pop
    +
    +// Enable/Disable push-pop
    - (void)setPushPopEnabled:(BOOL)inBool
    {
    pushPopEnabled = inBool;
    }
    -//Push out of the message entry field
    +// Push out of the message entry field
    - (void)pushContent
    {
    if ([[self textStorage] length] != 0 && pushPopEnabled) {
    @@ -922,20 +936,21 @@
    }
    }
    -//Pop into the message entry field
    +// Pop into the message entry field
    - (void)popContent
    {
    if ([pushArray count] && pushPopEnabled) {
    [self setAttributedString:[pushArray lastObject]];
    - [self setSelectedRange:NSMakeRange([[self textStorage] length], 0)]; //selection to end
    + [self setSelectedRange:NSMakeRange([[self textStorage] length], 0)]; // selection to end
    [pushArray removeLastObject];
    +
    if ([pushArray count] == 0) {
    [self _setPushIndicatorVisible:NO];
    }
    }
    }
    -//Swap current content
    +// Swap current content
    - (void)swapContent
    {
    if (pushPopEnabled) {
    @@ -954,25 +969,25 @@
    }
    }
    -//Push indicator
    +// Push indicator
    - (void)_setPushIndicatorVisible:(BOOL)visible
    {
    - static NSImage *pushIndicatorImage = nil;
    + static NSImage *pushIndicatorImage = nil;
    - //
    - if (!pushIndicatorImage) pushIndicatorImage = [[NSImage imageNamed:@"stackImage" forClass:[self class]] retain];
    + if (!pushIndicatorImage) {
    + pushIndicatorImage = [[NSImage imageNamed:@"stackImage" forClass:[self class]] retain];
    + }
    if (visible && !pushIndicatorVisible) {
    pushIndicatorVisible = visible;
    - //Push text over to make room for indicator
    + // Push text over to make room for indicator
    NSSize size = [self frame].size;
    size.width -= ([pushIndicatorImage size].width);
    [self setFrameSize:size];
    // Make the indicator and set its action. It is a button with no border.
    - pushIndicator = [[NSButton alloc] initWithFrame:
    - NSMakeRect(0, 0, [pushIndicatorImage size].width, [pushIndicatorImage size].height)];
    + pushIndicator = [[NSButton alloc] initWithFrame:NSMakeRect(0, 0, [pushIndicatorImage size].width, [pushIndicatorImage size].height)];
    [pushIndicator setButtonType:NSMomentaryPushButton];
    [pushIndicator setAutoresizingMask:(NSViewMinXMargin)];
    [pushIndicator setImage:pushIndicatorImage];
    @@ -986,30 +1001,40 @@
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(positionIndicators:) name:NSViewBoundsDidChangeNotification object:[self superview]];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(positionIndicators:) name:NSViewFrameDidChangeNotification object:[self superview]];
    - [self positionPushIndicator]; //Set the indicators initial position
    + [self positionPushIndicator]; // Set the indicators initial position
    + // Reposition the emoticons menu button
    + if ([self hasEmoticonsMenu]) {
    + [self updateEmoticonsMenuButton];
    + }
    } else if (!visible && pushIndicatorVisible) {
    pushIndicatorVisible = visible;
    - //Push text back
    + // Push text back
    NSSize size = [self frame].size;
    size.width += [pushIndicatorImage size].width;
    [self setFrameSize:size];
    - //Unsubcribe, if necessary.
    - if (!characterCounter) {
    + // Unsubcribe, if necessary.
    + if (!characterCounter && ![self hasEmoticonsMenu]) {
    [[NSNotificationCenter defaultCenter] removeObserver:self name:NSViewBoundsDidChangeNotification object:[self superview]];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:NSViewFrameDidChangeNotification object:[self superview]];
    }
    - //Remove indicator
    +
    + // Remove indicator
    [pushIndicator removeFromSuperview];
    [pushIndicator release]; pushIndicator = nil;
    [self positionPushIndicator];
    +
    + // Reposition the emoticons menu button
    + if ([self hasEmoticonsMenu]) {
    + [self updateEmoticonsMenuButton];
    + }
    }
    }
    -//Reposition the push indicator into lower right corner
    +// Reposition the push indicator into lower right corner
    - (void)positionPushIndicator
    {
    NSRect visRect = [[self superview] bounds];
    @@ -1020,23 +1045,32 @@
    [[self enclosingScrollView] setNeedsDisplay:YES];
    }
    -#pragma mark Indicators Positioning
    +#pragma mark - Indicators Positioning
    /**
    * @brief Dispatch for both indicators to observe bounds & frame changes of their superview
    *
    * Stupid that this is necessary, but you can only remove an entire object from a notification center's observer list,
    * not on a per-method basis.
    + * Updates emoticons menu button also.
    */
    - (void)positionIndicators:(NSNotification *)notification
    {
    - if (pushIndicatorVisible)
    + if (pushIndicatorVisible) {
    [self positionPushIndicator];
    - if (characterCounter)
    + }
    +
    + if (characterCounter) {
    [self positionCharacterCounter];
    + }
    +
    + // Update emoticons menu button
    + if ([self hasEmoticonsMenu]) {
    + [self updateEmoticonsMenuButton];
    + }
    }
    -#pragma mark Character Counter
    +#pragma mark - Character Counter
    /**
    * @brief Makes the character counter for this view visible.
    @@ -1061,8 +1095,8 @@
    size.width += NSWidth([characterCounter frame]);
    [self setFrameSize:size];
    - //Unsubscribe, if necessary.
    - if (!pushIndicatorVisible) {
    + // Unsubscribe, if necessary.
    + if (!pushIndicatorVisible && ![self hasEmoticonsMenu]) {
    [[NSNotificationCenter defaultCenter] removeObserver:self name:NSViewBoundsDidChangeNotification object:[self superview]];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:NSViewFrameDidChangeNotification object:[self superview]];
    }
    @@ -1071,8 +1105,14 @@
    characterCounter = nil;
    // Reposition the push indicator, if necessary.
    - if (pushIndicatorVisible)
    + if (pushIndicatorVisible) {
    [self positionPushIndicator];
    + }
    +
    + // Reposition the emoticons menu button
    + if ([self hasEmoticonsMenu]) {
    + [self updateEmoticonsMenuButton];
    + }
    [[self enclosingScrollView] setNeedsDisplay:YES];
    }
    @@ -1096,8 +1136,9 @@
    {
    maxCharacters = inMaxCharacters;
    - if (characterCounter)
    + if (characterCounter) {
    [self updateCharacterCounter];
    + }
    }
    /**
    @@ -1144,21 +1185,29 @@
    [characterCounter setFrameSize:label.size];
    [label release];
    - //Reposition the character counter.
    + // Reposition the character counter.
    [self positionCharacterCounter];
    - //Shift the text entry view over as necessary.
    + // Shift the text entry view over as necessary.
    CGFloat indent = 0;
    - if (pushIndicatorVisible || characterCounter) {
    +
    + if (pushIndicatorVisible || characterCounter || [self hasEmoticonsMenu]) {
    CGFloat pushIndicatorX = pushIndicator ? NSMinX([pushIndicator frame]) : NSMaxX([self bounds]);
    CGFloat characterCounterX = characterCounter ? NSMinX([characterCounter frame]) : NSMaxX([self bounds]);
    - indent = NSWidth(visRect) - AIfmin(pushIndicatorX, characterCounterX);
    + CGFloat emoticonsMenuButtonX = [self emoticonsMenuButton] ? NSMinX([[self emoticonsMenuButton] frame]) : NSMaxX([self bounds]);
    + indent = NSWidth(visRect) - AIfmin(pushIndicatorX, AIfmin(characterCounterX, emoticonsMenuButtonX));
    }
    +
    [self setFrameSize:NSMakeSize(NSWidth(visRect) - indent, NSHeight([self frame]))];
    - //Reposition the push indicator if necessary.
    + // Reposition the push indicator if necessary.
    if (pushIndicatorVisible)
    [self positionPushIndicator];
    +
    + // Reposition the emoticons menu button
    + if ([self hasEmoticonsMenu]) {
    + [self updateEmoticonsMenuButton];
    + }
    [[self enclosingScrollView] setNeedsDisplay:YES];
    }
    @@ -1171,14 +1220,14 @@
    NSRect visRect = [[self superview] bounds];
    NSSize counterSize = characterCounter.string.size;
    - //NSMaxY([self frame]) is necessary because visRect's height changes after you start typing. No idea why.
    + // NSMaxY([self frame]) is necessary because visRect's height changes after you start typing. No idea why.
    [characterCounter setFrameOrigin:NSMakePoint(NSMaxX(visRect) - counterSize.width - INDICATOR_RIGHT_PADDING,
    NSMidY([self frame]) - (counterSize.height)/2)];
    [characterCounter setFrameSize:counterSize];
    [[self enclosingScrollView] setNeedsDisplay:YES];
    }
    -#pragma mark List Object Observer / Chat KVO
    +#pragma mark - List Object Observer / Chat KVO
    - (NSSet *)updateListObject:(AIListObject *)inObject keys:(NSSet *)inModifiedKeys silent:(BOOL)silent
    {
    @@ -1205,7 +1254,7 @@
    }
    }
    -#pragma mark Contextual Menus
    +#pragma mark - Contextual Menus
    - (NSMenu *)menuForEvent:(NSEvent *)theEvent
    {
    @@ -1218,7 +1267,8 @@
    contextualMenu = [[contextualMenu copy] autorelease];
    NSMenuItem *editLinkItem = nil;
    - for (NSMenuItem *menuItem in contextualMenu.itemArray) {
    +
    + for (NSMenuItem *menuItem in contextualMenu.itemArray) {
    if ([[menuItem title] rangeOfString:AILocalizedString(@"Edit Link", nil)].location != NSNotFound) {
    editLinkItem = menuItem;
    break;
    @@ -1226,7 +1276,7 @@
    }
    if (editLinkItem) {
    - //There was an Edit Link item. Remove it, and add out own link editing items in its place.
    + // There was an Edit Link item. Remove it, and add out own link editing items in its place.
    NSInteger editIndex = [contextualMenu indexOfItem:editLinkItem];
    [contextualMenu removeItem:editLinkItem];
    @@ -1243,7 +1293,7 @@
    contextualMenu = [[[NSMenu alloc] init] autorelease];
    }
    - //Retrieve the items which should be added to the bottom of the default menu
    + // Retrieve the items which should be added to the bottom of the default menu
    NSArray *locationArray = (addedOurLinkItems ?
    [NSArray arrayWithObject:[NSNumber numberWithInt:Context_TextView_Edit]] :
    [NSArray arrayWithObjects:[NSNumber numberWithInt:Context_TextView_LinkEditing],
    @@ -1254,10 +1304,12 @@
    if ([itemsArray count] > 0) {
    [contextualMenu addItem:[NSMenuItem separatorItem]];
    NSInteger i = [(NSMenu *)contextualMenu numberOfItems];
    +
    for (NSMenuItem *menuItem in itemsArray) {
    - //We're going to be copying; call menu needs update now since it won't be called later.
    + // We're going to be copying; call menu needs update now since it won't be called later.
    NSMenu *submenu = [menuItem submenu];
    NSMenuItem *menuItemCopy = [[menuItem copy] autorelease];
    +
    if (submenu && [submenu respondsToSelector:@selector(delegate)]) {
    [[menuItemCopy submenu] setDelegate:[submenu delegate]];
    }
    @@ -1269,7 +1321,7 @@
    return contextualMenu;
    }
    -#pragma mark Drag and drop
    +#pragma mark - Drag and drop
    /*An NSTextView which has setImportsGraphics:YES as of 10.5 gets the following drag types by default:
    "NeXT RTFD pasteboard type",
    @@ -1321,7 +1373,7 @@
    return [super draggingUpdated:sender];
    }
    -//We don't need to prepare for the types we are handling in performDragOperation: below
    +// We don't need to prepare for the types we are handling in performDragOperation: below
    - (BOOL)prepareForDragOperation:(id <NSDraggingInfo>)sender
    {
    NSPasteboard *pasteboard = [sender draggingPasteboard];
    @@ -1339,7 +1391,7 @@
    return (allowDragOperation);
    }
    -//No conclusion is needed for the types we are handling in performDragOperation: below
    +// No conclusion is needed for the types we are handling in performDragOperation: below
    - (void)concludeDragOperation:(id <NSDraggingInfo>)sender
    {
    NSPasteboard *pasteboard = [sender draggingPasteboard];
    @@ -1357,8 +1409,9 @@
    {
    NSString *availableType;
    if ((availableType = [pasteboard availableTypeFromArray:[NSArray arrayWithObjects:NSFilenamesPboardType, AIiTunesTrackPboardType, nil]])) {
    - //The pasteboard points to one or more files on disc. Use them directly.
    - NSArray *files = nil;
    + // The pasteboard points to one or more files on disc. Use them directly.
    + NSArray *files = nil;
    +
    if ([availableType isEqualToString:NSFilenamesPboardType]) {
    files = [pasteboard propertyListForType:NSFilenamesPboardType];
    @@ -1366,20 +1419,20 @@
    files = [pasteboard filesFromITunesDragPasteboard];
    }
    - NSString *path;
    + NSString *path;
    +
    for (path in files) {
    [self addAttachmentOfPath:path];
    }
    -
    } else {
    - //The pasteboard contains image data with no corresponding file.
    + // The pasteboard contains image data with no corresponding file.
    NSImage *image = [[NSImage alloc] initWithPasteboard:pasteboard];
    [self addAttachmentOfImage:image];
    [image release];
    }
    }
    -//The textView's method of inserting into the view is insufficient; we can do better.
    +// The textView's method of inserting into the view is insufficient; we can do better.
    - (BOOL)performDragOperation:(id <NSDraggingInfo>)sender
    {
    NSPasteboard *pasteboard = [sender draggingPasteboard];
    @@ -1400,7 +1453,7 @@
    return success;
    }
    -#pragma mark Spell Checking
    +#pragma mark - Spell Checking
    /*!
    * @brief Spell checking was toggled
    @@ -1412,8 +1465,8 @@
    [super toggleContinuousSpellChecking:sender];
    [adium.preferenceController setPreference:[NSNumber numberWithBool:[self isContinuousSpellCheckingEnabled]]
    - forKey:KEY_SPELL_CHECKING
    - group:PREF_GROUP_DUAL_WINDOW_INTERFACE];
    + forKey:KEY_SPELL_CHECKING
    + group:PREF_GROUP_DUAL_WINDOW_INTERFACE];
    }
    /*!
    @@ -1426,11 +1479,12 @@
    [super toggleGrammarChecking:sender];
    [adium.preferenceController setPreference:[NSNumber numberWithBool:[self isGrammarCheckingEnabled]]
    - forKey:KEY_GRAMMAR_CHECKING
    - group:PREF_GROUP_DUAL_WINDOW_INTERFACE];
    + forKey:KEY_GRAMMAR_CHECKING
    + group:PREF_GROUP_DUAL_WINDOW_INTERFACE];
    }
    -#pragma mark Substitutions
    +#pragma mark - Substitutions
    +
    /*!
    * @brief Dash substitution was toggled
    */
    @@ -1515,7 +1569,8 @@
    group:PREF_GROUP_DUAL_WINDOW_INTERFACE];
    }
    -#pragma mark Autocompleting
    +#pragma mark - Autocompleting
    +
    - (NSRange)rangeForUserCompletion
    {
    NSRange completionRange = [super rangeForUserCompletion];
    @@ -1527,7 +1582,8 @@
    return completionRange;
    }
    -#pragma mark Writing Direction
    +#pragma mark - Writing Direction
    +
    - (void)toggleBaseWritingDirection:(id)sender
    {
    if ([self baseWritingDirection] == NSWritingDirectionRightToLeft) {
    @@ -1536,12 +1592,13 @@
    [self setBaseWritingDirection:NSWritingDirectionRightToLeft];
    }
    - //Apply it immediately
    + // Apply it immediately
    [self setBaseWritingDirection:[self baseWritingDirection]
    range:NSMakeRange(0, [[self textStorage] length])];
    }
    -#pragma mark Attachments
    +#pragma mark - Attachments
    +
    /*!
    * @brief Add an attachment of the file at inPath at the current insertion point
    *
    @@ -1549,15 +1606,39 @@
    */
    - (void)addAttachmentOfPath:(NSString *)inPath
    {
    - AITextAttachmentExtension *attachment = [[AITextAttachmentExtension alloc] init];
    - [attachment setPath:inPath];
    - [attachment setString:[inPath lastPathComponent]];
    - [attachment setShouldSaveImageForLogging:YES];
    -
    - //Insert an attributed string into the text at the current insertion point
    - [self insertText:[self attributedStringWithTextAttachmentExtension:attachment]];
    -
    - [attachment release];
    + if ([[inPath pathExtension] caseInsensitiveCompare:@"textClipping"] == NSOrderedSame) {
    + inPath = [inPath stringByAppendingString:@"/..namedfork/rsrc"];
    +
    + NSData *data = [NSData dataWithContentsOfFile:inPath];
    +
    + if (data) {
    + data = [data subdataWithRange:NSMakeRange(260, [data length] - 260)];
    +
    + NSAttributedString *clipping = [[[NSAttributedString alloc] initWithRTF:data documentAttributes:nil] autorelease];
    +
    + if (clipping) {
    + NSDictionary *attributes = [[self typingAttributes] copy];
    +
    + [self insertText:clipping];
    +
    + if (attributes) {
    + [self setTypingAttributes:attributes];
    + }
    +
    + [attributes release];
    + }
    + }
    + } else {
    + AITextAttachmentExtension *attachment = [[AITextAttachmentExtension alloc] init];
    + [attachment setPath:inPath];
    + [attachment setString:[inPath lastPathComponent]];
    + [attachment setShouldSaveImageForLogging:YES];
    +
    + // Insert an attributed string into the text at the current insertion point
    + [self insertText:[self attributedStringWithTextAttachmentExtension:attachment]];
    +
    + [attachment release];
    + }
    }
    /*!
    @@ -1570,7 +1651,7 @@
    [attachment setImage:inImage];
    [attachment setShouldSaveImageForLogging:YES];
    - //Insert an attributed string into the text at the current insertion point
    + // Insert an attributed string into the text at the current insertion point
    [self insertText:[self attributedStringWithTextAttachmentExtension:attachment]];
    [attachment release];
    @@ -1603,45 +1684,45 @@
    NSString *attachmentCharacterString = [NSString stringWithFormat:@"%C",(unsigned short)NSAttachmentCharacter];
    - //Find each attachment
    + // Find each attachment
    attachmentRange = [[attributedString string] rangeOfString:attachmentCharacterString
    options:0
    range:NSMakeRange(currentLocation,
    [attributedString length])];
    while (attachmentRange.length != 0) {
    - //Found an attachment in at attachmentRange.location
    + // Found an attachment in at attachmentRange.location
    NSTextAttachment *attachment = [attributedString attribute:NSAttachmentAttributeName
    atIndex:attachmentRange.location
    effectiveRange:nil];
    - //If it's not already an AITextAttachmentExtension, make it into one
    + // If it's not already an AITextAttachmentExtension, make it into one
    if (![attachment isKindOfClass:[AITextAttachmentExtension class]]) {
    NSAttributedString *replacement;
    NSFileWrapper *fileWrapper = [attachment fileWrapper];
    NSString *destinationPath;
    NSString *preferredName = [fileWrapper preferredFilename];
    - //Get a unique folder within our temporary directory
    + // Get a unique folder within our temporary directory
    destinationPath = [NSTemporaryDirectory() stringByAppendingPathComponent:[[NSProcessInfo processInfo] globallyUniqueString]];
    [[NSFileManager defaultManager] createDirectoryAtPath:destinationPath withIntermediateDirectories:YES attributes:nil error:NULL];
    destinationPath = [destinationPath stringByAppendingPathComponent:preferredName];
    - //Write the file out to it
    + // Write the file out to it
    [fileWrapper writeToFile:destinationPath
    atomically:NO
    updateFilenames:NO];
    - //Now create an AITextAttachmentExtension pointing to it
    + // Now create an AITextAttachmentExtension pointing to it
    AITextAttachmentExtension *textAttachment = [[AITextAttachmentExtension alloc] init];
    [textAttachment setPath:destinationPath];
    [textAttachment setString:preferredName];
    [textAttachment setShouldSaveImageForLogging:YES];
    - //Insert an attributed string into the text at the current insertion point
    + // Insert an attributed string into the text at the current insertion point
    replacement = [self attributedStringWithTextAttachmentExtension:textAttachment];
    [textAttachment release];
    - //Remove the NSTextAttachment, replacing it the AITextAttachmentExtension
    + // Remove the NSTextAttachment, replacing it the AITextAttachmentExtension
    [attributedString replaceCharactersInRange:attachmentRange
    withAttributedString:replacement];
    @@ -1651,7 +1732,7 @@
    currentLocation = attachmentRange.location + attachmentRange.length;
    - //Find the next attachment
    + // Find the next attachment
    attachmentRange = [[attributedString string] rangeOfString:attachmentCharacterString
    options:0
    range:NSMakeRange(currentLocation,
    @@ -1692,14 +1773,130 @@
    [self setBaseWritingDirection:[[[self textStorage] string] baseWritingDirection]];
    }
    +#pragma mark - Emoticons Menu
    +
    +@synthesize emoticonsMenuButton;
    +
    +/**
    + * @brief Show/Hide emoticons menu
    + */
    +- (void)setHasEmoticonsMenu:(BOOL)hasMenu
    +{
    + if (hasMenu && emoticonsMenuButton == nil) {
    + NSImage *emoticonsMenuIcon = [NSImage imageNamed:@"emoticons_menu"];
    +
    + emoticonsMenuButton = [[NSButton alloc] initWithFrame:NSZeroRect];
    +
    + [emoticonsMenuButton setFrameSize:[emoticonsMenuIcon size]];
    + [emoticonsMenuButton setAutoresizingMask:NSViewMinXMargin];
    + [emoticonsMenuButton setButtonType:NSMomentaryChangeButton];
    + [emoticonsMenuButton setBordered:NO];
    + [emoticonsMenuButton setAction:@selector(popUpEmoticonsMenu)];
    + [[emoticonsMenuButton cell] setImageScaling:NSImageScaleNone];
    +
    + [emoticonsMenuButton setImage:emoticonsMenuIcon];
    +
    + NSImage *alternateMenuIcon = [emoticonsMenuIcon copy];
    +
    + // Adjust image for On/Alternate state
    + [alternateMenuIcon lockFocus];
    + [alternateMenuIcon drawAtPoint:NSZeroPoint fromRect:NSZeroRect operation:NSCompositePlusDarker fraction:0.5f];
    + [alternateMenuIcon unlockFocus];