172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/gtk/infobars/extension_infobar_gtk.h"
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/extensions/extension_host.h"
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/extensions/extension.h"
93345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/common/extensions/extension_icon_set.h"
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/extensions/extension_resource.h"
11dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/renderer_host/render_view_host.h"
12dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/renderer_host/render_widget_host_view.h"
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "grit/theme_resources.h"
1472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/resource/resource_bundle.h"
1572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/gfx/gtk_util.h"
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochExtensionInfoBarGtk::ExtensionInfoBarGtk(ExtensionInfoBarDelegate* delegate)
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    : InfoBar(delegate),
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      tracker_(this),
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      delegate_(delegate),
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      view_(NULL) {
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  delegate_->extension_host()->view()->SetContainer(this);
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BuildWidgets();
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochExtensionInfoBarGtk::~ExtensionInfoBarGtk() {
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This view is not owned by us, so unparent.
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gtk_widget_unparent(view_->native_view());
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ExtensionInfoBarGtk::OnImageLoaded(
32ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    SkBitmap* image, const ExtensionResource& resource, int index) {
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!delegate_)
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;  // The delegate can go away while we asynchronously load images.
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
36ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // ResourceBundle& rb = ResourceBundle::GetSharedInstance();
37ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  //
38ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // SkBitmap* icon;
39ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // if (!image || image->empty())
40ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  //  icon = rb.GetBitmapNamed(IDR_EXTENSIONS_SECTION);
41ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // else
42ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  //  icon = image;
43ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // TODO(finnur): Use the above code.
44ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // We now have the icon for the menu button, show the menu button and layout.
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ExtensionInfoBarGtk::BuildWidgets() {
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Start loading the image for the menu button.
49513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  const Extension* extension = delegate_->extension_host()->extension();
503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ExtensionResource icon_resource = extension->GetIconResource(
513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      Extension::EXTENSION_ICON_BITTY, ExtensionIconSet::MATCH_EXACTLY);
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!icon_resource.relative_path().empty()) {
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Create a tracker to load the image. It will report back on OnImageLoaded.
543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    tracker_.LoadImage(extension, icon_resource,
553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                       gfx::Size(Extension::EXTENSION_ICON_BITTY,
563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                 Extension::EXTENSION_ICON_BITTY),
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       ImageLoadingTracker::DONT_CACHE);
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else {
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    OnImageLoaded(NULL, icon_resource, 0);  // |image|, |index|.
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ExtensionHost* extension_host = delegate_->extension_host();
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  view_ = extension_host->view();
644a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  if (gtk_widget_get_parent(view_->native_view())) {
654a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    gtk_widget_reparent(view_->native_view(), hbox_);
664a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    gtk_box_set_child_packing(GTK_BOX(hbox_), view_->native_view(),
674a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                              TRUE, TRUE, 0, GTK_PACK_START);
684a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  } else {
694a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    gtk_box_pack_start(GTK_BOX(hbox_), view_->native_view(), TRUE, TRUE, 0);
704a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  }
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  g_signal_connect(view_->native_view(), "size_allocate",
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   G_CALLBACK(&OnSizeAllocateThunk), this);
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ExtensionInfoBarGtk::OnSizeAllocate(GtkWidget* widget,
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                         GtkAllocation* allocation) {
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gfx::Size new_size(allocation->width, allocation->height);
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  delegate_->extension_host()->view()->render_view_host()->view()
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      ->SetSize(new_size);
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ExtensionInfoBarGtk::OnExtensionPreferredSizeChanged(
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ExtensionViewGtk* view,
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const gfx::Size& new_size) {
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // TODO(rafaelw) - Size the InfobarGtk vertically based on the preferred size
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // of the content.
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochInfoBar* ExtensionInfoBarDelegate::CreateInfoBar() {
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return new ExtensionInfoBarGtk(this);
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
94