15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_UI_GTK_INFOBARS_EXTENSION_INFOBAR_GTK_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_UI_GTK_INFOBARS_EXTENSION_INFOBAR_GTK_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_infobar_delegate.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/gtk/extensions/extension_view_gtk.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/gtk/infobars/infobar_gtk.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/gtk/menu_gtk.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/gtk_util.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ExtensionContextMenuModel;
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ExtensionViewGtk;
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MenuGtk;
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class ExtensionInfoBarGtk : public InfoBarGtk, public MenuGtk::Delegate {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
21a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  explicit ExtensionInfoBarGtk(scoped_ptr<ExtensionInfoBarDelegate> delegate);
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~ExtensionInfoBarGtk();
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // InfoBarGtk:
27a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual void PlatformSpecificSetOwner() OVERRIDE;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void PlatformSpecificHide(bool animate) OVERRIDE;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void GetTopColor(InfoBarDelegate::Type type,
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           double* r, double* g, double* b) OVERRIDE;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void GetBottomColor(InfoBarDelegate::Type type,
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              double* r, double* g, double* b) OVERRIDE;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // MenuGtk::Delegate:
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void StoppedShowing() OVERRIDE;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void OnImageLoaded(const gfx::Image& image);
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
39ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  ExtensionInfoBarDelegate* GetDelegate();
40ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Looks at the window the infobar is in and gets the browser. Can return
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // NULL if we aren't attached.
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* GetBrowser();
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the context menu model for this extension. Can be NULL if
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // extension context menus are disabled.
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExtensionContextMenuModel* BuildMenuModel();
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHROMEGTK_CALLBACK_1(ExtensionInfoBarGtk, void, OnSizeAllocate,
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       GtkAllocation*);
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHROMEGTK_CALLBACK_1(ExtensionInfoBarGtk, gboolean, OnButtonPress,
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       GdkEventButton*);
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHROMEGTK_CALLBACK_1(ExtensionInfoBarGtk, gboolean, OnExpose,
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       GdkEventExpose*);
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionViewGtk* view_;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The button that activates the extension popup menu. Non-NULL if the
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // extension shows configure context menus and a dropdown menu should be used
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // in place of the icon. If set, parents |icon_|.
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GtkWidget* button_;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The GtkImage that shows the extension icon. If a dropdown menu should be
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // used, it's put inside |button_|, otherwise it's put directly in the hbox
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // containing the infobar element. Composed in OnImageLoaded().
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GtkWidget* icon_;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // An alignment with one pixel of bottom padding. This is set so the |view_|
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // doesn't overlap the bottom separator. This also makes it more convenient
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to reattach the view since the alignment_ will have the |hbox_| packing
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // child properties. Reparenting becomes easier too.
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GtkWidget* alignment_;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The model for the current menu displayed.
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<ExtensionContextMenuModel> context_menu_model_;
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::WeakPtrFactory<ExtensionInfoBarGtk> weak_ptr_factory_;
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ExtensionInfoBarGtk);
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_UI_GTK_INFOBARS_EXTENSION_INFOBAR_GTK_H_
85