Handle copy/paste using $native

This commit is contained in:
Corey Johnson
2012-02-27 13:08:40 -08:00
parent 8cbf4331e4
commit 25133fc8d9
2 changed files with 82 additions and 45 deletions

View File

@@ -10,7 +10,7 @@ NSString *stringFromCefV8Value(const CefRefPtr<CefV8Value>& value) {
NativeHandler::NativeHandler() : CefV8Handler() {
m_object = CefV8Value::CreateObject(NULL);
const char *functionNames[] = {"exists", "read", "write", " absolute", "list", "isFile", "isDirectory", "remove", "asyncList", "open", "quit"};
const char *functionNames[] = {"exists", "read", "write", " absolute", "list", "isFile", "isDirectory", "remove", "asyncList", "open", "quit", "writeToPasteboard", "readFromPasteboard"};
NSUInteger arrayLength = sizeof(functionNames) / sizeof(const char *);
for (NSUInteger i = 0; i < arrayLength; i++) {
const char *functionName = functionNames[i];
@@ -155,7 +155,57 @@ bool NativeHandler::Execute(const CefString& name,
args.push_back(paths);
CefRefPtr<CefV8Exception> e;
arguments[2]->ExecuteFunction(arguments[2], args, retval, e, true);
exception = e->GetMessage();
if (e) exception = e->GetMessage();
}
return true;
}
else if (name == "alert") {
NSString *message = stringFromCefV8Value(arguments[0]);
NSString *detailedMessage = stringFromCefV8Value(arguments[1]);
CefRefPtr<CefV8Value> buttons = arguments[2];
NSAlert *alert = [[[NSAlert alloc] init] autorelease];
[alert setMessageText:message];
[alert setInformativeText:detailedMessage];
std::vector<CefString> buttonTitles;
std::vector<CefString>::iterator iter;
NSMutableDictionary *titleForTag = [NSMutableDictionary dictionary];
buttons->GetKeys(buttonTitles);
for (iter = buttonTitles.begin(); iter != buttonTitles.end(); iter++) {
NSString *buttonTitle = [NSString stringWithUTF8String:(*iter).ToString().c_str()];
NSButton *button = [alert addButtonWithTitle:buttonTitle];
[titleForTag setObject:buttonTitle forKey:[NSNumber numberWithInt:button.tag]];
}
NSUInteger buttonTag = [alert runModal];
const char *buttonTitle = [[titleForTag objectForKey:[NSNumber numberWithInt:buttonTag]] UTF8String];
CefRefPtr<CefV8Value> callback = buttons->GetValue(buttonTitle);
CefV8ValueList args;
CefRefPtr<CefV8Exception> e;
callback->ExecuteFunction(callback , args, retval, e, true);
if (e) exception = e->GetMessage();
return true;
}
else if (name == "writeToPasteboard") {
NSString *text = stringFromCefV8Value(arguments[0]);
NSPasteboard *pb = [NSPasteboard generalPasteboard];
[pb declareTypes:[NSArray arrayWithObjects:NSStringPboardType, nil] owner:nil];
[pb setString:text forType:NSStringPboardType];
return true;
}
else if (name == "readFromPasteboard") {
NSPasteboard *pb = [NSPasteboard generalPasteboard];
NSArray *results = [pb readObjectsForClasses:[NSArray arrayWithObjects:[NSString class], nil] options:nil];
if (results) {
retval = CefV8Value::CreateString([[results objectAtIndex:0] UTF8String]);
}
return true;

View File

@@ -3,16 +3,7 @@ _ = require 'underscore'
module.exports =
class Native
alert: (message, detailedMessage, buttons) ->
alert = OSX.NSAlert.alloc.init
alert.setMessageText message
alert.setInformativeText detailedMessage
callbacks = {}
for label, callback of buttons
button = alert.addButtonWithTitle label
callbacks[button.tag] = callback
buttonTag = alert.runModal
return callbacks[buttonTag]()
$native.alert(message, detailedMessage, buttons)
# path - Optional. The String path to the file to base it on.
newWindow: (path) ->
@@ -38,49 +29,45 @@ class Native
panel.filenames.lastObject.valueOf()
writeToPasteboard: (text) ->
pb = OSX.NSPasteboard.generalPasteboard
pb.declareTypes_owner [OSX.NSStringPboardType], null
pb.setString_forType text, OSX.NSStringPboardType
$native.writeToPasteboard text
readFromPasteboard: (text) ->
pb = OSX.NSPasteboard.generalPasteboard
results = pb.readObjectsForClasses_options [OSX.NSString], null
results?[0]?.toString()
readFromPasteboard: ->
$native.readFromPasteboard()
resetMainMenu: (menu) ->
# OSX.NSApp.resetMainMenu
OSX.NSApp.resetMainMenu
addMenuItem: (itemPath, keyPattern) ->
# itemPathComponents = itemPath.split /\s*>\s*/
# submenu = @buildSubmenuPath(OSX.NSApp.mainMenu, itemPathComponents[0..-2])
# title = _.last(itemPathComponents)
# unless submenu.itemWithTitle(title)
# item = OSX.AtomMenuItem.alloc.initWithTitle_itemPath(title, itemPath).autorelease
# item.setKeyEquivalentModifierMask 0 # Because in Cocoa defaults it to NSCommandKeyMask
itemPathComponents = itemPath.split /\s*>\s*/
submenu = @buildSubmenuPath(OSX.NSApp.mainMenu, itemPathComponents[0..-2])
title = _.last(itemPathComponents)
unless submenu.itemWithTitle(title)
item = OSX.AtomMenuItem.alloc.initWithTitle_itemPath(title, itemPath).autorelease
item.setKeyEquivalentModifierMask 0 # Because in Cocoa defaults it to NSCommandKeyMask
# if keyPattern
# bindingSet = new (require('binding-set'))("*", {})
# keys = bindingSet.parseKeyPattern keyPattern
if keyPattern
bindingSet = new (require('binding-set'))("*", {})
keys = bindingSet.parseKeyPattern keyPattern
# modifierMask = (keys.metaKey and OSX.NSCommandKeyMask ) |
# (keys.shiftKey and OSX.NSShiftKeyMask) |
# (keys.altKey and OSX.NSAlternateKeyMask) |
# (keys.ctrlKey and OSX.NSControlKeyMask)
modifierMask = (keys.metaKey and OSX.NSCommandKeyMask ) |
(keys.shiftKey and OSX.NSShiftKeyMask) |
(keys.altKey and OSX.NSAlternateKeyMask) |
(keys.ctrlKey and OSX.NSControlKeyMask)
# item.setKeyEquivalent keys.key
# item.setKeyEquivalentModifierMask modifierMask
# submenu.addItem(item)
item.setKeyEquivalent keys.key
item.setKeyEquivalentModifierMask modifierMask
submenu.addItem(item)
buildSubmenuPath: (menu, path) ->
# return menu if path.length == 0
return menu if path.length == 0
# first = path[0]
# unless item = menu.itemWithTitle(first)
# item = OSX.AtomMenuItem.alloc.initWithTitle_action_keyEquivalent(first, null, "").autorelease
# menu.addItem(item)
# unless submenu = item.submenu
# submenu = OSX.NSMenu.alloc.initWithTitle(first)
# item.submenu = submenu
first = path[0]
unless item = menu.itemWithTitle(first)
item = OSX.AtomMenuItem.alloc.initWithTitle_action_keyEquivalent(first, null, "").autorelease
menu.addItem(item)
unless submenu = item.submenu
submenu = OSX.NSMenu.alloc.initWithTitle(first)
item.submenu = submenu
# @buildSubmenuPath(submenu, path[1..-1])
@buildSubmenuPath(submenu, path[1..-1])