2011-01-24 18:01:34 +03:00
|
|
|
/*
|
|
|
|
* 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/>.
|
|
|
|
*/
|
|
|
|
|
2011-01-31 22:12:00 +03:00
|
|
|
#import "cocoa/HistoryView.h"
|
|
|
|
#import "cocoa/font.h"
|
|
|
|
#import "cocoa/coordinates.h"
|
|
|
|
#import "cocoa/plotter.h"
|
2011-02-27 12:46:54 +03:00
|
|
|
#import "cocoa/LocalHistoryController.h"
|
|
|
|
#import "cocoa/BrowserView.h"
|
2011-01-24 18:01:34 +03:00
|
|
|
|
2014-02-15 22:43:59 +04:00
|
|
|
#import "desktop/browser_history.h"
|
2011-01-24 18:01:34 +03:00
|
|
|
#import "desktop/plotters.h"
|
|
|
|
|
|
|
|
@implementation HistoryView
|
|
|
|
|
2011-02-27 12:46:54 +03:00
|
|
|
@synthesize browser = browserView;
|
2011-01-24 18:01:34 +03:00
|
|
|
|
2011-02-27 12:46:54 +03:00
|
|
|
- (void) setBrowser: (BrowserView *) bw;
|
2011-01-24 18:01:34 +03:00
|
|
|
{
|
2011-02-27 12:46:54 +03:00
|
|
|
browserView = bw;
|
|
|
|
browser = [bw browser];
|
2011-02-17 15:12:51 +03:00
|
|
|
[self updateHistory];
|
2011-01-24 18:01:34 +03:00
|
|
|
}
|
|
|
|
|
2011-02-17 20:23:58 +03:00
|
|
|
- (NSSize) size;
|
|
|
|
{
|
|
|
|
int width, height;
|
2014-02-15 22:43:59 +04:00
|
|
|
browser_window_history_size( browser, &width, &height );
|
2011-02-17 20:23:58 +03:00
|
|
|
|
2011-02-28 18:24:15 +03:00
|
|
|
return cocoa_size( width, height );
|
2011-02-17 20:23:58 +03:00
|
|
|
}
|
|
|
|
|
2011-01-24 18:01:34 +03:00
|
|
|
- (void) updateHistory;
|
|
|
|
{
|
2011-02-17 20:23:58 +03:00
|
|
|
[self setFrameSize: [self size]];
|
2011-01-24 18:01:34 +03:00
|
|
|
[self setNeedsDisplay: YES];
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void) drawRect: (NSRect)rect;
|
|
|
|
{
|
2011-02-28 18:24:15 +03:00
|
|
|
[[NSColor clearColor] set];
|
|
|
|
[NSBezierPath fillRect: rect];
|
2011-06-30 19:48:07 +04:00
|
|
|
|
|
|
|
struct redraw_context ctx = {
|
|
|
|
.interactive = true,
|
2011-12-24 02:39:25 +04:00
|
|
|
.background_images = true,
|
2011-06-30 19:48:07 +04:00
|
|
|
.plot = &cocoa_plotters
|
|
|
|
};
|
2011-02-28 18:24:15 +03:00
|
|
|
|
2011-01-28 11:54:55 +03:00
|
|
|
cocoa_set_clip( rect );
|
|
|
|
|
2014-02-15 22:43:59 +04:00
|
|
|
browser_window_history_redraw( browser, &ctx );
|
2011-01-24 18:01:34 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
- (void) mouseUp: (NSEvent *)theEvent;
|
|
|
|
{
|
|
|
|
const NSPoint location = [self convertPoint: [theEvent locationInWindow] fromView: nil];
|
|
|
|
const bool newWindow = [theEvent modifierFlags] & NSCommandKeyMask;
|
2014-02-15 22:43:59 +04:00
|
|
|
if (browser_window_history_click( browser,
|
2011-02-27 12:46:54 +03:00
|
|
|
cocoa_pt_to_px( location.x ), cocoa_pt_to_px( location.y ),
|
|
|
|
newWindow )) {
|
|
|
|
[browserView setHistoryVisible: NO];
|
|
|
|
}
|
2011-01-24 18:01:34 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
- (BOOL) isFlipped;
|
|
|
|
{
|
|
|
|
return YES;
|
|
|
|
}
|
|
|
|
|
2011-02-28 18:24:15 +03:00
|
|
|
- (void) mouseEntered: (NSEvent *) event;
|
|
|
|
{
|
|
|
|
[[NSCursor pointingHandCursor] set];
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void) mouseExited: (NSEvent *) event;
|
|
|
|
{
|
|
|
|
[[NSCursor arrowCursor] set];
|
|
|
|
}
|
|
|
|
|
2014-02-15 22:43:59 +04:00
|
|
|
static bool cursor_rects_cb( const struct browser_window *bw, int x0, int y0, int x1, int y1,
|
2011-02-28 18:24:15 +03:00
|
|
|
const struct history_entry *page, void *user_data )
|
|
|
|
{
|
|
|
|
HistoryView *view = user_data;
|
|
|
|
|
|
|
|
NSRect rect = NSIntersectionRect( [view visibleRect], cocoa_rect( x0, y0, x1, y1 ) );
|
|
|
|
if (!NSIsEmptyRect( rect )) {
|
|
|
|
|
2014-02-15 22:43:59 +04:00
|
|
|
NSString *toolTip = [NSString stringWithFormat: @"%s\n%s", browser_window_history_entry_get_title(page),
|
|
|
|
browser_window_history_entry_get_url( page )];
|
2011-02-28 18:24:15 +03:00
|
|
|
|
|
|
|
[view addToolTipRect: rect owner: toolTip userData: nil];
|
|
|
|
NSTrackingArea *area = [[NSTrackingArea alloc] initWithRect: rect
|
|
|
|
options: NSTrackingMouseEnteredAndExited | NSTrackingActiveInActiveApp
|
|
|
|
owner: view userInfo: nil];
|
|
|
|
[view addTrackingArea: area];
|
|
|
|
[area release];
|
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
- (NSToolTipTag)addToolTipRect: (NSRect) rect owner: (id) owner userData: (void *) userData;
|
|
|
|
{
|
|
|
|
if (toolTips == nil) toolTips = [[NSMutableArray alloc] init];
|
|
|
|
[toolTips addObject: owner];
|
|
|
|
|
|
|
|
return [super addToolTipRect: rect owner: owner userData: userData];
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void) removeAllToolTips;
|
|
|
|
{
|
|
|
|
[super removeAllToolTips];
|
|
|
|
[toolTips removeAllObjects];
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void) updateTrackingAreas;
|
|
|
|
{
|
|
|
|
[self removeAllToolTips];
|
|
|
|
|
|
|
|
for (NSTrackingArea *area in [self trackingAreas]) {
|
|
|
|
[self removeTrackingArea: area];
|
|
|
|
}
|
|
|
|
|
2014-02-15 22:43:59 +04:00
|
|
|
browser_window_history_enumerate( browser, cursor_rects_cb, self );
|
2011-02-28 18:24:15 +03:00
|
|
|
|
|
|
|
[super updateTrackingAreas];
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void) dealloc;
|
|
|
|
{
|
|
|
|
[self removeAllToolTips];
|
|
|
|
[super dealloc];
|
|
|
|
}
|
|
|
|
|
2011-01-24 18:01:34 +03:00
|
|
|
@end
|