summaryrefslogtreecommitdiff
path: root/cocoa/BrowserView.m
diff options
context:
space:
mode:
Diffstat (limited to 'cocoa/BrowserView.m')
-rw-r--r--cocoa/BrowserView.m289
1 files changed, 289 insertions, 0 deletions
diff --git a/cocoa/BrowserView.m b/cocoa/BrowserView.m
new file mode 100644
index 000000000..96f12699a
--- /dev/null
+++ b/cocoa/BrowserView.m
@@ -0,0 +1,289 @@
+/*
+ * 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 "BrowserView.h"
+
+#import "desktop/browser.h"
+#import "desktop/history_core.h"
+#import "desktop/plotters.h"
+#import "desktop/textinput.h"
+
+@implementation BrowserView
+
+@synthesize browser;
+@synthesize spinning;
+@synthesize status;
+@synthesize caretTimer;
+
+static const CGFloat CaretWidth = 1.0;
+static const NSTimeInterval CaretBlinkTime = 0.8;
+
+static inline NSRect cocoa_get_caret_rect( BrowserView *view )
+{
+ NSRect caretRect = {
+ .origin = view->caretPoint,
+ .size = NSMakeSize( CaretWidth, view->caretHeight )
+ };
+
+ return caretRect;
+}
+
+- (void) removeCaret;
+{
+ hasCaret = NO;
+ [self setNeedsDisplayInRect: cocoa_get_caret_rect( self )];
+
+ [caretTimer invalidate];
+ [self setCaretTimer: nil];
+}
+
+- (void) addCaretAt: (NSPoint) point height: (CGFloat) height;
+{
+ if (hasCaret) {
+ [self setNeedsDisplayInRect: cocoa_get_caret_rect( self )];
+ }
+
+ caretPoint = point;
+ caretHeight = height;
+ hasCaret = YES;
+ caretVisible = YES;
+
+ if (nil == caretTimer) {
+ [self setCaretTimer: [NSTimer scheduledTimerWithTimeInterval: CaretBlinkTime target: self selector: @selector(caretBlink:) userInfo: nil repeats: YES]];
+ } else {
+ [caretTimer setFireDate: [NSDate dateWithTimeIntervalSinceNow: CaretBlinkTime]];
+ }
+
+ [self setNeedsDisplayInRect: cocoa_get_caret_rect( self )];
+}
+
+
+- (void) caretBlink: (NSTimer *)timer;
+{
+ if (hasCaret) {
+ caretVisible = !caretVisible;
+ [self setNeedsDisplayInRect: cocoa_get_caret_rect( self )];
+ }
+}
+
+- (void)drawRect:(NSRect)dirtyRect;
+{
+
+ if (NULL == browser->current_content) return;
+
+ NSRect frame = [self bounds];
+
+ plot.clip(0, 0, frame.size.width, frame.size.height);
+
+ content_redraw(browser->current_content,
+ 0,
+ 0,
+ NSWidth( frame ),
+ NSHeight( frame ),
+ NSMinX( dirtyRect ),
+ NSMinY( dirtyRect ),
+ NSMaxX( dirtyRect ),
+ NSMaxY( dirtyRect ),
+ browser->scale,
+ 0xFFFFFF);
+
+
+ NSRect caretRect = cocoa_get_caret_rect( self );
+ if (hasCaret && caretVisible && [self needsToDrawRect: caretRect]) {
+ [[NSColor blackColor] set];
+ [NSBezierPath fillRect: caretRect];
+ }
+
+}
+
+- (BOOL) isFlipped;
+{
+ return YES;
+}
+
+- (void) mouseDown: (NSEvent *)theEvent;
+{
+ NSPoint location = [self convertPoint: [theEvent locationInWindow] fromView: nil];
+
+ browser_window_mouse_click( browser, BROWSER_MOUSE_PRESS_1, location.x, location.y );
+}
+
+- (void) mouseUp: (NSEvent *)theEvent;
+{
+ NSPoint location = [self convertPoint: [theEvent locationInWindow] fromView: nil];
+
+ browser_window_mouse_click( browser, BROWSER_MOUSE_CLICK_1, location.x, location.y );
+}
+
+- (void) mouseDragged: (NSEvent *)theEvent;
+{
+}
+
+- (void) mouseMoved: (NSEvent *)theEvent;
+{
+ NSPoint location = [self convertPoint: [theEvent locationInWindow] fromView: nil];
+ browser_window_mouse_click( browser, 0, location.x, location.y );
+}
+
+- (void) keyDown: (NSEvent *)theEvent;
+{
+ [self interpretKeyEvents: [NSArray arrayWithObject: theEvent]];
+}
+
+- (void) insertText: (id)string;
+{
+ for (NSUInteger i = 0, length = [string length]; i < length; i++) {
+ unichar ch = [string characterAtIndex: i];
+ browser_window_key_press( browser, ch );
+ }
+}
+
+- (void) moveLeft: (id)sender;
+{
+ browser_window_key_press( browser, KEY_LEFT );
+}
+
+- (void) moveRight: (id)sender;
+{
+ browser_window_key_press( browser, KEY_RIGHT );
+}
+
+- (void) moveUp: (id)sender;
+{
+ browser_window_key_press( browser, KEY_UP );
+}
+
+- (void) moveDown: (id)sender;
+{
+ browser_window_key_press( browser, KEY_DOWN );
+}
+
+- (void) deleteBackward: (id)sender;
+{
+ browser_window_key_press( browser, KEY_DELETE_LEFT );
+}
+
+- (void) deleteForward: (id)sender;
+{
+ browser_window_key_press( browser, KEY_DELETE_RIGHT );
+}
+
+- (void) cancelOperation: (id)sender;
+{
+ browser_window_key_press( browser, KEY_ESCAPE );
+}
+
+- (void) scrollPageUp: (id)sender;
+{
+ browser_window_key_press( browser, KEY_PAGE_UP );
+}
+
+- (void) scrollPageDown: (id)sender;
+{
+ browser_window_key_press( browser, KEY_PAGE_DOWN );
+}
+
+- (void) insertTab: (id)sender;
+{
+ browser_window_key_press( browser, KEY_TAB );
+}
+
+- (void) insertBacktab: (id)sender;
+{
+ browser_window_key_press( browser, KEY_SHIFT_TAB );
+}
+
+- (void) moveToBeginningOfLine: (id)sender;
+{
+ browser_window_key_press( browser, KEY_LINE_START );
+}
+
+- (void) moveToEndOfLine: (id)sender;
+{
+ browser_window_key_press( browser, KEY_LINE_END );
+}
+
+- (void) moveToBeginningOfDocument: (id)sender;
+{
+ browser_window_key_press( browser, KEY_TEXT_START );
+}
+
+- (void) moveToEndOfDocument: (id)sender;
+{
+ browser_window_key_press( browser, KEY_TEXT_END );
+}
+
+- (void) insertNewline: (id)sender;
+{
+ browser_window_key_press( browser, KEY_NL );
+}
+
+- (void) setFrame: (NSRect)frameRect;
+{
+ [super setFrame: frameRect];
+ browser_window_reformat( browser, [self bounds].size.width, [self bounds].size.height );
+}
+
+
+- (IBAction) goBack: (id) sender;
+{
+ if (browser && history_back_available( browser->history )) {
+ history_back(browser, browser->history);
+ }
+}
+
+- (IBAction) goForward: (id) sender;
+{
+ if (browser && history_forward_available( browser->history )) {
+ history_forward(browser, browser->history);
+ }
+}
+
+- (IBAction) showHistory: (id) sender;
+{
+}
+
+- (IBAction) reloadPage: (id) sender;
+{
+ browser_window_reload( browser, true );
+}
+
+- (BOOL) validateToolbarItem: (NSToolbarItem *)theItem;
+{
+ SEL action = [theItem action];
+
+ if (action == @selector( goBack: )) {
+ return browser != NULL && history_back_available( browser->history );
+ }
+
+ if (action == @selector( goForward: )) {
+ return browser != NULL && history_forward_available( browser->history );
+ }
+
+ if (action == @selector( reloadPage: )) {
+ return browser_window_reload_available( browser );
+ }
+
+ return YES;
+}
+- (BOOL) acceptsFirstResponder;
+{
+ return YES;
+}
+
+@end