summaryrefslogtreecommitdiff
path: root/frontends/cocoa/Tree.m
diff options
context:
space:
mode:
Diffstat (limited to 'frontends/cocoa/Tree.m')
-rw-r--r--frontends/cocoa/Tree.m143
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