Add drag and drop for the table view.
[macgdbp.git] / Source / BreakpointManager.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 "BreakpointManager.h"
18 #import "AppDelegate.h"
19
20 @interface BreakpointManager (Private)
21 - (void)updateDisplaysForFile:(NSString*)file;
22 @end
23
24 @implementation BreakpointManager
25
26 @synthesize breakpoints, connection;
27
28 /**
29 * Initializer
30 */
31 - (id)init
32 {
33 if (self = [super init])
34 {
35 if (!breakpoints)
36 {
37 breakpoints = [[NSMutableArray alloc] init];
38 }
39
40 savedBreakpoints = [[[NSUserDefaults standardUserDefaults] mutableArrayValueForKey:@"Breakpoints"] retain];
41 if (savedBreakpoints)
42 {
43 for (NSDictionary* d in savedBreakpoints)
44 {
45 [breakpoints addObject:[[[Breakpoint alloc] initWithDictionary:d] autorelease]];
46 }
47 }
48 }
49 return self;
50 }
51
52 /**
53 * Returns the shared manager (singleton)
54 */
55 + (BreakpointManager*)sharedManager
56 {
57 static BreakpointManager* manager;
58 if (!manager)
59 {
60 manager = [[BreakpointManager alloc] init];
61 }
62 return manager;
63 }
64
65 /**
66 * Registers a breakpoint at a given line
67 */
68 - (void)addBreakpoint:(Breakpoint*)bp;
69 {
70 if (![breakpoints containsObject:bp]) {
71 [breakpoints addObject:bp];
72 if (bp.line > 0) {
73 [connection addBreakpoint:bp];
74
75 [savedBreakpoints addObject:[bp dictionary]];
76 [[NSUserDefaults standardUserDefaults] setValue:savedBreakpoints forKey:@"Breakpoints"];
77 }
78
79 [self updateDisplaysForFile:[bp file]];
80 }
81 }
82
83 /**
84 * Removes a breakpoint at a given line/file combination, or nil if nothing was removed
85 */
86 - (Breakpoint*)removeBreakpointAt:(int)line inFile:(NSString*)file
87 {
88 for (Breakpoint* b in breakpoints)
89 {
90 if ([b line] == line && [[b file] isEqualToString:file])
91 {
92 [breakpoints removeObject:b];
93 if (b.line > 0)
94 [connection removeBreakpoint:b];
95
96 [savedBreakpoints removeObject:[b dictionary]];
97 [[NSUserDefaults standardUserDefaults] setValue:savedBreakpoints forKey:@"Breakpoints"];
98
99 [self updateDisplaysForFile:file];
100 return b;
101 }
102 }
103 return nil;
104 }
105
106 /**
107 * Returns all the breakpoints for a given file
108 */
109 - (NSArray*)breakpointsForFile:(NSString*)file
110 {
111 NSMutableArray* matches = [NSMutableArray array];
112 for (Breakpoint* b in breakpoints)
113 {
114 if ([[b file] isEqualToString:file] && [b line] > 0)
115 {
116 [matches addObject:b];
117 }
118 }
119
120 return matches;
121 }
122
123 /**
124 * Checks to see if a given file has a breakpoint on a given line
125 */
126 - (BOOL)hasBreakpointAt:(int)line inFile:(NSString*)file
127 {
128 return [breakpoints containsObject:[[[Breakpoint alloc] initWithLine:line inFile:file] autorelease]];
129 }
130
131 #pragma mark Private
132
133 /**
134 * This marks BSSourceView needsDisplay, rearranges the objects in the breakpoints controller,
135 * and sets the markers for the BSLineNumberView
136 */
137 - (void)updateDisplaysForFile:(NSString*)file
138 {
139 AppDelegate* appDel = [NSApp delegate];
140 [[[appDel breakpoint] arrayController] rearrangeObjects];
141 [[[appDel breakpoint] sourceView] setNeedsDisplay:YES];
142 [[[[appDel breakpoint] sourceView] numberView] setMarkers:[NSSet setWithArray:[self breakpointsForFile:file]]];
143 [[[appDel debugger] sourceViewer] setNeedsDisplay:YES];
144 [[[[appDel debugger] sourceViewer] numberView] setMarkers:[NSSet setWithArray:[self breakpointsForFile:file]]];
145 }
146
147 @end