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

📄 clusterimcontainercontroller.mm

📁 lumaqq
💻 MM
📖 第 1 页 / 共 2 页
字号:
	
	// retain member view
	[m_memberView retain];
	
	// set view's property
	[m_memberView setAutoresizingMask:(NSViewMinXMargin | NSViewWidthSizable | NSViewHeightSizable)];
	[m_memberView setAutoresizesSubviews:YES];
	[m_split setAutoresizingMask:(NSViewMaxXMargin | NSViewWidthSizable | NSViewHeightSizable)];
	
	// init table
	QQCell* qqCell = [[QQCell alloc] init];
	[qqCell setMemberStyle:YES];
	[qqCell setInternalId:[m_cluster internalId]];
	[[m_memberTable tableColumnWithIdentifier:@"1"] setDataCell:[qqCell autorelease]];
	[m_memberTable setDraggingSourceOperationMask:NSDragOperationEvery forLocal:NO];
	[m_memberTable registerForDraggedTypes:[NSArray arrayWithObject:NSStringPboardType]];
	
	// refresh cluster info
	[m_txtOnline setStringValue:[NSString stringWithFormat:@"%u/%u", [m_cluster onlineMemberCount], [m_cluster memberCount]]];
	if([m_cluster permanent]) {
		NSString* notice = [[[m_cluster info] notice] normalize];
	    [m_txtNotice setStringValue:notice];
		[m_txtNotice setToolTip:notice];
		[[m_mainWindowController client] getClusterInfo:[m_cluster internalId]];
	} else if([m_cluster isSubject]) {
		Cluster* parentCluster = [[m_mainWindowController groupManager] cluster:[m_cluster parentId]];
		NSString* notice = [NSString stringWithFormat:L(@"LQSubjectNotice", @"ClusterIMContainer"), [parentCluster name]];
		[m_txtNotice setStringValue:notice];
		[m_txtNotice setToolTip:notice];
		if([parentCluster memberCount] == 0)
			[[m_mainWindowController client] getClusterInfo:[m_cluster parentId]];
		[[m_mainWindowController client] getSubjectInfo:[m_cluster internalId] parent:[m_cluster parentId]];
	} else if([m_cluster isDialog]) {
		User* user = [[m_mainWindowController groupManager] user:[[m_cluster info] creator]];
		NSString* notice = [NSString stringWithFormat:L(@"LQDialogNotice", @"ClusterIMContainer"), user ? [user remarkOrNickOrQQ] : [[NSNumber numberWithUnsignedInt:[[m_cluster info] creator]] description]];
		[m_txtNotice setStringValue:notice];
		[m_txtNotice setToolTip:notice];
		[[m_mainWindowController client] getDialogInfo:[m_cluster internalId]];
	}
}

#pragma mark -
#pragma mark actions

- (IBAction)onSwitchMemberView:(id)sender {
	if([m_memberView superview]) {
		//
		// remove member view
		//
		
		NSRect bound = [m_box bounds];
		
		// get im view start frame
		NSRect imViewStartFrame = [m_split frame];
		
		// get im view end frame
		NSRect imViewEndFrame = bound;
		
		// start animation
		[AnimationHelper moveView:m_split
							 from:imViewStartFrame
							   to:imViewEndFrame
						   fadeIn:nil
						  fadeOut:m_memberView
						 delegate:self];
	} else {
		//
		// add member view
		//
		
		// add it
		[m_box addSubview:m_memberView];
		
		// calculate member view end frame
		NSRect bound = [m_box bounds];
		NSRect memberViewEndFrame = bound;
		// I don't know why, if I use float it will be obscured when I scrolling it
		memberViewEndFrame.origin.x = (int)(NSWidth(bound) / 3 * 2);
		memberViewEndFrame.size.width = NSWidth(bound) - memberViewEndFrame.origin.x;
		
		// set member view frame
		[m_memberView setFrame:memberViewEndFrame];
		[m_memberView setHidden:YES];
		
		// get im view start frame
		NSRect imViewStartFrame = [m_split frame];
		
		// calculate im view end frame
		NSRect imViewEndFrame = imViewStartFrame;
		imViewEndFrame.size.width = NSWidth(bound) - NSWidth(memberViewEndFrame);
	
		// start animation
		[AnimationHelper moveView:m_split
							 from:imViewStartFrame
							   to:imViewEndFrame
						   fadeIn:m_memberView
						  fadeOut:nil
						 delegate:nil];
	}
}

