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