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

📄 clusterinfowindowcontroller.mm

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