• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// Copyright (c) 2010 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/first_run_bubble_controller.h"
6
7#include "base/logging.h"
8#include "base/utf_string_conversions.h"
9#include "chrome/browser/search_engines/util.h"
10#import "chrome/browser/ui/cocoa/l10n_util.h"
11#import "chrome/browser/ui/cocoa/info_bubble_view.h"
12#include "grit/generated_resources.h"
13#include "ui/base/l10n/l10n_util.h"
14
15@interface FirstRunBubbleController(Private)
16- (id)initRelativeToView:(NSView*)view
17                  offset:(NSPoint)offset
18                 profile:(Profile*)profile;
19- (void)closeIfNotKey;
20@end
21
22@implementation FirstRunBubbleController
23
24+ (FirstRunBubbleController*) showForView:(NSView*)view
25                                   offset:(NSPoint)offset
26                                  profile:(Profile*)profile {
27  // Autoreleases itself on bubble close.
28  return [[FirstRunBubbleController alloc] initRelativeToView:view
29                                                       offset:offset
30                                                      profile:profile];
31}
32
33- (id)initRelativeToView:(NSView*)view
34                  offset:(NSPoint)offset
35                 profile:(Profile*)profile {
36  if ((self = [super initWithWindowNibPath:@"FirstRunBubble"
37                            relativeToView:view
38                                    offset:offset])) {
39    profile_ = profile;
40    [self showWindow:nil];
41
42    // On 10.5, the first run bubble sometimes does not disappear when clicking
43    // the omnibox. This happens if the bubble never became key, due to it
44    // showing up so early in the startup sequence. As a workaround, close it
45    // automatically after a few seconds if it doesn't become key.
46    // http://crbug.com/52726
47    [self performSelector:@selector(closeIfNotKey) withObject:nil afterDelay:3];
48  }
49  return self;
50}
51
52- (void)awakeFromNib {
53  DCHECK(header_);
54  [header_ setStringValue:cocoa_l10n_util::ReplaceNSStringPlaceholders(
55      [header_ stringValue], GetDefaultSearchEngineName(profile_), NULL)];
56
57  // Adapt window size to bottom buttons. Do this before all other layouting.
58  CGFloat dy = cocoa_l10n_util::VerticallyReflowGroup([[self bubble] subviews]);
59  NSSize ds = NSMakeSize(0, dy);
60  ds = [[self bubble] convertSize:ds toView:nil];
61
62  NSRect frame = [[self window] frame];
63  frame.origin.y -= ds.height;
64  frame.size.height += ds.height;
65  [[self window] setFrame:frame display:YES];
66}
67
68- (void)close {
69  // If the window is closed before the timer is fired, cancel the timer, since
70  // it retains the controller.
71  [NSObject cancelPreviousPerformRequestsWithTarget:self
72                                           selector:@selector(closeIfNotKey)
73                                             object:nil];
74  [super close];
75}
76
77- (void)closeIfNotKey {
78  if (![[self window] isKeyWindow])
79    [self close];
80}
81
82@end  // FirstRunBubbleController
83