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

Side by Side Diff: chrome/browser/ui/gtk/location_bar_view_gtk.h

Issue 231733005: Delete the GTK+ port of Chrome. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Remerge to ToT Created 6 years, 8 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
(Empty)
1 // Copyright (c) 2012 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_GTK_LOCATION_BAR_VIEW_GTK_H_
6 #define CHROME_BROWSER_UI_GTK_LOCATION_BAR_VIEW_GTK_H_
7
8 #include <gtk/gtk.h>
9
10 #include <map>
11 #include <string>
12
13 #include "base/basictypes.h"
14 #include "base/callback.h"
15 #include "base/compiler_specific.h"
16 #include "base/memory/scoped_ptr.h"
17 #include "base/memory/scoped_vector.h"
18 #include "base/memory/weak_ptr.h"
19 #include "base/prefs/pref_member.h"
20 #include "chrome/browser/extensions/extension_action.h"
21 #include "chrome/browser/extensions/extension_action_icon_factory.h"
22 #include "chrome/browser/extensions/extension_context_menu_model.h"
23 #include "chrome/browser/ui/gtk/bubble/bubble_gtk.h"
24 #include "chrome/browser/ui/gtk/menu_gtk.h"
25 #include "chrome/browser/ui/omnibox/location_bar.h"
26 #include "chrome/browser/ui/omnibox/omnibox_edit_controller.h"
27 #include "chrome/browser/ui/view_ids.h"
28 #include "chrome/common/content_settings_types.h"
29 #include "content/public/browser/notification_observer.h"
30 #include "content/public/browser/notification_registrar.h"
31 #include "content/public/common/page_transition_types.h"
32 #include "ui/base/gtk/gtk_signal.h"
33 #include "ui/base/gtk/owned_widget_gtk.h"
34 #include "ui/base/window_open_disposition.h"
35 #include "ui/gfx/animation/animation_delegate.h"
36 #include "ui/gfx/animation/slide_animation.h"
37 #include "url/gurl.h"
38
39 class Browser;
40 class CommandUpdater;
41 class ContentSettingImageModel;
42 class ContentSettingBubbleGtk;
43 class ExtensionAction;
44 class GtkThemeService;
45 class OmniboxViewGtk;
46
47 namespace content {
48 class WebContents;
49 }
50
51 namespace gfx {
52 class Image;
53 }
54
55 namespace ui {
56 class Accelerator;
57 }
58
59 class LocationBarViewGtk : public OmniboxEditController,
60 public LocationBar,
61 public LocationBarTesting,
62 public content::NotificationObserver {
63 public:
64 explicit LocationBarViewGtk(Browser* browser);
65 virtual ~LocationBarViewGtk();
66
67 void Init(bool popup_window_mode);
68
69 // Returns the widget the caller should host. You must call Init() first.
70 GtkWidget* widget() { return hbox_.get(); }
71
72 // Returns the widget the page info bubble should point to.
73 GtkWidget* location_icon_widget() const { return location_icon_image_; }
74
75 // Returns the widget the extension installed bubble should point to.
76 GtkWidget* location_entry_widget() const { return entry_box_; }
77
78 Browser* browser() const { return browser_; }
79
80 // Sets |preview_enabled| for the PageActionViewGtk associated with this
81 // |page_action|. If |preview_enabled| is true, the view will display the
82 // page action's icon even though it has not been activated by the extension.
83 // This is used by the ExtensionInstalledBubbleGtk to preview what the icon
84 // will look like for the user upon installation of the extension.
85 void SetPreviewEnabledPageAction(ExtensionAction *page_action,
86 bool preview_enabled);
87
88 // Retrieves the GtkWidget which is associated with PageActionView
89 // corresponding to |page_action|.
90 GtkWidget* GetPageActionWidget(ExtensionAction* page_action);
91
92 // Show the bookmark bubble.
93 void ShowStarBubble(const GURL& url, bool newly_boomkarked);
94
95 // Happens when the zoom changes for the active tab. |can_show_bubble| will be
96 // true if it was a user action and a bubble could be shown.
97 void ZoomChangedForActiveTab(bool can_show_bubble);
98
99 // Returns the zoom widget. Used by the zoom bubble for an anchor.
100 GtkWidget* zoom_widget() { return zoom_.get(); }
101
102 // Returns the manage passwords widget. Used by the manage passwords bubble
103 // for an anchor.
104 GtkWidget* manage_passwords_icon_widget() {
105 return manage_passwords_icon_.get();
106 }
107
108 // Set the starred state of the bookmark star.
109 void SetStarred(bool starred);
110
111 // OmniboxEditController:
112 virtual void Update(const content::WebContents* contents) OVERRIDE;
113 virtual void OnChanged() OVERRIDE;
114 virtual void OnSetFocus() OVERRIDE;
115 virtual void ShowURL() OVERRIDE;
116 virtual InstantController* GetInstant() OVERRIDE;
117 virtual content::WebContents* GetWebContents() OVERRIDE;
118 virtual ToolbarModel* GetToolbarModel() OVERRIDE;
119 virtual const ToolbarModel* GetToolbarModel() const OVERRIDE;
120
121 // LocationBar:
122 virtual void ShowFirstRunBubble() OVERRIDE;
123 virtual GURL GetDestinationURL() const OVERRIDE;
124 virtual WindowOpenDisposition GetWindowOpenDisposition() const OVERRIDE;
125 virtual content::PageTransition GetPageTransition() const OVERRIDE;
126 virtual void AcceptInput() OVERRIDE;
127 virtual void FocusLocation(bool select_all) OVERRIDE;
128 virtual void FocusSearch() OVERRIDE;
129 virtual void UpdateContentSettingsIcons() OVERRIDE;
130 virtual void UpdateManagePasswordsIconAndBubble() OVERRIDE;
131 virtual void UpdatePageActions() OVERRIDE;
132 virtual void InvalidatePageActions() OVERRIDE;
133 virtual void UpdateOpenPDFInReaderPrompt() OVERRIDE;
134 virtual void UpdateGeneratedCreditCardView() OVERRIDE;
135 virtual void SaveStateToContents(content::WebContents* contents) OVERRIDE;
136 virtual void Revert() OVERRIDE;
137 virtual const OmniboxView* GetOmniboxView() const OVERRIDE;
138 virtual OmniboxView* GetOmniboxView() OVERRIDE;
139 virtual LocationBarTesting* GetLocationBarForTesting() OVERRIDE;
140
141 // LocationBarTesting:
142 virtual int PageActionCount() OVERRIDE;
143 virtual int PageActionVisibleCount() OVERRIDE;
144 virtual ExtensionAction* GetPageAction(size_t index) OVERRIDE;
145 virtual ExtensionAction* GetVisiblePageAction(size_t index) OVERRIDE;
146 virtual void TestPageActionPressed(size_t index) OVERRIDE;
147 virtual bool GetBookmarkStarVisibility() OVERRIDE;
148
149 // content::NotificationObserver:
150 virtual void Observe(int type,
151 const content::NotificationSource& source,
152 const content::NotificationDetails& details) OVERRIDE;
153
154 // Edit background color.
155 static const GdkColor kBackgroundColor;
156
157 // Superclass for content settings icons shown at the left side of the
158 // location bar.
159 class PageToolViewGtk : public gfx::AnimationDelegate {
160 public:
161 PageToolViewGtk();
162 virtual ~PageToolViewGtk();
163
164 GtkWidget* widget() { return alignment_.get(); }
165
166 bool IsVisible();
167
168 virtual void Update(content::WebContents* web_contents) = 0;
169
170 // Overridden from gfx::AnimationDelegate:
171 virtual void AnimationProgressed(const gfx::Animation* animation) OVERRIDE;
172 virtual void AnimationEnded(const gfx::Animation* animation) OVERRIDE;
173 virtual void AnimationCanceled(const gfx::Animation* animation) OVERRIDE;
174
175 protected:
176 // Theme constants for solid background elements.
177 virtual GdkColor GetButtonBorderColor() const = 0;
178 virtual GdkColor GetGradientTopColor() const = 0;
179 virtual GdkColor GetGradientBottomColor() const = 0;
180
181 // Delegate for ButtonPressed message.
182 virtual void OnClick(GtkWidget* sender) = 0;
183
184 // Start the process of showing the label.
185 void StartAnimating();
186
187 // Slide the label shut.
188 void CloseAnimation();
189
190 CHROMEGTK_CALLBACK_1(PageToolViewGtk, gboolean, OnButtonPressed, GdkEvent*);
191 CHROMEGTK_CALLBACK_1(PageToolViewGtk, gboolean, OnExpose, GdkEventExpose*);
192
193 // The widgets for this view.
194 ui::OwnedWidgetGtk alignment_;
195 ui::OwnedWidgetGtk event_box_;
196 GtkWidget* hbox_;
197 ui::OwnedWidgetGtk image_;
198
199 // Explanatory text (e.g. "popup blocked").
200 ui::OwnedWidgetGtk label_;
201
202 // When we show explanatory text, we slide it in/out.
203 gfx::SlideAnimation animation_;
204
205 // The label's default requisition (cached so we can animate accordingly).
206 GtkRequisition label_req_;
207
208 base::WeakPtrFactory<PageToolViewGtk> weak_factory_;
209
210 private:
211 DISALLOW_COPY_AND_ASSIGN(PageToolViewGtk);
212 };
213
214 private:
215 // OmniboxEditController:
216 virtual void HideURL() OVERRIDE;
217
218 class PageActionViewGtk :
219 public ExtensionActionIconFactory::Observer,
220 public content::NotificationObserver,
221 public ExtensionContextMenuModel::PopupDelegate {
222 public:
223 PageActionViewGtk(LocationBarViewGtk* owner, ExtensionAction* page_action);
224 virtual ~PageActionViewGtk();
225
226 GtkWidget* widget() { return event_box_.get(); }
227
228 ExtensionAction* page_action() { return page_action_; }
229
230 void set_preview_enabled(bool preview_enabled) {
231 preview_enabled_ = preview_enabled;
232 }
233
234 bool IsVisible();
235
236 // Called to notify the PageAction that it should determine whether to be
237 // visible or hidden. |contents| is the WebContents that is active, |url|
238 // is the current page URL.
239 void UpdateVisibility(content::WebContents* contents, const GURL& url);
240
241 // Overriden from ExtensionActionIconFactory::Observer.
242 virtual void OnIconUpdated() OVERRIDE;
243
244 // Simulate left mouse click on the page action button.
245 void TestActivatePageAction();
246
247 // Implement the content::NotificationObserver interface.
248 virtual void Observe(int type,
249 const content::NotificationSource& source,
250 const content::NotificationDetails& details) OVERRIDE;
251
252 // Overridden from ExtensionContextMenuModel::PopupDelegate:
253 virtual void InspectPopup(ExtensionAction* action) OVERRIDE;
254
255 private:
256 // Connect the accelerator for the page action popup.
257 void ConnectPageActionAccelerator();
258
259 // Disconnect the accelerator for the page action popup.
260 void DisconnectPageActionAccelerator();
261
262 CHROMEGTK_CALLBACK_1(PageActionViewGtk, gboolean, OnButtonPressed,
263 GdkEventButton*);
264 CHROMEGTK_CALLBACK_1(PageActionViewGtk, gboolean, OnExposeEvent,
265 GdkEventExpose*);
266 CHROMEGTK_CALLBACK_0(PageActionViewGtk, void, OnRealize);
267
268 // The accelerator handler for when the shortcuts to open the popup is
269 // struck.
270 static gboolean OnGtkAccelerator(GtkAccelGroup* accel_group,
271 GObject* acceleratable,
272 guint keyval,
273 GdkModifierType modifier,
274 void* user_data);
275
276 // The location bar view that owns us.
277 LocationBarViewGtk* owner_;
278
279 // The PageAction that this view represents. The PageAction is not owned by
280 // us, it resides in the extension of this particular profile.
281 ExtensionAction* page_action_;
282
283 // The object that will be used to get the extension action icon for us.
284 // It may load the icon asynchronously (in which case the initial icon
285 // returned by the factory will be transparent), so we have to observe it
286 // for updates to the icon.
287 scoped_ptr<ExtensionActionIconFactory> icon_factory_;
288
289 // The widgets for this page action.
290 ui::OwnedWidgetGtk event_box_;
291 ui::OwnedWidgetGtk image_;
292
293 // The tab id we are currently showing the icon for.
294 int current_tab_id_;
295
296 // The URL we are currently showing the icon for.
297 GURL current_url_;
298
299 // The native browser window of the location bar that owns us.
300 gfx::NativeWindow window_;
301
302 // The Notification registrar.
303 content::NotificationRegistrar registrar_;
304
305 // The accelerator group used to handle accelerators, owned by this object.
306 GtkAccelGroup* accel_group_;
307
308 // The keybinding accelerator registered to show the page action popup.
309 scoped_ptr<ui::Accelerator> page_action_keybinding_;
310
311 // This is used for post-install visual feedback. The page_action icon
312 // is briefly shown even if it hasn't been enabled by its extension.
313 bool preview_enabled_;
314
315 // The context menu view and model for this extension action.
316 scoped_ptr<MenuGtk> context_menu_;
317 scoped_refptr<ExtensionContextMenuModel> context_menu_model_;
318
319 DISALLOW_COPY_AND_ASSIGN(PageActionViewGtk);
320 };
321 friend class PageActionViewGtk;
322
323 // Creates, initializes, and packs the location icon, EV certificate name,
324 // and optional border.
325 void BuildSiteTypeArea();
326
327 // Enable or disable the location icon/EV certificate as a drag source for
328 // the URL.
329 void SetSiteTypeDragSource();
330
331 GtkWidget* site_type_area() { return site_type_alignment_; }
332
333 CHROMEGTK_CALLBACK_1(LocationBarViewGtk, gboolean, HandleExpose,
334 GdkEventExpose*);
335 CHROMEGTK_CALLBACK_1(LocationBarViewGtk, gboolean, OnIconReleased,
336 GdkEventButton*);
337 CHROMEGTK_CALLBACK_4(LocationBarViewGtk, void, OnIconDragData,
338 GdkDragContext*, GtkSelectionData*, guint, guint);
339 CHROMEGTK_CALLBACK_1(LocationBarViewGtk, void, OnIconDragBegin,
340 GdkDragContext*);
341 CHROMEGTK_CALLBACK_1(LocationBarViewGtk, void, OnIconDragEnd,
342 GdkDragContext*);
343 CHROMEGTK_CALLBACK_1(LocationBarViewGtk, void, OnHboxSizeAllocate,
344 GtkAllocation*);
345 CHROMEGTK_CALLBACK_1(LocationBarViewGtk, void, OnEntryBoxSizeAllocate,
346 GtkAllocation*);
347 CHROMEGTK_CALLBACK_1(LocationBarViewGtk, gboolean, OnZoomButtonPress,
348 GdkEventButton*);
349 CHROMEGTK_CALLBACK_1(LocationBarViewGtk, gboolean,
350 OnManagePasswordsIconButtonPress, GdkEventButton*);
351 CHROMEGTK_CALLBACK_1(LocationBarViewGtk, void, OnStarButtonSizeAllocate,
352 GtkAllocation*);
353 CHROMEGTK_CALLBACK_1(LocationBarViewGtk, gboolean, OnStarButtonPress,
354 GdkEventButton*);
355
356 // Updates the site type area: changes the icon and shows/hides the EV
357 // certificate information.
358 void UpdateSiteTypeArea();
359
360 // Updates the maximum size of the EV certificate label.
361 void UpdateEVCertificateLabelSize();
362
363 // Set the keyword text for the Search BLAH: keyword box.
364 void SetKeywordLabel(const base::string16& keyword);
365
366 // Set the keyword text for the "Press tab to search BLAH" hint box.
367 void SetKeywordHintLabel(const base::string16& keyword);
368
369 void ShowFirstRunBubbleInternal();
370
371 // Shows the zoom bubble.
372 void ShowZoomBubble();
373
374 // Shows the manage password bubble.
375 void ShowManagePasswordsBubble();
376
377 // Show or hide |tab_to_search_box_| and |tab_to_search_hint_| according to
378 // the value of |show_selected_keyword_|, |show_keyword_hint_|, and the
379 // available horizontal space in the location bar.
380 void AdjustChildrenVisibility();
381
382 // Helpers to build create the various buttons that show up in the location
383 // bar.
384 GtkWidget* CreateIconButton(
385 GtkWidget** image,
386 int image_id,
387 ViewID debug_id,
388 int tooltip_id,
389 gboolean (click_callback)(GtkWidget*, GdkEventButton*, gpointer));
390 void CreateZoomButton();
391 void CreateManagePasswordsIconButton();
392 void CreateStarButton();
393
394 // Helpers to update state of the various buttons that show up in the
395 // location bar.
396 void UpdateZoomIcon();
397 void UpdateManagePasswordsIcon();
398 void UpdateStarIcon();
399
400 // Shows the managepassword bubble in case there is a password to be saved.
401 void ShowManagePasswordsBubbleIfNeeded();
402
403 // Returns true if we should only show the URL and none of the extras like
404 // the star button or page actions.
405 bool ShouldOnlyShowLocation();
406
407 // The outermost widget we want to be hosted.
408 ui::OwnedWidgetGtk hbox_;
409
410 // Zoom button.
411 ui::OwnedWidgetGtk zoom_;
412 GtkWidget* zoom_image_;
413
414 // Manage passwords button.
415 ui::OwnedWidgetGtk manage_passwords_icon_;
416 GtkWidget* manage_passwords_icon_image_;
417
418 // Star button.
419 ui::OwnedWidgetGtk star_;
420 GtkWidget* star_image_;
421 bool starred_;
422 bool star_sized_; // True after a size-allocate signal to the star widget.
423
424 // Action to execute after the star icon has been sized, can refer to a NULL
425 // function to indicate no such action should be taken.
426 base::Closure on_star_sized_;
427
428 // An icon to the left of the address bar.
429 GtkWidget* site_type_alignment_;
430 GtkWidget* site_type_event_box_;
431 GtkWidget* location_icon_image_;
432 GtkWidget* drag_icon_;
433 bool enable_location_drag_;
434 // TODO(pkasting): Split this label off and move the rest of the items to the
435 // left of the address bar.
436 GtkWidget* security_info_label_;
437
438 // Content setting icons.
439 ui::OwnedWidgetGtk content_setting_hbox_;
440 ScopedVector<PageToolViewGtk> content_setting_views_;
441
442 // Extension page actions.
443 std::vector<ExtensionAction*> page_actions_;
444
445 // Extension page action icons.
446 ui::OwnedWidgetGtk page_action_hbox_;
447 ScopedVector<PageActionViewGtk> page_action_views_;
448
449 // The widget that contains our tab hints and the location bar.
450 GtkWidget* entry_box_;
451
452 // Area on the left shown when in tab to search mode.
453 GtkWidget* tab_to_search_alignment_;
454 GtkWidget* tab_to_search_box_;
455 GtkWidget* tab_to_search_magnifier_;
456 GtkWidget* tab_to_search_full_label_;
457 GtkWidget* tab_to_search_partial_label_;
458
459 // Hint to user that they can tab-to-search by hitting tab.
460 GtkWidget* tab_to_search_hint_;
461 GtkWidget* tab_to_search_hint_leading_label_;
462 GtkWidget* tab_to_search_hint_icon_;
463 GtkWidget* tab_to_search_hint_trailing_label_;
464
465 scoped_ptr<OmniboxViewGtk> omnibox_view_;
466
467 // Alignment used to wrap |omnibox_view_|.
468 GtkWidget* omnibox_view_alignment_;
469
470 Browser* browser_;
471
472 // When true, the location bar view is read only and also is has a slightly
473 // different presentation (font size / color). This is used for popups.
474 bool popup_window_mode_;
475
476 // Provides colors and rendering mode.
477 GtkThemeService* theme_service_;
478
479 content::NotificationRegistrar registrar_;
480
481 // Width of the main |hbox_|. Used to properly elide the EV certificate.
482 int hbox_width_;
483
484 // Width of the hbox that holds |tab_to_search_box_|, |omnibox_view_| and
485 // |tab_to_search_hint_|.
486 int entry_box_width_;
487
488 // Indicate if |tab_to_search_box_| should be shown.
489 bool show_selected_keyword_;
490
491 // Indicate if |tab_to_search_hint_| should be shown.
492 bool show_keyword_hint_;
493
494 // The last search keyword that was shown via the |tab_to_search_box_|.
495 base::string16 last_keyword_;
496
497 // Used to change the visibility of the star decoration.
498 BooleanPrefMember edit_bookmarks_enabled_;
499
500 // Used to remember the URL and title text when drag&drop has begun.
501 GURL drag_url_;
502 base::string16 drag_title_;
503
504 // Used to schedule a task for the first run bubble.
505 base::WeakPtrFactory<LocationBarViewGtk> weak_ptr_factory_;
506
507 DISALLOW_COPY_AND_ASSIGN(LocationBarViewGtk);
508 };
509
510 #endif // CHROME_BROWSER_UI_GTK_LOCATION_BAR_VIEW_GTK_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698