| // Copyright (c) 2012 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. |
| |
| #ifndef CHROME_BROWSER_UI_FIND_BAR_FIND_BAR_CONTROLLER_H_ |
| #define CHROME_BROWSER_UI_FIND_BAR_FIND_BAR_CONTROLLER_H_ |
| |
| #include "base/basictypes.h" |
| #include "base/memory/scoped_ptr.h" |
| #include "content/public/browser/notification_observer.h" |
| #include "content/public/browser/notification_registrar.h" |
| |
| class FindBar; |
| |
| namespace content { |
| class WebContents; |
| } |
| |
| namespace gfx { |
| class Rect; |
| } |
| |
| class FindBarController : public content::NotificationObserver { |
| public: |
| // An enum listing the possible actions to take on a find-in-page selection |
| // in the page when ending the find session. |
| enum SelectionAction { |
| kKeepSelectionOnPage, // Translate the find selection into a normal |
| // selection. |
| kClearSelectionOnPage, // Clear the find selection. |
| kActivateSelectionOnPage // Focus and click the selected node (for links). |
| }; |
| |
| // An enum listing the possible actions to take on a find-in-page results in |
| // the Find box when ending the find session. |
| enum ResultAction { |
| kClearResultsInFindBox, // Clear search string, ordinal and match count. |
| kKeepResultsInFindBox, // Leave the results untouched. |
| }; |
| |
| // FindBar takes ownership of |find_bar_view|. |
| explicit FindBarController(FindBar* find_bar); |
| |
| virtual ~FindBarController(); |
| |
| // Shows the find bar. Any previous search string will again be visible. |
| void Show(); |
| |
| // Ends the current session. |selection_action| specifies what to do with the |
| // selection on the page created by the find operation. |results_action| |
| // specifies what to do with the contents of the Find box (after ending). |
| void EndFindSession(SelectionAction selection_action, |
| ResultAction results_action); |
| |
| // Accessor for the attached WebContents. |
| content::WebContents* web_contents() const { return web_contents_; } |
| |
| // Changes the WebContents that this FindBar is attached to. This |
| // occurs when the user switches tabs in the Browser window. |contents| can be |
| // NULL. |
| void ChangeWebContents(content::WebContents* contents); |
| |
| // Overridden from content::NotificationObserver: |
| virtual void Observe(int type, |
| const content::NotificationSource& source, |
| const content::NotificationDetails& details) OVERRIDE; |
| |
| FindBar* find_bar() const { return find_bar_.get(); } |
| |
| // Reposition |view_location| such that it avoids |avoid_overlapping_rect|, |
| // and return the new location. |
| static gfx::Rect GetLocationForFindbarView( |
| gfx::Rect view_location, |
| const gfx::Rect& dialog_bounds, |
| const gfx::Rect& avoid_overlapping_rect); |
| |
| private: |
| // Sents an update to the find bar with the tab contents' current result. The |
| // web_contents_ must be non-NULL before this call. Theis handles |
| // de-flickering in addition to just calling the update function. |
| void UpdateFindBarForCurrentResult(); |
| |
| // For Windows and Linux this function sets the prepopulate text for the |
| // Find text box. The propopulate value is the last value the user searched |
| // for in the current tab, or (if blank) the last value searched for in any |
| // tab. Mac has a global value for search, so this function does nothing on |
| // Mac. |
| void MaybeSetPrepopulateText(); |
| |
| content::NotificationRegistrar registrar_; |
| |
| scoped_ptr<FindBar> find_bar_; |
| |
| // The WebContents we are currently associated with. Can be NULL. |
| content::WebContents* web_contents_; |
| |
| // The last match count we reported to the user. This is used by |
| // UpdateFindBarForCurrentResult to avoid flickering. |
| int last_reported_matchcount_; |
| |
| DISALLOW_COPY_AND_ASSIGN(FindBarController); |
| }; |
| |
| #endif // CHROME_BROWSER_UI_FIND_BAR_FIND_BAR_CONTROLLER_H_ |