⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mainwindowcontroller.mm

📁 lumaqq
💻 MM
📖 第 1 页 / 共 5 页
字号:
/* * 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 + -