Implementing selection and clipboard functions.

svn path=/trunk/netsurf/; revision=11319
This commit is contained in:
Sven Weidauer 2011-01-14 17:50:11 +00:00
parent 30d9439781
commit 7bd51ba0ba
4 changed files with 142 additions and 37 deletions

View File

@ -23,6 +23,7 @@
#import "desktop/plotters.h"
#import "desktop/textinput.h"
#import "desktop/options.h"
#import "desktop/selection.h"
@implementation BrowserView
@ -275,6 +276,26 @@ static browser_mouse_state cocoa_mouse_flags_for_event( NSEvent *evt )
browser_window_key_press( browser, KEY_NL );
}
- (void) selectAll: (id)sender;
{
browser_window_key_press( browser, KEY_SELECT_ALL );
}
- (void) copy: (id) sender;
{
browser_window_key_press( browser, KEY_COPY_SELECTION );
}
- (void) cut: (id) sender;
{
browser_window_key_press( browser, KEY_CUT_SELECTION );
}
- (void) paste: (id) sender;
{
browser_window_key_press( browser, KEY_PASTE );
}
- (void) setFrame: (NSRect)frameRect;
{
[super setFrame: frameRect];
@ -337,6 +358,26 @@ static browser_mouse_state cocoa_mouse_flags_for_event( NSEvent *evt )
return YES;
}
- (BOOL) validateUserInterfaceItem: (id) item;
{
SEL action = [item action];
if (action == @selector(copy:)) {
return selection_defined( browser->sel );
}
if (action == @selector(cut:)) {
return selection_defined( browser->sel ) && browser->caret_callback != NULL;
}
if (action == @selector(paste:)) {
return browser->paste_callback != NULL;
}
return YES;
}
- (BOOL) acceptsFirstResponder;
{
return YES;

View File

@ -115,6 +115,7 @@
26AFE97C12DF514C005AD082 /* NetSurfAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 26AFE97B12DF514C005AD082 /* NetSurfAppDelegate.m */; };
26AFEAEB12E04253005AD082 /* DownloadWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 26AFEAEA12E04253005AD082 /* DownloadWindowController.m */; };
26AFEAF112E042F9005AD082 /* DownloadWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 26AFEAF012E042F9005AD082 /* DownloadWindow.xib */; };
26AFED0412E09916005AD082 /* selection.m in Sources */ = {isa = PBXBuildFile; fileRef = 26AFED0312E09916005AD082 /* selection.m */; };
8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
/* End PBXBuildFile section */
@ -336,6 +337,7 @@
26AFEAE912E04253005AD082 /* DownloadWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DownloadWindowController.h; sourceTree = "<group>"; };
26AFEAEA12E04253005AD082 /* DownloadWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DownloadWindowController.m; sourceTree = "<group>"; };
26AFEAF012E042F9005AD082 /* DownloadWindow.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = DownloadWindow.xib; sourceTree = "<group>"; };
26AFED0312E09916005AD082 /* selection.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = selection.m; sourceTree = "<group>"; };
8D1107320486CEB800E47090 /* NetSurf.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = NetSurf.app; sourceTree = BUILT_PRODUCTS_DIR; };
/* End PBXFileReference section */
@ -617,6 +619,7 @@
26AFE97B12DF514C005AD082 /* NetSurfAppDelegate.m */,
26AFEAE912E04253005AD082 /* DownloadWindowController.h */,
26AFEAEA12E04253005AD082 /* DownloadWindowController.m */,
26AFED0312E09916005AD082 /* selection.m */,
);
name = cocoa;
sourceTree = "<group>";
@ -867,6 +870,7 @@
26AFE8E412DF4200005AD082 /* ScrollableView.m in Sources */,
26AFE97C12DF514C005AD082 /* NetSurfAppDelegate.m in Sources */,
26AFEAEB12E04253005AD082 /* DownloadWindowController.m in Sources */,
26AFED0412E09916005AD082 /* selection.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};

View File

@ -25,6 +25,8 @@
#import "desktop/netsurf.h"
#import "desktop/browser.h"
#import "desktop/options.h"
#import "desktop/textinput.h"
#import "desktop/selection.h"
char *default_stylesheet_url;
char *adblock_stylesheet_url;
@ -261,43 +263,6 @@ void gui_drag_save_selection(struct selection *s, struct gui_window *g)
{
}
void gui_start_selection(struct gui_window *g)
{
}
void gui_clear_selection(struct gui_window *g)
{
}
void gui_paste_from_clipboard(struct gui_window *g, int x, int y)
{
UNIMPL();
}
bool gui_empty_clipboard(void)
{
return false;
}
bool gui_add_to_clipboard(const char *text, size_t length, bool space)
{
UNIMPL();
return false;
}
bool gui_commit_clipboard(void)
{
UNIMPL();
return false;
}
bool gui_copy_to_clipboard(struct selection *s)
{
UNIMPL();
return false;
}
void gui_create_form_select_menu(struct browser_window *bw,
struct form_control *control)

95
cocoa/selection.m Normal file
View File

@ -0,0 +1,95 @@
/*
* 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 "BrowserWindow.h"
#import "desktop/selection.h"
static NSMutableString *cocoa_clipboard_string;
void gui_start_selection(struct gui_window *g)
{
gui_empty_clipboard();
}
void gui_clear_selection(struct gui_window *g)
{
}
void gui_paste_from_clipboard(struct gui_window *g, int x, int y)
{
NSPasteboard *pb = [NSPasteboard generalPasteboard];
NSString *string = [pb stringForType: NSStringPboardType];
if (string) {
const char *text = [string UTF8String];
browser_window_paste_text( [(BrowserWindow *)g browser], text, strlen(text), true );
}
}
bool gui_empty_clipboard(void)
{
if (nil == cocoa_clipboard_string) {
cocoa_clipboard_string = [[NSMutableString alloc] init];
} else {
[cocoa_clipboard_string setString: @""];
}
return true;
}
bool gui_add_to_clipboard(const char *text, size_t length, bool space)
{
if (nil == cocoa_clipboard_string) return false;
[cocoa_clipboard_string appendString: [[[NSString alloc] initWithBytes: text
length: length
encoding: NSUTF8StringEncoding]
autorelease]];
if (space) [cocoa_clipboard_string appendString: @" "];
return true;
}
static bool cocoa_clipboard_copy_handler(const char *text, size_t length, struct box *box,
void *handle, const char *whitespace_text,
size_t whitespace_length)
{
if (whitespace_text && !gui_add_to_clipboard( whitespace_text,
whitespace_length, false )) return false;
return gui_add_to_clipboard( text, length, box->space );
}
bool gui_commit_clipboard(void)
{
NSPasteboard *pb = [NSPasteboard generalPasteboard];
[pb declareTypes: [NSArray arrayWithObject: NSStringPboardType] owner: nil];
bool result = [pb setString: cocoa_clipboard_string forType: NSStringPboardType];
if (result) gui_empty_clipboard();
return result;
}
bool gui_copy_to_clipboard(struct selection *s)
{
if (selection_defined( s ) && selection_traverse( s, cocoa_clipboard_copy_handler, NULL ))
gui_commit_clipboard();
return true;
}