Introduce DebuggerModel, which will be updated by the BackEnd.
[macgdbp.git] / Source / BreakpointController.m
1 /*
2 * MacGDBp
3 * Copyright (c) 2007 - 2011, Blue Static <http://www.bluestatic.org>
4 *
5 * This program is free software; you can redistribute it and/or modify it under the terms of the GNU
6 * General Public License as published by the Free Software Foundation; either version 2 of the
7 * License, or (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
10 * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 * General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License along with this program; if not,
14 * write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
15 */
16
17 #import "BreakpointController.h"
18
19 #import "AppDelegate.h"
20
21 @implementation BreakpointController
22
23 @synthesize sourceView, arrayController;
24
25 /**
26 * Constructor
27 */
28 - (id)init
29 {
30 if (self = [super initWithWindowNibName:@"Breakpoints"])
31 {
32 manager = [BreakpointManager sharedManager];
33 if ([[NSUserDefaults standardUserDefaults] boolForKey:@"BreakpointsWindowVisible"])
34 [[self window] orderBack:nil];
35 }
36 return self;
37 }
38
39 /**
40 * Adds a breakpoint by calling up a file chooser and selecting a file for
41 * breaking in
42 */
43 - (IBAction)addBreakpoint:(id)sender
44 {
45 NSOpenPanel* panel = [NSOpenPanel openPanel];
46
47 if ([panel runModal] != NSOKButton)
48 {
49 return;
50 }
51
52 [sourceView setFile:[panel filename]];
53 }
54
55 /**
56 * Removes a breakpoint
57 */
58 - (IBAction)removeBreakpoint:(id)sender
59 {
60 NSArray* selection = [arrayController selectedObjects];
61 if ([selection count] < 1)
62 {
63 return;
64 }
65
66 for (Breakpoint* bp in selection)
67 {
68 [manager removeBreakpointAt:[bp line] inFile:[bp file]];
69 }
70 }
71
72 #pragma mark NSTableView Delegate
73
74 /**
75 * NSTableView delegate method that informs the controller that the stack selection did change and that
76 * we should update the source viewer
77 */
78 - (void)tableViewSelectionDidChange:(NSNotification*)notif
79 {
80 NSArray* selection = [arrayController selectedObjects];
81 if ([selection count] < 1)
82 {
83 return;
84 }
85
86 Breakpoint* bp = [selection objectAtIndex:0];
87 [sourceView setFile:[bp file]];
88 [sourceView scrollToLine:[bp line]];
89 [sourceView setMarkers:[NSSet setWithArray:[manager breakpointsForFile:[bp file]]]];
90 }
91
92 #pragma mark BSSourceView Delegate
93
94 /**
95 * The gutter was clicked, which indicates that a breakpoint needs to be changed
96 */
97 - (void)gutterClickedAtLine:(NSUInteger)line forFile:(NSString*)file
98 {
99 if ([manager hasBreakpointAt:line inFile:file])
100 {
101 [manager removeBreakpointAt:line inFile:file];
102 }
103 else
104 {
105 Breakpoint* bp = [[Breakpoint alloc] initWithLine:line inFile:file];
106 [manager addBreakpoint:bp];
107 [bp release];
108 }
109
110 [sourceView setMarkers:[NSSet setWithArray:[manager breakpointsForFile:file]]];
111 [sourceView setNeedsDisplay:YES];
112 }
113
114 /**
115 * Accepts a file dragged to set the contents of the display.
116 */
117 - (BOOL)sourceView:(BSSourceView*)sv acceptsDropOfFile:(NSString*)filename
118 {
119 return YES;
120 }
121
122 @end