1// Copyright (c) 2009 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#import "chrome/browser/ui/cocoa/find_pasteboard.h"
6
7#include "base/logging.h"
8#include "base/sys_string_conversions.h"
9
10NSString* kFindPasteboardChangedNotification =
11    @"kFindPasteboardChangedNotification_Chrome";
12
13@implementation FindPasteboard
14
15+ (FindPasteboard*)sharedInstance {
16  static FindPasteboard* instance = nil;
17  if (!instance) {
18    instance = [[FindPasteboard alloc] init];
19  }
20  return instance;
21}
22
23- (id)init {
24  if ((self = [super init])) {
25    findText_.reset([[NSString alloc] init]);
26
27    // Check if the text in the findboard has changed on app activate.
28    [[NSNotificationCenter defaultCenter]
29        addObserver:self
30           selector:@selector(loadTextFromPasteboard:)
31               name:NSApplicationDidBecomeActiveNotification
32             object:nil];
33    [self loadTextFromPasteboard:nil];
34  }
35  return self;
36}
37
38- (void)dealloc {
39  // Since this is a singleton, this should only be executed in test code.
40  [[NSNotificationCenter defaultCenter] removeObserver:self];
41  [super dealloc];
42}
43
44- (NSPasteboard*)findPboard {
45  return [NSPasteboard pasteboardWithName:NSFindPboard];
46}
47
48- (void)loadTextFromPasteboard:(NSNotification*)notification {
49  NSPasteboard* findPboard = [self findPboard];
50  if ([[findPboard types] containsObject:NSStringPboardType])
51    [self setFindText:[findPboard stringForType:NSStringPboardType]];
52}
53
54- (NSString*)findText {
55  return findText_;
56}
57
58- (void)setFindText:(NSString*)newText {
59  DCHECK(newText);
60  if (!newText)
61    return;
62
63  DCHECK([NSThread isMainThread]);
64
65  BOOL needToSendNotification = ![findText_.get() isEqualToString:newText];
66  if (needToSendNotification) {
67    findText_.reset([newText copy]);
68    NSPasteboard* findPboard = [self findPboard];
69    [findPboard declareTypes:[NSArray arrayWithObject:NSStringPboardType]
70                       owner:nil];
71    [findPboard setString:findText_.get() forType:NSStringPboardType];
72    [[NSNotificationCenter defaultCenter]
73        postNotificationName:kFindPasteboardChangedNotification
74                      object:self];
75  }
76}
77
78@end
79
80string16 GetFindPboardText() {
81  return base::SysNSStringToUTF16([[FindPasteboard sharedInstance] findText]);
82}
83