- (IBAction)showOwnerInfo:(id)sender {
	if([m_cluster permanent])
		[[m_mainWindowController windowRegistry] showClusterInfoWindow:m_cluster mainWindow:m_mainWindowController];
	else if([m_cluster isSubject]) {
		Cluster* parent = [[m_mainWindowController groupManager] cluster:[m_cluster parentId]];
		if(parent)
			[[m_mainWindowController windowRegistry] showTempClusterInfoWindow:m_cluster 
																		parent:parent
																	mainWindow:m_mainWindowController];
	} else if([m_cluster isDialog])
		[[m_mainWindowController windowRegistry] showTempClusterInfoWindow:m_cluster
																	parent:nil
																mainWindow:m_mainWindowController];
}

- (IBAction)onUserInfo:(id)sender {
	User* user = [m_cluster memberAtIndex:[m_memberTable selectedRow]];
	if(user)
		[[m_mainWindowController windowRegistry] showUserInfoWindow:user
															cluster:m_cluster
														 mainWindow:m_mainWindowController];
}

- (IBAction)onAddAsFriend:(id)sender {
	User* user = [m_cluster memberAtIndex:[m_memberTable selectedRow]];
	if(user)
		[[m_mainWindowController windowRegistry] showAddFriendWindow:[user QQ]
																head:[user head]
																nick:[user nick]
														  mainWindow:m_mainWindowController];
}

- (IBAction)onTempSession:(id)sender {
	User* user = [m_cluster memberAtIndex:[m_memberTable selectedRow]];
	if(user)
		[[m_mainWindowController windowRegistry] showTempSessionIMWindowOrTab:user
																   mainWindow:m_mainWindowController];
}

#pragma mark -
#pragma mark animation delegate

- (void)animationDidEnd:(NSAnimation*)animation {
	[m_memberView removeFromSuperviewWithoutNeedingDisplay];
}

#pragma mark -
#pragma mark table datasource

- (int)numberOfRowsInTableView:(NSTableView *)aTableView {
	return [m_cluster memberCount];
}

