diff options
author | avi@google.com <avi@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2008-08-12 16:25:23 +0000 |
---|---|---|
committer | avi@google.com <avi@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2008-08-12 16:25:23 +0000 |
commit | 2b05317b8aa8edb15c794f5d389e71b1a50c331d (patch) | |
tree | 1bddb2c1799823c7b68ca0a2c57eabc19eed2733 /base/clipboard_mac.mm | |
parent | b6e09acf8ced26198871626c76bb5a3741cc51f1 (diff) | |
download | chromium_src-2b05317b8aa8edb15c794f5d389e71b1a50c331d.zip chromium_src-2b05317b8aa8edb15c794f5d389e71b1a50c331d.tar.gz chromium_src-2b05317b8aa8edb15c794f5d389e71b1a50c331d.tar.bz2 |
Basic implementation of the clipboard on the Mac.
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@717 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base/clipboard_mac.mm')
-rw-r--r-- | base/clipboard_mac.mm | 202 |
1 files changed, 202 insertions, 0 deletions
diff --git a/base/clipboard_mac.mm b/base/clipboard_mac.mm new file mode 100644 index 0000000..380082e --- /dev/null +++ b/base/clipboard_mac.mm @@ -0,0 +1,202 @@ +// Copyright 2008, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#include "base/clipboard.h" + +#import <Cocoa/Cocoa.h> + +#include "base/logging.h" +#include "base/string_util.h" + +namespace { + +// Would be nice if this were in UTCoreTypes.h, but it isn't +const NSString* kUTTypeURLName = @"public.url-name"; + +NSString* nsStringForWString(const std::wstring& string) { + std::string16 text16 = WideToUTF16(string); + return [NSString stringWithCharacters:text16.c_str() length:text16.length()]; +} + +} + +Clipboard::Clipboard() { +} + +Clipboard::~Clipboard() { +} + +void Clipboard::Clear() { + NSPasteboard* pb = [NSPasteboard generalPasteboard]; + [pb declareTypes:[NSArray array] owner:nil]; +} + +void Clipboard::WriteText(const std::wstring& text) { + NSPasteboard* pb = [NSPasteboard generalPasteboard]; + [pb declareTypes:[NSArray arrayWithObject:NSStringPboardType] owner:nil]; + [pb setString:nsStringForWString(text) forType:NSStringPboardType]; + +} + +void Clipboard::WriteHTML(const std::wstring& markup, + const std::string& src_url) { + // TODO(avi): src_url? + NSPasteboard* pb = [NSPasteboard generalPasteboard]; + [pb declareTypes:[NSArray arrayWithObject:NSHTMLPboardType] owner:nil]; + [pb setString:nsStringForWString(markup) forType:NSHTMLPboardType]; +} + +void Clipboard::WriteBookmark(const std::wstring& title, + const std::string& url) { + WriteHyperlink(title, url); +} + +void Clipboard::WriteHyperlink(const std::wstring& title, + const std::string& url) { + NSURL* nsurl = [NSURL URLWithString: + [NSString stringWithUTF8String:url.c_str()]]; + NSString* nstitle = nsStringForWString(title); + + NSPasteboard* pb = [NSPasteboard generalPasteboard]; + // passing UTIs into the pasteboard methods is valid >= 10.5 + [pb declareTypes:[NSArray arrayWithObjects:NSURLPboardType, + kUTTypeURLName, nil] + owner:nil]; + [nsurl writeToPasteboard:pb]; + [pb setString:nstitle forType:kUTTypeURLName]; +} + +void Clipboard::WriteFile(const std::wstring& file) { + std::vector<std::wstring> files; + files.push_back(file); + WriteFiles(files); +} + +void Clipboard::WriteFiles(const std::vector<std::wstring>& files) { + NSMutableArray* fileList = [NSMutableArray arrayWithCapacity:files.size()]; + for (unsigned int i = 0; i < files.size(); ++i) { + [fileList addObject:nsStringForWString(files[i])]; + } + + NSPasteboard* pb = [NSPasteboard generalPasteboard]; + [pb declareTypes:[NSArray arrayWithObject:NSFilenamesPboardType] owner:nil]; + [pb setPropertyList:fileList forType:NSFilenamesPboardType]; +} + +bool Clipboard::IsFormatAvailable(NSString* format) const { + NSPasteboard* pb = [NSPasteboard generalPasteboard]; + NSArray* types = [pb types]; + + return [types containsObject:format]; +} + +void Clipboard::ReadText(std::wstring* result) const { + NSPasteboard* pb = [NSPasteboard generalPasteboard]; + NSString* contents = [pb stringForType:NSStringPboardType]; + + UTF8ToWide([contents UTF8String], + [contents lengthOfBytesUsingEncoding:NSUTF8StringEncoding], + result); +} + +void Clipboard::ReadAsciiText(std::string* result) const { + NSPasteboard* pb = [NSPasteboard generalPasteboard]; + NSString* contents = [pb stringForType:NSStringPboardType]; + + *result = std::string([contents UTF8String]); +} + +void Clipboard::ReadHTML(std::wstring* markup, std::string* src_url) const { + if (markup) { + markup->clear(); + + NSPasteboard* pb = [NSPasteboard generalPasteboard]; + NSString* contents = [pb stringForType:NSStringPboardType]; + + UTF8ToWide([contents UTF8String], + [contents lengthOfBytesUsingEncoding:NSUTF8StringEncoding], + markup); + } + +// TODO(avi): src_url? + if (src_url) + src_url->clear(); +} + +void Clipboard::ReadBookmark(std::wstring* title, std::string* url) const { + NSPasteboard* pb = [NSPasteboard generalPasteboard]; + + if (title) { + title->clear(); + + NSString* contents = [pb stringForType:kUTTypeURLName]; + UTF8ToWide([contents UTF8String], + [contents lengthOfBytesUsingEncoding:NSUTF8StringEncoding], + title); + } + + if (url) { + url->clear(); + + NSURL* nsurl = [NSURL URLFromPasteboard:pb]; + *url = std::string([[nsurl absoluteString] UTF8String]); + } +} + +void Clipboard::ReadFile(std::wstring* file) const { + if (!file) { + NOTREACHED(); + return; + } + + file->clear(); + std::vector<std::wstring> files; + ReadFiles(&files); + + // Take the first file, if available. + if (!files.empty()) + file->assign(files[0]); +} + +void Clipboard::ReadFiles(std::vector<std::wstring>* files) const { + if (!files) { + NOTREACHED(); + return; + } + + files->clear(); + + NSPasteboard* pb = [NSPasteboard generalPasteboard]; + NSArray* fileList = [pb propertyListForType:NSFilenamesPboardType]; + + for (unsigned int i = 0; i < [fileList count]; ++i) { + std::wstring file = UTF8ToWide([[fileList objectAtIndex:i] UTF8String]); + files->push_back(file); + } +} |