📄 clusterinfowindowcontroller.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 "ClusterInfoWindowController.h"
#import "MainWindowController.h"
#import "ImageTool.h"
#import "ClusterNameCard.h"
#import "LocalizedStringTool.h"
#import "NSString-Validate.h"
#import "GroupManager.h"
#import "AlertTool.h"
#import "TreeSelectorWindowController.h"
// workflow name
#define _kWorkflowGetInfos @"GetInfos"
#define _kWorkflowModifyInfos @"ModifyInfos"
#define _kWorkflowModifyMessageSetting @"ModifyMessageSettingWorkflow"
#define _kWorkflowModifyCard @"ModifyCardWorkflow"
#define _kWorkflowGetCard @"GetCardWorkflow"
// workflow unit name
#define _kWorkflowUnitGetCard @"GetCard"
#define _kWorkflowUnitModifyCard @"ModifyCard"
#define _kWorkflowUnitModifyMessageSetting @"ModifyMessageSetting"
#define _kWorkflowUnitGetMessageSetting @"GetMessageSetting"
#define _kWorkflowUnitGetChannelSetting @"GetChannelSetting"
#define _kWorkflowUnitModifyChannelSetting @"ModifyChannelSetting"
#define _kWorkflowUnitGetLastTalkTime @"GetLastTalkTime"
#define _kWorkflowUnitGetClusterInfo @"GetClusterInfo"
#define _kWorkflowUnitModifyClusterInfo @"ModifyClusterInfo"
#define _kWorkflowUnitAddMember @"AddMember"
#define _kWorkflowUnitRemoveMember @"RemoveMember"
// sheet type
#define _kSheetOperationFinishedAndNeedCloseWindow 0
@implementation ClusterInfoWindowController
- (id)initWithCluster:(Cluster*)cluster mainWindow:(MainWindowController*)mainWindowController {
self = [super initWithWindowNibName:@"ClusterInfo"];
if(self) {
m_cluster = [cluster retain];
m_mainWindowController = [mainWindowController retain];
m_members = [[NSMutableArray arrayWithArray:[cluster members]] retain];
m_sheetType = -1;
}
return self;
}
- (void) dealloc {
[m_members release];
[m_cluster release];
[m_mainWindowController release];
[super dealloc];
}
- (void)windowWillClose:(NSNotification *)aNotification {
if([aNotification object] != [self window])
return;
if(m_moderator) {
[m_moderator cancel];
[m_moderator release];
m_moderator = nil;
}
if(m_oldMembers)
[m_oldMembers release];
if(m_newMembers)
[m_newMembers release];
[[m_mainWindowController windowRegistry] unregisterClusterInfoWindow:[m_cluster internalId]];
[[NSNotificationCenter defaultCenter] removeObserver:self
name:NSWindowWillCloseNotification
object:nil];
[[NSNotificationCenter defaultCenter] removeObserver:self
name:kQQCellDidSelectedNotificationName
object:nil];
if(m_treeSelector)
[m_treeSelector close];
[self release];
}
- (void)windowDidLoad {
// init table
[[m_memberTable tableColumnWithIdentifier:@"0"] setDataCell:[[[NSImageCell alloc] init] autorelease]];
QQCell* qqCell = [[QQCell alloc] init];
[qqCell setSearchStyle:YES];
[qqCell setShowStatus:NO];
[[m_memberTable tableColumnWithIdentifier:@"1"] setDataCell:[qqCell autorelease]];
// init window title
if(![[m_cluster name] isEmpty])
[[self window] setTitle:[NSString stringWithFormat:L(@"LQTitle", @"ClusterInfo"), [m_cluster name]]];
else
[[self window] setTitle:[NSString stringWithFormat:L(@"LQTitle", @"ClusterInfo"), [NSString stringWithFormat:@"%u", [m_cluster externalId]]]];
// show first tab
[m_tabMain selectTabViewItemAtIndex:0];
// refresh button
[self updateMemberPanelButtons];
// refresh category combo box
[m_cbLevel1 reloadData];
[m_cbLevel2 reloadData];
[m_cbLevel3 reloadData];
// reload
[self reloadInfo];
// add listener to alert notification
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(handleTreeSelectorWindowWillClose:)
name:NSWindowWillCloseNotification
object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(handleQQCellDidSelected:)
name:kQQCellDidSelectedNotificationName
object:nil];
// start to get infos
m_moderator = [[WorkflowModerator alloc] initWithName:_kWorkflowGetInfos dataSource:self];
m_apply = YES;
m_showAlert = NO;
[self buildWorkflow:_kWorkflowGetInfos];
[m_moderator start:[m_mainWindowController client]];
}
- (void)windowDidMove:(NSNotification *)aNotification {
if([aNotification object] != [self window])
return;
if(m_treeSelector) {
NSRect frame = [[self window] frame];
frame.origin.x += frame.size.width;
frame.size.width = 250;
[[m_treeSelector window] setFrame:frame display:NO];
}
}
- (void)windowDidEndSheet:(NSNotification *)aNotification {
if([aNotification object] != [self window])
return;
switch(m_sheetType) {
case _kSheetOperationFinishedAndNeedCloseWindow:
[self close];
break;
}
m_sheetType = -1;
}
#pragma mark -
#pragma mark actions
- (IBAction)onOK:(id)sender {
m_apply = NO;
[self startModify];
}
- (IBAction)onCancel:(id)sender {
if([self isSuperUser])
[self close];
else {
switch([[[m_tabMain selectedTabViewItem] identifier] intValue]) {
case 4:
m_apply = YES;
m_showAlert = YES;
[self buildWorkflow:_kWorkflowModifyCard];
[m_moderator start:[m_mainWindowController client]];
break;
case 3:
m_apply = YES;
m_showAlert = YES;
[self buildWorkflow:_kWorkflowModifyMessageSetting];
[m_moderator start:[m_mainWindowController client]];
break;
default:
m_apply = YES;
m_showAlert = NO;
[self buildWorkflow:_kWorkflowGetInfos];
[m_moderator start:[m_mainWindowController client]];
break;
}
}
}
- (IBAction)onApply:(id)sender {
if([self isSuperUser]) {
m_apply = YES;
[self startModify];
} else
[self close];
}
- (IBAction)onRemoveMember:(id)sender {
QQCell* cell = m_treeSelector ? [m_treeSelector QQCell] : nil;
int row = [m_memberTable selectedRow];
User* u = [m_members objectAtIndex:row];
[m_members removeObjectAtIndex:row];
Group* g = [[m_mainWindowController groupManager] group:[u groupIndex]];
if(cell) {
[cell set:u state:NSOffState];
[self refreshGroupState:g cell:cell];
}
if(g)
[[m_treeSelector tree] reloadItem:g reloadChildren:YES];
[m_memberTable reloadData];
[self updateMemberPanelButtons];
}
- (IBAction)onSetMembers:(id)sender {
if(m_treeSelector)
return;
// get window frame
NSRect frame = [[self window] frame];
frame.origin.x += frame.size.width;
frame.size.width = 250;
// create and show at right side of window
m_treeSelector = [[TreeSelectorWindowController alloc] initWithMainWindow:m_mainWindowController
dataSource:self];
[m_treeSelector showWindow:self];
[[m_treeSelector window] setFrame:frame display:NO];
// set flags
QQCell* cell = [m_treeSelector QQCell];
NSEnumerator* e = [m_members objectEnumerator];
while(User* u = [e nextObject])
[cell set:u state:NSOnState];
e = [[[m_mainWindowController groupManager] friendlyGroups] objectEnumerator];
while(Group* g = [e nextObject]) {
[self refreshGroupState:g cell:cell];
}
}
- (IBAction)onAddAsFriend:(id)sender {
User* user = [m_members objectAtIndex:[m_memberTable selectedRow]];
[[m_mainWindowController windowRegistry] showAddFriendWindow:[user QQ]
head:[user head]
nick:[user nick]
mainWindow:m_mainWindowController];
}
#pragma mark -
#pragma mark alert delegate
- (void)alertDidEnd:(NSAlert *)alert returnCode:(int)returnCode contextInfo:(void *)contextInfo {
if(!m_apply) {
m_sheetType = _kSheetOperationFinishedAndNeedCloseWindow;
}
}
#pragma mark -
#pragma mark helper
- (void)buildWorkflow:(NSString*)name {
[m_moderator reset:name];
if([_kWorkflowGetInfos isEqualToString:name]) {
[m_moderator addUnit:_kWorkflowUnitGetClusterInfo failEvent:kQQEventClusterGetInfoFailed];
[m_moderator addUnit:_kWorkflowUnitGetLastTalkTime failEvent:kQQEventClusterGetLastTalkTimeFailed];
[m_moderator addUnit:_kWorkflowUnitGetMessageSetting failEvent:kQQEventClusterGetMessageSettingFailed];
[m_moderator addUnit:_kWorkflowUnitGetChannelSetting failEvent:kQQEventClusterGetChannelSettingFailed];
[m_moderator addUnit:_kWorkflowUnitGetCard failEvent:kQQEventClusterGetCardFailed];
} else if([_kWorkflowModifyInfos isEqualToString:name]) {
[m_moderator addUnit:_kWorkflowUnitModifyClusterInfo failEvent:kQQEventClusterModifyInfoFailed];
[m_moderator addUnit:_kWorkflowUnitModifyChannelSetting failEvent:kQQEventClusterModifyChannelSettingFailed];
[self diffMembers];
[m_moderator addUnit:_kWorkflowUnitAddMember failEvent:kQQEventClusterModifyMemberFailed];
[m_moderator addUnit:_kWorkflowUnitRemoveMember failEvent:kQQEventClusterModifyMemberFailed];
} else if([_kWorkflowGetCard isEqualToString:name]) {
[m_moderator addUnit:_kWorkflowUnitGetCard failEvent:kQQEventClusterGetCardFailed critical:YES];
} else if([_kWorkflowModifyCard isEqualToString:name]) {
[m_moderator addUnit:_kWorkflowUnitModifyCard failEvent:kQQEventClusterModifyCardFailed critical:YES];
} else if([_kWorkflowModifyMessageSetting isEqualToString:name]) {
[m_moderator addUnit:_kWorkflowUnitModifyMessageSetting failEvent:kQQEventClusterModifyMessageSettingFailed critical:YES];
}
}
- (void)diffMembers {
if(m_oldMembers)
[m_oldMembers release];
if(m_newMembers)
[m_newMembers release];
m_oldMembers = [[NSMutableArray array] retain];
NSEnumerator* e = [[m_cluster members] objectEnumerator];
while(User* u = [e nextObject])
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -