VoiceMac/Classes/VoiceMac/Inbox/MGMInboxWindow.m

530 lines
23 KiB
Objective-C

//
// MGMInboxWindow.m
// VoiceMac
//
// Created by Mr. Gecko on 9/3/10.
// Copyright (c) 2011 Mr. Gecko's Media (James Coleman). http://mrgeckosmedia.com/
//
// Permission to use, copy, modify, and/or distribute this software for any purpose
// with or without fee is hereby granted, provided that the above copyright notice
// and this permission notice appear in all copies.
//
// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
// FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT,
// OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
// DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
// ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
//
#import "MGMInboxWindow.h"
#import "MGMInboxPlayWindow.h"
#import "MGMVoiceUser.h"
#import "MGMController.h"
#import "MGMSMSManager.h"
#import <VoiceBase/VoiceBase.h>
#import <MGMUsers/MGMUsers.h>
#import <Growl/GrowlApplicationBridge.h>
static NSMutableArray *sideItems;
NSString * const MGMSName = @"name";
NSString * const MGMSObjects = @"objects";
NSString * const MGMSSelectable = @"selectable";
NSString * const MGMSID = @"id";
@implementation MGMInboxWindow
+ (id)windowWithInstance:(MGMInstance *)theInstance {
return [[[self alloc] initWithInstance:theInstance] autorelease];
}
- (id)initWithInstance:(MGMInstance *)theInstance {
if ((self = [super init])) {
if (sideItems==nil) {
sideItems = [NSMutableArray new];
[sideItems addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"Inbox", MGMSName, [NSNumber numberWithBool:YES], MGMSSelectable, [NSNumber numberWithInt:0], MGMSID, nil]];
[sideItems addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"Starred", MGMSName, [NSNumber numberWithBool:YES], MGMSSelectable, [NSNumber numberWithInt:1], MGMSID, nil]];
[sideItems addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"Spam", MGMSName, [NSNumber numberWithBool:YES], MGMSSelectable, [NSNumber numberWithInt:2], MGMSID, nil]];
[sideItems addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"Trash", MGMSName, [NSNumber numberWithBool:YES], MGMSSelectable, [NSNumber numberWithInt:3], MGMSID, nil]];
NSMutableArray *history = [NSMutableArray array];
[history addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"Voicemail", MGMSName, [NSNumber numberWithBool:YES], MGMSSelectable, [NSNumber numberWithInt:4], MGMSID, nil]];
[history addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"SMS Messages", MGMSName, [NSNumber numberWithBool:YES], MGMSSelectable, [NSNumber numberWithInt:5], MGMSID, nil]];
[history addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"Recorded", MGMSName, [NSNumber numberWithBool:YES], MGMSSelectable, [NSNumber numberWithInt:6], MGMSID, nil]];
[history addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"Placed", MGMSName, [NSNumber numberWithBool:YES], MGMSSelectable, [NSNumber numberWithInt:7], MGMSID, nil]];
[history addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"Received", MGMSName, [NSNumber numberWithBool:YES], MGMSSelectable, [NSNumber numberWithInt:8], MGMSID, nil]];
[history addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"Missed", MGMSName, [NSNumber numberWithBool:YES], MGMSSelectable, [NSNumber numberWithInt:9], MGMSID, nil]];
[sideItems addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"History", MGMSName, [NSNumber numberWithBool:NO], MGMSSelectable, history, MGMSObjects, nil]];
}
instance = theInstance;
maxResults = 10;
}
return self;
}
- (void)awakeFromNib {
[inboxTable setTarget:self];
[inboxTable setDoubleAction:@selector(inboxAction:)];
[nextButton setEnabled:NO];
[previousButton setEnabled:NO];
progressStartCount = 0;
[inboxWindow setFrameAutosaveName:[@"inboxWindow" stringByAppendingString:[[instance user] settingForKey:MGMUserID]]];
[inboxWindow setTitle:[NSString stringWithFormat:@"%@ (%@)", [inboxWindow title], [[instance userNumber] readableNumber]]];
if ([splitView respondsToSelector:@selector(setAutosaveName:)])
[splitView setAutosaveName:[@"inboxSplitView" stringByAppendingString:[[instance user] settingForKey:MGMUserID]]];
[sidebarView setAutosaveName:[@"inboxSidebarView" stringByAppendingString:[[instance user] settingForKey:MGMUserID]]];
[sidebarView setAutosaveExpandedItems:YES];
}
- (void)dealloc {
[inboxWindow close];
[currentData release];
[super dealloc];
}
- (NSWindow *)inboxWindow {
return inboxWindow;
}
- (IBAction)showWindow:(id)sender {
if (inboxWindow==nil) {
if (![NSBundle loadNibNamed:@"InboxWindow" owner:self]) {
NSLog(@"Error: Unable to load Inbox Window!");
return;
}
}
if ([sender isKindOfClass:[NSMenuItem class]]) {
switch ([sender tag]) {
case 1:
[sidebarView expandItem:[sideItems objectAtIndex:4]];
[sidebarView selectRowIndexes:[NSIndexSet indexSetWithIndex:6] byExtendingSelection:NO];
[self outlineView:sidebarView shouldSelectItem:[[[sideItems objectAtIndex:4] objectForKey:MGMSObjects] objectAtIndex:1]];
break;
case 2:
[sidebarView expandItem:[sideItems objectAtIndex:4]];
[sidebarView selectRowIndexes:[NSIndexSet indexSetWithIndex:5] byExtendingSelection:NO];
[self outlineView:sidebarView shouldSelectItem:[[[sideItems objectAtIndex:4] objectForKey:MGMSObjects] objectAtIndex:0]];
break;
case 3:
[sidebarView expandItem:[sideItems objectAtIndex:4]];
[sidebarView selectRowIndexes:[NSIndexSet indexSetWithIndex:8] byExtendingSelection:NO];
[self outlineView:sidebarView shouldSelectItem:[[[sideItems objectAtIndex:4] objectForKey:MGMSObjects] objectAtIndex:3]];
break;
case 4:
[sidebarView expandItem:[sideItems objectAtIndex:4]];
[sidebarView selectRowIndexes:[NSIndexSet indexSetWithIndex:9] byExtendingSelection:NO];
[self outlineView:sidebarView shouldSelectItem:[[[sideItems objectAtIndex:4] objectForKey:MGMSObjects] objectAtIndex:4]];
break;
case 5:
[sidebarView expandItem:[sideItems objectAtIndex:4]];
[sidebarView selectRowIndexes:[NSIndexSet indexSetWithIndex:10] byExtendingSelection:NO];
[self outlineView:sidebarView shouldSelectItem:[[[sideItems objectAtIndex:4] objectForKey:MGMSObjects] objectAtIndex:5]];
break;
default:
[sidebarView selectRowIndexes:[NSIndexSet indexSetWithIndex:0] byExtendingSelection:NO];
[self outlineView:sidebarView shouldSelectItem:[sideItems objectAtIndex:0]];
break;
}
} else if (sender!=self) {
[sidebarView selectRowIndexes:[NSIndexSet indexSetWithIndex:0] byExtendingSelection:NO];
[self outlineView:sidebarView shouldSelectItem:[sideItems objectAtIndex:0]];
} else {
start = 0;
[sidebarView expandItem:[sideItems objectAtIndex:4]];
[sidebarView selectRowIndexes:[NSIndexSet indexSetWithIndex:5] byExtendingSelection:NO];
currentInbox = 4;
[pageField setStringValue:@"Page 1"];
}
[sidebarView setAllowsEmptySelection:NO];
[inboxWindow makeKeyAndOrderFront:self];
}
- (void)closeWindow {
[inboxWindow close];
}
- (void)startProgress {
if (progressStartCount==0)
[progress startAnimation:self];
progressStartCount++;
}
- (void)stopProgress {
if (progressStartCount==1)
[progress stopAnimation:self];
progressStartCount--;
}
- (void)checkVoicemail {
[[instance inbox] getVoicemailForPage:1 delegate:self didFailWithError:@selector(voicemail:didFailWithError:instance:) didReceiveInfo:@selector(voicemailGotInfo:instance:)];
}
- (void)voicemail:(MGMDelegateInfo *)theInfo didFailWithError:(NSError *)theError instance:(MGMInstance *)theInstance {
NSLog(@"Voicemail Error: %@ for instance: %@", theError, theInstance);
}
- (void)voicemailGotInfo:(NSArray *)theMessages instance:(MGMInstance *)theInstance {
NSDate *newestDate = [NSDate distantPast];
BOOL newMessage = NO;
for (unsigned int i=0; i<[theMessages count]; i++) {
if (![[[theMessages objectAtIndex:i] objectForKey:MGMIRead] boolValue] && (lastDate==nil || (![lastDate isEqual:[[theMessages objectAtIndex:i] objectForKey:MGMITime]] && [lastDate earlierDate:[[theMessages objectAtIndex:i] objectForKey:MGMITime]]==lastDate))) {
[GrowlApplicationBridge notifyWithTitle:[NSString stringWithFormat:@"Voicemail from %@", [[instance contacts] nameForNumber:[[theMessages objectAtIndex:i] objectForKey:MGMIPhoneNumber]]] description:[[[theMessages objectAtIndex:i] objectForKey:MGMIText] flattenHTML] notificationName:@"Voicemail" iconData:[[instance contacts] photoDataForNumber:[[theMessages objectAtIndex:i] objectForKey:MGMIPhoneNumber]] priority:0 isSticky:NO clickContext:nil];
newMessage = YES;
if ([newestDate earlierDate:[[theMessages objectAtIndex:i] objectForKey:MGMITime]]==newestDate)
newestDate = [[theMessages objectAtIndex:i] objectForKey:MGMITime];
}
}
if (newMessage) {
[lastDate release];
lastDate = [newestDate copy];
[self setCurrentData:theMessages];
[self showWindow:self];
[[[(MGMVoiceUser *)[instance delegate] controller] themeManager] playSound:MGMTSVoicemail];
}
}
- (NSInteger)outlineView:(NSOutlineView *)outlineView numberOfChildrenOfItem:(id)item {
return (item==nil ? [sideItems count] : ([item objectForKey:MGMSObjects]!=nil ? [[item objectForKey:MGMSObjects] count] : 0));
}
- (BOOL)outlineView:(NSOutlineView *)outlineView isItemExpandable:(id)item {
return (item!=nil ? ([item objectForKey:MGMSObjects]!=nil && [[item objectForKey:MGMSObjects] count]>0) : NO);
}
- (id)outlineView:(NSOutlineView *)outlineView child:(NSInteger)index ofItem:(id)item {
return (item==nil ? [sideItems objectAtIndex:index] : [[item objectForKey:MGMSObjects] objectAtIndex:index]);
}
- (id)outlineView:(NSOutlineView *)outlineView objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item {
return [item objectForKey:MGMSName];
}
- (BOOL)outlineView:(NSOutlineView *)outlineView shouldSelectItem:(id)item {
if ([item objectForKey:MGMSSelectable]!=nil && ![[item objectForKey:MGMSSelectable] boolValue])
return NO;
[self setCurrentData:nil];
if ([item objectForKey:MGMSID]!=nil) {
currentInbox = [[item objectForKey:MGMSID] intValue];
start = 0;
[self loadInbox];
}
return YES;
}
- (IBAction)next:(id)sender {
start += maxResults;
[self loadInbox];
}
- (IBAction)previous:(id)sender {
start -= maxResults;
[self loadInbox];
}
- (void)loadInbox {
int page = (start/maxResults)+1;
[nextButton setEnabled:NO];
[previousButton setEnabled:NO];
[pageField setStringValue:[NSString stringWithFormat:@"Page %d", page]];
[self startProgress];
switch (currentInbox) {
case 0:
[[instance inbox] getInboxForPage:page delegate:self didFailWithError:@selector(inbox:didFailWithError:instance:) didReceiveInfo:@selector(inboxGotInfo:instance:)];
break;
case 1:
[[instance inbox] getStarredForPage:page delegate:self didFailWithError:@selector(inbox:didFailWithError:instance:) didReceiveInfo:@selector(inboxGotInfo:instance:)];
break;
case 2:
[[instance inbox] getSpamForPage:page delegate:self didFailWithError:@selector(inbox:didFailWithError:instance:) didReceiveInfo:@selector(inboxGotInfo:instance:)];
break;
case 3:
[[instance inbox] getTrashForPage:page delegate:self didFailWithError:@selector(inbox:didFailWithError:instance:) didReceiveInfo:@selector(inboxGotInfo:instance:)];
break;
case 4:
[[instance inbox] getVoicemailForPage:page delegate:self didFailWithError:@selector(inbox:didFailWithError:instance:) didReceiveInfo:@selector(inboxGotInfo:instance:)];
break;
case 5:
[[instance inbox] getSMSForPage:page delegate:self didFailWithError:@selector(inbox:didFailWithError:instance:) didReceiveInfo:@selector(inboxGotInfo:instance:)];
break;
case 6:
[[instance inbox] getRecordedCallsForPage:page delegate:self didFailWithError:@selector(inbox:didFailWithError:instance:) didReceiveInfo:@selector(inboxGotInfo:instance:)];
break;
case 7:
[[instance inbox] getPlacedCallsForPage:page delegate:self didFailWithError:@selector(inbox:didFailWithError:instance:) didReceiveInfo:@selector(inboxGotInfo:instance:)];
break;
case 8:
[[instance inbox] getReceivedCallsForPage:page delegate:self didFailWithError:@selector(inbox:didFailWithError:instance:) didReceiveInfo:@selector(inboxGotInfo:instance:)];
break;
case 9:
[[instance inbox] getMissedCallsForPage:page delegate:self didFailWithError:@selector(inbox:didFailWithError:instance:) didReceiveInfo:@selector(inboxGotInfo:instance:)];
break;
}
}
- (void)inbox:(MGMDelegateInfo *)theInfo didFailWithError:(NSError *)theError instance:(MGMInstance *)theInstance {
NSLog(@"Inbox Error: %@ for instance: %@", theError, theInstance);
NSAlert *alert = [[NSAlert new] autorelease];
[alert setMessageText:@"Error loading inbox"];
[alert setInformativeText:[theError localizedDescription]];
[alert runModal];
[self stopProgress];
}
- (void)inboxGotInfo:(NSArray *)theInfo instance:(MGMInstance *)theInstance {
if (theInfo!=nil) {
[self setCurrentData:theInfo];
} else {
NSLog(@"Error 234554: Hold on, this should never happen.");
}
[self stopProgress];
}
- (int)currentInbox {
return currentInbox;
}
- (void)setCurrentData:(NSArray *)theData {
[currentData release];
currentData = [theData mutableCopy];
resultsCount = [currentData count];
if (resultsCount==maxResults)
[nextButton setEnabled:YES];
else
[nextButton setEnabled:NO];
if (start!=0)
[previousButton setEnabled:YES];
else
[previousButton setEnabled:NO];
[inboxTable reloadData];
}
- (NSDictionary *)selectedItem {
if (inboxTable==nil || [inboxTable selectedRow]==-1)
return nil;
return [currentData objectAtIndex:[inboxTable selectedRow]];
}
- (NSString *)currentPhoneNumber {
if (inboxTable==nil || [inboxTable selectedRow]==-1)
return nil;
return [[currentData objectAtIndex:[inboxTable selectedRow]] objectForKey:MGMIPhoneNumber];
}
- (NSURL *)audioURL {
if (inboxTable==nil || [inboxTable selectedRow]==-1)
return nil;
NSDictionary *data = [currentData objectAtIndex:[inboxTable selectedRow]];
if ([[data objectForKey:MGMIType] intValue]==MGMIVoicemailType || [[data objectForKey:MGMIType] intValue]==MGMIRecordedType)
return [NSURL URLWithString:[NSString stringWithFormat:MGMIVoiceMailDownloadURL, [[data objectForKey:MGMIID] addPercentEscapes]]];
return nil;
}
- (IBAction)spam:(id)sender {
if (inboxTable==nil || [inboxTable selectedRow]==-1)
return;
NSMutableDictionary *data = [currentData objectAtIndex:[inboxTable selectedRow]];
[self startProgress];
[[instance inbox] reportEntries:[NSArray arrayWithObject:[data objectForKey:MGMIID]] delegate:self];
[currentData removeObject:data];
[inboxTable reloadData];
}
- (IBAction)report:(MGMDelegateInfo *)theInfo didFailWithError:(NSError *)theError instance:(MGMInstance *)theInstance {
NSLog(@"Report Error: %@ for instance: %@", theError, theInstance);
NSAlert *alert = [[NSAlert new] autorelease];
[alert setMessageText:@"Error reporting"];
[alert setInformativeText:[theError localizedDescription]];
[alert runModal];
[self stopProgress];
}
- (void)reportDidFinish:(MGMDelegateInfo *)theInfo instance:(MGMInstance *)theInstance {
[self loadInbox];
[self stopProgress];
}
- (IBAction)markRead:(id)sender {
if (inboxTable==nil || [inboxTable selectedRow]==-1)
return;
NSMutableDictionary *data = [NSMutableDictionary dictionaryWithDictionary:[currentData objectAtIndex:[inboxTable selectedRow]]];
[[instance inbox] markEntries:[NSArray arrayWithObject:[data objectForKey:MGMIID]] read:![[data objectForKey:MGMIRead] boolValue] delegate:self];
[data setObject:[NSNumber numberWithBool:![[data objectForKey:MGMIRead] boolValue]] forKey:MGMIRead];
[currentData replaceObjectAtIndex:[inboxTable selectedRow] withObject:data];
[inboxTable reloadData];
}
- (IBAction)delete:(id)sender {
if (inboxTable==nil || [inboxTable selectedRow]==-1)
return;
NSDictionary *data = [currentData objectAtIndex:[inboxTable selectedRow]];
[self startProgress];
if (currentInbox==3)
[[instance inbox] deleteEntriesForever:[NSArray arrayWithObject:[data objectForKey:MGMIID]] delegate:self];
else
[[instance inbox] deleteEntries:[NSArray arrayWithObject:[data objectForKey:MGMIID]] delegate:self];
[currentData removeObject:data];
[inboxTable reloadData];
}
- (IBAction)undelete:(id)sender {
if (inboxTable==nil || [inboxTable selectedRow]==-1)
return;
NSDictionary *data = [currentData objectAtIndex:[inboxTable selectedRow]];
[self startProgress];
[[instance inbox] deleteEntries:[NSArray arrayWithObject:[data objectForKey:MGMIID]] delegate:self];
[currentData removeObject:data];
[inboxTable reloadData];
}
- (void)delete:(MGMDelegateInfo *)theInfo didFailWithError:(NSError *)theError instance:(MGMInstance *)theInstance {
NSLog(@"Delete Error: %@ for instance: %@", theError, theInstance);
NSAlert *alert = [[NSAlert new] autorelease];
[alert setMessageText:@"Error deleting"];
[alert setInformativeText:[theError localizedDescription]];
[alert runModal];
[self stopProgress];
}
- (void)deleteDidFinish:(MGMDelegateInfo *)theInfo instance:(MGMInstance *)theInstance {
[self loadInbox];
[self stopProgress];
}
- (NSInteger)numberOfRowsInTableView:(NSTableView *)aTableView {
return [currentData count];
}
- (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex {
NSDictionary *data = [currentData objectAtIndex:rowIndex];
NSString *identifier = [aTableColumn identifier];
if ([identifier isEqual:@"read"]) {
return ([[data objectForKey:MGMIRead] boolValue] ? @"" : @"");
} else if ([identifier isEqual:@"name"]) {
NSString *name = [[instance contacts] nameForNumber:[data objectForKey:MGMIPhoneNumber]];
NSString *number = [[data objectForKey:MGMIPhoneNumber] readableNumber];
if ([name isEqual:number])
return number;
return [NSString stringWithFormat:@"%@ (%@)", name, number];
} else if ([identifier isEqual:@"text"]) {
int type = [[data objectForKey:MGMIType] intValue];
if (type==MGMIVoicemailType) {
return [data objectForKey:MGMIText];
} else if (type==MGMISMSInType || type==MGMISMSOutType) {
return [[[[data objectForKey:MGMIMessages] lastObject] objectForKey:MGMIText] flattenHTML];
} else {
return [[[data objectForKey:MGMIPhoneNumber] areaCode] areaCodeLocation];
}
} else if ([identifier isEqual:@"date"]) {
NSDateFormatter *formatter = [[NSDateFormatter new] autorelease];
[formatter setDateFormat:@"M/d/yy h:mm:ss a"];
return [formatter stringFromDate:[data objectForKey:MGMITime]];
}
return nil;
}
- (IBAction)inboxAction:(id)sender {
NSDictionary *data = [currentData objectAtIndex:[inboxTable selectedRow]];
int type = [[data objectForKey:MGMIType] intValue];
if (type==MGMIVoicemailType) {
NSArray *cookies = [[instance cookieStorage] cookies];
for (int i=0; i<[cookies count]; i++) {
NSHTTPCookie *cookie = [cookies objectAtIndex:i];
if ([[cookie path] isEqual:@"/voice"] && [[cookie name] isEqual:@"gv"])
[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];
}
MGMInboxPlayWindow *playWindow = [[MGMInboxPlayWindow alloc] initWithNibNamed:@"VoicemailView" data:data instance:instance];
NSRect rowRect = [inboxTable rectOfRow:[inboxTable selectedRow]];
rowRect.origin = [[inboxWindow contentView] convertPoint:rowRect.origin fromView:inboxTable];
rowRect.origin = [inboxWindow convertBaseToScreen:rowRect.origin];
rowRect.origin.y -= ([playWindow frame].size.height+20);
rowRect.origin.x += ((rowRect.size.width-[playWindow frame].size.width)/2);
[playWindow setFrameOrigin:rowRect.origin];
[playWindow makeKeyAndOrderFront:self];
} else if (type==MGMIRecordedType) {
NSArray *cookies = [[instance cookieStorage] cookies];
for (int i=0; i<[cookies count]; i++) {
NSHTTPCookie *cookie = [cookies objectAtIndex:i];
if ([[cookie path] isEqual:@"/voice"] && [[cookie name] isEqual:@"gv"])
[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];
}
MGMInboxPlayWindow *playWindow = [[MGMInboxPlayWindow alloc] initWithNibNamed:@"RecordedView" data:data instance:instance];
NSRect rowRect = [inboxTable rectOfRow:[inboxTable selectedRow]];
rowRect.origin = [[inboxWindow contentView] convertPoint:rowRect.origin fromView:inboxTable];
rowRect.origin = [inboxWindow convertBaseToScreen:rowRect.origin];
rowRect.origin.y -= ([playWindow frame].size.height+20);
rowRect.origin.x += ((rowRect.size.width-[playWindow frame].size.width)/2);
[playWindow setFrameOrigin:rowRect.origin];
[playWindow makeKeyAndOrderFront:self];
} else if (type==MGMISMSInType || type==MGMISMSOutType) {
[[[(MGMVoiceUser *)[instance delegate] controller] SMSManager] messageWithData:data instance:instance];
} else {
[(MGMVoiceUser *)[instance delegate] runAction:sender];
}
if (![[data objectForKey:MGMIRead] boolValue])
[self markRead:self];
}
#if (MAC_OS_X_VERSION_MAX_ALLOWED >= 1060)
- (float)splitView:(NSSplitView *)sender constrainMinCoordinate:(float)proposedMin ofSubviewAt:(int)offset
#else
- (CGFloat)splitView:(NSSplitView *)sender constrainMinCoordinate:(CGFloat)proposedMin ofSubviewAt:(NSInteger)offset
#endif
{
leftMax = [[[sender subviews] objectAtIndex:0] frame].size.width;
rightMax = [[[sender subviews] objectAtIndex:1] frame].size.width;
return 0.0;
}
#if (MAC_OS_X_VERSION_MAX_ALLOWED >= 1060)
- (float)splitView:(NSSplitView *)sender constrainMaxCoordinate:(float)proposedMax ofSubviewAt:(int)offset
#else
- (CGFloat)splitView:(NSSplitView *)sender constrainMaxCoordinate:(CGFloat)proposedMax ofSubviewAt:(NSInteger)offset
#endif
{
leftMax = [[[sender subviews] objectAtIndex:0] frame].size.width;
rightMax = [[[sender subviews] objectAtIndex:1] frame].size.width;
return proposedMax - 250.0;
}
- (void)splitView:(NSSplitView *)sender resizeSubviewsWithOldSize:(NSSize)oldSize {
NSRect newFrame = [sender frame];
if (newFrame.size.width == oldSize.width) {
[sender adjustSubviews];
return;
}
NSView *left = [[sender subviews] objectAtIndex:0];
NSRect leftFrame = [left frame];
NSView *right = [[sender subviews] objectAtIndex:1];
NSRect rightFrame = [right frame];
if (rightFrame.size.width<250.0) {
rightMax = newFrame.size.width-(250.0+[sender dividerThickness]);
rightFrame.size.width = rightMax;
}
if (rightMax<250.0)
rightMax = 250.0;
if (leftFrame.size.width < leftMax || leftFrame.size.width > leftMax)
leftFrame.size.width = leftMax;
[left setFrame:leftFrame];
[right setFrame:rightFrame];
}
- (void)windowDidBecomeKey:(NSNotification *)notification {
[sidebarView display];
[(MGMVoiceUser *)[instance delegate] windowDidBecomeKey:notification];
}
- (void)windowDidResignKey:(NSNotification *)notification {
[sidebarView display];
}
- (void)windowWillClose:(NSNotification *)notification {
[self setCurrentData:nil];
[inboxWindow setDelegate:nil];
inboxWindow = nil;
splitView = nil;
sidebarView = nil;
inboxTable = nil;
nextButton = nil;
previousButton = nil;
pageField = nil;
progress = nil;
}
@end
@implementation MGMInboxTableView
- (void)keyDown:(NSEvent *)theEvent {
int keyCode = [theEvent keyCode];
if (keyCode==51 || keyCode==117) {
if ([inboxWindow currentInbox]==3 && [theEvent modifierFlags] & NSAlternateKeyMask)
[inboxWindow undelete:self];
else
[inboxWindow delete:self];
} else {
[super keyDown:theEvent];
}
}
- (void)copy:(id)sender {
NSString *phoneNumber = [inboxWindow currentPhoneNumber];
if (phoneNumber==nil) {
NSBeep();
return;
}
NSPasteboard *pasteBoard = [NSPasteboard generalPasteboard];
[pasteBoard declareTypes:[NSArray arrayWithObjects:NSStringPboardType, nil] owner:nil];
[pasteBoard setString:[phoneNumber readableNumber] forType:NSStringPboardType];
}
@end