netsurf/cocoa/TreeView.m

138 lines
3.9 KiB
Objective-C

/*
* 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 "TreeView.h"
#import "desktop/tree.h"
#import "desktop/plotters.h"
#import "desktop/history_global_core.h"
#import "cocoa/coordinates.h"
@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];
}
- (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 ) ) );
}
- (BOOL) isFlipped;
{
return YES;
}
- (void) mouseDown: (NSEvent *)theEvent;
{
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 ) );
}
- (void) mouseUp: (NSEvent *)theEvent;
{
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 ) );
}
}
#define squared(x) ((x)*(x))
#define MinDragDistance (5.0)
- (void) mouseDragged: (NSEvent *)theEvent;
{
NSPoint point = [self convertPoint: [theEvent locationInWindow] fromView: nil];
if (!isDragging) {
const CGFloat distance = squared( dragStart.x - point.x ) + squared( dragStart.y - point.y );
if (distance >= squared( MinDragDistance)) isDragging = YES;
}
if (isDragging) {
tree_mouse_action( treeHandle, BROWSER_MOUSE_DRAG_1,
cocoa_pt_to_px( point.x ), cocoa_pt_to_px( point.y ) );
}
}
static void tree_redraw_request( int x, int y, int w, int h, void *data )
{
[(TreeView *)data setNeedsDisplayInRect: cocoa_rect_wh( x, y, w, h )];
}
static void tree_resized( struct tree *tree, int w, int h, void *data )
{
[(TreeView *)data setMinimumSize: cocoa_size( w, h )];
}
static void tree_scroll_visible( int y, int height, void *data )
{
[(TreeView *)data scrollPoint: cocoa_point( 0, y )];
}
static void tree_get_window_dimensions( int *width, int *height, void *data )
{
NSSize size = [(TreeView *)data frame].size;
*width = cocoa_pt_to_px( size.width );
*height = cocoa_pt_to_px( size.height );
}
@end