15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2009 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#import "ui/base/cocoa/find_pasteboard.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/strings/sys_string_conversions.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NSString* kFindPasteboardChangedNotification =
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @"kFindPasteboardChangedNotification_Chrome";
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@implementation FindPasteboard
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)+ (FindPasteboard*)sharedInstance {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static FindPasteboard* instance = nil;
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!instance) {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    instance = [[FindPasteboard alloc] init];
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return instance;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (id)init {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if ((self = [super init])) {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    findText_.reset([[NSString alloc] init]);
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check if the text in the findboard has changed on app activate.
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    [[NSNotificationCenter defaultCenter]
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        addObserver:self
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           selector:@selector(loadTextFromPasteboard:)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               name:NSApplicationDidBecomeActiveNotification
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             object:nil];
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    [self loadTextFromPasteboard:nil];
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return self;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (void)dealloc {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Since this is a singleton, this should only be executed in test code.
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  [[NSNotificationCenter defaultCenter] removeObserver:self];
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  [super dealloc];
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (NSPasteboard*)findPboard {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return [NSPasteboard pasteboardWithName:NSFindPboard];
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (void)loadTextFromPasteboard:(NSNotification*)notification {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NSPasteboard* findPboard = [self findPboard];
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if ([[findPboard types] containsObject:NSStringPboardType])
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    [self setFindText:[findPboard stringForType:NSStringPboardType]];
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (NSString*)findText {
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return findText_;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (void)setFindText:(NSString*)newText {
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(newText);
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!newText)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK([NSThread isMainThread]);
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BOOL needToSendNotification = ![findText_.get() isEqualToString:newText];
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (needToSendNotification) {
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    findText_.reset([newText copy]);
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NSPasteboard* findPboard = [self findPboard];
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    [findPboard declareTypes:[NSArray arrayWithObject:NSStringPboardType]
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       owner:nil];
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    [findPboard setString:findText_.get() forType:NSStringPboardType];
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    [[NSNotificationCenter defaultCenter]
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        postNotificationName:kFindPasteboardChangedNotification
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      object:self];
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@end
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 GetFindPboardText() {
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return base::SysNSStringToUTF16([[FindPasteboard sharedInstance] findText]);
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
83