📄 mainwindowcontroller.mm
字号:
/* * LumaQQ - Cross platform QQ client, special edition for Mac * * Copyright (C) 2007 luma <stubma@163.com> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */#import "MainWindowController.h"#import "LoginWindowController.h"#import "QQNotification.h"#import "AlertTool.h"#import "ImageTool.h"#import "PreferenceCache.h"#import "User.h"#import "RecentOutlineModel.h"#import "UserOutlineModel.h"#import "ClusterOutlineModel.h"#import "MobileOutlineModel.h"#import "FontTool.h"#import "FriendStatus.h"#import "QQCell.h"#import "OutlineModel.h"#import "ClusterCommandPacket.h"#import "ClusterSubOpPacket.h"#import "NSString-Validate.h"#import "UserInfoWindowController.h"#import "WindowRegistry.h"#import "ModifyInfoPacket.h"#import "KeepAliveReplyPacket.h"#import "SearchWindowController.h"#import "ModelEffectTask.h"#import "FriendDataOpPacket.h"#import "LocalizedStringTool.h"#import "NormalIMWindowController.h"#import "HotKeyManager.h"#import "SystemNotificationPacket.h"#import "ClusterAuthWindowController.h"#import "UserAuthWindowController.h"#import "LumaQQApplication.h"#import "SoundHelper.h"#import "TimerTaskManager.h"#import "GroupDataOpPacket.h"#import "SendIMPacket.h"#import "ClusterSendIMExPacket.h"#import "FileTool.h"#import "ClusterBatchGetCardPacket.h"#import "ParentLocatableOutlineDataSource.h"#import "FriendStatusChangedNotification.h"#import "FriendStatusChangedPacket.h"#import "MessageWingTask.h"#import "SystemMessageBlinkTask.h"#import "AnimationHelper.h"#import "ScreenscrapHelper.h"#import "CreateSubjectWindowController.h"#import "CreateDialogWindowController.h"#import "SmoothTooltipTrackerDelegate.h"#import <Growl/GrowlApplicationBridge.h>#import "LQGrowlNotifyHelper.h"#import "GetRemarkJob.h"#import "GetSignatureJob.h"// main tab view item label#define _kTabViewItemMain @"Main"#define _kTabViewItemLogin @"Login"// toolbar identifier#define _kToolItemHead @"ToolbarItemMyHead"#define _kToolItemQBar @"ToolbarItemQBar"// user outline menu item tags#define _kMenuItemDeleteGroup 995#define _kMenuItemRenameGroup 996#define _kMenuItemNewGroup 997#define _kMenuItemModifyRemarkName 998#define _kMenuItemChatWithUser 999#define _kMenuItemUserInfo 1000#define _kMenuItemAddFriend 1001#define _kMenuItemQuicklyAddFriend 1002#define _kMenuItemdDeleteFriend 1003#define _kMenuItemMoveToBlacklist 1004#define _kMenuItemSendSMSToQQ 1005#define _kMenuItemTempSessionToFriend 1006// cluster outline item tags#define _kMenuItemChatInCluster 1999#define _kMenuItemViewInfo 2000#define _kMenuItemAddAsFriend 2001#define _kMenuItemTempSession 2002#define _kMenuItemAddCluster 2003#define _kMenuItemExitCluster 2004#define _kMenuItemCreateCluster 2005 // removed already, but keep this constant#define _kMenuItemUpdateOrganization 2006#define _kMenuItemEditOrganization 2007#define _kMenuItemCreateSubject 2008#define _kMenuItemCreateDialog 2009#define _kMenuItemMessageSetting 2010#define _kMenuItemApplyForAllClusters 3000#define _kMenuItemMessageSettingAccept 3001#define _kMenuItemMessageSettingAutoEject 3002#define _kMenuItemMessageSettingAcceptNoPrompt 3003#define _kMenuItemMessageSettingDisplayCount 3004#define _kMenuItemMessageSettingBlock 3005// recent table item tags#define _kMenuItemRemoveFromRecentContact 4000#define _kMenuItemClearAllRecentContacts 4001// mobile table item tags#define _kMenuItemNewMobile 5000#define _kMenuItemModifyMobileInfo 5001#define _kMenuItemDeleteMobile 5002#define _kMenuItemSendSMS 5003// action menu item tags#define _kMenuItemRefreshSignature 6000#define _kMenuItemRefreshRemark 6001#define _kMenuItemRefreshFriendList 6002// sheet type#define _kSheetLoginFailed 0#define _kSheetNetworkError 1#define _kSheetMoveToBlacklist 2#define _kSheetInputQQ 3#define _kSheetInputRemarkName 4#define _kSheetUploadFriendGroupConfirmYes 5#define _kSheetUploadFriendGroupConfirmNo 6#define _kSheetUploadFriendGroup 7#define _kSheetInputNewGroup 8#define _kSheetInputRenameGroup 9#define _kSheetInputDeleteGroup 10#define _kSheetDeleteGroup 11#define _kSheetNewMobile 12#define _kSheetModifyMobile 13#define _kSheetKickedOut 14#define _kSheetInputQQForTempSession 15#define _kSheetInputStatusMessage 16// animation type#define _kAnimationAutoHide 0#define _kAnimationRestoreFromAutoHide 1#define _kAnimationSideWindowMove 2// modify font type#define _kFontNick 0#define _kFontSignature 1// modify color type#define _kColorOutlineBackground 0#define _kColorNickFont 1#define _kColorSignatureFont 2@implementation MainWindowController#pragma mark -#pragma mark override super- (id)initWithQQ:(int)iQQ password:(NSData*)password passwordMd5:(NSData*)passwordMd5 loginStatus:(char)loginStatus connection:(Connection*)connection { self = [super initWithWindowNibName:@"MainWindow"]; if(self != nil) { m_changingStatus = YES; m_myInfoGot = NO; m_enableHotKey = NO; m_searchFlag = kFlagSearchByName | kFlagSearchByNick | kFlagSearchByQQ | kFlagSearchBySignature; m_windowRegistry = [[WindowRegistry alloc] init]; m_messageQueue = [[MessageQueue alloc] init]; m_postponedEventCache = [[NSMutableArray array] retain]; m_requestBlockingCache = [[NSMutableArray array] retain]; m_addFriendGroupMapping = [[NSMutableDictionary dictionary] retain]; m_removeFriendGroupMapping = [[NSMutableDictionary dictionary] retain]; m_sheetType = -1; m_ignoreHideOnClose = NO; m_autoHided = NO; m_filtering = NO; m_UIInitialized = NO; m_refreshingFriendList = NO; // save password key [password retain]; [m_password release]; m_password = password; // save password md5 [passwordMd5 retain]; [m_passwordMd5 release]; m_passwordMd5 = passwordMd5; // save login status m_loginStatus = loginStatus; // save init connection [connection retain]; [m_connection release]; m_connection = connection; // initialize group manager m_groupManager = [[GroupManager alloc] initWithQQ:iQQ domain:self]; m_faceManager = [[FaceManager alloc] initWithQQ:iQQ]; [m_faceManager load]; // init history manager m_historyManager = [[HistoryManager alloc] initWithQQ:iQQ]; // get my object m_me = [[m_groupManager user:iQQ] retain]; // initialize qbar plugin m_pluginManager = [[PluginManager alloc] initWithDomain:self]; [m_pluginManager loadPlugins]; // initialize tooltip control m_tooltipController = [[OutlineTooltipController alloc] initWithMainWindow:self]; [NSBundle loadNibNamed:@"OutlineTooltip" owner:m_tooltipController]; // initialze job controller m_jobController = [[JobController alloc] initWithMain:self]; } return self;}- (void) dealloc { [super dealloc];}- (void)windowDidLoad { // initialize search field [m_searchField setTarget:self]; [m_searchField setAction:@selector(onFilter:)]; // initial outline tab [m_outlineSwitcher setStyleNamed:@"Unified"]; [m_outlineSwitcher setCanCloseOnlyTab:NO]; [m_outlineSwitcher setShowCloseTabButton:NO]; [m_outlineSwitcher setUpHead:YES]; [m_outlineSwitcher setSizeCellsToFit:YES]; [m_outlineSwitcher setShowLabel:NO]; // set drawer delegate [m_displaySettingDrawer setDelegate:self]; // set qbar view delegate [m_qbarView setDelegate:self]; // initialize preference PreferenceCache* cache = [PreferenceCache cache:[m_me QQ]]; [cache reload]; // initialize button [m_btnSearchWizard setToolTip:L(@"LQTooltipSearch", @"MainWindow")]; [m_btnDisplaySetting setToolTip:L(@"LQTooltipDisplaySetting", @"MainWindow")]; // initialize outline view data source m_userDataSource = [[UserOutlineDataSource alloc] initWithMainWindow:self]; m_clusterDataSource = [[ClusterOutlineDataSource alloc] initWithMainWindowController:self]; [m_userDataSource setShowOnlineOnly:[cache showOnlineOnly]]; [m_userDataSource setShowLargeHead:[cache showLargeUserHead]]; m_recentDataSource = [[RecentTableDataSource alloc] initWithGroupManager:m_groupManager]; m_mobileDataSource = [[MobileTableDataSource alloc] initWithGroupManager:m_groupManager]; // // initialize outline // [[m_userOutline tableColumnWithIdentifier:@"0"] setDataCell:[[[QQCell alloc] initWithQQ:[m_me QQ]] autorelease]]; [m_userOutline setColumnAutoresizingStyle:NSTableViewUniformColumnAutoresizingStyle]; [m_userOutline setAutoresizesOutlineColumn:YES]; [m_userOutline setGridStyleMask:([cache showHorizontalLine] ? NSTableViewSolidHorizontalGridLineMask : NSTableViewGridNone)]; [m_userOutline setUsesAlternatingRowBackgroundColors:[cache alternatingRowBackground]]; [m_userOutline setBackgroundColor:[cache background]]; [m_userOutline setIntercellSpacing:NSMakeSize(0, 0)]; [m_userOutline setTarget:self]; [m_userOutline setDoubleAction:@selector(onDoubleClick:)]; [m_userOutline setDraggingSourceOperationMask:NSDragOperationEvery forLocal:NO]; [m_userOutline registerForDraggedTypes:[NSArray arrayWithObject:NSStringPboardType]]; [m_userOutline setTooltipDelegate:self]; QQCell* cell = [[[QQCell alloc] initWithQQ:[m_me QQ]] autorelease]; [cell setMemberStyle:YES]; [[m_clusterOutline tableColumnWithIdentifier:@"0"] setDataCell:cell]; [m_clusterOutline setAutoresizesOutlineColumn:YES]; [m_clusterOutline setGridStyleMask:([cache showHorizontalLine] ? NSTableViewSolidHorizontalGridLineMask : NSTableViewGridNone)]; [m_clusterOutline setUsesAlternatingRowBackgroundColors:[cache alternatingRowBackground]]; [m_clusterOutline setBackgroundColor:[cache background]]; [m_clusterOutline setTarget:self]; [m_clusterOutline setDoubleAction:@selector(onDoubleClick:)]; [m_clusterOutline setTooltipDelegate:self]; cell = [[[QQCell alloc] initWithQQ:[m_me QQ]] autorelease]; [cell setLargeClusterHeadStyle:YES]; [cell setIgnoreLargeUserHeadPreference:YES]; [[m_recentTable tableColumnWithIdentifier:@"0"] setDataCell:cell]; [m_recentTable setColumnAutoresizingStyle:NSTableViewUniformColumnAutoresizingStyle]; [m_recentTable setDataSource:m_recentDataSource]; [m_recentTable setBackgroundColor:[cache background]]; [m_recentTable setUsesAlternatingRowBackgroundColors:[cache alternatingRowBackground]]; [m_recentTable setIntercellSpacing:NSMakeSize(0, 0)]; [m_recentTable setTarget:self]; [m_recentTable setDoubleAction:@selector(onDoubleClick:)]; [m_recentTable setTooltipDelegate:self]; cell = [[[QQCell alloc] initWithQQ:[m_me QQ]] autorelease]; [[m_mobileTable tableColumnWithIdentifier:@"0"] setDataCell:cell]; [m_mobileTable setColumnAutoresizingStyle:NSTableViewUniformColumnAutoresizingStyle]; [m_mobileTable setDataSource:m_mobileDataSource]; [m_mobileTable setBackgroundColor:[cache background]]; [m_mobileTable setUsesAlternatingRowBackgroundColors:[cache alternatingRowBackground]]; [m_mobileTable setIntercellSpacing:NSMakeSize(0, 0)]; [m_mobileTable setTarget:self]; [m_mobileTable setDoubleAction:@selector(onDoubleClick:)]; [m_mobileTable setTooltipDelegate:self]; [m_tabGroup selectTabViewItemAtIndex:0]; // initialize toolbar, we need set window frame according to hideToolbar option if([cache hideToolbar]) [self restoreLastFrame]; m_toolbar = [[NSToolbar alloc] initWithIdentifier:@"MainWindowToolBar"]; [m_toolbar setDisplayMode:NSToolbarDisplayModeIconOnly]; [m_toolbar setAllowsUserCustomization:NO]; [m_toolbar setDelegate:self]; [[self window] setToolbar:m_toolbar]; if(![cache hideToolbar]) [self restoreLastFrame]; // initialize menu [m_messageSettingMenu setDelegate:self]; // initialize window if([cache alwaysOnTop]) [[self window] setLevel:NSScreenSaverWindowLevel]; // initial side view [m_sideView setMainWindowController:self]; // create main qq listener m_mainQQListener = [[MainQQListener alloc] initWithMainWindow:self]; // register window [WindowRegistry registerMainWindow:[m_me QQ] window:self]; // add notification observer [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleUserDidRemovedNotification:) name:kUserDidRemovedNotificationName object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleUserDidMovedNotification:) name:kUserDidMovedNotificationName object:nil]; // check update NSURL* url = [NSURL URLWithString:@"http://lumaqq.linuxsir.org/update/update.txt"]; NSURLRequest* request = [NSURLRequest requestWithURL:url]; m_updateChecker = [[NSURLDownload alloc] initWithRequest:request delegate:self]; [m_updateChecker setDeletesFileUponFailure:YES]; [m_updateChecker setDestination:kLQFileUpdate allowOverwrite:YES]; [m_updateChecker request]; // start login process [self restartNetwork];}- (IBAction)showWindow:(id)sender { [super showWindow:sender]; // restore frame origin, showwindow will do some mystic thing to change window frame [self restoreLastFrameOrigin]; // register hotkey if(![self registerExtractMessageHotKey] || ![self registerScreenscrapHotKey]) { [AlertTool showWarning:[self window] message:L(@"LQWarningHotKeyRegisterFailed", @"MainWindow")]; }}- (void)windowWillClose:(NSNotification *)aNotification { if([aNotification object] != [self window]) return; // detach delegate [m_userOutline setDelegate:nil]; [m_clusterOutline setDelegate:nil]; [m_mobileTable setDelegate:nil]; [m_recentTable setDelegate:nil]; // remove notification observers [[NSNotificationCenter defaultCenter] removeObserver:self name:kUserDidRemovedNotificationName object:nil]; [[NSNotificationCenter defaultCenter] removeObserver:self name:kUserDidMovedNotificationName object:nil]; // stop related timer task [[TimerTaskManager sharedManager] removeTasks:self]; // cancel updater if(m_updateChecker) { [m_updateChecker cancel]; [m_updateChecker release]; m_updateChecker = nil; } // save info [self saveImportantInfo]; // clear job
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -