mirror of
https://github.com/atom/atom.git
synced 2026-04-06 03:02:13 -04:00
Handle copy/paste using $native
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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])
|
||||
|
||||
|
||||
Reference in New Issue
Block a user