Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(103)

Side by Side Diff: chrome/browser/cocoa/base_bubble_controller.mm

Issue 2822026: Mac: First run bubble. (Closed)
Patch Set: '' Created 10 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
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/cocoa/base_bubble_controller.h"
6
7 #include "app/l10n_util.h"
8 #include "base/logging.h"
9 #include "base/mac_util.h"
10 #include "base/string_util.h"
11 #import "chrome/browser/cocoa/info_bubble_view.h"
12 #include "grit/generated_resources.h"
13
14 @implementation BaseBubbleController
15
16 @synthesize bubble = bubble_;
17
18 - (id)initWithWindowNibPath:(NSString*)nibPath
19 parentWindow:(NSWindow*)parentWindow
20 anchoredAt:(NSPoint)anchoredAt {
21 nibPath = [mac_util::MainAppBundle() pathForResource:nibPath
22 ofType:@"nib"];
23 if ((self = [super initWithWindowNibPath:nibPath owner:self])) {
24 parentWindow_ = parentWindow;
25 anchor_ = anchoredAt;
26
27 // Watch to see if the parent window closes, and if so, close this one.
28 NSNotificationCenter* center = [NSNotificationCenter defaultCenter];
29 [center addObserver:self
30 selector:@selector(parentWindowWillClose:)
31 name:NSWindowWillCloseNotification
32 object:parentWindow_];
33 }
34 return self;
35 }
36
37 - (id)initWithWindowNibPath:(NSString*)nibPath
38 relativeToView:(NSView*)view
39 offset:(NSPoint)offset {
40 DCHECK([view window]);
41 NSWindow* window = [view window];
42 NSRect bounds = [view convertRect:[view bounds] toView:nil];
43 NSPoint anchor = NSMakePoint(NSMinX(bounds) + offset.x,
44 NSMinY(bounds) + offset.y);
45 anchor = [window convertBaseToScreen:anchor];
46 return [self initWithWindowNibPath:nibPath
47 parentWindow:window
48 anchoredAt:anchor];
49 }
50
51
52 - (void)awakeFromNib {
53 // Check all connections have been made in Interface Builder.
54 DCHECK([self window]);
55 DCHECK(bubble_);
56 DCHECK_EQ(self, [[self window] delegate]);
57
58 [bubble_ setBubbleType:info_bubble::kWhiteInfoBubble];
59 [bubble_ setArrowLocation:info_bubble::kTopRight];
60 }
61
62 - (void)dealloc {
63 [[NSNotificationCenter defaultCenter] removeObserver:self];
64 [super dealloc];
65 }
66
67 - (void)parentWindowWillClose:(NSNotification*)notification {
68 [self close];
69 }
70
71 - (void)windowWillClose:(NSNotification*)notification {
72 // We caught a close so we don't need to watch for the parent closing.
73 [[NSNotificationCenter defaultCenter] removeObserver:self];
74 [self autorelease];
75 }
76
77 // We want this to be a child of a browser window. addChildWindow:
78 // (called from this function) will bring the window on-screen;
79 // unfortunately, [NSWindowController showWindow:] will also bring it
80 // on-screen (but will cause unexpected changes to the window's
81 // position). We cannot have an addChildWindow: and a subsequent
82 // showWindow:. Thus, we have our own version.
83 - (void)showWindow:(id)sender {
84 NSWindow* window = [self window]; // completes nib load
jeremy 2010/06/27 12:46:42 nit: Completes nib load.
85
86 NSPoint origin = anchor_;
87 NSSize offsets = NSMakeSize(info_bubble::kBubbleArrowXOffset +
88 info_bubble::kBubbleArrowWidth / 2.0, 0);
89 offsets = [[parentWindow_ contentView] convertSize:offsets toView:nil];
90 origin.x += offsets.width;
91 if ([bubble_ arrowLocation] == info_bubble::kTopRight)
92 origin.x -= NSWidth([window frame]);
93 origin.y -= NSHeight([window frame]);
94 [window setFrameOrigin:origin];
95 [parentWindow_ addChildWindow:window ordered:NSWindowAbove];
96 [window makeKeyAndOrderFront:self];
97 }
98
99 - (void)close {
100 [parentWindow_ removeChildWindow:[self window]];
101 [super close];
102 }
103
104 // The controller is the delegate of the window so it receives did resign key
105 // notifications. When key is resigned mirror Windows behavior and close the
106 // window.
107 - (void)windowDidResignKey:(NSNotification*)notification {
108 NSWindow* window = [self window];
109 DCHECK_EQ([notification object], window);
110 if ([window isVisible]) {
111 // If the window isn't visible, it is already closed, and this notification
112 // has been sent as part of the closing operation, so no need to close.
113 [self close];
114 }
115 }
116
117 // By implementing this, ESC causes the window to go away.
118 - (IBAction)cancel:(id)sender {
119 // This is not a "real" cancel as potential changes to the radio group are not
120 // undone. That's ok.
jeremy 2010/06/27 12:46:42 Could you expand this comment: which radio group?
121 [self close];
122 }
123 @end // BaseBubbleController
OLDNEW
« no previous file with comments | « chrome/browser/cocoa/base_bubble_controller.h ('k') | chrome/browser/cocoa/content_blocked_bubble_controller.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698