diff options
Diffstat (limited to 'frontends/cocoa/Tree.m')
-rw-r--r-- | frontends/cocoa/Tree.m | 143 |
1 files changed, 143 insertions, 0 deletions
diff --git a/frontends/cocoa/Tree.m b/frontends/cocoa/Tree.m new file mode 100644 index 000000000..1b834691e --- /dev/null +++ b/frontends/cocoa/Tree.m @@ -0,0 +1,143 @@ +/* + * Copyright 2011 Sven Weidauer <sven.weidauer@gmail.com> + * + * This file is part of NetSurf, http://www.netsurf-browser.org/ + * + * NetSurf 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; version 2 of the License. + * + * NetSurf 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, see <http://www.gnu.org/licenses/>. + */ + +#import "cocoa/Tree.h" +#import "cocoa/coordinates.h" +#import "cocoa/font.h" +#import "cocoa/plotter.h" + +#import "utils/errors.h" +#import "netsurf/plotters.h" +#import "cocoa/desktop-tree.h" + +@implementation Tree + +static void tree_redraw_request(int x, int y, int w, int h, void *data); +static void tree_resized(struct tree *tree, int w, int h, void *data); +static void tree_scroll_visible(int y, int height, void *data); +static void tree_get_window_dimensions(int *width, int *height, void *data); + +static const struct treeview_table cocoa_tree_callbacks = { + .redraw_request = tree_redraw_request, + .resized = tree_resized, + .scroll_visible = tree_scroll_visible, + .get_window_dimensions = tree_get_window_dimensions +}; + +- (instancetype)initWithFlags:(unsigned int)flags +{ + if ((self = [super init]) == nil) + return nil; + + _tree = tree_create(flags, &cocoa_tree_callbacks, (__bridge void *)self); + if (_tree == NULL) { + return nil; + } + + return self; +} + +- (void)dealloc +{ + tree_delete(_tree); +} + +- (void)setRedrawing:(BOOL)newRedrawing +{ +} + +//MARK: - +//MARK: Callbacks + +static void tree_redraw_request(int x, int y, int w, int h, void *data) +{ + Tree *tree = (__bridge Tree *)data; + [tree.delegate tree:tree requestedRedrawInRect:cocoa_rect_wh(x, y, w, h)]; +} + +static void tree_resized(struct tree *tree, int w, int h, void *data) +{ + Tree *cocoaTree = (__bridge Tree *)data; + [cocoaTree.delegate tree:cocoaTree resized:cocoa_size(w, h)]; +} + +static void tree_scroll_visible(int y, int height, void *data) +{ + Tree *tree = (__bridge Tree *)data; + [tree.delegate tree:tree scrollPoint:cocoa_point(0, y)]; +} + +static void tree_get_window_dimensions(int *width, int *height, void *data) +{ + Tree *tree = (__bridge Tree *)data; + id<TreeDelegate> delegate = tree.delegate; + + if (delegate == nil) { + return; + } + + NSSize size = [delegate treeWindowSize:tree]; + + if (width != NULL) { + *width = cocoa_pt_to_px(size.width); + } + + if (height != NULL) { + *height = cocoa_pt_to_px(size.height); + } +} + +@end + +@implementation Tree (ViewInterface) + +- (void)drawRect:(NSRect)rect inView:(NSView *)view +{ + struct redraw_context ctx = { + .interactive = true, + .background_images = true, + .plot = &cocoa_plotters + }; + + tree_draw(self.tree, 0, 0, + cocoa_pt_to_px(NSMinX(rect)), + cocoa_pt_to_px(NSMinY(rect)), + cocoa_pt_to_px(NSWidth(rect)), + cocoa_pt_to_px(NSHeight(rect)), + &ctx); +} + +- (void)mouseAction:(browser_mouse_state)state atPoint:(NSPoint)point +{ + tree_mouse_action(self.tree, state, + cocoa_pt_to_px(point.x), cocoa_pt_to_px(point.y)); +} + +- (void)mouseDragEnd:(browser_mouse_state)state fromPoint:(NSPoint)p0 toPoint:(NSPoint)p1 +{ + tree_drag_end(self.tree, state, + cocoa_pt_to_px(p0.x), cocoa_pt_to_px(p0.y), + cocoa_pt_to_px(p1.x), cocoa_pt_to_px(p1.y)); +} + +- (void)keyPress:(uint32_t)key +{ + tree_keypress(self.tree, key); +} + +@end |