172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
24a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
34a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// found in the LICENSE file.
44a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
54a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#ifndef CHROME_BROWSER_UI_VIEWS_LOCATION_BAR_PAGE_ACTION_IMAGE_VIEW_H_
64a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#define CHROME_BROWSER_UI_VIEWS_LOCATION_BAR_PAGE_ACTION_IMAGE_VIEW_H_
74a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#pragma once
84a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
94a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include <map>
104a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include <string>
114a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h"
134a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/extensions/image_loading_tracker.h"
144a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/extensions/extension_context_menu_model.h"
1572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/views/extensions/extension_popup.h"
164a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "views/controls/image_view.h"
174a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
184a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass LocationBarView;
194a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochnamespace views {
204a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass Menu2;
214a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch};
224a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
234a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// PageActionImageView is used by the LocationBarView to display the icon for a
244a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// given PageAction and notify the extension when the icon is clicked.
254a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass PageActionImageView : public views::ImageView,
264a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                            public ImageLoadingTracker::Observer,
274a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                            public ExtensionContextMenuModel::PopupDelegate,
284a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                            public ExtensionPopup::Observer {
294a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch public:
304a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  PageActionImageView(LocationBarView* owner,
314a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                      Profile* profile,
324a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                      ExtensionAction* page_action);
334a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  virtual ~PageActionImageView();
344a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
354a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  ExtensionAction* page_action() { return page_action_; }
364a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
374a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  int current_tab_id() { return current_tab_id_; }
384a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
394a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  void set_preview_enabled(bool preview_enabled) {
404a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    preview_enabled_ = preview_enabled;
414a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  }
424a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
434a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Overridden from view.
44ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void GetAccessibleState(ui::AccessibleViewState* state) OVERRIDE;
45ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual bool OnMousePressed(const views::MouseEvent& event) OVERRIDE;
46ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void OnMouseReleased(const views::MouseEvent& event) OVERRIDE;
47ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual bool OnKeyPressed(const views::KeyEvent& event) OVERRIDE;
48ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void ShowContextMenu(const gfx::Point& p,
49ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                               bool is_mouse_gesture) OVERRIDE;
504a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
514a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Overridden from ImageLoadingTracker.
52ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void OnImageLoaded(SkBitmap* image,
53ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                             const ExtensionResource& resource,
54ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                             int index) OVERRIDE;
554a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
564a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Overridden from ExtensionContextMenuModelModel::Delegate
57ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void InspectPopup(ExtensionAction* action) OVERRIDE;
584a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
594a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Overridden from ExtensionPopup::Observer
60ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void ExtensionPopupIsClosing(ExtensionPopup* popup) OVERRIDE;
614a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
624a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Called to notify the PageAction that it should determine whether to be
634a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // visible or hidden. |contents| is the TabContents that is active, |url| is
644a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // the current page URL.
654a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  void UpdateVisibility(TabContents* contents, const GURL& url);
664a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
674a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Either notify listeners or show a popup depending on the page action.
684a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  void ExecuteAction(int button, bool inspect_with_devtools);
694a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
704a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch private:
714a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Hides the active popup, if there is one.
724a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  void HidePopup();
734a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
744a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // The location bar view that owns us.
754a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  LocationBarView* owner_;
764a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
774a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // The current profile (not owned by us).
784a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  Profile* profile_;
794a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
804a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // The PageAction that this view represents. The PageAction is not owned by
814a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // us, it resides in the extension of this particular profile.
824a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  ExtensionAction* page_action_;
834a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
844a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // A cache of bitmaps the page actions might need to show, mapped by path.
854a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  typedef std::map<std::string, SkBitmap> PageActionMap;
864a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  PageActionMap page_action_icons_;
874a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
884a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // The context menu for this page action.
894a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  scoped_refptr<ExtensionContextMenuModel> context_menu_contents_;
904a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  scoped_ptr<views::Menu2> context_menu_menu_;
914a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
924a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // The object that is waiting for the image loading to complete
934a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // asynchronously.
944a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  ImageLoadingTracker tracker_;
954a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
964a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // The tab id we are currently showing the icon for.
974a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  int current_tab_id_;
984a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
994a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // The URL we are currently showing the icon for.
1004a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  GURL current_url_;
1014a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1024a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // The string to show for a tooltip;
1034a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  std::string tooltip_;
1044a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1054a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // This is used for post-install visual feedback. The page_action icon is
1064a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // briefly shown even if it hasn't been enabled by its extension.
1074a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  bool preview_enabled_;
1084a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1094a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // The current popup and the button it came from.  NULL if no popup.
1104a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  ExtensionPopup* popup_;
1114a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1124a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  DISALLOW_IMPLICIT_CONSTRUCTORS(PageActionImageView);
1134a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch};
1144a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1154a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#endif  // CHROME_BROWSER_UI_VIEWS_LOCATION_BAR_PAGE_ACTION_IMAGE_VIEW_H_
116