- (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex {
	User* user = [m_cluster memberAtIndex:rowIndex];
	switch([[aTableColumn identifier] intValue]) {
		case 0:
			if([user isCreator:m_cluster])
				return [NSImage imageNamed:kImageClusterCreator];
			else if([user isAdmin:m_cluster])
				return [NSImage imageNamed:kImageClusterAdmin];
			else if([user isStockholder:m_cluster])
				return [NSImage imageNamed:kImageClusterStockholder];
			else
				return nil;
			return nil;
		case 1:
			return user;
		default:
			return kStringEmpty;
	}
}

#pragma mark -
#pragma mark table delegate

- (BOOL)tableView:(NSTableView *)aTableView writeRows:(NSArray *)rows toPasteboard:(NSPasteboard *)pboard {
	id item = [m_cluster memberAtIndex:[[rows objectAtIndex:0] intValue]];
	if([item isMemberOfClass:[User class]]) {
		// set dragged user qq number
		[pboard declareTypes:[NSArray arrayWithObject:NSStringPboardType] owner:self];
		[pboard setString:[self getUserDisplayName:item QQ:[item QQ]] forType:NSStringPboardType];
		return YES;
	} else
		return NO;
}

- (NSDragOperation)tableView:(NSTableView *)aTableView validateDrop:(id <NSDraggingInfo>)info proposedRow:(int)row proposedDropOperation:(NSTableViewDropOperation)operation {
	return NSDragOperationMove;
}

#pragma mark -
#pragma mark qq event handler

- (BOOL)handleClusterGetMemberInfoOK:(QQNotification*)event {
	ClusterCommandReplyPacket* packet = [event object];
	if([packet internalId] == [m_cluster internalId])
		[m_memberTable reloadData];
	return NO;
}

- (BOOL)handleClusterGetOnlineMemberOK:(QQNotification*)event {
	ClusterCommandReplyPacket* packet = [event object];
	if([packet internalId] == [m_cluster internalId]) {
		[m_txtOnline setStringValue:[NSString stringWithFormat:@"%u/%u", [m_cluster onlineMemberCount], [m_cluster memberCount]]];
		[m_memberTable reloadData];
	}
	return NO;
}

- (BOOL)handleClusterBatchGetCardOK:(QQNotification*)event {
	ClusterCommandReplyPacket* packet = [event object];
	if([packet internalId] == [m_cluster internalId])
		[m_memberTable reloadData];
	return NO;
}

- (BOOL)handleClusterGetInfoOK:(QQNotification*)event {
	ClusterCommandReplyPacket* packet = [event object];
	if([packet internalId] == [m_cluster internalId] || ![m_cluster permanent] && [packet internalId] == [m_cluster parentId]) {
		[m_txtOnline setStringValue:[NSString stringWithFormat:@"%u/%u", [m_cluster onlineMemberCount], [m_cluster memberCount]]];
		[m_memberTable reloadData];
		if([m_cluster permanent]) {
			NSString* notice = [[[m_cluster info] notice] normalize];
			[m_txtNotice setStringValue:notice];
			[m_txtNotice setToolTip:notice];
		}
		[[NSNotificationCenter defaultCenter] postNotificationName:kIMContainerModelDidChangedNotificationName
															object:m_cluster];
	}
	
	return NO;
}

- (BOOL)handleClusterSendIMOK:(QQNotification*)event {
	ClusterCommandReplyPacket* packet = [event object];
	if([packet sequence] == m_waitingSequence) {
		// remove message from queue
		ClusterSendIMExPacket* request = (ClusterSendIMExPacket*)[event outPacket];
		if([request fragmentCount] == [request fragmentIndex] + 1)
			[m_sendQueue removeObjectAtIndex:0];
		
		// send next
		[self sendNextMessage];
		return YES;
	}
	return NO;
}

- (BOOL)handleClusterSendIMFailed:(QQNotification*)event {
	ClusterCommandReplyPacket* packet = [event object];
	if([packet sequence] == m_waitingSequence) {
		// remove message from queue
		[m_sendQueue removeObjectAtIndex:0];
		
		// send next
		[self sendNextMessage];
		return YES;
	}
	return NO;
}

- (BOOL)handleTempClusterSendIMOK:(QQNotification*)event {
	return [self handleClusterSendIMOK:event];
}

- (BOOL)handleTempClusterSendIMFailed:(QQNotification*)event {
	return [self handleClusterSendIMFailed:event];
}

- (BOOL)handleTempClusterSendIMTimeout:(QQNotification*)event {
	return [self handleClusterSendIMTimeout:event];
}

- (BOOL)handleClusterSendIMTimeout:(QQNotification*)event {
	ClusterSendIMExPacket* packet = (ClusterSendIMExPacket*)[event outPacket];
	if([packet sequence] == m_waitingSequence) {
		// get message from queue
		NSAttributedString* message = [[m_sendQueue objectAtIndex:0] retain];
		
		// remove message
		[m_sendQueue removeObjectAtIndex:0];
		
		// change fragment index, so we can skip the timeout message
		m_nextFragmentIndex = m_fragmentCount;
		
		// append timeout hint to output text view
		NSAttributedString* string = [[NSAttributedString alloc] initWithString:L(@"LQHintTimeoutHeader", @"BaseIMContainer")
																	 attributes:m_errorHintAttributes];
		[[m_txtOutput textStorage] appendAttributedString:string];
		[string release];
		[[m_txtOutput textStorage] appendAttributedString:message];
		[message release];
		string = [[NSAttributedString alloc] initWithString:L(@"LQHintTimeoutTail", @"BaseIMContainer")
												 attributes:m_errorHintAttributes];
		[[m_txtOutput textStorage] appendAttributedString:string];
		[string release];
		
		// send next
		[self sendNextMessage];
		return YES;
	}
	return NO;
}

- (BOOL)handleTempClusterGetInfoOK:(QQNotification*)event {
	ClusterCommandReplyPacket* packet = [event object];
	if([packet internalId] == [m_cluster internalId]) {
		[m_txtOnline setStringValue:[NSString stringWithFormat:@"%u/%u", [m_cluster onlineMemberCount], [m_cluster memberCount]]];
		[m_memberTable reloadData];
		[[NSNotificationCenter defaultCenter] postNotificationName:kIMContainerModelDidChangedNotificationName
															object:m_cluster];
	}
	
	return NO;
}

#pragma mark -
#pragma mark menu delegate

- (int)numberOfItemsInMenu:(NSMenu *)menu {
	return [[menu itemArray] count];
}

- (BOOL)menu:(NSMenu *)menu updateItem:(NSMenuItem *)item atIndex:(int)index shouldCancel:(BOOL)shouldCancel {
	if(menu == m_memberMenu) {
		User* user = [m_cluster memberAtIndex:[m_memberTable selectedRow]];
		if(user == nil)
			[item setEnabled:NO];
		else {
			switch([item tag]) {
				case _kMenuItemTagAddAsFriend:
					[item setEnabled:![[m_mainWindowController groupManager] isUserFriendly:user]];
					break;
				default:
					[item setEnabled:YES];
					break;
			}
		}
	}
	
	return YES;
}

@end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -