📄 clusterimcontainercontroller.mm
字号:
// 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 + -