// Copyright (c) 2009 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "content/browser/renderer_host/gtk_plugin_container.h"

#include <gtk/gtk.h>

#include "base/basictypes.h"

namespace content {

namespace {

// NOTE: This class doesn't have constructors/destructors, it is created
// through GLib's object management.
class GtkPluginContainer : public GtkSocket {
 public:
  // Sets the requested size of the widget.
  void set_size(int width, int height) {
    width_ = width;
    height_ = height;
  }

  // Casts a widget into a GtkPluginContainer, after checking the type.
  template <class T>
  static GtkPluginContainer *CastChecked(T *instance) {
    return G_TYPE_CHECK_INSTANCE_CAST(instance, GetType(), GtkPluginContainer);
  }

  // Create and register our custom container type with GTK.
  static GType GetType() {
    static GType type = 0;  // We only want to register our type once.
    if (!type) {
      static const GTypeInfo info = {
        sizeof(GtkSocketClass),
        NULL, NULL,
        static_cast<GClassInitFunc>(&ClassInit),
        NULL, NULL,
        sizeof(GtkPluginContainer),
        0, &InstanceInit,
      };
      type = g_type_register_static(GTK_TYPE_SOCKET,
                                    "GtkPluginContainer",
                                    &info,
                                    static_cast<GTypeFlags>(0));
    }
    return type;
  }

  // Implementation of the class initializer.
  static void ClassInit(gpointer klass, gpointer class_data_unusued) {
    GtkWidgetClass* widget_class = reinterpret_cast<GtkWidgetClass*>(klass);
    widget_class->size_request = &HandleSizeRequest;
  }

  // Implementation of the instance initializer (constructor).
  static void InstanceInit(GTypeInstance *instance, gpointer klass) {
    GtkPluginContainer *container = CastChecked(instance);
    container->set_size(0, 0);
  }

  // Report our allocation size during size requisition.
  static void HandleSizeRequest(GtkWidget* widget,
                                GtkRequisition* requisition) {
    GtkPluginContainer *container = CastChecked(widget);
    requisition->width = container->width_;
    requisition->height = container->height_;
  }

  int width_;
  int height_;
  DISALLOW_IMPLICIT_CONSTRUCTORS(GtkPluginContainer);
};

}  // namespace

// Create a new instance of our GTK widget object.
GtkWidget* gtk_plugin_container_new() {
  return GTK_WIDGET(g_object_new(GtkPluginContainer::GetType(), NULL));
}

void gtk_plugin_container_set_size(GtkWidget *widget, int width, int height) {
  GtkPluginContainer::CastChecked(widget)->set_size(width, height);
  // Signal the parent that the size request has changed.
  gtk_widget_queue_resize_no_redraw(widget);
}

}  // namespace content
