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

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

Issue 195105: [Mac] Adds animations to the findbar.... (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 11 years, 3 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #import <Cocoa/Cocoa.h> 5 #import <Cocoa/Cocoa.h>
6 6
7 #include "app/l10n_util.h" 7 #include "app/l10n_util.h"
8 #include "base/mac_util.h" 8 #include "base/mac_util.h"
9 #include "base/sys_string_conversions.h" 9 #include "base/sys_string_conversions.h"
10 #include "grit/generated_resources.h" 10 #include "grit/generated_resources.h"
11 #include "chrome/browser/find_bar_controller.h" 11 #include "chrome/browser/find_bar_controller.h"
12 #include "chrome/browser/cocoa/browser_window_cocoa.h" 12 #include "chrome/browser/cocoa/browser_window_cocoa.h"
13 #import "chrome/browser/cocoa/find_bar_cocoa_controller.h" 13 #import "chrome/browser/cocoa/find_bar_cocoa_controller.h"
14 #import "chrome/browser/cocoa/find_bar_bridge.h" 14 #import "chrome/browser/cocoa/find_bar_bridge.h"
15 #import "chrome/browser/cocoa/focus_tracker.h" 15 #import "chrome/browser/cocoa/focus_tracker.h"
16 #import "chrome/browser/cocoa/tab_strip_controller.h" 16 #import "chrome/browser/cocoa/tab_strip_controller.h"
17 #include "chrome/browser/tab_contents/tab_contents.h" 17 #include "chrome/browser/tab_contents/tab_contents.h"
18 18
19 namespace {
20 static float kFindBarOpenDuration = 0.2;
21 static float kFindBarCloseDuration = 0.15;
22 }
23
24 @interface FindBarCocoaController (PrivateMethods)
25 // Returns the appropriate frame for a hidden find bar.
26 - (NSRect)hiddenFindBarFrame;
27
28 // Sets the frame of |findBarView_|. |duration| is ignored if |animate| is NO.
29 - (void)setFindBarFrame:(NSRect)endFrame
30 animate:(BOOL)animate
31 duration:(float)duration;
32 @end
33
19 @implementation FindBarCocoaController 34 @implementation FindBarCocoaController
20 35
21 - (id)init { 36 - (id)init {
22 if ((self = [super initWithNibName:@"FindBar" 37 if ((self = [super initWithNibName:@"FindBar"
23 bundle:mac_util::MainAppBundle()])) { 38 bundle:mac_util::MainAppBundle()])) {
24 } 39 }
25 return self; 40 return self;
26 } 41 }
27 42
43 - (void)dealloc {
44 // All animations should be explicitly stopped by the TabContents before a tab
45 // is closed.
46 DCHECK(!currentAnimation_.get());
47 [super dealloc];
48 }
49
28 - (void)setFindBarBridge:(FindBarBridge*)findBarBridge { 50 - (void)setFindBarBridge:(FindBarBridge*)findBarBridge {
29 DCHECK(!findBarBridge_); // should only be called once. 51 DCHECK(!findBarBridge_); // should only be called once.
30 findBarBridge_ = findBarBridge; 52 findBarBridge_ = findBarBridge;
31 } 53 }
32 54
33 - (void)awakeFromNib { 55 - (void)awakeFromNib {
34 [[self view] setHidden:YES]; 56 [findBarView_ setFrame:[self hiddenFindBarFrame]];
35 } 57 }
36 58
37 - (IBAction)close:(id)sender { 59 - (IBAction)close:(id)sender {
38 if (findBarBridge_) 60 if (findBarBridge_)
39 findBarBridge_->GetFindBarController()->EndFindSession(); 61 findBarBridge_->GetFindBarController()->EndFindSession();
40 } 62 }
41 63
42 - (IBAction)previousResult:(id)sender { 64 - (IBAction)previousResult:(id)sender {
43 if (findBarBridge_) 65 if (findBarBridge_)
44 findBarBridge_->GetFindBarController()->tab_contents()->StartFinding( 66 findBarBridge_->GetFindBarController()->tab_contents()->StartFinding(
45 base::SysNSStringToUTF16([findText_ stringValue]), 67 base::SysNSStringToUTF16([findText_ stringValue]),
46 false, false); 68 false, false);
47 } 69 }
48 70
49 - (IBAction)nextResult:(id)sender { 71 - (IBAction)nextResult:(id)sender {
50 if (findBarBridge_) 72 if (findBarBridge_)
51 findBarBridge_->GetFindBarController()->tab_contents()->StartFinding( 73 findBarBridge_->GetFindBarController()->tab_contents()->StartFinding(
52 base::SysNSStringToUTF16([findText_ stringValue]), 74 base::SysNSStringToUTF16([findText_ stringValue]),
53 true, false); 75 true, false);
54 } 76 }
55 77
56 // Positions the find bar view in the correct location based on the current 78 // Positions the find bar container view in the correct location based on the
57 // state of the window. The findbar is always positioned one pixel above the 79 // current state of the window. The find bar container is always positioned one
58 // infobar container. Note that we are using the infobar container location as 80 // pixel above the infobar container. Note that we are using the infobar
59 // a proxy for the toolbar location, but we cannot position based on the toolbar 81 // container location as a proxy for the toolbar location, but we cannot
60 // because the toolbar is not always present (for example in fullscreen 82 // position based on the toolbar because the toolbar is not always present (for
61 // windows). 83 // example in fullscreen windows).
62 - (void)positionFindBarView:(NSView*)infoBarContainerView { 84 - (void)positionFindBarView:(NSView*)infoBarContainerView {
63 static const int kRightEdgeOffset = 25; 85 static const int kRightEdgeOffset = 25;
64 NSView* findBarView = [self view]; 86 NSView* containerView = [self view];
65 int findBarHeight = NSHeight([findBarView frame]); 87 int containerHeight = NSHeight([containerView frame]);
66 int findBarWidth = NSWidth([findBarView frame]); 88 int containerWidth = NSWidth([containerView frame]);
67 89
68 // Start by computing the upper right corner of the infobar container, then 90 // Start by computing the upper right corner of the infobar container, then
69 // move left by a constant offset and up one pixel. This gives us the upper 91 // move left by a constant offset and up one pixel. This gives us the upper
70 // right corner of our bounding box. We move up one pixel to overlap with the 92 // right corner of our bounding box. We move up one pixel to overlap with the
71 // toolbar area, which allows us to cover up the toolbar's border, if present. 93 // toolbar area, which allows us to cover up the toolbar's border, if present.
72 NSRect windowRect = [infoBarContainerView frame]; 94 NSRect windowRect = [infoBarContainerView frame];
73 int max_x = NSMaxX(windowRect) - kRightEdgeOffset; 95 int max_x = NSMaxX(windowRect) - kRightEdgeOffset;
74 int max_y = NSMaxY(windowRect) + 1; 96 int max_y = NSMaxY(windowRect) + 1;
75 97
76 NSRect findRect = NSMakeRect(max_x - findBarWidth, max_y - findBarHeight, 98 NSRect newFrame = NSMakeRect(max_x - containerWidth, max_y - containerHeight,
77 findBarWidth, findBarHeight); 99 containerWidth, containerHeight);
78 [findBarView setFrame:findRect]; 100 [containerView setFrame:newFrame];
79 } 101 }
80 102
81 // NSControl delegate method. 103 // NSControl delegate method.
82 - (void)controlTextDidChange:(NSNotification *)aNotification { 104 - (void)controlTextDidChange:(NSNotification *)aNotification {
83 if (!findBarBridge_) 105 if (!findBarBridge_)
84 return; 106 return;
85 107
86 TabContents* tab_contents = 108 TabContents* tab_contents =
87 findBarBridge_->GetFindBarController()->tab_contents(); 109 findBarBridge_->GetFindBarController()->tab_contents();
88 if (!tab_contents) 110 if (!tab_contents)
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
134 // that function that we want to keep or avoid? 156 // that function that we want to keep or avoid?
135 RenderViewHost* render_view_host = contents->render_view_host(); 157 RenderViewHost* render_view_host = contents->render_view_host();
136 render_view_host->ForwardKeyboardEvent(NativeWebKeyboardEvent(event)); 158 render_view_host->ForwardKeyboardEvent(NativeWebKeyboardEvent(event));
137 return YES; 159 return YES;
138 } 160 }
139 161
140 return NO; 162 return NO;
141 } 163 }
142 164
143 // Methods from FindBar 165 // Methods from FindBar
144 - (void)showFindBar { 166 - (void)showFindBar:(BOOL)animate {
145 [[self view] setHidden:NO]; 167 // Save the currently-focused view. |findBarView_| is in the view
146
147 // Save the currently-focused view. |[self view]| is in the view
148 // hierarchy by now. showFindBar can be called even when the 168 // hierarchy by now. showFindBar can be called even when the
149 // findbar is already open, so do not overwrite an already saved 169 // findbar is already open, so do not overwrite an already saved
150 // view. 170 // view.
151 if (!focusTracker_.get()) 171 if (!focusTracker_.get())
152 focusTracker_.reset( 172 focusTracker_.reset(
153 [[FocusTracker alloc] initWithWindow:[[self view] window]]); 173 [[FocusTracker alloc] initWithWindow:[findBarView_ window]]);
174
175 // Animate the view into place.
176 NSRect frame = [findBarView_ frame];
177 frame.origin = NSMakePoint(0, 0);
178 [self setFindBarFrame:frame animate:animate duration:kFindBarOpenDuration];
154 } 179 }
155 180
156 - (void)hideFindBar { 181 - (void)hideFindBar:(BOOL)animate {
157 [[self view] setHidden:YES]; 182 NSRect frame = [self hiddenFindBarFrame];
183 [self setFindBarFrame:frame animate:animate duration:kFindBarCloseDuration];
184 }
185
186 - (void)stopAnimation {
187 if (currentAnimation_.get()) {
188 [currentAnimation_ stopAnimation];
189 currentAnimation_.reset(nil);
190 }
158 } 191 }
159 192
160 - (void)setFocusAndSelection { 193 - (void)setFocusAndSelection {
161 [[findText_ window] makeFirstResponder:findText_]; 194 [[findText_ window] makeFirstResponder:findText_];
162 195
163 // Enable the buttons if the find text is non-empty. 196 // Enable the buttons if the find text is non-empty.
164 BOOL buttonsEnabled = ([[findText_ stringValue] length] > 0) ? YES : NO; 197 BOOL buttonsEnabled = ([[findText_ stringValue] length] > 0) ? YES : NO;
165 [previousButton_ setEnabled:buttonsEnabled]; 198 [previousButton_ setEnabled:buttonsEnabled];
166 [nextButton_ setEnabled:buttonsEnabled]; 199 [nextButton_ setEnabled:buttonsEnabled];
167
168 } 200 }
169 201
170 - (void)restoreSavedFocus { 202 - (void)restoreSavedFocus {
171 if (!(focusTracker_.get() && 203 if (!(focusTracker_.get() &&
172 [focusTracker_ restoreFocusInWindow:[[self view] window]])) { 204 [focusTracker_ restoreFocusInWindow:[findBarView_ window]])) {
173 // Fall back to giving focus to the tab contents. 205 // Fall back to giving focus to the tab contents.
174 findBarBridge_->GetFindBarController()->tab_contents()->Focus(); 206 findBarBridge_->GetFindBarController()->tab_contents()->Focus();
175 } 207 }
176 focusTracker_.reset(nil); 208 focusTracker_.reset(nil);
177 } 209 }
178 210
179 - (void)setFindText:(const string16&)findText { 211 - (void)setFindText:(const string16&)findText {
180 [findText_ setStringValue:base::SysUTF16ToNSString(findText)]; 212 [findText_ setStringValue:base::SysUTF16ToNSString(findText)];
181 } 213 }
182 214
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
229 [resultsLabel_ sizeToFit]; 261 [resultsLabel_ sizeToFit];
230 labelFrame.size.width = [resultsLabel_ frame].size.width; 262 labelFrame.size.width = [resultsLabel_ frame].size.width;
231 labelFrame.origin.x = NSMaxX([findText_ frame]) - labelFrame.size.width; 263 labelFrame.origin.x = NSMaxX([findText_ frame]) - labelFrame.size.width;
232 [resultsLabel_ setFrame:labelFrame]; 264 [resultsLabel_ setFrame:labelFrame];
233 265
234 // TODO(rohitrao): If the search string is too long, then it will overlap with 266 // TODO(rohitrao): If the search string is too long, then it will overlap with
235 // the results label. Fix. 267 // the results label. Fix.
236 } 268 }
237 269
238 - (BOOL)isFindBarVisible { 270 - (BOOL)isFindBarVisible {
239 return [[self view] isHidden] ? NO : YES; 271 // Find bar is visible if any part of it is on the screen.
272 return NSIntersectsRect([[self view] bounds], [findBarView_ frame]);
273 }
274
275 // NSAnimation delegate methods.
276 - (void)animationDidEnd:(NSAnimation*)animation {
277 // Autorelease the animation (cannot use release because the animation object
278 // is still on the stack.
279 DCHECK(animation == currentAnimation_.get());
280 [currentAnimation_.release() autorelease];
pink (ping after 24hrs) 2009/09/18 13:40:12 i assume release() here doesn't actually call rele
rohitrao (ping after 24h) 2009/09/18 15:17:58 I'll file a bug against Mark =)
Mark Mentovai 2009/09/18 15:35:13 This is not what you want. Use current_animation_
240 } 281 }
241 282
242 @end 283 @end
284
285 @implementation FindBarCocoaController (PrivateMethods)
286 - (NSRect)hiddenFindBarFrame {
pink (ping after 24hrs) 2009/09/18 13:40:12 blank line between these, maybe?
rohitrao (ping after 24h) 2009/09/18 15:17:58 Done.
287 NSRect frame = [findBarView_ frame];
288 NSRect containerBounds = [[self view] bounds];
289 frame.origin = NSMakePoint(NSMinX(containerBounds), NSMaxY(containerBounds));
290 return frame;
291 }
292
293 - (void)setFindBarFrame:(NSRect)endFrame
294 animate:(BOOL)animate
295 duration:(float)duration {
296 // Save the current frame.
297 NSRect startFrame = [findBarView_ frame];
298
299 // Stop any existing animations.
300 [currentAnimation_ stopAnimation];
301
302 if (!animate) {
303 [findBarView_ setFrame:endFrame];
304 currentAnimation_.reset(nil);
305 return;
306 }
307
308 // Reset the frame to what was saved above.
309 [findBarView_ setFrame:startFrame];
310 NSDictionary* dict = [NSDictionary dictionaryWithObjectsAndKeys:
311 findBarView_, NSViewAnimationTargetKey,
312 [NSValue valueWithRect:endFrame], NSViewAnimationEndFrameKey, nil];
313
314 currentAnimation_.reset(
315 [[NSViewAnimation alloc]
316 initWithViewAnimations:[NSArray arrayWithObjects:dict, nil]]);
317 [currentAnimation_ setDuration:duration];
318 [currentAnimation_ setDelegate:self];
319 [currentAnimation_ startAnimation];
320 }
321
322 @end
OLDNEW
« no previous file with comments | « chrome/browser/cocoa/find_bar_cocoa_controller.h ('k') | chrome/browser/cocoa/find_bar_cocoa_controller_unittest.mm » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698