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

📄 cluster.mm

📁 lumaqq
💻 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 "Cluster.h"#import "Constants.h"#import "LocalizedStringTool.h"// encoding key#define _kKeyInternalId @"InternalId"#define _kKeyExternalId @"ExternalId"#define _kKeyParentId @"ParentId"#define _kKeyPermanent @"Permanent"#define _kKeyLevelFlag @"LevelFlag"#define _kKeyTempType @"TempType"#define _kKeyClusterName @"ClusterName"#define _kKeySubClusters @"SubClusters"#define _kKeyOrganizations @"Organizations"#define _kKeyMessageSetting @"MessageSetting"#define _kKeyInputBoxPortion @"InputBoxPortion"#define _kKeyCreator @"Creator"@implementation Cluster- (id)initWithInternalId:(UInt32)internalId domain:(MainWindowController*)domain {	self = [super init];	if(self) {		m_domain = [domain retain];		m_internalId = internalId;		m_externalId = 0;		m_parentId = 0;		m_permanent = YES;		m_organizationsDummy = [[Dummy alloc] initWithType:kDummyOrganizations name:@"Organizations"];		[m_organizationsDummy setClusterInternalId:internalId];		m_subjectsDummy = [[Dummy alloc] initWithType:kDummySubjects name:@"Subjects"];		[m_subjectsDummy setClusterInternalId:internalId];		m_subClusters = [[NSMutableArray array] retain];		m_members = [[NSMutableArray array] retain];		m_organizations = [[NSMutableDictionary dictionary] retain];		m_notificationRight = kQQClusterNotificationAllowUserSend | kQQClusterNotificationAllowAdminSend;		m_messageSetting = kQQClusterMessageAccept;		m_saveMessageSettingInServer = YES;		m_info = [[ClusterInfo alloc] init];		m_messageCount = 0;		m_frame = 0;		m_operationSuffix = kStringEmpty;		m_nameCardVersionId = 0;		m_inputBoxProportion = 0.2;	}	return self;}- (void) dealloc {	[m_domain release];	[m_name release];	[m_info release];	[m_organizationsDummy release];	[m_subjectsDummy release];	[m_subClusters release];	[m_members release];	[m_organizations release];	[m_operationSuffix release];	[super dealloc];}- (BOOL)isEqual:(id)anObject {	if([anObject isKindOfClass:[Cluster class]])		return m_internalId == [(Cluster*)anObject internalId];	else		return NO;}- (unsigned)hash {	return m_internalId;}- (void)increaseMessageCount {	m_messageCount++;		[[NSNotificationCenter defaultCenter] postNotificationName:kModelMessageCountChangedNotificationName														object:self													  userInfo:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:(m_messageCount - 1)], kUserInfoOldMessageCount, [NSNumber numberWithInt:m_messageCount], kUserInfoNewMessageCount, m_domain, kUserInfoDomain, nil]];}- (id)copyWithZone:(NSZone *)zone {	return [self retain];}#pragma mark -#pragma mark NSCoding protocol- (void)encodeWithCoder:(NSCoder *)encoder {	[encoder encodeInt32:m_internalId forKey:_kKeyInternalId];	[encoder encodeInt32:m_externalId forKey:_kKeyExternalId];	[encoder encodeInt32:m_parentId forKey:_kKeyParentId];	[encoder encodeBool:m_permanent forKey:_kKeyPermanent];	[encoder encodeInt32:[m_info levelFlag] forKey:_kKeyLevelFlag];	[encoder encodeInt:m_tempType forKey:_kKeyTempType];	[encoder encodeObject:m_name forKey:_kKeyClusterName];	[encoder encodeObject:m_subClusters forKey:_kKeySubClusters];	[encoder encodeObject:m_organizations forKey:_kKeyOrganizations];	[encoder encodeInt:m_messageSetting forKey:_kKeyMessageSetting];	[encoder encodeFloat:m_inputBoxProportion forKey:_kKeyInputBoxPortion];	[encoder encodeInt32:[m_info creator] forKey:_kKeyCreator];}- (id)initWithCoder:(NSCoder *)decoder {	// create cluster info	m_info = [[ClusterInfo alloc] init];		// decoder	m_internalId = [decoder decodeInt32ForKey:_kKeyInternalId];	m_externalId = [decoder decodeInt32ForKey:_kKeyExternalId];	m_parentId = [decoder decodeInt32ForKey:_kKeyParentId];	m_permanent = [decoder decodeBoolForKey:_kKeyPermanent];	m_tempType = [decoder decodeIntForKey:_kKeyTempType];	[m_info setCreator:[decoder decodeInt32ForKey:_kKeyCreator]];	m_name = [[decoder decodeObjectForKey:_kKeyClusterName] retain];	m_subClusters = [[decoder decodeObjectForKey:_kKeySubClusters] retain];	m_organizations = [[decoder decodeObjectForKey:_kKeyOrganizations] retain];	m_messageSetting = [decoder decodeIntForKey:_kKeyMessageSetting];	m_inputBoxProportion = [decoder decodeFloatForKey:_kKeyInputBoxPortion];	if(m_inputBoxProportion <= 0)		m_inputBoxProportion = 0.2;		// initialize dummy	m_organizationsDummy = [[Dummy alloc] initWithType:kDummyOrganizations name:L(@"LQClusterOrganizations")];	[m_organizationsDummy setClusterInternalId:m_internalId];	m_subjectsDummy = [[Dummy alloc] initWithType:kDummySubjects name:L(@"LQClusterSubjects")];	[m_subjectsDummy setClusterInternalId:m_internalId];		// initialize other	m_members = [[NSMutableArray array] retain];	m_notificationRight = kQQClusterNotificationAllowUserSend | kQQClusterNotificationAllowAdminSend;	m_saveMessageSettingInServer = YES;	[m_info setLevelFlag:[decoder decodeInt32ForKey:_kKeyLevelFlag]];	m_messageCount = 0;	m_frame = 0;	m_operationSuffix = kStringEmpty;	m_nameCardVersionId = 0;		return self;}#pragma mark -#pragma mark compare- (NSComparisonResult)compare:(Cluster*)cluster {	if(m_externalId < [cluster externalId])		return NSOrderedAscending;	else if(m_externalId > [cluster externalId])		return NSOrderedDescending;	else		return NSOrderedSame;}- (NSComparisonResult)compareName:(Cluster*)cluster {	return [m_name compare:[cluster name]];}- (void)sortAll {	[m_members sortUsingSelector:@selector(compare:)];	[m_subClusters sortUsingSelector:@selector(compareName:)];}#pragma mark -#pragma mark getter and setter- (BOOL)isSubject {	return m_permanent == NO && m_tempType == kQQTempClusterTypeSubject;}- (BOOL)isDialog {	return m_permanent == NO && m_tempType == kQQTempClusterTypeDialog;}- (void)addMember:(User*)member {	[m_members addObject:member];}- (int)subClusterCount {	return [m_subClusters count];}- (Cluster*)subCluster:(UInt32)internalId {	int count = [m_subClusters count];	for(int i = 0; i < count; i++) {		Cluster* sub = [m_subClusters objectAtIndex:i];		if([sub internalId] == internalId)			return sub;	}	return nil;}- (void)clearMembers {	[m_members removeAllObjects];}- (User*)memberInOrganization:(UInt8)ID index:(int)index {	NSEnumerator* e = [m_members objectEnumerator];	while(User* u = [e nextObject]) {		if([u organization:m_internalId] == ID) {			index--;			if(index < 0)				return u;		}	}	return nil;}- (int)memberCount:(UInt8)orgId {	int ret = 0;	int count = [m_members count];	for(int i = 0; i < count; i++) {		User* u = [m_members objectAtIndex:i];		if([u organization:m_internalId] == orgId) 			ret++;	}	return ret;}- (NSEnumerator*)subClusterEnumerator {	return [m_subClusters objectEnumerator];}- (Cluster*)subClusterAtIndex:(int)index {	return [m_subClusters objectAtIndex:index];}- (Dummy*)organizationsDummy {	return m_organizationsDummy;}- (Dummy*)subjectsDummy {	return m_subjectsDummy;}- (UInt32)externalId {	return m_externalId;}- (void)setExternalId:(UInt32)externalId {	m_externalId = externalId;}- (UInt32)internalId {	return m_internalId;}- (void)setInternalId:(UInt32)internalId {	m_internalId = internalId;}- (UInt32)parentId {	return m_parentId;}- (void)setParentId:(UInt32)parentId {	m_parentId = parentId;}- (NSString*)name {	return m_name ? m_name : kStringEmpty;}- (void)setName:(NSString*)name {	[name retain];	[m_name release];	m_name = name;}- (ClusterInfo*)info {	return m_info;}- (void)setClusterInfo:(ClusterInfo*)info {	[info retain];	[m_info release];	m_info = info;		if(m_info) {		[self setName:[m_info name]];		[self setInternalId:[m_info internalId]];		[self setExternalId:[m_info externalId]];		[self setParentId:[m_info parentId]];	}}- (BOOL)permanent {	return m_permanent;}- (void)setPermanent:(BOOL)permanent {	m_permanent = permanent;}- (char)tempType {	return m_tempType;}- (void)setTempType:(char)tempType {	m_tempType = tempType;}- (NSMutableArray*)subClusters {	return m_subClusters;}- (void)setSubClusters:(NSMutableArray*)subClusters {	[subClusters retain];	[m_subClusters release];	m_subClusters = subClusters;}- (void)addSubCluster:(Cluster*)subCluster {	[m_subClusters addObject:subCluster];}- (void)removeSubCluster:(Cluster*)subCluster {	[m_subClusters removeObject:subCluster];}- (int)memberCount {	return [m_members count];}- (int)onlineMemberCount {	int count = 0;	NSEnumerator* e = [m_members objectEnumerator];	while(User* user = [e nextObject]) {		if([user isVisible])			count++;	}	return count;}- (User*)memberAtIndex:(int)index {	if(index < 0 || index >= [m_members count])		return nil;	return [m_members objectAtIndex:index];}- (void)setMembers:(NSMutableArray*)members {	[m_members addObjectsFromArray:members];}- (NSMutableArray*)members {	return m_members;}- (void)addOrganization:(Organization*)org {	[org setClusterInternalId:m_internalId];	[m_organizations setObject:org forKey:[NSNumber numberWithInt:[org ID]]];}- (Organization*)organization:(UInt8)ID {	return [m_organizations objectForKey:[NSNumber numberWithInt:ID]];}- (NSMutableDictionary*)organizations {	return m_organizations;}- (void)setOrganizations:(NSMutableDictionary*)org {	[org retain];	[m_organizations release];	m_organizations = org;}- (int)organizationCount:(int)level {	int ret = 0;	NSEnumerator* e = [m_organizations objectEnumerator];	while(Organization* org = [e nextObject]) {		if([org level] == level)			ret++;	}	return ret;}- (int)unorganizedMemberCount {	int ret = 0;	NSEnumerator* e = [m_members objectEnumerator];	while(User* u = [e nextObject]) {		if([self organization:[u organization:m_internalId]] == nil)			ret++;	}	return ret;}- (User*)unorganizedMember:(int)index {	NSEnumerator* e = [m_members objectEnumerator];	while(User* u = [e nextObject]) {		if([self organization:[u organization:m_internalId]] == nil) {			index--;			if(index < 0)				return u;		}	}	return nil;}- (Organization*)organizationInLevel:(int)level index:(int)index {	NSEnumerator* e = [m_organizations objectEnumerator];	while(Organization* org = [e nextObject]) {		if([org level] == level) {			index--;			if(index < 0)				return org;		}	}	return nil;}- (char)notificationRight {	return m_notificationRight;}- (void)setNotificationRight:(char)right {	m_notificationRight = right;}- (char)messageSetting {	return m_messageSetting;}- (void)setMessageSetting:(char)messageSetting {	m_messageSetting = messageSetting;}- (BOOL)saveMessageSettingInServer {	return m_saveMessageSettingInServer;}- (void)setSaveMessageSettingInServer:(BOOL)save {	m_saveMessageSettingInServer = save;}- (UInt32)messageCount {	return m_messageCount;}- (void)setMessageCount:(UInt32)count {	NSNumber* oldCount = [NSNumber numberWithInt:m_messageCount];	m_messageCount = count;		[[NSNotificationCenter defaultCenter] postNotificationName:kModelMessageCountChangedNotificationName														object:self													  userInfo:[NSDictionary dictionaryWithObjectsAndKeys:oldCount, kUserInfoOldMessageCount, [NSNumber numberWithInt:count], kUserInfoNewMessageCount, m_domain, kUserInfoDomain, nil]];}- (int)frame {	return m_frame;}- (void)setFrame:(int)frame {	m_frame = frame;}- (NSString*)operationSuffix {	return m_operationSuffix;}- (void)setOperationSuffix:(NSString*)suffix {	[suffix retain];	[m_operationSuffix release];	m_operationSuffix = suffix;}- (UInt32)nameCardVersionId {	return m_nameCardVersionId;}- (void)setNameCardVersionId:(UInt32)versionId {	m_nameCardVersionId = versionId;}- (float)inputBoxProportion {	return m_inputBoxProportion;}- (void)setInputBoxProportion:(float)proportion {	m_inputBoxProportion = proportion;}- (MainWindowController*)domain {	return m_domain;}- (void)setDomain:(MainWindowController*)domain {	[domain retain];	[m_domain release];	m_domain = domain;}@end

⌨️ 快捷键说明

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