Replace explicit |-display| with |-setNeedsDisplay:YES| when updating the source...
[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 #import "PreferenceNames.h"
21
22 @implementation BreakpointController
23
24 @synthesize sourceView, arrayController;
25
26 /**
27 * Constructor
28 */
29 - (id)init
30 {
31 if (self = [super initWithWindowNibName:@"Breakpoints"])
32 {
33 manager = [BreakpointManager sharedManager];
34 if ([[NSUserDefaults standardUserDefaults] boolForKey:kPrefBreakpointsWindowVisible])
35 [[self window] orderBack:nil];
36 }
37 return self;
38 }
39
40 /**
41 * Adds a breakpoint by calling up a file chooser and selecting a file for
42 * breaking in
43 */
44 - (IBAction)addBreakpoint:(id)sender
45 {
46 NSOpenPanel* panel = [NSOpenPanel openPanel];
47
48 if ([panel runModal] != NSOKButton)
49 {
50 return;
51 }
52
53 [sourceView setFile:[[panel URL] path]];
54 }
55
56 /**
57 * Removes a breakpoint
58 */
59 - (IBAction)removeBreakpoint:(id)sender
60 {
61 NSArray* selection = [arrayController selectedObjects];
62 if ([selection count] < 1)
63 {
64 return;
65 }
66
67 for (Breakpoint* bp in selection)
68 {
69 [manager removeBreakpointAt:[bp line] inFile:[bp file]];
70 }
71 }
72
73 #pragma mark NSTableView Delegate
74
75 /**
76 * NSTableView delegate method that informs the controller that the stack selection did change and that
77 * we should update the source viewer
78 */
79 - (void)tableViewSelectionDidChange:(NSNotification*)notif
80 {
81 NSArray* selection = [arrayController selectedObjects];
82 if ([selection count] < 1)
83 {
84 return;
85 }
86
87 Breakpoint* bp = [selection objectAtIndex:0];
88 [sourceView setFile:[bp file]];
89 [sourceView scrollToLine:[bp line]];
90 [sourceView setMarkers:[NSSet setWithArray:[manager breakpointsForFile:[bp file]]]];
91 }
92
93 #pragma mark BSSourceView Delegate
94
95 /**
96 * The gutter was clicked, which indicates that a breakpoint needs to be changed
97 */
98 - (void)gutterClickedAtLine:(NSUInteger)line forFile:(NSString*)file
99 {
100 if ([manager hasBreakpointAt:line inFile:file])
101 {
102 [manager removeBreakpointAt:line inFile:file];
103 }
104 else
105 {
106 Breakpoint* bp = [[Breakpoint alloc] initWithLine:line inFile:file];
107 [manager addBreakpoint:bp];
108 [bp release];
109 }
110
111 [sourceView setMarkers:[NSSet setWithArray:[manager breakpointsForFile:file]]];
112 [sourceView setNeedsDisplay:YES];
113 }
114
115 /**
116 * Accepts a file dragged to set the contents of the display.
117 */
118 - (BOOL)sourceView:(BSSourceView*)sv acceptsDropOfFile:(NSString*)filename
119 {
120 return YES;
121 }
122
123 @end