• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2011 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 #ifndef CHROME_BROWSER_UI_FIND_BAR_FIND_BAR_CONTROLLER_H_
6 #define CHROME_BROWSER_UI_FIND_BAR_FIND_BAR_CONTROLLER_H_
7 #pragma once
8 
9 #include "base/basictypes.h"
10 #include "base/memory/scoped_ptr.h"
11 #include "content/common/notification_observer.h"
12 #include "content/common/notification_registrar.h"
13 
14 namespace gfx {
15 class Rect;
16 }
17 
18 class FindBar;
19 class TabContentsWrapper;
20 
21 class FindBarController : public NotificationObserver {
22  public:
23   // An enum listing the possible actions to take on a find-in-page selection.
24   enum SelectionAction {
25     kKeepSelection,  // Translate the find selection into a normal selection.
26     kClearSelection,  // Clear the find selection.
27     kActivateSelection  // Focus and click the selected node (for links).
28   };
29 
30   // FindBar takes ownership of |find_bar_view|.
31   explicit FindBarController(FindBar* find_bar);
32 
33   virtual ~FindBarController();
34 
35   // Shows the find bar. Any previous search string will again be visible.
36   void Show();
37 
38   // Ends the current session.
39   void EndFindSession(SelectionAction action);
40 
41   // Accessor for the attached TabContentsWrapper.
tab_contents()42   TabContentsWrapper* tab_contents() const { return tab_contents_; }
43 
44   // Changes the TabContents that this FindBar is attached to. This occurs when
45   // the user switches tabs in the Browser window. |contents| can be NULL.
46   void ChangeTabContents(TabContentsWrapper* contents);
47 
48   // Overridden from NotificationObserver:
49   virtual void Observe(NotificationType type,
50                        const NotificationSource& source,
51                        const NotificationDetails& details);
52 
find_bar()53   FindBar* find_bar() const { return find_bar_.get(); }
54 
55   // Reposition |view_location| such that it avoids |avoid_overlapping_rect|,
56   // and return the new location.
57   static gfx::Rect GetLocationForFindbarView(
58       gfx::Rect view_location,
59       const gfx::Rect& dialog_bounds,
60       const gfx::Rect& avoid_overlapping_rect);
61 
62  private:
63   // Sents an update to the find bar with the tab contents' current result. The
64   // tab_contents_ must be non-NULL before this call. Theis handles
65   // de-flickering in addition to just calling the update function.
66   void UpdateFindBarForCurrentResult();
67 
68   // For Windows and Linux this function sets the prepopulate text for the
69   // Find text box. The propopulate value is the last value the user searched
70   // for in the current tab, or (if blank) the last value searched for in any
71   // tab. Mac has a global value for search, so this function does nothing on
72   // Mac.
73   void MaybeSetPrepopulateText();
74 
75   NotificationRegistrar registrar_;
76 
77   scoped_ptr<FindBar> find_bar_;
78 
79   // The TabContentsWrapper we are currently associated with.  Can be NULL.
80   TabContentsWrapper* tab_contents_;
81 
82   // The last match count we reported to the user. This is used by
83   // UpdateFindBarForCurrentResult to avoid flickering.
84   int last_reported_matchcount_;
85 
86   DISALLOW_COPY_AND_ASSIGN(FindBarController);
87 };
88 
89 #endif  // CHROME_BROWSER_UI_FIND_BAR_FIND_BAR_CONTROLLER_H_
90