Deprecated: Assigning the return value of new by reference is deprecated in /home/bluestat/public_html/source/index.php on line 477
MacGDBp - Blob - ViewGit - Blue Static
/*
 * MacGDBp
 * Copyright (c) 2007 - 2009, Blue Static <http://www.bluestatic.org>
 *
 * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
 */

#import "BreakpointManager.h"
#import "AppDelegate.h"

@interface BreakpointManager (Private)
- (void)updateDisplaysForFile:(NSString*)file;
@end

@implementation BreakpointManager

@synthesize breakpoints, connection;

/**
 * Initializer
 */
- (id)init
{
	if (self = [super init])
	{
		if (!breakpoints)
		{
			breakpoints = [[NSMutableArray alloc] init];
		}

		savedBreakpoints = [[[NSUserDefaults standardUserDefaults] mutableArrayValueForKey:@"Breakpoints"] retain];
		if (savedBreakpoints)
		{
			for (NSDictionary* d in savedBreakpoints)
			{
				[breakpoints addObject:[[[Breakpoint alloc] initWithDictionary:d] autorelease]];
			}
		}
	}
	return self;
}

/**
 * Returns the shared manager (singleton)
 */
+ (BreakpointManager*)sharedManager
{
	static BreakpointManager* manager;
	if (!manager)
	{
		manager = [[BreakpointManager alloc] init];
	}
	return manager;
}

/**
 * Registers a breakpoint at a given line
 */
- (void)addBreakpoint:(Breakpoint*)bp;
{
	if (![breakpoints containsObject:bp])
	{
		[breakpoints addObject:bp];
		[connection addBreakpoint:bp];

		[savedBreakpoints addObject:[bp dictionary]];
		[[NSUserDefaults standardUserDefaults] setValue:savedBreakpoints forKey:@"Breakpoints"];

		[self updateDisplaysForFile:[bp file]];
	}
}

/**
 * Removes a breakpoint at a given line/file combination, or nil if nothing was removed
 */
- (Breakpoint*)removeBreakpointAt:(int)line inFile:(NSString*)file
{
	for (Breakpoint* b in breakpoints)
	{
		if ([b line] == line && [[b file] isEqualToString:file])
		{
			[breakpoints removeObject:b];
			[connection removeBreakpoint:b];

			[savedBreakpoints removeObject:[b dictionary]];
			[[NSUserDefaults standardUserDefaults] setValue:savedBreakpoints forKey:@"Breakpoints"];

			[self updateDisplaysForFile:file];
			return b;
		}
	}
	return nil;
}

/**
 * Returns all the breakpoints for a given file
 */
- (NSArray*)breakpointsForFile:(NSString*)file
{
	NSMutableArray* matches = [NSMutableArray array];
	for (Breakpoint* b in breakpoints)
	{
		if ([[b file] isEqualToString:file])
		{
			[matches addObject:b];
		}
	}

	return matches;
}

/**
 * Checks to see if a given file has a breakpoint on a given line
 */
- (BOOL)hasBreakpointAt:(int)line inFile:(NSString*)file
{
	return [breakpoints containsObject:[[[Breakpoint alloc] initWithLine:line inFile:file] autorelease]];
}

#pragma mark Private

/**
 * This marks BSSourceView needsDisplay, rearranges the objects in the breakpoints controller,
 * and sets the markers for the BSLineNumberView
 */
- (void)updateDisplaysForFile:(NSString*)file
{
	AppDelegate* appDel = [NSApp delegate];
	[[[appDel breakpoint] arrayController] rearrangeObjects];
	[[[appDel breakpoint] sourceView] setNeedsDisplay:YES];
	[[[[appDel breakpoint] sourceView] numberView] setMarkers:[NSSet setWithArray:[self breakpointsForFile:file]]];
	[[[appDel debugger] sourceViewer] setNeedsDisplay:YES];
	[[[[appDel debugger] sourceViewer] numberView] setMarkers:[NSSet setWithArray:[self breakpointsForFile:file]]];
}

@end