[GLIB] Use GUniquePtr instead of GOwnPtr
[WebKit-https.git] / Source / WebCore / platform / gtk / ContextMenuGtk.cpp
index b34631d..96cd268 100644 (file)
  */
 
 #include "config.h"
+
+#if ENABLE(CONTEXT_MENUS)
+
 #include "ContextMenu.h"
 
-#include "NotImplemented.h"
 #include <gtk/gtk.h>
+#include <wtf/gobject/GRefPtr.h>
+#include <wtf/gobject/GUniquePtr.h>
 
 namespace WebCore {
 
@@ -30,6 +34,11 @@ ContextMenu::ContextMenu()
     m_platformDescription = GTK_MENU(gtk_menu_new());
 }
 
+ContextMenu::ContextMenu(const PlatformMenuDescription menu)
+    : m_platformDescription(menu)
+{
+}
+
 ContextMenu::~ContextMenu()
 {
     if (m_platformDescription)
@@ -40,15 +49,21 @@ void ContextMenu::appendItem(ContextMenuItem& item)
 {
     ASSERT(m_platformDescription);
 
-    GtkMenuItem* platformItem = item.releasePlatformDescription();
+    GRefPtr<GtkWidget> platformItem = GTK_WIDGET(item.releasePlatformDescription());
     ASSERT(platformItem);
-    gtk_menu_shell_append(GTK_MENU_SHELL(m_platformDescription), GTK_WIDGET(platformItem));
-    gtk_widget_show(GTK_WIDGET(platformItem));
+
+    if (GtkWidget* parent = gtk_widget_get_parent(platformItem.get()))
+        gtk_container_remove(GTK_CONTAINER(parent), platformItem.get());
+
+    gtk_menu_shell_append(GTK_MENU_SHELL(m_platformDescription), platformItem.get());
+    gtk_widget_show(platformItem.get());
 }
 
 void ContextMenu::setPlatformDescription(PlatformMenuDescription menu)
 {
     ASSERT(menu);
+    if (m_platformDescription == menu)
+        return;
     if (m_platformDescription)
         gtk_widget_destroy(GTK_WIDGET(m_platformDescription));
 
@@ -68,12 +83,43 @@ PlatformMenuDescription ContextMenu::releasePlatformDescription()
     return description;
 }
 
-Vector<ContextMenuItem> contextMenuItemVector(const PlatformMenuDescription)
+unsigned ContextMenu::itemCount() const
 {
-    notImplemented();
+    ASSERT(m_platformDescription);
+
+    GUniquePtr<GList> children(gtk_container_get_children(GTK_CONTAINER(m_platformDescription)));
+    return g_list_length(children.get());
+}
 
+Vector<ContextMenuItem> contextMenuItemVector(const PlatformMenuDescription menu)
+{
     Vector<ContextMenuItem> menuItemVector;
+
+    GUniquePtr<GList> children(gtk_container_get_children(GTK_CONTAINER(menu)));
+    int itemCount = g_list_length(children.get());
+    menuItemVector.reserveCapacity(itemCount);
+
+    for (GList* item = children.get(); item; item = g_list_next(item)) {
+        GtkWidget* widget = static_cast<GtkWidget*>(item->data);
+        if (!GTK_IS_MENU_ITEM(widget))
+            continue;
+        menuItemVector.append(GTK_MENU_ITEM(widget));
+    }
+
     return menuItemVector;
 }
 
+PlatformMenuDescription platformMenuDescription(Vector<ContextMenuItem>& subMenuItems)
+{
+    GtkMenu* menu = GTK_MENU(gtk_menu_new());
+    for (size_t i = 0; i < subMenuItems.size(); i++) {
+        GtkWidget* platformItem = GTK_WIDGET(subMenuItems[i].releasePlatformDescription());
+        gtk_menu_shell_append(GTK_MENU_SHELL(menu), platformItem);
+        gtk_widget_show(platformItem);
+    }
+    return menu;
+}
+
 }
+
+#endif // ENABLE(CONTEXT_MENUS)