Factored Tree class out of TreeView

svn path=/trunk/netsurf/; revision=11577
This commit is contained in:
Sven Weidauer 2011-02-01 08:39:32 +00:00
parent e20f69147d
commit 28ff0cfb0a
6 changed files with 272 additions and 72 deletions

View File

@ -74,6 +74,7 @@ S_COCOA := \
ScrollableView.m \
SearchWindowController.m \
URLFieldCell.m \
Tree.m \
TreeView.m \
HistoryView.m \
FormSelectMenu.m \

View File

@ -184,6 +184,8 @@
263629C812F69B120048542C /* NetsurfApp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NetsurfApp.h; sourceTree = "<group>"; };
263629C912F69B120048542C /* NetsurfApp.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NetsurfApp.m; sourceTree = "<group>"; };
263629CA12F69B120048542C /* system_colour.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = system_colour.m; sourceTree = "<group>"; };
263769A912F7EBE2000F45FE /* Tree.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Tree.h; sourceTree = "<group>"; };
263769AA12F7EBE2000F45FE /* Tree.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Tree.m; sourceTree = "<group>"; };
2639E20512F2ADEE00699678 /* coordinates.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = coordinates.h; sourceTree = "<group>"; };
264C344112F0987E00D11246 /* gui.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gui.h; sourceTree = "<group>"; };
265F30A712D6637E0048B600 /* NetSurf-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "NetSurf-Info.plist"; sourceTree = "<group>"; };
@ -519,12 +521,24 @@
name = Makefiles;
sourceTree = "<group>";
};
263769A812F7EBC3000F45FE /* Tree View */ = {
isa = PBXGroup;
children = (
2622F1D512DCD84600CD5A62 /* TreeView.h */,
2622F1D612DCD84600CD5A62 /* TreeView.m */,
263769A912F7EBE2000F45FE /* Tree.h */,
263769AA12F7EBE2000F45FE /* Tree.m */,
);
name = "Tree View";
sourceTree = "<group>";
};
265F303F12D6637E0048B600 /* Cocoa Frontend */ = {
isa = PBXGroup;
children = (
26CDD26512E74402004FC66B /* Browser */,
26CDD26712E74453004FC66B /* Download */,
26CDD26612E7441E004FC66B /* Views */,
263769A812F7EBC3000F45FE /* Tree View */,
26CDD26812E74461004FC66B /* NSApplication */,
26CDD26912E7446E004FC66B /* Platform Interface */,
265F310F12D663C20048B600 /* Resources */,
@ -674,8 +688,6 @@
children = (
26AFE8E212DF4200005AD082 /* ScrollableView.h */,
26AFE8E312DF4200005AD082 /* ScrollableView.m */,
2622F1D512DCD84600CD5A62 /* TreeView.h */,
2622F1D612DCD84600CD5A62 /* TreeView.m */,
26EC3B6812ED62C0000A960C /* URLFieldCell.h */,
26EC3B6912ED62C0000A960C /* URLFieldCell.m */,
26EC3C4212ED8202000A960C /* HistoryView.h */,

58
cocoa/Tree.h Normal file
View File

@ -0,0 +1,58 @@
/*
* 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/Cocoa.h>
#import "desktop/tree.h"
@class Tree;
@protocol TreeDelegate
- (void) tree: (Tree *)tree requestedRedrawInRect: (NSRect) rect;
- (void) tree: (Tree *)tree resized: (NSSize) size;
- (void) tree: (Tree *)tree scrollPoint: (NSPoint) point;
- (NSSize) treeWindowSize: (Tree *)tree;
@end
@interface Tree : NSObject {
id <TreeDelegate> delegate;
struct tree *tree;
}
@property (readwrite, assign, nonatomic) id <TreeDelegate> delegate;
@property (readwrite, assign, nonatomic, getter=isRedrawing) BOOL redrawing;
- initWithFlags: (unsigned int) flags;
- (struct node *) rootNode;
- (struct tree *) tree;
@end
@interface Tree (ViewInterface)
- (void) drawRect: (NSRect) rect inView: (NSView *) view;
- (void) mouseAction: (browser_mouse_state)state atPoint: (NSPoint)point;
- (void) mouseDragEnd: (browser_mouse_state)state fromPoint: (NSPoint)p0 toPoint: (NSPoint) p1;
- (void) keyPress: (uint32_t) key;
@end

140
cocoa/Tree.m Normal file
View File

@ -0,0 +1,140 @@
/*
* 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 "desktop/tree.h"
@implementation Tree
@synthesize delegate;
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
};
- initWithFlags: (unsigned int)flags;
{
if ((self = [super init]) == nil) return nil;
tree = tree_create( flags, &cocoa_tree_callbacks, self );
if (tree == NULL) {
[self release];
return nil;
}
return self;
}
- (void) dealloc;
{
tree_delete( tree );
[super dealloc];
}
- (struct node *) rootNode;
{
return tree_get_root( tree );
}
- (struct tree *) tree;
{
return tree;
}
- (BOOL) isRedrawing;
{
return tree_get_redraw( tree );
}
- (void) setRedrawing: (BOOL) newRedrawing;
{
tree_set_redraw( tree, newRedrawing );
}
//MARK: -
//MARK: Callbacks
static void tree_redraw_request( int x, int y, int w, int h, void *data )
{
id <TreeDelegate> delegate = ((Tree *)data)->delegate;
[delegate tree: (Tree *)data requestedRedrawInRect: cocoa_rect_wh( x, y, w, h )];
}
static void tree_resized( struct tree *tree, int w, int h, void *data )
{
id <TreeDelegate> delegate = ((Tree *)data)->delegate;
[delegate tree: (Tree *)data resized: cocoa_size( w, h )];
}
static void tree_scroll_visible( int y, int height, void *data )
{
id <TreeDelegate> delegate = ((Tree *)data)->delegate;
[delegate tree: (Tree *)data scrollPoint: cocoa_point( 0, y )];
}
static void tree_get_window_dimensions( int *width, int *height, void *data )
{
id <TreeDelegate> delegate = ((Tree *)data)->delegate;
if (delegate == nil) return;
NSSize size = [delegate treeWindowSize: (Tree *)data];
*width = cocoa_pt_to_px( size.width );
*height = cocoa_pt_to_px( size.height );
}
@end
@implementation Tree (ViewInterface)
- (void) drawRect: (NSRect) rect inView: (NSView *) view;
{
tree_draw( 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 ) ) );
}
- (void) mouseAction: (browser_mouse_state)state atPoint: (NSPoint)point;
{
tree_mouse_action( 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( 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( tree, key );
}
@end

View File

@ -19,13 +19,16 @@
#import <Cocoa/Cocoa.h>
#import "cocoa/ScrollableView.h"
@class Tree;
@interface TreeView : ScrollableView {
struct tree *treeHandle;
Tree *tree;
BOOL isDragging;
NSPoint dragStart;
}
@property (readwrite, retain, nonatomic) Tree *tree;
@end

View File

@ -17,52 +17,20 @@
*/
#import "cocoa/TreeView.h"
#import "cocoa/coordinates.h"
#import "cocoa/Tree.h"
#import "desktop/tree.h"
#import "desktop/plotters.h"
#import "desktop/history_global_core.h"
@interface TreeView () <TreeDelegate>
@end
@implementation TreeView
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
};
- (id)initWithFrame:(NSRect)frame
{
if ((self = [super initWithFrame:frame]) == nil) return nil;
treeHandle = tree_create( history_global_get_tree_flags(), &cocoa_tree_callbacks, self );
if (NULL == treeHandle) {
[self release];
return nil;
}
history_global_initialise( treeHandle, "" );
return self;
}
- (void) dealloc;
{
tree_delete( treeHandle );
[super dealloc];
}
@synthesize tree;
- (void)drawRect:(NSRect)dirtyRect
{
tree_set_redraw( treeHandle, true );
tree_draw( treeHandle, 0, 0,
cocoa_pt_to_px( NSMinX( dirtyRect ) ), cocoa_pt_to_px( NSMinY( dirtyRect ) ),
cocoa_pt_to_px( NSWidth( dirtyRect ) ), cocoa_pt_to_px( NSHeight( dirtyRect ) ) );
[tree drawRect: dirtyRect inView: self];
}
- (BOOL) isFlipped;
@ -70,68 +38,86 @@ static const struct treeview_table cocoa_tree_callbacks = {
return YES;
}
- (void) mouseDown: (NSEvent *)theEvent;
- (void) dealloc;
{
NSPoint point = [self convertPoint: [theEvent locationInWindow] fromView: nil];
dragStart = point;
tree_mouse_action( treeHandle, BROWSER_MOUSE_PRESS_1,
cocoa_pt_to_px( point.x ), cocoa_pt_to_px( point.y ) );
[self setTree: nil];
[super dealloc];
}
- (void) mouseUp: (NSEvent *)theEvent;
- (void) setTree: (Tree *)newTree;
{
NSPoint point = [self convertPoint: [theEvent locationInWindow] fromView: nil];
if (isDragging) {
tree_drag_end( treeHandle, BROWSER_MOUSE_DRAG_1,
cocoa_pt_to_px( dragStart.x ), cocoa_pt_to_px( dragStart.y ),
cocoa_pt_to_px( point.x ), cocoa_pt_to_px( point.y ) );
isDragging = NO;
} else {
tree_mouse_action( treeHandle, BROWSER_MOUSE_CLICK_1,
cocoa_pt_to_px( point.x ), cocoa_pt_to_px( point.y ) );
if (tree != newTree) {
[tree setRedrawing: NO];
[tree setDelegate: nil];
[tree release];
tree = [newTree retain];
[tree setDelegate: self];
[tree setRedrawing: YES];
}
}
//MARK: -
//MARK: Event handlers
- (void)mouseDown: (NSEvent *)event;
{
isDragging = NO;
dragStart = [self convertPoint: [event locationInWindow] fromView: nil];
[tree mouseAction: BROWSER_MOUSE_PRESS_1 atPoint: dragStart];
}
#define squared(x) ((x)*(x))
#define MinDragDistance (5.0)
- (void) mouseDragged: (NSEvent *)theEvent;
- (void) mouseDragged: (NSEvent *)event;
{
NSPoint point = [self convertPoint: [theEvent locationInWindow] fromView: nil];
const NSPoint point = [self convertPoint: [event locationInWindow] fromView: nil];
if (!isDragging) {
const CGFloat distance = squared( dragStart.x - point.x ) + squared( dragStart.y - point.y );
if (distance >= squared( MinDragDistance)) isDragging = YES;
}
}
- (void) mouseUp: (NSEvent *)event;
{
const NSPoint point = [self convertPoint: [event locationInWindow] fromView: nil];
browser_mouse_state modifierFlags = 0;
if (isDragging) {
tree_mouse_action( treeHandle, BROWSER_MOUSE_DRAG_1,
cocoa_pt_to_px( point.x ), cocoa_pt_to_px( point.y ) );
}
isDragging = NO;
[tree mouseDragEnd: modifierFlags fromPoint: dragStart toPoint: point];
} else {
modifierFlags |= BROWSER_MOUSE_CLICK_1;
if ([event clickCount] == 2) modifierFlags |= BROWSER_MOUSE_DOUBLE_CLICK;
[tree mouseAction: modifierFlags atPoint: point];
}
}
static void tree_redraw_request( int x, int y, int w, int h, void *data )
//MARK: -
//MARK: Tree delegate methods
- (void) tree: (Tree *)t requestedRedrawInRect: (NSRect) rect;
{
[(TreeView *)data setNeedsDisplayInRect: cocoa_rect_wh( x, y, w, h )];
[self setNeedsDisplayInRect: rect];
}
static void tree_resized( struct tree *tree, int w, int h, void *data )
- (void) tree: (Tree *)t resized: (NSSize) size;
{
[(TreeView *)data setMinimumSize: cocoa_size( w, h )];
[self setMinimumSize: size];
}
static void tree_scroll_visible( int y, int height, void *data )
- (void) tree: (Tree *)t scrollPoint: (NSPoint) point;
{
[(TreeView *)data scrollPoint: cocoa_point( 0, y )];
[self scrollPoint: point];
}
static void tree_get_window_dimensions( int *width, int *height, void *data )
- (NSSize) treeWindowSize: (Tree *)t;
{
NSSize size = [(TreeView *)data frame].size;
*width = cocoa_pt_to_px( size.width );
*height = cocoa_pt_to_px( size.height );
return [self frame].size;
}
@end