Index: chrome/browser/ui/cocoa/find_bar_cocoa_controller.mm |
=================================================================== |
--- chrome/browser/ui/cocoa/find_bar_cocoa_controller.mm (revision 71508) |
+++ chrome/browser/ui/cocoa/find_bar_cocoa_controller.mm (working copy) |
@@ -1,384 +0,0 @@ |
-// Copyright (c) 2009 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#import <Cocoa/Cocoa.h> |
- |
-#include "base/mac/mac_util.h" |
-#include "base/sys_string_conversions.h" |
-#include "chrome/browser/renderer_host/render_view_host.h" |
-#include "chrome/browser/tab_contents/tab_contents.h" |
-#include "chrome/browser/ui/cocoa/browser_window_cocoa.h" |
-#import "chrome/browser/ui/cocoa/find_bar_cocoa_controller.h" |
-#import "chrome/browser/ui/cocoa/find_bar_bridge.h" |
-#import "chrome/browser/ui/cocoa/find_bar_text_field.h" |
-#import "chrome/browser/ui/cocoa/find_bar_text_field_cell.h" |
-#import "chrome/browser/ui/cocoa/find_pasteboard.h" |
-#import "chrome/browser/ui/cocoa/focus_tracker.h" |
-#import "chrome/browser/ui/cocoa/tab_strip_controller.h" |
-#include "chrome/browser/ui/find_bar/find_bar_controller.h" |
-#import "third_party/GTM/AppKit/GTMNSAnimation+Duration.h" |
- |
-namespace { |
-const float kFindBarOpenDuration = 0.2; |
-const float kFindBarCloseDuration = 0.15; |
-} |
- |
-@interface FindBarCocoaController (PrivateMethods) |
-// Returns the appropriate frame for a hidden find bar. |
-- (NSRect)hiddenFindBarFrame; |
- |
-// Sets the frame of |findBarView_|. |duration| is ignored if |animate| is NO. |
-- (void)setFindBarFrame:(NSRect)endFrame |
- animate:(BOOL)animate |
- duration:(float)duration; |
- |
-// Optionally stops the current search, puts |text| into the find bar, and |
-// enables the buttons, but doesn't start a new search for |text|. |
-- (void)prepopulateText:(NSString*)text stopSearch:(BOOL)stopSearch; |
-@end |
- |
-@implementation FindBarCocoaController |
- |
-- (id)init { |
- if ((self = [super initWithNibName:@"FindBar" |
- bundle:base::mac::MainAppBundle()])) { |
- [[NSNotificationCenter defaultCenter] |
- addObserver:self |
- selector:@selector(findPboardUpdated:) |
- name:kFindPasteboardChangedNotification |
- object:[FindPasteboard sharedInstance]]; |
- } |
- return self; |
-} |
- |
-- (void)dealloc { |
- // All animations should be explicitly stopped by the TabContents before a tab |
- // is closed. |
- DCHECK(!currentAnimation_.get()); |
- [[NSNotificationCenter defaultCenter] removeObserver:self]; |
- [super dealloc]; |
-} |
- |
-- (void)setFindBarBridge:(FindBarBridge*)findBarBridge { |
- DCHECK(!findBarBridge_); // should only be called once. |
- findBarBridge_ = findBarBridge; |
-} |
- |
-- (void)awakeFromNib { |
- [findBarView_ setFrame:[self hiddenFindBarFrame]]; |
- |
- // Stopping the search requires a findbar controller, which isn't valid yet |
- // during setup. Furthermore, there is no active search yet anyway. |
- [self prepopulateText:[[FindPasteboard sharedInstance] findText] |
- stopSearch:NO]; |
-} |
- |
-- (IBAction)close:(id)sender { |
- if (findBarBridge_) |
- findBarBridge_->GetFindBarController()->EndFindSession( |
- FindBarController::kKeepSelection); |
-} |
- |
-- (IBAction)previousResult:(id)sender { |
- if (findBarBridge_) |
- findBarBridge_->GetFindBarController()->tab_contents()->StartFinding( |
- base::SysNSStringToUTF16([findText_ stringValue]), |
- false, false); |
-} |
- |
-- (IBAction)nextResult:(id)sender { |
- if (findBarBridge_) |
- findBarBridge_->GetFindBarController()->tab_contents()->StartFinding( |
- base::SysNSStringToUTF16([findText_ stringValue]), |
- true, false); |
-} |
- |
-- (void)findPboardUpdated:(NSNotification*)notification { |
- if (suppressPboardUpdateActions_) |
- return; |
- [self prepopulateText:[[FindPasteboard sharedInstance] findText] |
- stopSearch:YES]; |
-} |
- |
-- (void)positionFindBarViewAtMaxY:(CGFloat)maxY maxWidth:(CGFloat)maxWidth { |
- static const CGFloat kRightEdgeOffset = 25; |
- NSView* containerView = [self view]; |
- CGFloat containerHeight = NSHeight([containerView frame]); |
- CGFloat containerWidth = NSWidth([containerView frame]); |
- |
- // Adjust where we'll actually place the find bar. |
- CGFloat maxX = maxWidth - kRightEdgeOffset; |
- DLOG_IF(WARNING, maxX < 0) << "Window too narrow for find bar"; |
- maxY += 1; |
- |
- NSRect newFrame = NSMakeRect(maxX - containerWidth, maxY - containerHeight, |
- containerWidth, containerHeight); |
- [containerView setFrame:newFrame]; |
-} |
- |
-// NSControl delegate method. |
-- (void)controlTextDidChange:(NSNotification *)aNotification { |
- if (!findBarBridge_) |
- return; |
- |
- TabContents* tab_contents = |
- findBarBridge_->GetFindBarController()->tab_contents(); |
- if (!tab_contents) |
- return; |
- |
- NSString* findText = [findText_ stringValue]; |
- suppressPboardUpdateActions_ = YES; |
- [[FindPasteboard sharedInstance] setFindText:findText]; |
- suppressPboardUpdateActions_ = NO; |
- |
- if ([findText length] > 0) { |
- tab_contents->StartFinding(base::SysNSStringToUTF16(findText), true, false); |
- } else { |
- // The textbox is empty so we reset. |
- tab_contents->StopFinding(FindBarController::kClearSelection); |
- [self updateUIForFindResult:tab_contents->find_result() |
- withText:string16()]; |
- } |
-} |
- |
-// NSControl delegate method |
-- (BOOL)control:(NSControl*)control |
- textView:(NSTextView*)textView |
- doCommandBySelector:(SEL)command { |
- if (command == @selector(insertNewline:)) { |
- // Pressing Return |
- NSEvent* event = [NSApp currentEvent]; |
- |
- if ([event modifierFlags] & NSShiftKeyMask) |
- [previousButton_ performClick:nil]; |
- else |
- [nextButton_ performClick:nil]; |
- |
- return YES; |
- } else if (command == @selector(insertLineBreak:)) { |
- // Pressing Ctrl-Return |
- if (findBarBridge_) { |
- findBarBridge_->GetFindBarController()->EndFindSession( |
- FindBarController::kActivateSelection); |
- } |
- return YES; |
- } else if (command == @selector(pageUp:) || |
- command == @selector(pageUpAndModifySelection:) || |
- command == @selector(scrollPageUp:) || |
- command == @selector(pageDown:) || |
- command == @selector(pageDownAndModifySelection:) || |
- command == @selector(scrollPageDown:) || |
- command == @selector(scrollToBeginningOfDocument:) || |
- command == @selector(scrollToEndOfDocument:) || |
- command == @selector(moveUp:) || |
- command == @selector(moveDown:)) { |
- TabContents* contents = |
- findBarBridge_->GetFindBarController()->tab_contents(); |
- if (!contents) |
- return NO; |
- |
- // Sanity-check to make sure we got a keyboard event. |
- NSEvent* event = [NSApp currentEvent]; |
- if ([event type] != NSKeyDown && [event type] != NSKeyUp) |
- return NO; |
- |
- // Forward the event to the renderer. |
- // TODO(rohitrao): Should this call -[BaseView keyEvent:]? Is there code in |
- // that function that we want to keep or avoid? Calling |
- // |ForwardKeyboardEvent()| directly ignores edit commands, which breaks |
- // cmd-up/down if we ever decide to include |moveToBeginningOfDocument:| in |
- // the list above. |
- RenderViewHost* render_view_host = contents->render_view_host(); |
- render_view_host->ForwardKeyboardEvent(NativeWebKeyboardEvent(event)); |
- return YES; |
- } |
- |
- return NO; |
-} |
- |
-// Methods from FindBar |
-- (void)showFindBar:(BOOL)animate { |
- // Save the currently-focused view. |findBarView_| is in the view |
- // hierarchy by now. showFindBar can be called even when the |
- // findbar is already open, so do not overwrite an already saved |
- // view. |
- if (!focusTracker_.get()) |
- focusTracker_.reset( |
- [[FocusTracker alloc] initWithWindow:[findBarView_ window]]); |
- |
- // Animate the view into place. |
- NSRect frame = [findBarView_ frame]; |
- frame.origin = NSMakePoint(0, 0); |
- [self setFindBarFrame:frame animate:animate duration:kFindBarOpenDuration]; |
-} |
- |
-- (void)hideFindBar:(BOOL)animate { |
- NSRect frame = [self hiddenFindBarFrame]; |
- [self setFindBarFrame:frame animate:animate duration:kFindBarCloseDuration]; |
-} |
- |
-- (void)stopAnimation { |
- if (currentAnimation_.get()) { |
- [currentAnimation_ stopAnimation]; |
- currentAnimation_.reset(nil); |
- } |
-} |
- |
-- (void)setFocusAndSelection { |
- [[findText_ window] makeFirstResponder:findText_]; |
- |
- // Enable the buttons if the find text is non-empty. |
- BOOL buttonsEnabled = ([[findText_ stringValue] length] > 0) ? YES : NO; |
- [previousButton_ setEnabled:buttonsEnabled]; |
- [nextButton_ setEnabled:buttonsEnabled]; |
-} |
- |
-- (void)restoreSavedFocus { |
- if (!(focusTracker_.get() && |
- [focusTracker_ restoreFocusInWindow:[findBarView_ window]])) { |
- // Fall back to giving focus to the tab contents. |
- findBarBridge_->GetFindBarController()->tab_contents()->Focus(); |
- } |
- focusTracker_.reset(nil); |
-} |
- |
-- (void)setFindText:(NSString*)findText { |
- [findText_ setStringValue:findText]; |
- |
- // Make sure the text in the find bar always ends up in the find pasteboard |
- // (and, via notifications, in the other find bars too). |
- [[FindPasteboard sharedInstance] setFindText:findText]; |
-} |
- |
-- (void)clearResults:(const FindNotificationDetails&)results { |
- // Just call updateUIForFindResult, which will take care of clearing |
- // the search text and the results label. |
- [self updateUIForFindResult:results withText:string16()]; |
-} |
- |
-- (void)updateUIForFindResult:(const FindNotificationDetails&)result |
- withText:(const string16&)findText { |
- // If we don't have any results and something was passed in, then |
- // that means someone pressed Cmd-G while the Find box was |
- // closed. In that case we need to repopulate the Find box with what |
- // was passed in. |
- if ([[findText_ stringValue] length] == 0 && !findText.empty()) { |
- [findText_ setStringValue:base::SysUTF16ToNSString(findText)]; |
- [findText_ selectText:self]; |
- } |
- |
- // Make sure Find Next and Find Previous are enabled if we found any matches. |
- BOOL buttonsEnabled = result.number_of_matches() > 0 ? YES : NO; |
- [previousButton_ setEnabled:buttonsEnabled]; |
- [nextButton_ setEnabled:buttonsEnabled]; |
- |
- // Update the results label. |
- BOOL validRange = result.active_match_ordinal() != -1 && |
- result.number_of_matches() != -1; |
- NSString* searchString = [findText_ stringValue]; |
- if ([searchString length] > 0 && validRange) { |
- [[findText_ findBarTextFieldCell] |
- setActiveMatch:result.active_match_ordinal() |
- of:result.number_of_matches()]; |
- } else { |
- // If there was no text entered, we don't show anything in the results area. |
- [[findText_ findBarTextFieldCell] clearResults]; |
- } |
- |
- [findText_ resetFieldEditorFrameIfNeeded]; |
- |
- // If we found any results, reset the focus tracker, so we always |
- // restore focus to the tab contents. |
- if (result.number_of_matches() > 0) |
- focusTracker_.reset(nil); |
-} |
- |
-- (BOOL)isFindBarVisible { |
- // Find bar is visible if any part of it is on the screen. |
- return NSIntersectsRect([[self view] bounds], [findBarView_ frame]); |
-} |
- |
-- (BOOL)isFindBarAnimating { |
- return (currentAnimation_.get() != nil); |
-} |
- |
-// NSAnimation delegate methods. |
-- (void)animationDidEnd:(NSAnimation*)animation { |
- // Autorelease the animation (cannot use release because the animation object |
- // is still on the stack. |
- DCHECK(animation == currentAnimation_.get()); |
- [currentAnimation_.release() autorelease]; |
- |
- // If the find bar is not visible, make it actually hidden, so it'll no longer |
- // respond to key events. |
- [findBarView_ setHidden:![self isFindBarVisible]]; |
-} |
- |
-@end |
- |
-@implementation FindBarCocoaController (PrivateMethods) |
- |
-- (NSRect)hiddenFindBarFrame { |
- NSRect frame = [findBarView_ frame]; |
- NSRect containerBounds = [[self view] bounds]; |
- frame.origin = NSMakePoint(NSMinX(containerBounds), NSMaxY(containerBounds)); |
- return frame; |
-} |
- |
-- (void)setFindBarFrame:(NSRect)endFrame |
- animate:(BOOL)animate |
- duration:(float)duration { |
- // Save the current frame. |
- NSRect startFrame = [findBarView_ frame]; |
- |
- // Stop any existing animations. |
- [currentAnimation_ stopAnimation]; |
- |
- if (!animate) { |
- [findBarView_ setFrame:endFrame]; |
- [findBarView_ setHidden:![self isFindBarVisible]]; |
- currentAnimation_.reset(nil); |
- return; |
- } |
- |
- // If animating, ensure that the find bar is not hidden. Hidden status will be |
- // updated at the end of the animation. |
- [findBarView_ setHidden:NO]; |
- |
- // Reset the frame to what was saved above. |
- [findBarView_ setFrame:startFrame]; |
- NSDictionary* dict = [NSDictionary dictionaryWithObjectsAndKeys: |
- findBarView_, NSViewAnimationTargetKey, |
- [NSValue valueWithRect:endFrame], NSViewAnimationEndFrameKey, nil]; |
- |
- currentAnimation_.reset( |
- [[NSViewAnimation alloc] |
- initWithViewAnimations:[NSArray arrayWithObjects:dict, nil]]); |
- [currentAnimation_ gtm_setDuration:duration |
- eventMask:NSLeftMouseUpMask]; |
- [currentAnimation_ setDelegate:self]; |
- [currentAnimation_ startAnimation]; |
-} |
- |
-- (void)prepopulateText:(NSString*)text stopSearch:(BOOL)stopSearch{ |
- [self setFindText:text]; |
- |
- // End the find session, hide the "x of y" text and disable the |
- // buttons, but do not close the find bar or raise the window here. |
- if (stopSearch && findBarBridge_) { |
- TabContents* contents = |
- findBarBridge_->GetFindBarController()->tab_contents(); |
- if (contents) { |
- contents->StopFinding(FindBarController::kClearSelection); |
- findBarBridge_->ClearResults(contents->find_result()); |
- } |
- } |
- |
- // Has to happen after |ClearResults()| above. |
- BOOL buttonsEnabled = [text length] > 0 ? YES : NO; |
- [previousButton_ setEnabled:buttonsEnabled]; |
- [nextButton_ setEnabled:buttonsEnabled]; |
-} |
- |
-@end |