📄 mainwindowcontroller.mm
字号:
[m_jobController terminate]; // shutdown network [self shutdownNetwork]; // release [m_client removeQQListener:m_mainQQListener]; [m_client release]; [m_client dealloc]; m_client = nil; [m_toolbar release]; [WindowRegistry unregisterMainWindow:[m_me QQ]]; // get system perference PreferenceCache* cache = [PreferenceCache cache:[m_me QQ]]; // unregister hot key [[HotKeyManager sharedHotKeyManager] unregisterHotKeyByString:[cache extractMessageHotKey] owner:[m_me QQ]]; [[HotKeyManager sharedHotKeyManager] unregisterHotKeyByString:[cache screenscrapHotKey] owner:[m_me QQ]]; // remove active window if([LumaQQApplication activeMainWindow] == self) { [LumaQQApplication setActiveMainWindow:nil]; [NSApp setApplicationIconImage:[NSImage imageNamed:kImageQQGGOffline]]; } // unload qbar plugins [m_pluginManager unloadPlugins]; // release if(m_sideWindow) { [m_sideWindow close]; [m_sideWindow release]; m_sideWindow = nil; } if(m_tooltipController) { [m_tooltipController hideTooltip]; [m_tooltipController release]; m_tooltipController = nil; } [m_jobController release]; m_jobController = nil; [m_pluginManager release]; m_pluginManager = nil; [m_me release]; m_me = nil; [m_mainQQListener release]; m_mainQQListener = nil; [m_userDataSource release]; m_userDataSource = nil; [m_clusterDataSource release]; m_clusterDataSource = nil; [m_recentDataSource release]; m_recentDataSource = nil; [m_mobileDataSource release]; m_mobileDataSource = nil; [m_password release]; m_password = nil; [m_passwordMd5 release]; m_passwordMd5 = nil; [m_connection release]; m_connection = nil; [m_groupManager release]; m_groupManager = nil; [m_faceManager release]; m_faceManager = nil; [m_historyManager release]; m_historyManager = nil; [m_windowRegistry release]; m_windowRegistry = nil; [m_messageQueue release]; m_messageQueue = nil; [m_postponedEventCache release]; m_postponedEventCache = nil; [m_requestBlockingCache release]; m_requestBlockingCache = nil; [m_addFriendGroupMapping release]; m_addFriendGroupMapping = nil; [m_removeFriendGroupMapping release]; m_removeFriendGroupMapping = nil; [self release];}- (BOOL)windowShouldClose:(id)sender { // if hide on close PreferenceCache* cache = [PreferenceCache cache:[m_me QQ]]; if(!m_ignoreHideOnClose && [cache hideOnClose]) { [[self window] orderOut:self]; } else if([m_groupManager changed] && [cache uploadFriendGroupMode] != kLQUploadNever) { if([cache uploadFriendGroupMode] == kLQUploadAsk) { [AlertTool showConfirm:[self window] message:L(@"LQWarningUploadConfirm", @"MainWindow") defaultButton:L(@"LQYes") alternateButton:L(@"LQNo") delegate:self didEndSelector:@selector(uploadFriendGroupAlertDidEnd:returnCode:contextInfo:)]; } else { [self showProgressWindow:YES]; [m_mainQQListener uploadGroupNames]; } return NO; } return m_ignoreHideOnClose ? YES : ![cache hideOnClose];}- (void)windowDidBecomeKey:(NSNotification *)aNotification { if([aNotification object] != [self window]) return; [LumaQQApplication setActiveMainWindow:self]; [self refreshDockIcon];}- (void)windowDidEndSheet:(NSNotification *)aNotification { if([aNotification object] != [self window]) return; switch(m_sheetType) { case _kSheetLoginFailed: case _kSheetNetworkError: case _kSheetKickedOut: [self shutdownNetwork]; [self returnToLogin]; break; case _kSheetInputQQ: [m_windowRegistry showAddFriendWindow:[[m_txtInput stringValue] intValue] mainWindow:self]; break; case _kSheetInputStatusMessage: PreferenceCache* cache = [PreferenceCache cache:[m_me QQ]]; [cache setStatusMessage:[m_txtInput stringValue]]; [[cache statusHistory] addObject:[m_txtInput stringValue]]; [m_client changeStatusMessage:[m_txtInput stringValue]]; break; case _kSheetInputQQForTempSession: User* user = [m_groupManager user:[[m_txtInput stringValue] intValue]]; if(user == nil) user = [[[User alloc] initWithQQ:[[m_txtInput stringValue] intValue] domain:self] autorelease]; [m_windowRegistry showTempSessionIMWindowOrTab:user mainWindow:self]; break; case _kSheetInputRemarkName: user = [m_userOutline itemAtRow:[m_userOutline selectedRow]]; if(user) { NSString* name = [m_txtInput stringValue]; [user setRemarkName:name]; [m_client modifyRemarkName:[user QQ] name:name]; [m_userOutline reloadItem:user]; } break; case _kSheetInputNewGroup: [m_groupManager addFriendlyGroup:[m_txtInput stringValue]]; [m_userOutline reloadData]; break; case _kSheetInputRenameGroup: Group* group = [m_userOutline itemAtRow:[m_userOutline selectedRow]]; if(group) { [m_groupManager setGroupName:group name:[m_txtInput stringValue]]; [m_userOutline reloadItem:group]; } break; case _kSheetMoveToBlacklist: // open delete user window if(m_userToBeDeleted) { [m_removeFriendGroupMapping setObject:[NSNumber numberWithInt:[m_groupManager blacklistGroupIndex]] forKey:[NSNumber numberWithUnsignedInt:[m_userToBeDeleted QQ]]]; [m_windowRegistry showDeleteUserWindow:m_userToBeDeleted mainWindow:self]; } break; case _kSheetUploadFriendGroupConfirmNo: case _kSheetUploadFriendGroup: [m_groupManager saveGroups]; [self close]; break; case _kSheetUploadFriendGroupConfirmYes: [self showProgressWindow:YES]; [m_mainQQListener uploadGroupNames]; break; case _kSheetDeleteGroup: group = [m_userOutline itemAtRow:[m_userOutline selectedRow]]; int index = [m_groupManager indexOfGroup:group]; if(index == m_moveFriendsInDeleteGroupTo) { [AlertTool showWarning:[self window] message:L(@"LQWarningMoveToSameAsToBeDeleted", @"MainWindow")]; } else { [m_groupManager moveAllUsersFrom:index to:m_moveFriendsInDeleteGroupTo]; [m_groupManager removeGroupAt:index]; [m_userOutline reloadData]; } break; case _kSheetNewMobile: Mobile* mobile = [[[Mobile alloc] initWithName:[m_txtMobileName stringValue] mobile:[m_txtMobileNumber stringValue] domain:self] autorelease]; [m_groupManager addMobile:mobile]; [m_mobileTable reloadData]; break; case _kSheetModifyMobile: mobile = [m_groupManager mobileAtIndex:[m_mobileTable selectedRow]]; [mobile setName:[m_txtMobileName stringValue]]; [mobile setMobile:[m_txtMobileNumber stringValue]]; [m_mobileTable reloadData]; break; } m_sheetType = -1;}- (void)windowDidMove:(NSNotification *)aNotification { if([aNotification object] != [self window]) return; // check auto hide setting PreferenceCache* cache = [PreferenceCache cache:[m_me QQ]]; if([cache autoHideMainWindow]) { // first, check whether a sheet is displayed, if yes, don't perform auto hiding NSWindow* sheet = [[self window] attachedSheet]; if(sheet) return; // get new frame NSRect frame = [[self window] frame]; // get screen size NSRect screenFrame = [[NSScreen mainScreen] frame]; // check intersect BOOL left = frame.origin.x < 0; BOOL right = NSMaxX(frame) > NSMaxX(screenFrame); BOOL top = NSMaxY(frame) > NSMaxY(screenFrame); BOOL bottom = frame.origin.y < 0; // check side if(left || right || top || bottom) { // set flag m_autoHided = YES; // get view bound NSRect viewBound = [m_sideView bounds]; // create side window m_sideWindow = [[NSWindow alloc] initWithContentRect:viewBound styleMask:NSBorderlessWindowMask backing:NSBackingStoreBuffered defer:YES]; [m_sideWindow setReleasedWhenClosed:NO]; [m_sideWindow setLevel:NSScreenSaverWindowLevel]; // add side view [[m_sideWindow contentView] addSubview:m_sideView]; [m_txtSide setStringValue:[[NSNumber numberWithUnsignedInt:[m_me QQ]] description]]; // set next responder [m_sideWindow setInitialFirstResponder:m_sideView]; [m_txtSide setNextResponder:m_sideView]; [m_ivSide setNextResponder:m_sideView]; // set frame if(right) { frame.origin.x = NSMaxX(screenFrame) - NSWidth(viewBound); [m_sideView setDockSide:kSideRight]; } else if(left) { frame.origin.x = 0; [m_sideView setDockSide:kSideLeft]; } if(bottom) { frame.origin.y = 0; [m_sideView setDockSide:kSideBottom]; } else if(top) { frame.origin.y = NSMaxY(screenFrame) - NSHeight(viewBound); [m_sideView setDockSide:kSideTop]; } frame.size = viewBound.size; // set side window frame [m_sideWindow setFrameOrigin:frame.origin]; // forbid autoresize because it will mess UI [[[self window] contentView] setAutoresizesSubviews:NO]; // set window background [m_sideWindow setBackgroundColor:[NSColor lightGrayColor]]; // start animation m_animationType = _kAnimationAutoHide; [AnimationHelper moveWindow:[self window] from:[[self window] frame] to:frame delegate:self]; } }}#pragma mark -#pragma mark actions- (IBAction)onCancel:(id)sender { // shutdown network [self shutdownNetwork]; // return to login window [self returnToLogin];}- (IBAction)onHeadItem:(id)sender { // get head bound NSRect bound = [(HeadControl*)[m_headItem view] bounds]; // calculate bound = [(HeadControl*)[m_headItem view] convertRect:bound toView:nil]; // create a mouse event and popup menu NSEvent* event = [NSEvent mouseEventWithType:NSLeftMouseDown location:bound.origin modifierFlags:NSLeftMouseDownMask timestamp:0 windowNumber:[[self window] windowNumber] context:[[self window] graphicsContext] eventNumber:0 clickCount:0 pressure:0]; [NSMenu popUpContextMenu:m_headMenu withEvent:event forView:m_tabMain];}- (IBAction)onOnline:(id)sender { if([[m_client user] status] != kQQStatusOnline) { // set flag m_changingStatus = YES; // save status message [[PreferenceCache cache:[m_me QQ]] setStatusMessage:L(@"LQStatusOnline")]; // change status or login if([[m_client user] status] == kQQStatusOffline) { m_loginStatus = kQQStatusOnline; [self restartNetwork]; } else [m_client changeStatus:kQQStatusOnline]; }}- (IBAction)onAway:(id)sender { if([[m_client user] status] != kQQStatusAway) { // set flag m_changingStatus = YES; // save status message [[PreferenceCache cache:[m_me QQ]] setStatusMessage:L(@"LQStatusAway")]; // change status or login if([[m_client user] status] == kQQStatusOffline) { m_loginStatus = kQQStatusAway; [self restartNetwork]; } else [m_client changeStatus:kQQStatusAway]; }}- (IBAction)onHidden:(id)sender { if([[m_client user] status] != kQQStatusHidden) { // set flag m_changingStatus = YES; // save status message [[PreferenceCache cache:[m_me QQ]] setStatusMessage:L(@"LQStatusHidden")]; // change status or login if([[m_client user] status] == kQQStatusOffline) { m_loginStatus = kQQStatusHidden; [self restartNetwork]; } else [m_client changeStatus:kQQStatusHidden]; }}- (IBAction)onOffline:(id)sender { if([[m_client user] status] != kQQStatusOffline) { // save status message [[PreferenceCache cache:[m_me QQ]] setStatusMessage:L(@"LQStatusOffline")]; // shutdown network layer [self shutdownNetwork]; // refresh ui [self refreshStatusUI]; }}- (IBAction)onBusy:(id)sender { if([[m_client user] status] != kQQStatusBusy) { // set flag m_changingStatus = YES; // save status message [[PreferenceCache cache:[m_me QQ]] setStatusMessage:L(@"LQStatusBusy")]; // change status or login if([[m_client user] status] == kQQStatusOffline) { m_loginStatus = kQQStatusBusy; [self restartNetwork]; } else [m_client changeStatus:kQQStatusBusy]; }}- (IBAction)onMute:(id)sender { if([[m_client user] status] != kQQStatusMute) { // set flag m_changingStatus = YES; // save status message [[PreferenceCache cache:[m_me QQ]] setStatusMessage:L(@"LQStatusMute")]; // change status or login if([[m_client user] status] == kQQStatusOffline) { m_loginStatus = kQQStatusMute; [self restartNetwork];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -