Index: chrome/browser/ui/gtk/find_bar_gtk.h |
diff --git a/chrome/browser/ui/gtk/find_bar_gtk.h b/chrome/browser/ui/gtk/find_bar_gtk.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..602c1bc7c88e6a4257b0a107a55b368c2c404e36 |
--- /dev/null |
+++ b/chrome/browser/ui/gtk/find_bar_gtk.h |
@@ -0,0 +1,240 @@ |
+// Copyright (c) 2010 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_GTK_FIND_BAR_GTK_H_ |
+#define CHROME_BROWSER_UI_GTK_FIND_BAR_GTK_H_ |
+#pragma once |
+ |
+#include <gtk/gtk.h> |
+ |
+#include "base/basictypes.h" |
+#include "base/scoped_ptr.h" |
+#include "chrome/browser/gtk/focus_store_gtk.h" |
+#include "chrome/browser/gtk/owned_widget_gtk.h" |
+#include "chrome/browser/gtk/slide_animator_gtk.h" |
+#include "chrome/browser/ui/find_bar/find_bar.h" |
+#include "chrome/common/notification_observer.h" |
+#include "chrome/common/notification_registrar.h" |
+#include "gfx/point.h" |
+ |
+class Browser; |
+class BrowserWindowGtk; |
+class CustomDrawButton; |
+class FindBarController; |
+class GtkThemeProvider; |
+class NineBox; |
+class SlideAnimatorGtk; |
+class TabContentsContainerGtk; |
+ |
+typedef struct _GtkFloatingContainer GtkFloatingContainer; |
+ |
+// Currently this class contains both a model and a view. We may want to |
+// eventually pull out the model specific bits and share with Windows. |
+class FindBarGtk : public FindBar, |
+ public FindBarTesting, |
+ public NotificationObserver { |
+ public: |
+ explicit FindBarGtk(Browser* browser); |
+ virtual ~FindBarGtk(); |
+ |
+ GtkWidget* widget() const { return slide_widget_->widget(); } |
+ |
+ // Methods from FindBar. |
+ virtual FindBarController* GetFindBarController() const; |
+ virtual void SetFindBarController(FindBarController* find_bar_controller); |
+ virtual void Show(bool animate); |
+ virtual void Hide(bool animate); |
+ virtual void SetFocusAndSelection(); |
+ virtual void ClearResults(const FindNotificationDetails& results); |
+ virtual void StopAnimation(); |
+ virtual void MoveWindowIfNecessary(const gfx::Rect& selection_rect, |
+ bool no_redraw); |
+ virtual void SetFindText(const string16& find_text); |
+ virtual void UpdateUIForFindResult(const FindNotificationDetails& result, |
+ const string16& find_text); |
+ virtual void AudibleAlert(); |
+ virtual bool IsFindBarVisible(); |
+ virtual void RestoreSavedFocus(); |
+ virtual FindBarTesting* GetFindBarTesting(); |
+ |
+ // Methods from FindBarTesting. |
+ virtual bool GetFindBarWindowInfo(gfx::Point* position, |
+ bool* fully_visible); |
+ virtual string16 GetFindText(); |
+ virtual string16 GetFindSelectedText(); |
+ virtual string16 GetMatchCountText(); |
+ |
+ // Overridden from NotificationObserver: |
+ virtual void Observe(NotificationType type, |
+ const NotificationSource& source, |
+ const NotificationDetails& details); |
+ |
+ private: |
+ void InitWidgets(); |
+ |
+ // Store the currently focused widget if it is not in the find bar. |
+ // This should always be called before we claim focus. |
+ void StoreOutsideFocus(); |
+ |
+ // For certain keystrokes, such as up or down, we want to forward the event |
+ // to the renderer rather than handling it ourselves. Returns true if the |
+ // key event was forwarded. |
+ // See similar function in FindBarWin. |
+ bool MaybeForwardKeyEventToRenderer(GdkEventKey* event); |
+ |
+ // Searches for another occurrence of the entry text, moving forward if |
+ // |forward_search| is true. |
+ void FindEntryTextInContents(bool forward_search); |
+ |
+ void UpdateMatchLabelAppearance(bool failure); |
+ |
+ // Asynchronously repositions the dialog. |
+ void Reposition(); |
+ |
+ // Returns the rectangle representing where to position the find bar. If |
+ // |avoid_overlapping_rect| is specified, the return value will be a rectangle |
+ // located immediately to the left of |avoid_overlapping_rect|, as long as |
+ // there is enough room for the dialog to draw within the bounds. If not, the |
+ // dialog position returned will overlap |avoid_overlapping_rect|. |
+ // Note: |avoid_overlapping_rect| is expected to use coordinates relative to |
+ // the top of the page area, (it will be converted to coordinates relative to |
+ // the top of the browser window, when comparing against the dialog |
+ // coordinates). The returned value is relative to the browser window. |
+ gfx::Rect GetDialogPosition(gfx::Rect avoid_overlapping_rect); |
+ |
+ // Adjust the text alignment according to the text direction of the widget |
+ // and |text_entry_|'s content, to make sure the real text alignment is |
+ // always in sync with the UI language direction. |
+ void AdjustTextAlignment(); |
+ |
+ // Get the position of the findbar within the floating container. |
+ gfx::Point GetPosition(); |
+ |
+ static void OnParentSet(GtkWidget* widget, GtkObject* old_parent, |
+ FindBarGtk* find_bar); |
+ |
+ static void OnSetFloatingPosition(GtkFloatingContainer* floating_container, |
+ GtkAllocation* allocation, |
+ FindBarGtk* find_bar); |
+ |
+ // Callback when the entry text changes. |
+ static gboolean OnChanged(GtkWindow* window, FindBarGtk* find_bar); |
+ |
+ static gboolean OnKeyPressEvent(GtkWidget* widget, GdkEventKey* event, |
+ FindBarGtk* find_bar); |
+ static gboolean OnKeyReleaseEvent(GtkWidget* widget, GdkEventKey* event, |
+ FindBarGtk* find_bar); |
+ |
+ // Callback for previous, next, and close button. |
+ static void OnClicked(GtkWidget* button, FindBarGtk* find_bar); |
+ |
+ // Handles shapping and drawing the find bar background. |
+ static gboolean OnExpose(GtkWidget* widget, GdkEventExpose* event, |
+ FindBarGtk* bar); |
+ |
+ // Expose that draws the text entry background in GTK mode. |
+ static gboolean OnContentEventBoxExpose(GtkWidget* widget, |
+ GdkEventExpose* event, |
+ FindBarGtk* bar); |
+ |
+ // These are both used for focus management. |
+ static gboolean OnFocus(GtkWidget* text_entry, GtkDirectionType focus, |
+ FindBarGtk* find_bar); |
+ static gboolean OnButtonPress(GtkWidget* text_entry, GdkEventButton* e, |
+ FindBarGtk* find_bar); |
+ |
+ // Forwards ctrl-Home/End key bindings to the renderer. |
+ static void OnMoveCursor(GtkEntry* entry, GtkMovementStep step, gint count, |
+ gboolean selection, FindBarGtk* bar); |
+ |
+ // Handles Enter key. |
+ static void OnActivate(GtkEntry* entry, FindBarGtk* bar); |
+ |
+ static void OnWidgetDirectionChanged(GtkWidget* widget, |
+ GtkTextDirection previous_direction, |
+ FindBarGtk* find_bar) { |
+ find_bar->AdjustTextAlignment(); |
+ } |
+ |
+ static void OnKeymapDirectionChanged(GdkKeymap* keymap, |
+ FindBarGtk* find_bar) { |
+ find_bar->AdjustTextAlignment(); |
+ } |
+ |
+ static gboolean OnFocusIn(GtkWidget* entry, GdkEventFocus* event, |
+ FindBarGtk* find_bar); |
+ |
+ static gboolean OnFocusOut(GtkWidget* entry, GdkEventFocus* event, |
+ FindBarGtk* find_bar); |
+ |
+ Browser* browser_; |
+ BrowserWindowGtk* window_; |
+ |
+ // Provides colors and information about GTK. |
+ GtkThemeProvider* theme_provider_; |
+ |
+ // The widget that animates the slide-in and -out of the findbar. |
+ scoped_ptr<SlideAnimatorGtk> slide_widget_; |
+ |
+ // A GtkAlignment that is the child of |slide_widget_|. |
+ GtkWidget* container_; |
+ |
+ // Cached allocation of |container_|. We keep this on hand so that we can |
+ // reset the widget's shape when the width/height change. |
+ int container_width_; |
+ int container_height_; |
+ |
+ // The widget where text is entered. |
+ GtkWidget* text_entry_; |
+ |
+ // An event box and alignment that wrap the entry area and the count label. |
+ GtkWidget* content_event_box_; |
+ GtkWidget* content_alignment_; |
+ |
+ // The border around the text entry area. |
+ GtkWidget* border_bin_; |
+ GtkWidget* border_bin_alignment_; |
+ |
+ // The next and previous match buttons. |
+ scoped_ptr<CustomDrawButton> find_previous_button_; |
+ scoped_ptr<CustomDrawButton> find_next_button_; |
+ |
+ // The GtkLabel listing how many results were found. |
+ GtkWidget* match_count_label_; |
+ GtkWidget* match_count_event_box_; |
+ // Cache whether the match count label is showing failure or not so that |
+ // we can update its appearance without changing its semantics. |
+ bool match_label_failure_; |
+ |
+ // The X to close the find bar. |
+ scoped_ptr<CustomDrawButton> close_button_; |
+ |
+ // The last matchcount number we reported to the user. |
+ int last_reported_matchcount_; |
+ |
+ // Pointer back to the owning controller. |
+ FindBarController* find_bar_controller_; |
+ |
+ // Saves where the focus used to be whenever we get it. |
+ FocusStoreGtk focus_store_; |
+ |
+ // If true, the change signal for the text entry is ignored. |
+ bool ignore_changed_signal_; |
+ |
+ // This is the width of widget(). We cache it so we can recognize whether |
+ // allocate signals have changed it, and if so take appropriate actions. |
+ int current_fixed_width_; |
+ |
+ scoped_ptr<NineBox> dialog_background_; |
+ |
+ // The selection rect we are currently showing. We cache it to avoid covering |
+ // it up. |
+ gfx::Rect selection_rect_; |
+ |
+ NotificationRegistrar registrar_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(FindBarGtk); |
+}; |
+ |
+#endif // CHROME_BROWSER_UI_GTK_FIND_BAR_GTK_H_ |